cacti-release-1.2.19/000077500000000000000000000000001413633772300143165ustar00rootroot00000000000000cacti-release-1.2.19/.github/000077500000000000000000000000001413633772300156565ustar00rootroot00000000000000cacti-release-1.2.19/.github/FUNDING.yml000066400000000000000000000013271413633772300174760ustar00rootroot00000000000000# These are supported funding model platforms github: [cacti, netniV] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username ko_fi: # Replace with a single Ko-fi username tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry liberapay: # Replace with a single Liberapay username issuehunt: # Replace with a single IssueHunt username otechie: # Replace with a single Otechie username custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] cacti-release-1.2.19/.github/ISSUE_TEMPLATE/000077500000000000000000000000001413633772300200415ustar00rootroot00000000000000cacti-release-1.2.19/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000015171413633772300225370ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: 'bug,unverified' assignees: '' --- # Describe the bug A clear and concise description of what the bug is. ## To Reproduce Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error ## Expected behavior A clear and concise description of what you expected to happen. ## Screenshots If applicable, add screenshots to help explain your problem. ## Desktop (please complete the following information) - OS: [e.g. iOS] - Browser [e.g. chrome, safari] - Version [e.g. 22] ## Smartphone (please complete the following information) - Device: [e.g. iPhone6] - OS: [e.g. iOS8.1] - Browser [e.g. stock browser, safari] - Version [e.g. 22] ## Additional context Add any other context about the problem here. cacti-release-1.2.19/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011601413633772300235640ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: 'enhancement' assignees: '' --- # Feature Request ## Is your feature request related to a problem? Please describe A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] ## Describe the solution you'd like A clear and concise description of what you want to happen. ## Describe alternatives you've considered A clear and concise description of any alternative solutions or features you've considered. ## Additional context Add any other context or screenshots about the feature request here. cacti-release-1.2.19/.github/workflows/000077500000000000000000000000001413633772300177135ustar00rootroot00000000000000cacti-release-1.2.19/.github/workflows/oldissues.yml000066400000000000000000000040551413633772300224540ustar00rootroot00000000000000name: "Maintain old issues" on: schedule: - cron: '0 0 * * *' jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v3 with: repo-token: ${{ secrets.GITHUB_TOKEN }} days-before-stale: 60 days-before-close: 7 remove-stale-when-updated: true exempt-issue-labels: 'pinned, security, enhancement, future release' stale-issue-label: 'outdated' stale-issue-message: > This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. exempt-pr-labels: 'pinned, security, enhancement, future release' stale-pr-label: 'outdated' stale-pr-message: > This pull request has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions. lock: runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@v2.0.0 with: github-token: ${{ github.token }} repo-token: ${{ secrets.GITHUB_TOKEN }} issue-lock-inactive-days: '90' issue-exclude-created-before: '' issue-exclude-labels: 'future release' issue-lock-labels: '' # issue-lock-comment: > # This issue tracker has been automatically locked since there # has not been any recent activity after it was closed. Please # open a new issue for related bugs. # issue-lock-reason: 'resolved' issue-lock-reason: '' pr-lock-inactive-days: '90' pr-exclude-created-before: '' pr-exclude-labels: 'future release' pr-lock-labels: '' # pr-lock-comment: > # This pull request has been automatically locked since there # has not been any recent activity after it was closed. Please # open a new issue for related bugs. pr-lock-reason: '' process-only: '' debug-run: truecacti-release-1.2.19/.gitignore000066400000000000000000000030511413633772300163050ustar00rootroot00000000000000################################################################## # # For any folder that ignores all subcontent (/**), you # must MANUALLY use 'git add' to include a file as source # controlled. This is to prevent addition of local specific # content bleeding into cacti's main sources. # # Example # ------- # The themes and scripts folders ignore all contents # beneath them unless that content was already source controlled # so to add a new theme, or script, make sure to use 'git add' # before commiting changes. # # Themes # ------ # Themes have a special case where a theme folder that is # included in a cacti release has all content considered as # maintainable and as such are prefixed with an exclamation # mark (!include/theme/mytheme = do not ignore mytheme) # ################################################################## # Ignore vim swap files *.swp # Ignore Cacti config include/config.php # Ignore Cacti log files/folders log/** # Ignore Cacti rrd files/folders rra/** # Ignore Cacti cache files/folders cache/** # Ignore Cacti plugin files/folders plugins/** # Ignore Cacti script files/folders scripts/** # Ignore Custom Cacti theme folders include/themes/* # Ignore custom stylesheet (applied on all themes) include/themes/custom.css # Do not ignore standard Cacti theme folders !include/themes/classic !include/themes/dark !include/themes/modern !include/themes/paper-plane !include/themes/paw !include/themes/sunrise !include/themes/midwinter # Ignore any mac DS_Store files .DS_Store locales/po/*.mo include/vendor/csrf/csrf-secret.php cacti-release-1.2.19/.mdl_style.rb000066400000000000000000000011011413633772300167060ustar00rootroot00000000000000# customize style guide all rule "MD010", code_blocks: false rule "MD013", code_blocks: false, tables: false rule "MD029", style: "ordered" rule "MD046", style: "fenced" # Lesser rules exclude_rule "MD010" # hard tabs #exclude_rule "MD013" # line length # Rule Exclusions exclude_rule "MD001" # Headers are useful in other ways exclude_rule "MD024" # Headers with same name are useful, but break link labeling (Rework needed on affected files before enabling this rule) exclude_rule "MD041" # YAML header is being flagged as not the first exclude_rule "MD046" # seems broken cacti-release-1.2.19/.mdlrc000066400000000000000000000000741413633772300154210ustar00rootroot00000000000000# mdl cli configuration style ".mdl_style.rb" verbose false cacti-release-1.2.19/.travis.yml000066400000000000000000000073231413633772300164340ustar00rootroot00000000000000language: php services: - mysql matrix: include: - php: 7.2 dist: bionic - php: 7.3 dist: bionic - php: 7.4 dist: bionic - php: 8.0 dist: bionic fast_finish: true before_install: # run syntax check - if find . -name '*.php' -exec php -l {} 2>&1 \; | grep -iv 'no syntax errors detected'; then exit 1; fi # obtain keys for Ubuntu - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 78BD65473CB3BD13 6B05F25D762E3157 # get latest updates - sudo apt-get update > /dev/null install: # setup link for php legacy - sudo ln -s ~/.phpenv/versions/$(phpenv version-name)/bin/php /bin/php # install apache web server - sudo apt-get install apache2 php-fpm php-mysql php-gd php-ldap php-gmp php-xml php-mbstring rrdtool snmp libapache2-mod-php - sudo a2enmod proxy_fcgi setenvif actions alias - sudo find /etc/apache2 # configure apache virtual hosts - sudo cp -f tests/tools/cacti.conf /etc/apache2/sites-available/000-default.conf # set some required variables - echo 'cgi.fix_pathinfo = 1' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini - echo 'date.timezone = "America/New_York"' >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini # copy the Cacti website to the correct direcotry - sudo cp -rp /home/travis/build/Cacti/cacti /var/www/html/ # change ownership on the Cacti directory - sudo chown -R www-data:www-data /home/travis/build/Cacti/cacti - sudo chown -R www-data:www-data /var/www/html/cacti # make the directory more open for our tests - sudo chmod -R 777 /home/travis/build/Cacti/cacti # enable php-fpm - sudo cp ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf.default ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.conf - sudo sed -i -e 's,nobody,www-data,g' ~/.phpenv/versions/$(phpenv version-name)/etc/php-fpm.d/*.conf - sudo grep nobody ~/.phpenv/versions/$(phpenv version-name)/etc/ -R # restart apache - sudo service apache2 restart # start php-fpm - sudo ~/.phpenv/versions/$(phpenv version-name)/sbin/php-fpm before_script: - mysql -e 'CREATE DATABASE cacti;' - mysql -e "CREATE USER 'cactiuser'@'localhost' IDENTIFIED BY 'cactiuser';" - mysql -e "GRANT ALL PRIVILEGES ON cacti.* TO 'cactiuser'@'localhost';" - mysql -e "FLUSH PRIVILEGES;" - mysql cacti < cacti.sql - mysql -e "INSERT INTO settings (name, value) VALUES ('path_php_binary', '/bin/php')" cacti - sudo cp -p include/config.php.dist include/config.php - sudo cp -p include/config.php.dist /var/www/html/cacti/include/config.php script: - cd /var/www/html/cacti && sudo php tests/tools/check_install_code.php - cd /var/www/html/cacti && sudo bash tests/tools/check_cli_version.sh - cd /var/www/html/cacti && sudo php cli/install_cacti.php --accept-eula --install --force - cd /var/www/html/cacti && sudo bash tests/tools/check_all_pages.sh - cd /var/www/html/cacti && sudo cat /var/www/html/cacti/log/cacti.log notifications: email: on_success: change on_failure: always recipients: - developers@cacti.net slack: secure: ZY2XMrAUZO0UbZY0MvRd+sD60+fnvluUVm5kxXII/+waDpEutLmWnNclJo+96KI0zXZwsYcdahmHc4lnNiJhZSGcZN3QWp/bAophgT5b3ly4k2HzyMcG39pK9v1ue2tws4yB9OPDMcTyq7XPEcWxQT3q7Ca7hAYVCOZSnAt17OTe6HgasjvJtekDog+dK0iI3TB9BIrazWw4e2eoFpnVnPtTPo8qI0uh3Aihcfg12ETzssLD4hvyx6eBmaQBHn0jhvuw3AfzD82T4g5MHaLrGGz3q8tD+iZPGEIp4XBxeDtFkYx+MdY6IFWlYXa0mCVE1H7ChQjk3VMhHGxZMFzUOyxn61CGPJLGknn98qnrgj7bXRq073RlzirnyvRmxilFeJlXNM3KiVie5e3Abl7u5REQMfvs8slETLE7bQ7MJwyF6wWamaZWzoeIGS+ZEdEAdZK0LoTApHsk4rh1ciJZP6ECn6S+1bkAfRDPoyo9LOjqL32oSl6S3+/hGVHTJr1e9fEX+iwjLwA6w3JmbvhfGY/eLudRz+QqY0MlRiBp9bdnkLoneS6gmKhz5n6bzaDZxZ4xmLWY4aSX1rLbOyJZAss2m0vvaxg7QnJ6LjHDWeQUHcDLsklYBAqK8IAzBEDHzOic+9GOvtWyPWXBktR+8bNn+C0oFrHCykFo8dDv8Nc= cacti-release-1.2.19/CHANGELOG000066400000000000000000007260331413633772300155430ustar00rootroot00000000000000Cacti CHANGELOG 1.2.19 -security#4356: Further fixes for grave character security protection -issue: Over aggressive escaping causes menu visibility issues on Create Device page -issue#3787: Add SHA256 and AES256 security levels for SNMP polling -issue#4289: Import graph template(Preview Only) show color_id new value as a blank area -issue#4341: Editing graphs can cause errors due to missing sequence -issue#4342: When hovering over a Tree Graph, row shows same highlighting as Graph Edit screen -issue#4343: When RealTime is not active, console errors may appear -issue#4347: Race conditions may occur when multiple RRDtool processes are running -issue#4352: Creating graphs from templates may sometimes result in errors -issue#4353: When duplicating reports, errors may occur -issue#4375: Boost may be blocked by overflowing poller_output table -issue#4378: Template import may be blocked due to unmet dependency warnings with snmp ports -issue#4381: Newer MySQL versions may error if committing a transaction when not in one -issue#4382: SNMP Agent may not find a cache item -issue#4383: Correct issues running under PHP 8.x -issue#4391: When polling is disabled, boost may crash and creates many arch tables -issue#4396: When poller runs, memory tables may not always be present -issue#4400: Removal of redunant code -issue#4403: Timezones may sometimes be incorrectly calculated -issue#4404: Allow monitoring IPv6 with interface graphs -issue#4408: When a data source uses a Data Input Method, those without a mapping should be flagged -issue#4410: When RRDfile is not yet created, errors may appear when displaying the graph -issue#4419: Cacti missing key indexes that result in Preset pages slowdowns -issue#4420: Data Sources page shows no name when Data Source has no name cache -issue#4421: db_update_table function can not alter table from signed to unsigned -issue#4422: data remains in poller_output table even if it's flushed to rrd files -issue#4423: Parameter list for lib/database.php:db_connect_real() is not correct in 3 places -issue#4424: Offset is a reserved word in MariaDB 10.6 affecting Report -issue#4425: Rendering large trees slowed due to lack of permission caching -issue#4428: Error on interpretation of snmpUtime, when to big -issue#4431: Applying right axis formatting creates an error-image -issue#4435: Unable to Save Graph Settings from the Graphs pages -issue#4437: Graph Template Cache is nullified too often when Graph Automation is running -issue#4438: When Adding a Data Query to a Device, no Progress Spinner is shown -issue#4439: New Browser Breaks Plugins that depend on non UTC date time data -issue#4440: Undefined index: timeout_exceed /lib/poller.php on line: 1953 -issue#4442: When testing remote poller connectivity Errors occour -issue#4443: When renaming poller errors occour -issue#4444: Removing spikes by Variance does not appear to be working beyond the first RRA -issue#4445: LDAP API lacks timeout options leading to bad login experiences -feature: Add a normal/wrap class for general use -feature: Limit File Types available for Template Import operations -feature#1573: Cacti does not provide an option of providing a client side certificate for LDAP/AD authentication -feature#3113: Support Stronger Encryption Available Starting in Net-SNMP v5.8 -feature#4299: Allow Cacti to use multiple possible LDAP servers -feature#4344: Add a 15 minute polling/sampling interval -feature#4385: Provide additional admin email notifications -feature#4390: Add warnings for undesired changes to plugin hook return values -feature#4409: When creating a Graph, make testing the Data Sources optional by Template -feature#4412: Update phpseclib to 2.0.33 -feature#4413: Update jstree.js to 3.3.12 -feature#4414: Improve performance of Cacti poller on heavily loaded systems -feature#4426: MariaDB recommendations need some tuning for recent updates 1.2.18 -security#4261: Lack of escaping on template import can lead to XSS exposure under 'midwinter' theme (CVE-2020-14424) -security#4276: Real time graphs can expose XSS issue -security#4282: Session IDs are not always recreated when logging out under PHP 5 -issue#4250: Unable to create graphs due to Data Source verification failure -issue#4254: When poller first runs, time since last run produces an error -issue#4259: Data Template caching does not update and causes errors -issue#4263: Graphs with multiple data sources can no longer display percenticles -issue#4266: Incomplete items from a previous polling session may be updated twice -issue#4267: Unnecessary warnings appear when host name is not resolved -issue#4269: Installation Wizard can become stuck when creating graphs for default device -issue#4271: Continued timeout of registered processes -issue#4272: Unexpected errors may appear when using hostnames without a DNS domain -issue#4273: When adding a device from command line, testing of data sources can cause errors to be recorded -issue#4274: When you start to zoom a graph, the auto graph refresh should be disabled -issue#4279: Default Setting "Device Threads" will not be saved correctly -issue#4284: Database upgrade can fail - Uncaught argument count error -issue#4293: Tree search does not take hosts belonging to a site into account -issue#4284: Whilst upgrading, errors in upgrade scripts prevent properly execution -issue#4294: Tables outside of pre-built list that need fixing, cause bad unknown column errors -issue#4295: If a page contains multiple tables, a larger table can cause small ones to lose columns -issue#4297: Unable to search using regular expressions when trying to filter graphs -issue#4312: When using CMD.PHP as the poller, warnings can appear if you only use a subset of data input types -issue#4314: When disabling the snmpagent, you can introduce significant delay to data collection -issue#4315: Reduce repeatative warnings when resources are exhausted -issue#4316: Remove Spikes CLI interface is unable to provide localized spike, gap fill or float operations -issue#4321: Earlier versions of RRDTool do not correctly ignore previous updates -issue#4324: Date/Time format of replacement field on graph cannot be changed -issue#4325: When editing graph items, make identifying rows easier -issue#4326: When using large lists, ensure selection is visible in dropdown menus -issue#4330: Automation attempts to call undefined debug function -issue#4333: Under FreeBSD, allow ping to work properly for IPv6 -issue#4367: Report owner - show at least the username when the full name is empty -feature#4258: Update phpseclib to 2.0.31 -feature#4283: Content Security Policy may block Plugin functionality -feature#4317: Allow the Cacti administrator to perform bulk gap filling and floating in parallel -feature#4322: Update pace.js to version 1.2.4 1.2.17 -security#4019: Incorrect handling of fields led to potential XSS issues -security#4022: SQL Injection was possible due to incorrect validation order (CVE-2020-35701) -security#4035: Various XSS issues with HTML Forms handling -issue: CLI scripts should not have a max allowed runtime -issue: Normalize plugin hooks between user_admin.php and user_group_admin.php -issue#1052: TimeZones are not handled correctly with Daylight Savings changes -issue#3392: Allow plugins to customize device listing page -issue#3879: Allow Graph/Data Source with custom fields to prompt during manual creation -issue#3908: When poller overruns the script server can throw errors upon shutdown -issue#3936: Editing a graph created from Aggregate Graph can fail -issue#3945: CSV export can show NaN for date if TimeZone does not match system -issue#3969: SNMPv3 Password field does not correctly limit to size of database field -issue#3976: Font colors are being overridden leading to display issues -issue#3977: Database upgrade may fail when using upgrade_database.php -issue#3978: Input Validation was not handled correctly when displaying graph trees -issue#3981: Missing API include leads to runtime errors in Automation -issue#3985: Collation was not always handled correctly in the database library -issue#3988: Automation raises errors when default snmp options is set to none -issue#3990: PHP Information was not being displayed properly under Tech Support -issue#3999: Ensure database audit code attempts to use passwordless options before sending credentials -issue#4001: Ensure Cacti can support PHP 8 -issue#4002: Pollers may sometimes not recover properly once they go offline -issue#4005: When viewing Realtime Graphs, validation errors may be seen for Size parameter -issue#4008: Massive decrease in poller performance due to unset variable -issue#4009: Ensure number format functions are consistent for i18n usage -issue#4021: Increase maximum number of device threads -issue#4031: Secondary filters on Data Collectors and Data Profiles do not work as expected -issue#4033: Action Icons changed to be consistent with admin UI -issue#4036: During discovery, Automation can throw unexpected errors due to null values -issue#4038: When creating new graphs, a second click is required even if not needed -issue#4042: RRD Updates can become disabled when saving performance options -issue#4043: Boost can become unresponsive when large number of archive tables exist -issue#4049: Enable sensitive graph information to be hidden from standard users -issue#4050: When showing table conversion script, the example path can be displayed incorrectly -issue#4056: Rename "Show Exceptions" checkbox to "Only Show Exceptions" which more actually reflects its function -issue#4060: When attempting to get client address, incorrect information may be returned -issue#4061: When getting date format, default options are not always honored -issue#4066: Enable Boost to utilize multiple processes -issue#4067: Disable BOOST image caching when using Graph Zoom features -issue#4068: When viewing graphs, individual graph sizes can be ignored in favour of global default -issue#4070: Summary data can fail to calculate when the RRDfile lacks the Data Source -issue#4073: Zoom functionality can fail when a graph has lost focus. -issue#4074: Realtime Images are not always adhering to defined format -issue#4075: LDAP Settings lead to confusion when setting up LDAP authentication -issue#4076: MariaDB tuning link points to a dead URL within System Utilities -issue#4077: If user has no permissions assigned and tries to login, a redirect loop occours -issue#4079: When checking current timestamps, make audit replace mysql function usage with preferred CURRENT_TIMESTAMP variable -issue#4080: Cacti regular expression searching does not quote expressions -issue#4082: RRDtool version detection not working for RRDproxy setup -issue#4083: RRDCleaner does not support RRDproxy -issue#4086: Large system performance negatively impacted due to $spikekill_templates behavior -issue#4092: On large systems, Primary ID usage on heavily used tables will overflow due to default MySQL variable size -issue#4095: When viewing Plugins page, icons can sometimes be misaligned -issue#4098: Graphs and Data Sources lists can become unresponsive on very large systems -issue#4100: When viewing User Admins, a division by zero error can sometimes be seen -issue#4105: Allow admins to define bulk walk repetition sizes -issue#4109: Realtime graphing can sometimes cause gaps in historic data -issue#4110: Graph Variables are not always parsed correctly leading to errors in log files -issue#4116: Upgrading large trees from 0.8.x to 1.x is slow -issue#4117: Script server throws errors if a command line argument includes a backslash -issue#4119: Implicit flushing is not always enabled, depending on OS, resulting in Script Server result issues -issue#4121: LDAP search filter cannot be configured if too many OUs or filters are nested -issue#4122: Automation causes SQL syntax errors when invalid operations are present -issue#4125: On completing the installation wizard, an internal server error can sometimes be observed -issue#4126: Deleting a damaged graph can sometimes led to removal of valid graphs too -issue#4127: When updating Trees, graph titles are calculated too often leading to unresponsiveness -issue#4130: On large systens, Graph creation can become unresponsive due to large number of data sources -issue#4131: A design flaw makes importing new Graph Template slow on large systems -issue#4134: MIB Caching does not always work as expected -issue#4135: On large Cacti installs, editing Data Templates is slow -issue#4136: When repairing database at command line, no option exists to skip table checks and force Data Source repair -issue#4141: Unusually long comments do not wrap when viewing graphs, and haven't in this CHANGELOG entry either -issue#4143: Prevent some false positive scenarios when detection orphan graphs -issue#4147: Poller items are evaluated too quickly when mixed polling cycles are used -issue#4148: Ensure automatic refresh of cacti log view works consistently -issue#4149: Ensure utilities show correct information when in offline mode -issue#4161: Data source template names should be shown in the respective "suggested values" sections -issue#4162: Allow Persistent Connections to MariaDB/MySQL to be configured -issue#4164: Unable to easily track Cacti login sessions when using database sessions -issue#4166: Auto-select text when focusing auto complete elements -issue#4169: Ensure Log Viewer 'Go' and 'Clear' buttons behave as expected -issue#4170: Enable full name tooltips for Alias/Description columns -issue#4173: Ensure Console menu icons are properly aligned -issue#4174: When using replication, ensure binary logging can be disabled -issue#4175: When syncing Templates, prevent false 'Damaged Graph' notifications from appearing -issue#4177: Simplify Graph/Template authorization searches when not using restricted mode -issue#4179: Correct class usage on Graph Sidebar Icons to be consistent -issue#4180: Remove logoff option when using basic authentication -issue#4181: Ensure realm names are more consistent -issue#4182: Allow Automatic Graph Creation to utilise Data Templates with Overriden Values -issue#4183: Processes can be terminated early due to incorrect timeout calculation -issue#4184: Ensure error logging is consistent when using CMD processor instead of spine -issue#4185: Updating Signal Handling to recommended standards for PHP 7.1+ -issue#4186: When editing a Fixed String on Tree Rule it is improperly displayed as "Unknown" -issue#4187: Provide more direct method fo navigating to Data Source from Graph -issue#4188: Replacement variable names are difficult to find for Aggregate Graphs and Templates -issue#4189: Allow links from a page to its specific documentation -issue#4190: Augmenting roles can incorrectly link to roles instead of realms in rare cases -issue#4192: Devices search can return a black screen if device name contains the hash/pound # character -issue#4193: Allow command line reindex to work with disabled devices -issue#4195: When search text includes # character, filtering does not always work as expected -issue#4197: When attempting to do a rollback on versions, the installer will not restart -issue#4199: Allow Cacti administrator to define a min refresh interval to prevent graph gaps -issue#4205: When removing Data-query Associated Graph Templates, it deletes the graphs Templates from bottom to top -issue#4206: When a report was delayed, the report's time is incorrectly changed -issue#4215: Poller recovery starts multiple processes and fails to recover properly -issue#4223: Parallel boost restart due to timeout can result in errors. -issue#4227: When remote poller is in offline mode, data is written to more tables than necessary -issue#4228: Under specific circumstances, redirection issues can occur after login -issue#4229: When no snmp option is set, automation can incorrectly report a number of issues -issue#4232: Database TLS configuration requires client certificates as well -issue#4233: Potential typos and incomplete parameter lists for database connection variables -issue#4241: Tree sort mechanism does not take sites into account -issue#4251: Caching of Graph Titles can be incorrect -feature: Add Theme 'Midwinter' -feature: Update phpseclib to version 2.0.30 -feature#645: Modify automation to test for data before creating graphs -feature#3513: Add hooks for plugins to show customize graph source and customize template url -feature#3572: Missing prompts during automation's device creation leads to blank data -feature#4012: Allow CSRF security key to be refreshed at command line -feature#4013: Allow remote pollers statistics to be cleared -feature#4113: Allow user to be automatically logged out after admin defined period -feature#4176: When replicating, ensure Cacti can detect and verify replica servers -feature#4210: Replace c3.js with billboard.js 1.2.16 -issue#3704: When generating a report, the Cascade to Branches function does not as expected -issue#3859: When viewing graphs, automatic refresh so not always work as expected -issue#3898: Realtime graph pop up counter bug -issue#3903: Undefined variable errors may occur when creating a new datasource -issue#3907: The cli-based installer does not exit with a non-zero exit code when error occurs -issue#3912: When an export is complete, sometimes the progress bar remains -issue#3915: When enabling many devices, a threshold can be reached causing a slowdown in the process -issue#3916: When performing actions against Devices, replicated device information could sometimes be lost -issue#3917: When using API to rename a tree node, backtrace may be incorrectly shown -issue#3919: When searching, valid pages can sometimes be shown as empty -issue#3920: When exporting data from graphs, not all data was properly included -issue#3924: Graph Templates filter is not updated after new graph created -issue#3926: Username and password on the login page is not visible in Classic theme -issue#3929: Improve wording of concurrent process and thread settings -issue#3930: Location filter should remove blank entries -issue#3931: When syncing data collectors, a reindex event may be triggered unnecessarily -issue#3932: Automation Networks allows discovery of invalid IP addresses -issue#3933: When changing permissions of the current user, they don't take effect immediately -issue#3935: When reindexing a device, an incorrect page was sometimes displayed -issue#3942: When repairing database, audit_database.php does not add missing columns -issue#3948: Spine 1.2.15 - Spine Encountered An Unhandled Exception Signal Number: '6' [11, Resource temporarily unavailable] (Spine thread) -issue#3949: Log page should not be empty if no log info exists -issue#3953: During upgrade, there are times when realms can be duplicated leading to SQL errors -issue#3957: When using ping.php, UDP response times are not interpreted properly -issue#3960: Improve warning you get when attempting to view a log file you don't have access to -issue#3962: When replicating files, scripts are not marked as executable -issue#3963: When creating plugin tables, collation is not set properly -feature: Update c3.js to version 0.7.20 -feature: Update Chart.js to version 2.9.4 -feature: Update phpseclib to version 2.0.29 -feature: Update PHPMailer to version 6.1.8 -feature: Use LSB shebang notation for cli scripts -feature: Add support for cactid daemon based launcher -feature#3923: Add ability to hide the Graph Drilldown icons -feature#3943: Add hooks for plugins to show custom Graph Source and custom Template URL (List View) 1.2.15 -issue#3643: When editing Maximum OIDs Per Get Request, blank value can cause errors -issue#3656: Boost may run more often than it should -issue#3693: Recache Event Loop can cause Interface Graphs to show gaps -issue#3703: When searching Graph Tree's, non matching devices remain visible -issue#3711: Page validation errors may occur when opening real time graphs -issue#3722: External Links do not always open if they are still open from previous usage -issue#3730: Cultural changes to various word usage -issue#3741: Replicate deleted device status instead of poller sync -issue#3743: Description field allows more characters entered than is stored -issue#3747: When installing or upgrading, LDAP functions may not always be included properly -issue#3748: Unable to remove discovered device -issue#3753: When installing or upgrading, PHP recommendations may not always return a valid value -issue#3755: Graph Templates has duplicate SQL delete statement -issue#3759: When syncing to remote poller, missing function errors may occur -issue#3760: When removing devices from remote pollers, devices may reappear without details -issue#3761: When removing devices, array errors may sometimes be recorded -issue#3763: Variable injection does not always work as expected -issue#3764: Editing Data Queries with multiple data templates can give errors about Suggested values -issue#3767: Progress bar does not provide enough visual information during long page loads -issue#3768: Some themes do not allow for a way to see which user is currently signed in -issue#3769: When viewing tables, allow users to force all columns to be visible -issue#3770: Column sizing is being lost between pages refreshes -issue#3771: When viewing input methods table, no ID is shown to help identify which method is being viewed -issue#3775: Filters do not always respect using keyboard to initiate searching -issue#3778: When exporting a data query, an invalid column name error can sometimes be shown -issue#3781: When checking if a view is allowed, having no session can result in errors -issue#3782: When removing devices via the CLI, undefined variable errors may be seen -issue#3786: Real Time Graphs may cause invalid index errors -issue#3790: On newer versions of MySQL/MariaDB, 'system' keyword can cause issues -issue#3793: Plugin setup can generate errors when reading options via system function -issue#3809: Plugin version numbers can be unexpectedly truncated -issue#3815: When PHP Session is set to autostart, an error can be reported as Cacti attempts to start it -issue#3820: When removing multiple items, selection process does not always work -issue#3821: When exporting colors, the indicator is not always removed upon completion -issue#3825: Unable to pass tree and leaf ID to 'graph_button' hook -issue#3827: When performing maintenance, various errors may sometimes be seen -issue#3828: When Guest User setting is active, current user is not always properly set -issue#3831: When installing Cacti, minor errors in text can be seen -issue#3835: Numbers are not always formatted properly when there are no decimal places -issue#3836: When viewing Real Time Graphs, an undefined index error may be recorded -issue#3844: Minor memory leaks and refresh issues when zooming on graphs -issue#3847: Real Time Graphs may sometimes fail due to folder permissions -issue#3849: Navigation can sometimes occur unexpectedly due to background timers -issue#3850: Trees management screen not reporting correct number of trees -issue#3858: Tree sequences can sometimes skip numbers during resorting -issue#3862: Guest user selection should not allow setting the currently logged in user -issue#3864: Links in Table Headers do not show clearly when in modern theme -issue#3868: Under some cases tree logic leads to undefined index errors -issue#3869: Cacti Data Debug can show errors if the Data Source is damaged or has been removed -issue#3871: When importing a data query, an invalid column name error can sometimes be shown -issue#3874: When using shift functions on graphs, negative values are not allowed -issue#3881: Correct issue when file is unreadable reporting no file was specified -issue#3883: Orphaned Plugins have no option to be removed -issue#3884: Update MySQL recommendations for Character Set and Colation -issue#3888: Correct sorting of IP addresses to be numeric not alpha -issue#3890: Saving a device should not always repopulate the poller cache -feature: Update FontAwesome to Version 5.14 1.2.14 -issue#3676: Device not showing up in device page but showing up in Monitor tab -issue#3678: More or Equal incorrect highlighting max_heap_table_size and tmp_table_size -issue#3694: Spikekill `percent` is converted from percent to decimal twice, making it 1/100 of the true size -issue#3713: When sorting data debug checks by user, no results are shown and errors recorded -issue#3719: When tooltip is too long, the scroll bar exists, and cannot be scrolled, which makes the tooltip be hided -issue#3723: Improper escaping of error message leads to XSS during template import preview -issue#3728: Invalid uptime is not handled properly -issue#3737: Poller functions may not run if 'processes' table is missing -feature#3615: Poller keeps using old IP address for a device 1.2.13 -security#3544: jQuery XSS vulnerabilities require vendor package update (CVE-2020-11022 / CVE-2020-11023) -security#3549: Lack of escaping on some pages can lead to XSS exposure (CVE-2020-23226) -security#3582: Update PHPMailer to 6.1.6 (CVE-2020-13625) -security#3622: SQL Injection vulnerability due to input validation failure when editing colors (CVE-2020-14295) -security#3628: Lack of escaping on template import can lead to XSS exposure -issue#3517: When generating reports, function looping can occur resulting in 100% cpu usage -issue#3525: When viewing Graphs, zoom functionality prevents drag and drop of image -issue#3527: When using 95th Percentiles, undefined index errors can be generated -issue#3532: When using Realtime, if no graph contents are present an error is generated -issue#3533: When exporting data, Start date for RRDfile does not match start date of first data row -issue#3536: When using Navigation Menu, Show/Hide in Response mode does not always work -issue#3538: When using Realtime, race conditions between browser and function loading can occur -issue#3543: When exporting CSV data, Unicode prefix is not properly set -issue#3551: Authentication can fail when using Web Basic Authentication and Template User -issue#3553: When attempting to view an aggregate graph that does not exist, many errors are generated -issue#3563: Current orphan handling disrupts graphing transient indexes -issue#3566: Automation incorrectly attempts to use MacTrack to duplicate options -issue#3567: When Boost runs, locks are not always released properly and crash is detected -issue#3569: Invalid font results in large number of log entries -issue#3571: Correct various runtime errors due to incorrect message variables -issue#3574: Saving Graph Template Items take a long time on large systems -issue#3577: Hosts are being incorrectly filtered when first displaying with filter set to all -issue#3579: Graphs can incorrectly show as 'Empty Graph' -issue#3581: Realtime graph window is not resizing properly -issue#3588: Validation warnings are generated when viewing/editing devices -issue#3594: Automation hangs for certain schedule types -issue#3595: Template to Device sync text is not consistent -issue#3596: When importing template, resources aren't checked properly -issue#3597: Template to Device sync provides no feedback -issue#3598: When editing graphs and graph templates, back button results in broken page -issue#3599: When downgrading, templates are fully selected for install -issue#3601: When a device is down, instate can show wrong time -issue#3607: When session timeout occurs, subsequent authorized access to areas can become blocked -issue#3611: Allow CHANGELOG to be viewable from the GUI -issue#3613: When modifying trees, devices and graphs lists ignore Autocomplete Rows setting -issue#3614: When section tabs wrap, the title of the first section can become obscured -issue#3624: When previewing graphs, sometimes the images fail to appear -issue#3629: Log files are not rotated properly on remote pollers -issue#3631: Command line scripts do not allow an unlimited runtime causing timeouts -issue#3632: When mysql connection fails, various unexpected errors are recorded -issue#3635: Automate generates undefined index errors when communicating with remote pollers -issue#3639: When updating a device, duplicate entry errors occur when inserting to the database -issue#3646: Adding datasource fails from CLI due to missing function -issue#3651: Editing any item on an Aggregate Graph that has been converted to a normal graph breaks entire graph -issue#3655: Rare race condition between Boost and Poller can result in unexpected missing table errors -issue#3659: When viewing logs, unexpected 'needle' errors can be seen on rare occasions -issue#3663: Disabling a Data Collector can cause unexpected errors -issue#3668: When Input Field is in error, message reports field will be highlighted which is incorrect -issue#3669: When adding an Input Field, the Input Method can be renamed unexpected -issue#3673: Spikekill does not receive correct `avgnan` value when launching from GUI -issue#3676: Device not showing up in device page but showing up in Monitor tab -issue#3681: Item movement arrows do not properly align on all themes -issue#3682: When in 'Time Graph View' mode, Zoom features do not work correctly -feature#3611: Allow CHANGELOG to be viewable from the GUI -feature#3647: When adding datasource fails from CLI, created Datasource ID should be printed -feature#3666: Update jstree.js to 3.3.10 -feature#3688: Update phpseclib to 2.0.28 1.2.12 -security#3467: Lack of escaping of color items can lead to XSS exposure (CVE-2020-7106) -issue#3422: When Graph Item is not linked to a data source, Comments do not always get variables substituted correctly -issue#3424: Hosts are being incorrectly filtered when no location filter is set -issue#3427: When exporting to a CSV with unicode characters, contents can become garbled -issue#3429: When using SNMP v3, Automation can report extraneous warnings -issue#3432: Rare race condition exists when both boost and dsstats enabled -issue#3434: When attempting to exploit Cacti using alert, unexpected errors can be seen -issue#3436: Unable to login due to incorrect default of Cookie Domains in config.php.dist -issue#3438: When upgrading to 1.2.11, installer can appear to stop at 42% -issue#3447: SNMP Issues on recent version of PHP -issue#3449: When viewing the installation wizard's directory permission step, items are overlapping unexpectedly -issue#3450: When installing Cacti under XAMPP and PHP 7.4, exceptions are being recorded and installation fails -issue#3452: New Content-Security-Policy prevents External Links from being opened -issue#3454: Cacti's Reports are not displaying messages correctly -issue#3457: Graphs can not properly handle negative axis values -issue#3459: When installing a new remote poller, connection tests can incorrectly fail -issue#3460: Addtional changes to allow plugin folder/display names to be handled better -issue#3462: Increase default memory limit for cli scripts to prevent runtime memory issues -issue#3463: When listing VDEF's, selecting 'has graph' can cause unexpected exceptions in logs -issue#3468: Graph rules cannot be created for automation -issue#3474: The SSL option to set the SSL_CA should be optional for Client Connections -issue#3477: Boost leaking memory when a large number of Data Sources disabled -issue#3478: Reindexing can sometimes run longer than expected -issue#3479: When viewing the Data Query table interface, the Data Input Method should be right aligned -issue#3483: When recording log entries, cacti should default to hyphenated date format -issue#3484: When editing SNMP v3 passwords, previous setting is not obfuscated -issue#3488: In automation, when viewing an 'SNMP option set', the private passphrase is in clear -issue#3495: When installing templates, default 'all' selection will reset all existing graphs, removing customisations -issue#3496: Graph Items can show a double percent sign incorrectly -issue#3502: When viewing Graphs, can not switch between list, preview and tree submodes -issue#3504: Viewing graphs before the poller has run for the first time can produce unexpected errors -issue#3505: When viewing graph previews, clicking Go or Refresh prevents calendars from working -issue#3506: After successfully logging in, a user can become automatically logged out again -issue#3507: Changes to JavaScript's Storage API cause exceptions to be thrown -issue#3510: Only guests can actually guest only pages, logged in users are denied access incorrectly -issue#3512: When plugins update, registered files list cannot always be updated -issue#3520: When viewing graphs, shifting time does not work when using non-english languages -issue#3576: LDAP Authentication succeeds, but login fails due to bad session handling -issue#3629: Log files are not rotated properly on remote pollers -feature#3480: Created 'custom_denied' hook to allow customisation of permission denied notifications -feature#3498: Update js.storage.js to 1.1.0 -feature#3499: Update jstree.js to 3.3.9 -feature#3500: Update phpseclib to 2.0.27 1.2.11 -security#1566: Add SameSite support for cookies -security#1985: Cookie should be properly verified against password -security#3342: CSRF at Admin Email -security#3343: Improper Access Control on disabling a user. -security#3414: Update to jQuery 3.4.1 to resolve XSS issues with jQuery 3.3.1 -issue#2265: When attempting to save Graph field, query_ifSpeed is not properly validated -issue#2400: Allow ability to duplicate site settings -issue#2428: Make plugins non-case sensitive for folder names, whilst allowing nicer display names -issue#2580: When running DSSTATS, system isn't properly detecting that another is already running -issue#2853: Discovered Devices filtering do not include snmp description or name -issue#3231: Allow user to unlock a tree that has been locked for editing by another -issue#3237: Report gets resent every poller cycle -issue#3247: Language source files do not update "PO-Revision-Date" attribute -issue#3261: Automation rules aren't run for new devices on remote data collectors -issue#3296: Bad PHP memory limit values can result in failed upgrades -issue#3299: When using php-snmp and setting SNMPv3, warning is now shown as library does not support it properly -issue#3303: When installing under Windows OS, path expansion is not converted to PHP required format -issue#3310: When using 32-bit OS, automation errors can be seen due to subnet mask calculations -issue#3312: Console menu does not auto-expand for graph item editor page -issue#3313: When installing, multiple issues can be seen due to bad packages -issue#3314: Script Server has invalid debug code left in -issue#3317: Warnings can appear from CSRF Magic library due to multiple token values being found -issue#3319: Errors can occur upgrading from 0.8.x due to incorrectly detected data source profile id -issue#3322: When searching for LDAP accounts, allow recursive searching -issue#3330: Packages that are not properly formatted can cause installation issues -issue#3334: When upgrading from 0.8.x Automation SNMP Options should be populated -issue#3335: Unable to hide Device based Aggregate Graphs on Tree -issue#3336: Plugins need the ability to relax some content security policies in order to work properly -issue#3340: Undefined variable warning can appear when using 95th percentile graphs -issue#3341: MoTranslator does not appear to be handing null values properly -issue#3345: When attempting to refresh datetime picker, unexpected results can appear -issue#3346: When attempting to rewrite octet strings, extra space breaks pattern matching -issue#3348: When attempting to handle Orphans and/or Sync Graphs, results are not as expected -issue#3349: Prevent setting the PHP variable max_input_vars since it is read only -issue#3350: When editing a data source template, inconsistent results can be seen due to database query -issue#3355: When viewing raw graph data via the GUI, values are not always calculated correctly -issue#3357: Tree Search textbox resizes to 0 in some cases -issue#3360: When using guest accounts, after several timeouts result in refreshes, guest becomes logged out -issue#3363: The current user and user group permissions pages are not responsive -issue#3367: When Data Queries timeout, data is removed from the Host SNMP Cache table causing issues -issue#3368: Saving a Graph Template Item fails due to missing includes -issue#3373: When logging in via LDAP, ActiveDirectory would sometimes report insufficient access -issue#3375: When polling more often than default period of collecting data, distribution of collected data was not occurring -issue#3376: Improve speed when recovering from a poller from offline state -issue#3378: When attempting to check whether to include MoTranslator, typo makes it appear unavailable -issue#3380: php error when trigger threshold sendmail -issue#3386: Second data collector shows as running when its has no items to gather -issue#3387: Minor corrections to CSRF Magic -issue#3388: Naming of CLI programs does not always match name used within syntax usage advice -issue#3390: Incorrect breadcrumb bar if current tab is not "Graphs" -issue#3402: Cacti scores low on performance audit on lighthouse audit -issue#3408: CSRF Secret path is not passed properly when attempting to initialize secret -issue#3409: Issues with navigation link activations to other base Cacti pages -issue#3410: Zoom looses focus in advanced mode while crossing chart border -issue#3411: When upgrading a primary server, full synchronization is not happening as expected -issue#3412: When upgrading a primary server, automation templates are removed -issue#3413: When upgrading and choosing to upgrade your packages, installer finishes without package data in log -feature#1551: Allow system uptime to be a variable for use with graphs -feature#1990: Plugin Realm should have a 'role' to help maintain changes between plugins -feature#2110: Add Refresh Interval to Data Collectors display -feature#2156: Add Location based filtering -feature#2236: Allow for Purging of Data Source Statistics from the GUI -feature#2268: Restore ability to duplicate a data profile -feature#2534: Enhance table navigation bars to support systems with larger number of items -feature#2688: Increase length of Graph Item 'value' field to support pango-markup better -feature#3304: Allow Basic Auth Accounts to be mapped by CSV file -feature#3366: Make form elements under checkbox_groups flow using flex grid style -feature#3374: Set the domain attribute to secure cookies for the 'remember me' option -feature#3403: Enhance the "Graph Debug Mode" to display RRDtool Command lengths and excess warnings 1.2.10 -security#3285: When guest users have access to realtime graphs, remote code could be executed (CVE-2020-8813) -issue#3240: When using User Domains, global template user is used instead of the configured domain template user -issue#3245: Unix timestamps after Sep 13 2020 are rejected as graph start/end arguments -issue#3246: When upgrading with remote collectors, sync status does not always return properly -issue#3250: When PHP memory limit is set to -1, recommendation value fails -issue#3253: Upgrade can stall when checking permissions on csrf-secret.php -issue#3254: Installer shows script owner rather than running user for suggested chown command -issue#3266: When setting User Groups to 'Defer to the User', setting can lead to user being told they have no permissions -issue#3269: When searching Graphs under a Chinese language, an unexpected error as sometimes shown -issue#3274: When editing a tree, multiple device drag/drop does not work -issue#3276: When spine aborts, script server can be left wanting or generating unnecessary logs -issue#3277: When boost does not find an initial time, numeric errors can be raised -issue#3281: When changing Graph Template options, incorrect image format may be selected -issue#3282: Graph's can be sized incorrectly if image is SVG format -issue#3283: When setting a file path, valid characters not recognised properly -issue#3287: When using graph template 'Cacti Stats - User Logins', an incorrect count of invalid users can be seen -issue#3288: When on Device page, pressing 'Go' on the filter caused Device New menu pick to appear -issue#3289: When using CMD.PHP, poller id is not always shown properly -issue#3290: When using CMD.PHP, inconsistent device logging levels may occur -issue#3298: When initialising fields in JavaScript, text/textarea elements have width set to zero if it is hidden by parent -issue#3302: Editing a Graph Template does not show the Data Template name 1.2.9 -security#3191: Lack of escaping on some pages can lead to XSS exposure (CVE-2020-7106) -security#3201: Remote Code Execution due to input validation failure in Performance Boost Debug Log (CVE-2020-7237) -issue#2937: Devices still show in lists despite being deleted -issue#3038: When editing an aggregate on smaller screens, layout may not be correct -issue#3136: Upgrade may fail between 1.2.7 and 1.2.8 if incompatible database format used -issue#3142: Chrome sets graphs tree navigation view to width 0px -issue#3146: Unable to create aggregate graphs on new installations -issue#3149: After refresh of page, tooltips stop working -issue#3150: When using Time Graph View, Zooming can cause errors -issue#3151: Passing glue string after array is deprecated in PHP 7.4 -issue#3155: Aggregate does not correctly follow color template when reordered -issue#3156: On new installs, gprint_format was missing from table aggregate_graphs -issue#3157: Back button not working properly with Classic theme -issue#3158: Classic theme show only 3 tabs on mobile device. Don't show Console menu -issue#3159: PHP Memory is not correctly identified when value is not in megabytes -issue#3161: When the poller_output_boost table is missing, recreate it before a poller run -issue#3163: When using RPMlint, Free Software Foundation address is shown to be incorrect -issue#3165: Zoom looses its focus after all graphs on page rendered -issue#3166: When changing zoom level, graphs are resized inappropriately at the end -issue#3167: Installer should initialize the csrf-secret.php file automatically -issue#3168: sqltable_to_php.php script does not pick up row_format -issue#3177: Remove legacy plugin hook that presents potential 3rd party security issues -issue#3178: The change password page is not displaying the rules -issue#3180: Receiving undefined index errors when working with some Data Queries -issue#3181: When configuration file is unreadable, Cacti shows database connection errors if non defaults are needed -issue#3182: When a database connection error occurs, there is no way to report actual error -issue#3184: Improve program path detection by using system path and PHP_BINDIR -issue#3193: Starting with MySQL 5.7 some sql_mode variables are required for some plugins -issue#3196: Minimize use of eval() in JavaScript due to emerging Content-Security-Context guidelines -issue#3200: Unable to mass change Graph Template image format in mass -issue#3206: Converted aggregate graph cannot be edited -issue#3209: Error occurs when Creating New Graphs through Automatically Added Devices using Sync Device Template -issue#3216: When editing a Data Source Profile size is shown as 'N/A' -issue#3224: When removing graphs by command line, regex is not properly validated when empty -issue#3225: Unable to Import Templates due to invalid dependency hash -issue#3226: When processing secpass login, failed logins are not recorded -issue#3228: Login page does not remember the last realm used by user -issue#3232: When editing HRULE and VRULE items, color selector was not presented -issue#3233: When working with non-templated graphs, it can be difficult to determine what items represent -issue#3235: Transient errors may occur with table poller_output_boost_arch 1.2.8 -security#3025: CVE-2019-17357 When viewing graphs, some input variables are not properly checked (SQL injection possible) -security#3026: CVE-2019-17358 When deserializating data, ensure basic sanitization has been performed -security#3066: When using HTTPS, secure cookie to prevent potential weakness -issue#1228: Any tree or branch with a long name force main content off screen -issue#2133: Long snmp_indexes are being cut off -issue#2888: Long hostnames cause template filter to go off page -issue#2987: Changing Color Template does not update Aggregate -issue#2989: Allow Remote Data Collectors to maintain their own path variables -issue#2991: Cacti Statistics device template can generate unexpected errors -issue#2995: When editing a report, column setting may be ignored incorrectly -issue#2996: When editing a user, graph options do not properly reflect previously saved settings -issue#2998: Session performance issues due to excessive use for database storage -issue#2999: Blank arguments can lead to extra spaces in script arguments -issue#3006: Boost generates undefined variables warning during poller run -issue#3011: i18n logging does not check write permission exists -issue#3012: When viewing realtime graphs, some input variables are not properly checked -issue#3013: Allow legends to be modified for Aggregate Graphs -issue#3017: Automation network range with spaces fails validation -issue#3019: User selected language is not always adhered to -issue#3021: Tree view cuts off at the bottom of page on modern theme -issue#3023: When clicking highlighted tab, side panel is not always shown/hidden correctly -issue#3027: Aggregate Graph re-ordering does not work -issue#3028: When zooming a graph, unable to reach edge of graph without losing focus -issue#3030: Pace continues to run even after a page is finished rendering -issue#3032: Graphs may select MAX instead of AVERAGE as consolidation function even if there is no item with MAX present. -issue#3035: When editing a tree, can not remove entries due to CSS bug -issue#3037: When emptying poller output using cli, debug functions are not properly included -issue#3039: Allow packagers to be able to specify an alternate location of csrf-secret.php file -issue#3040: When running automation, discovery can still run even if cancelled -issue#3041: When running automation, scans do not always respond to being cancelled -issue#3042: When running automation, scan can fail when selecting remote pollers -issue#3045: When viewing Aggregate Graphs, an error due to undefined referrer may occur -issue#3047: When saving settings, ignore remote pollers who have not checked in recently -issue#3050: When viewing graph trees, some input variables are not properly checked -issue#3052: When editing CDEF's, slow database performance can occur -issue#3053: When viewing graph thumbnails, some input variables are not properly checked -issue#3055: During install/upgrade, database tests are not performed correctly -issue#3059: When using nth_percentile, correct value is not always returned if using MAX consolidation -issue#3060: When upgrading from older MySQL databases, format is not changed from compact to dynamic -issue#3061: When running automation, allow SNMP to be used as a ping method -issue#3068: When administrating users, some input variables are not properly checked -issue#3070: Improve database logging when a crashed table is encountered -issue#3073: Automation network range does not always produce the correct start/end values -issue#3078: When viewing graph debug from remote data collector, File Not Found warnings can appear incorrectly -issue#3079: Allow domain names to be stripped from a device's long description -issue#3080: Remote Agent throws warnings that graph_nolegend has not been sanitized -issue#3085: When editing a poller, ensure each listening IP is unique -issue#3081: External Links are not showing a glyph when they appear on the Console menu -issue#3089: When viewing graphs in realtime, undefined variable can be logged for 95th Percentile graphs -issue#3099: Graph template 'Linux - Memory Usage' has the wrong unit on its vertical_label -issue#3101: Polling times can be slightly inconsistent due -issue#3104: When viewing graphs, a byref error can be seen in the error logs -issue#3105: When viewing hosts, some input variables are not properly checked -issue#3111: When adding devices via command line, bad SNMP versions are not reported -issue#3112: When zooming on Graphs, too many requests are being made causing slowness -issue#3114: Support for USB devices that change name due to their hosts restarting -issue#3118: When converting tables, the dynamic row format should be selected -issue#3119: Main Data Collector should perform a Full Sync whenever it is installed/upgraded -issue#3120: Correct issues causing incompatibility with PHP 7.4 -issue#3121: When converting tables during install, show what will be changed -issue#3123: Named colors table is not properly imported/upgraded -issue#3124: When a second data collector is added, boost is not enabled automatically -issue#3128: i18n handler checks for existence of wrong mo file -issue#3129: Logout repeated occurs even when already logged out -issue#3132: Installer fails to continue if automation range is array of networks -issue#3098: Support percent sign(%) in graph gprint item like legend area. -feature#3077: Allow disabling remote poller resource cache replication to support upgrade testing 1.2.7 -security#2964: CVE-2019-16723 Security issue allows to view all graphs -issue#1181: When opening the Scheduler, it may appear off screen when opened near the bottom of a window -issue#2894: When using Remote Data Collectors, database information and recommendations may show Incorrect values -issue#2895: When using data sources from different RRDs, Percentile calculation may be incorrect -issue#2899: When displaying a form, variable substitution may not always work as expected -issue#2922: When running a data query, the result may come back as undefined -issue#2925: When using consolidation functions, retrieving the first step can cause errors -issue#2926: When editing a graph, variable validation errors may prevent changes from being saved -issue#2929: Boost performance may become poor even in single server mode -issue#2930: RRDtool can generate errors to standard output which can corrupt images -issue#2932: When RRDTool generates an error creating an image, it is not always reportedly properly -issue#2936: Installer will loop when number of tables exceeds PHP's max_input_vars limit -issue#2938: Under CentOS packages, upgrade_database.php script uses incorrect location for DB upgrade scripts -issue#2940: Images are not always properly sized until the page size changes -issue#2949: Order icons may not be properly aligned -issue#2951: Allow legends to be modified for Aggregate Graphs -issue#2958: Drop down autocomplete lists do not always open as expected -issue#2961: When syncing device templates, undefined function may be raised -issue#2963: When running ss_cpoller script, avgTime incorrect returns maxTime -issue#2966: Realtime popup windows do not always honor settings -issue#2967: When using Spikekill, gap and range fill are not operating as expected -issue#2970: When a user edits their profile, buttons may appear as unusable whilst still being enabled -issue#2973: User menu does not always display properly on mobile devices -issue#2974: Script Server can raise unexpected warnings when 'arg_num_indexes' set but not found in data source -issue#2975: Datasource Debug does not properly handle European numbers in certain circumstances -issue#2976: Boost messages should be stored in their own log file -issue#2977: Data updates with past timestamps can cause boost errors -issue#2978: Moving hosts between data collectors is slow -issue#2979: Multi Output Fields are not parsed correctly -issue#2984: When checking SQL fields, value was not always primed -issue#2986: Selecting 'Devices' menu pick closes 'Management' menu -feature#2943: Allow all Data Queries of a device to be re-indexed at once -feature#2952: If device is down or threshold breached, highlight in tree view -feature#2985: Update phpseclib to 2.0.23 1.2.6 -issue#2794: Graph template not saved on graph edit -issue#2825: "innodb_doublewrite = off" possibly dangerous recommendation -issue#2829: PHP recommendations always see memory limit as unlimited -issue#2830: Disabled Top/Bottom external links should not be displayed -issue#2832: Install/Upgrade log does not show anything -issue#2833: Undefined index can occur when data source does not have an snmp_index -issue#2834: Boost performance drops on very large systems -issue#2835: When creating graphs and inneficient query is causing long creation times -issue#2837: Sunrise theme does not render checkboxes 100% correctly -issue#2838: jQueryMultiselect does not match upstream due to forking -issue#2839: Non regular expression search filters don't support international characters -issue#2841: Total count is wrong after searching for External Link pages -issue#2843: DSStats reruns Daily Aggregation every minute -issue#2844: Autocomplete settings for passwords are not properly defined -issue#2845: Data Template can't be edited when it is in use -issue#2846: Allow tooltips for section headers with 'question' icon -issue#2847: Permanently convert an Aggregate to a regular graph -issue#2848: Aggregate graphs get clipped due to incorrect date range -issue#2856: Aggregate issues with very long RRDtool command lines -issue#2857: When trying to find the best index to use, a 'must implement Countable' warning appears -issue#2860: When testing remote poller connections during install, undefined variable warning can occur -issue#2862: Automation does not calculate network information correctly for single hosts -issue#2866: Add poller ID to subject for admin notifications -issue#2869: When creating aggregates from Graphs, JavaScript issues can occur -issue#2872: Add support for MySQL 8 and use of grouping as name for a column -issue#2875: Undefined variable when removing spikes in some cases -issue#2877: When attempting to send report, undefined function 'get_tinespan' messages appear -issue#2878: Function get_magic_quotes_gpc() is now deprecated in PHP 7.4 -issue#2879: Switching from authPriv to authNoPriv produces error when saving -issue#2884: Replication continues to occur when poller has been disabled -issue#2891: Script server script ss_fping.php generates error when not called by script server -issue#2901: Poller overrun warning message is badly worded -issue#2902: Mailer incorrectly reports it is sending to noone -issue#2903: PHP recommendations can generate a warning causing JSON issues -issue#2905: Sorting plugins by version can lead to unexpected ordering -issue#2907: SSL column for multiple pollers can be incorrectly set causing SQL errors -issue#2908: When URL_PATH is blank, it should assume that it is '/' -issue#2909: Correct usage of affect vs effect in strings -issue#2910: Can not show user menu when in portrait mode on mobile devices -issue#2911: Graph variables are not always encoded to JSON properly resulting in warnings -issue#2912: Navigation cache can sometimes be corrupted resulting in a non-array value -issue#2913: When adding new graphs, the type of graph is not remembered -issue#2917: Action icons next to graphs can sometimes become unselectable due to zoom -issue#2919: When refreshing menu, selected items are sometimes lost and submenu items can become hidden 1.2.5 -issue#1978: Popup Menus can appear off screen when using Graph Thumbnails -issue#2282: Installation wizard does not detect RRDtool version correctly -issue#2524: When editing a tree, Drag and Drop of Devices does not always work as expected -issue#2573: Associated Graph Template for Data Query can sometime disappear -issue#2656: GPRINT text_format does not replace Data Query and Host Fields -issue#2661: Automation does not always calculate network range/subnet correctly -issue#2663: Some legacy Data Queries can not determine their index order causing broken graphs -issue#2674: Large strings can sometimes cause language translation can fail -issue#2719: Automation may sometimes create empty graphs -issue#2721: When replacing '|input_xxxx|' strings, undefined index can occur -issue#2722: Calls to _db_replace() are not consistent resulting in warnings -issue#2723: When replicating to remote pollers, Undefined Variable errors may be seen -issue#2724: When graphing HRULE items, 'Only Variables should be passed by reference' error may be seen -issue#2725: When viewing logs in utilities, filenames should be limited the same as clog -issue#2726: During Automation logging, include the Rule ID that triggers the creation of an item -issue#2732: When using basic authentication, automatically strip any @domain information -issue#2734: Allow non-english labels to be used on Graph Templates -issue#2727: When using Polling Hosts Template, warnings can be issued when CMD.PHP is the poller -issue#2733: When processing SNMP data, space delimited hex strings do not always convert into MAC addresses -issue#2735: Mouse cursor should show as default pointer if column is not sortable -issue#2736: When using MySQL 8 or above, 'function' is considered a reserved word unless quoted -issue#2741: Various errors can occur due to undefined or incorrect variable names -issue#2742: Various errors can occur due to undefined or incorrect variable names -issue#2743: Attempts to close a tooltip when no tooltip has been set may cause errors -issue#2744: When changing password, undefined index error can occur if user is not logged in -issue#2748: If PHP location setting is invalid during install/upgrade, this should be notified on modules page -issue#2750: When performing multiple sort, highlighting of content occurs -issue#2751: When editing a Tree, display filter may not allow 'All' option to work -issue#2752: When running verbose query on device, you are unable to copy text from items -issue#2753: Unable to copy entire verbose query using clipboard command -issue#2757: Page Navigation can be subject to XSS injection -issue#2758: Various sensitive directories are browsable if web server directory browsing is enabled -issue#2760: Unable to add items into a report -issue#2762: Creating an aggregate graph can sometimes fail due to unknown RRD tools error -issue#2766: When modifying Aggregate Templates, changes are not always cascaded to Graph -issue#2768: Aggregate Graphs may sometimes show the wrong row count -issue#2770: ItemType is not updated when saving Report Items -issue#2772: Add tooltip support to html_header() and html_header_checkbox() -issue#2775: Remote pollers may sometimes fail to replicate data back to main system -issue#2777: Attempting to edit a non-existent report generates an error -issue#2778: When rendering graphs, resizing can sometimes occur repeatedly -issue#2779: On new installations, automation rules for Interface Graphs are broken -issue#2780: Upgrade database script not actually upgrading Cacti -issue#2782: When replicating the syslog plugin, the configuration file is ignored causing errors -issue#2783: When limiting the number of displayed characters, international characters may sometimes display incorrectly -issue#2784: When removing a device with graphs but no data sources , errors are generated -issue#2785: When editing a graph rule, warnings incorrectly appear about unsaved changes -issue#2792: When a checkbox 'friendly name' has a comma, checkbox functionality stops working -issue#2797: When upgrading from before 1.x, SuperLinks view permissions may not be correct -issue#2799: Under heavy use of Real Time Graphs, SQL errors may start appearing -issue#2800: When editing a tree, using a comma in the search field stops search from working -issue#2802: If a Device lacks ifName, an alternative field is not always found even if available -issue#2807: When editing a Data Template that has dependant graphs, some attributes should not be modifiable -issue#2808: When navigating a tree, the layout may unexpectedly move -issue#2814: When viewing the utilities page, HTML tags may be seen rather than rendered -issue#2816: When viewing logs, paging does not always working correctly -issue#2818: Automation can sometimes incorrectly add duplicate devices with the same sysname -issue#2820: When path is blank, is_resource_writable() will generate 'Uninitialized string offset: -1' -issue#2821: When the desired locale can not be located, a number format issue may occur -feature#2728: Update phpseclib to 2.0.17 -feature#2809: Update c3.js & d3.js -feature#2730: Update jstree.js to 3.3.8 -feature#2754: Allow Devices, Graphs and Data Sources to be searched by ID -feature#2765: When editing a tree, allow cascading selection of available graphics -feature#2805: Merged plugins are not always upgraded correctly -feature#2823: Enhance the splice_rrd.php to be able to merge RRDfiles of differing step 1.2.4 -issue#2523: Send A Test Email stops working under PHP 7.3 -issue#2589: Missing RRD file can cause DSSTATS to throw errors -issue#2590: When installing, chosen language is sometimes lost -issue#2591: Menu selection does not always match selected page/section -issue#2592: When viewing an aggregate graph, 'Display graphs from this aggregate' option does always not work -issue#2593: Unable to migrate aggregate graphs to matching aggregate template -issue#2598: Creating an aggregate graph without associated template causes RRDtool error -issue#2599: Creating/Updating an Aggregate Graph to use LINE/STACK's generates invalid SQL statements -issue#2604: When adding a dataquery, SQL errors can be generated -issue#2605: When installing, checking database tables can cause errors -issue#2608: db_update_table() function should not require an engine type or comment -issue#2609: When updating from earlier than 1.2, timezone column might not exist -issue#2610: Data Sources troubleshooter generates warning that each() function is deprecated -issue#2612: When RRDtool fails to initialize, DSStats generates lots of warnings -issue#2618: ifAdminStatus in snmp_queries/interfaces.xml -issue#2621: File paths that accept blanks are not allowing blanks -issue#2622: Various undefined variables generate errors within database.php -issue#2623: When using form_text_area(), invalid HTML can be generated -issue#2627: Some filenames can be lost in log file selection list -issue#2629: When upgrading, ldap library is not loaded properly due to incorrect paths -issue#2632: Automated Networks are not being properly replicated to additional pollers -issue#2635: When running automation scans, database connection should be forced to central database -issue#2638: Support disabling PHP SNMP extension -issue#2645: Some URLs are incorrectly calculated -issue#2649: Automation not creating graphs when there are custom items -issue#2650: Several undefined variables are generating warnings -issue#2662: HRULE objects broken in some cases -issue#2668: Trailing parentheses are removed from the SNMP system description -issue#2672: Cacti Install on Windows Fails -issue#2676: Skin paper plane not working on iPhone XR -issue#2678: Call to undefined function _() in data_queries.php -issue#2679: Users with passwords that do not meet complexity requirements are not redirected to the Change Password page -issue#2680: Remove deprecated $php_errormsg usage -issue#2689: Increase boost maximum memory limits -issue#2693: Graph links do not contain URL path causing links to fail -issue#2698: Avoid duplicated icon in the main.js of all themes -issue#2699: Login option "Show the page that user pointed their browser to" does not work properly -issue#2702: sqltable_to_php.php does not always generate valid table data arrays -issue#2707: Some pages that have permission errors dont raise proper messages -issue#2712: PHP memory should be unlimited in scripts that need more memory than the default -issue#2713: SNMP System Description with UTF8 strings properly are not properly parsed -issue#2718: When links are converted to ajax calls, mailto links should not be included -issue#2720: When calculating percentiles, the value is incorrect as the steps are not placed in correct order -issue#2822: When stderr log file is not populated, clog generates 'empty needle' error -feature#2538: Allow users to change default method of removing data sources when deleting graphs -feature#2539: Allow users to set the default graph lock status -feature#2540: Allow users to enable/disable graph tree history -feature#2646: Allow application of automation rules on CLI -feature#2654: New hook to notify plugins of user profile changes ('auth_profile_update_data') -feature#2664: Add option to purge spikekill backups -feature#2701: Provide option to continue graphing objects that loose their index -feature#2704: Device and template cache do not refresh properly 1.2.3 -issue#1063: Tree View does not display the last item correctly under 'Modern' theme -issue#2282: Install Wizard does not Detect RRDtool Version on Windows -issue#2430: "New Device" menu item showing as selected incorrect when "Devices" clicked -issue#2435: Tree View becomes narrower and narrower when expanding/collapsing nodes with long names -issue#2449: Index incorrectly changed to 1 if the index is alphanumeric when OID/REGEXP: or OIDVALUE/REGEXP: -issue#2452: Missing 'getSNMPQueries()' function when calling add_data_query.php -issue#2453: When running add_graphs.php, cannot retrieve list of valid snmp values -issue#2460: sqltable_to_php.php does not export 'default' value of columns correctly -issue#2456: When attempting to display actions that can be taken, having no actions caused error -issue#2457: When creating a graph, undefined function prevents confirmation from appearing -issue#2459: ss_host_disk.php attempts to return an empty array instead of a string -issue#2463: Partial Fix: Display zombie data sources without graphs -issue#2464: When viewing a User's effective permissions, disabled devices should show denied -issue#2465: Too many groups hide effective permission column when viewing User's effective permissions -issue#2466: Manual data source creation is broken -issue#2469: When using Matching Objects filter within Automation Graph Rules, unexpected redirect occurs -issue#2471: When Creating a new Graph Template, clear the Graph Template permissions cache -issue#2472: Bad navigation items cause Array to string conversion errors -issue#2474: REGEXP_SNMP_TRIM does not handle Gauge fields properly -issue#2475: When resetting filters, multiple sort session variables do not always reset properly -issue#2476: When using CMD.PHP for polling, device polling time is not updated -issue#2477: When saving a Data Input Method, Output Field name changes to incorrect value -issue#2478: When saving a LINEX type Graph Item, the Line Width value is too restrictive -issue#2479: RPN function select list should be sorted when editing CDEF and VDEF's -issue#2480: RRDtool versions in Cacti not granular enough -issue#2482: When upgrading past 1.1.34, upgrade attempts to drop a non-existing primary key -issue#2491: Data Source Info suggests commands RRDTool can't honor -issue#2492: When data templates are filtered by profile, data source list does not get same filter applied -issue#2493: Data Source Info is not separated properly -issue#2494: User Login History is not fully enabled for translations -issue#2497: When linking to Graphs, unless both start and end are specified, only defaults are used -issue#2499: Data Source reapply names does not update name from data query or template. -issue#2500: Allow Data Source repairs from the Data Source Debug and Data Source Info pages -issue#2502: Unable to have a min or max value for RRDfile at zero '0' -issue#2503: The Cacti Statistics Device Template is not include in release -issue#2509: When checking for correct Unicode, minimum MySQL version is incorrect -issue#2513: When a plugin INFO file is malformed or missing elements, plugin_load_info_file() should fill missing elements with defaults -issue#2519: When editing a data query, graph template picker shows poor performance -issue#2518: Unexpected errors when filtering Data Sources with invalid 'rows' value -issue#2522: When upgrading from pre-1.0.0, colors were not upgraded properly -issue#2525: Tree branches that includes sites which have valid devices do not appear on Graph Tree -issue#2527: When importing a package, if Cacti version is below the version which that exported, a clear message should be shown -issue#2531: When updating color template items, the table name used is incorrect -issue#2532: Ensure Graph ListView table is displayed in line with Management -> Graphs -issue#2535: Ensure Graph ListView uses same UI logic as Graph Management -> Graphs -issue#2537: Incorrect title showing when changes are made to Tree -issue#2543: Poor performance showing a device's graphs on a tree -issue#2547: RRD values are not being properly trimmed -issue#2551: When checking MySQL configuration values, consider ON/OFF to be equal to 1/0 -issue#2553: When upgrading from 1.0.0 or below, renaming automation columns can cause issues -issue#2555: Missing configuration defaults prevent installations/upgrades without showing reason -issue#2563: When sorting Data Sources, missing index causes unnecessary delays -issue#2564: Filtering for Orphan Data Sources is unreliable -issue#2565: Pages with 500+ selectable items in a single able can suffer from poor performance -issue#2568: When querying for diagnostic data, devices on remote pollers should proxy the request -issue#2571: External Links do not properly validate user permissions -issue#2575: Poller errors occur if a file exists that the website cannot read -issue#2576: Spikekill API does not work when called from plugins -issue#2578: When importing packages, missing/new resources are not created -issue#2581: When viewing poller cache, Device SNMP community is not properly escaped -issue#2583: When JSON module is not installed, Installer does not correctly show missing message -issue#2584: When user/group permissions are reset, this is not reflected immediately to the end user -feature#2505: Improve performance of Data Source Statistics -feature#2515: Allow more than one SNMP port to be specified when adding devices via CLI -feature: Update phpseclib to version 2.0.15 -feature: Adjust the max table rows based upon value of 'max_input_vars' 1.2.2 -issue#599: Aggregate graph templates assume AVG consolidation function -issue#2312: Retrieving Device Information appears to fail on Safari -issue#2317: Unabe to add new records to 'poller_time' table -issue#2327: Memory exhausted whilst running poller replication -issue#2334: Some browsers report JavaScript errors when switching to console -issue#2337: When running an upgrade, the path of the log file is reset -issue#2339: Certain characters in recipient address can cause email to fail -issue#2343: Export hooks no longer work due to missing default keyword -issue#2346: When listing plugin permissions, "Legacy 1.x Plugins" can appear in the wrong cell -issue#2347: Allow sort output to inject returned data into a specific object -issue#2350: Unable to Select Data Source for HRULES and COMMENTS that include nth Percentile and Bandwidth -issue#2352: SNMP description field can sometimes contain mangled data -issue#2354: When reindexing in Automation, titles are not updated for Graph and Data Source -issue#2355: Data Sources are sometimes duplicated when Custom Data is specified -issue#2357: When indexes are incorrect, poller should log more information -issue#2359: When upgrading, "Install/Upgrade" privilege may have been previously lost -issue#2360: When retrieving database / table / column information, schema name is not always applied -issue#2362: No way to default an interface speed when ifSpeed and ifHighSpeed come back as zero -issue#2365: When editing Aggregate Graphs, orphaned items were not always removed -issue#2372: Data Query reindexing leads gaps in Graphs -issue#2376: Manually adding a device discovered by Automation causes errors to be logged -issue#2380: Devices may experience constant reindexing -issue#2384: When authentication method is set to None, change to Builtin as None has been removed -issue#2393: When reindexing a device, Graph Automation creates duplicate graphs every time -issue#2416: SELinux wants APPEND not WRITE permission for Fedora/EPEL (RHEL, Centos) -issue#2419: Host state time was not correctly calculated -issue#2426: Reinstate missing plugin hooks for 'custom_logout_message' and 'custom_denied' -issue#2431: Default value for 'Mail Method' (settings_how) is incorrect resulting in errors -issue#2432: Undefined variable warnings when updating RRD data -issue#2451: Drag and drop does not always function correctly -feature: Update JavaScript library c3.js to version 0.6.12 -feature: Update phpseclib to version 2.0.14 -feature: Update PHPMailer to version 6.0.7 -feature: Update JavaScript library d3.js to version 5.9.1 1.2.1 -issue#2259: Unable to View Aggregate Graphs -issue#2267: Remove unnecessary includes in aggregate template code -issue#2270: Realtime Graphs consuming too much memory -issue#2272: Site Tree Branches not showing Graphs -issue#2273: Error when saving changes to Data Collectors -issue#2279: SQL Errors in add_graphs.php -issue#2280: SQL Errors in snmpagent cache table inserts -issue#2281: Database audit cli giving incorrect results -issue#2285: Allow HRULEs for bandwith and ptile -issue#2292: Allow Realtime to use 1 second data collection -issue#2298: Ambiguous Toggle Switches in Sunrise Theme -issue#2303: Problem with "Notify Primary Admin of Issues" function -issue#2304: Installation progress stays at 0% -issue#2305: BOOST PROGERR: ERRNO:'8' -issue#2311: Unable to update PHP location during installation due to incorrect CLI environment -issue#2319: Primary admin account not always given access to a plugin when that plugin is enabled -issue#2321: Date separator not being used properly for graphs -issue#2322: Modifying plugin realm registration files and description not supported -issue: Installer does not identify when shell_exec()/exec() are disabled -issue: Removing a Device or Graph Template can not be seen till next login -issue: Visual issues with custom data when using paper-plane theme -issue: Undefined function errors attempting to sync device templates -issue: Plugin dependency handling inconsistant -issue: Editing a report shows incorrect graphs from dropdown 1.2.0 -feature: Add a Timeout setting for Remote Agent calls -feature: Add Graphs and Data Sources hyperlinks on Device page -feature: Add One Minute Sampling to the default Data Source Profiles -feature: Add support for DDERIVE and DCOUNTER to Cacti -feature: Add Timezone support for Remote Data Collectors -feature: Allow Adding Aggregate Graphs to a Report -feature: Allow ASCII filepath paths to not be found on settings save -feature: Allow drill down from Graphs to Data Queries or Templates -feature: Allow Import/Export to be hookable -feature: Allow snmpagent to be disabled for very large installs -feature: Allow Top tabs to be Glyphs or Text or both -feature: Big Spanish translation update plus massive QA fixes -feature: Change password page provides visible confirmation of password rules -feature: Do not allow second data source to be added to an SNMP Get data template -feature: Don't allow removal of Data Sources from Data Template once its in use -feature: Inform the primary Cacti administrator of problems by Email -feature: Make all user settings dynamic and allow resetting to default. -feature: Make Graph and Data Source suggested naming more efficient -feature: Make it easy to find Data Query based graphs that have lost indexes -feature: Make Top Tabs use Ajax Callback -feature: Make tree editing responive -feature: New Install/Upgrade user permission to limit access to being able to upgrade -feature: Provide option to debug width errors where output exceeds column width -feature: Removed the Authentication Method of 'None' -feature: Tree automation is now defaulted to on for new install -feature: Update JavaScript library c3.js to version 0.6.8 -feature: Update JavaScript library Chart.js to 2.7.3 -feature: Update JavaScript library d3.js to version 5.7.0 -feature: Update JavaScript library jquery.js to 3.3.1 -feature: Update JavaScript library jquery-migrate.js to 3.0.1 -feature: Update JavaScript library jquery.tablesorter.js to version 2.30.7 -feature: Update JavaScript library jstree.js to 3.3.7 -feature: Update JavaScript library screenfull.js to 3.3.3 -feature: Update phpmailer to version 6.0.6 -feature: Update phpseclib to version 2.0.13 -feature#289: Allow external nologin access for Realtime Graphs -feature#553: When display a host, include Aggregated Graphs as well as standard graphs -feature#614: Allow users to duplicate Data Input Methods -feature#973: When creating a new user authenticated via LDAP, attempt to retrieve users email and full name -feature#122: Support a Site Branch Type -feature#1060: Design Enhancement for Large scale Cacti Implementations -feature#1142: Add Site dropdown to the Graphs and Data Source pages -feature#1184: Improve Data Input Methods editability and message handling -feature#1200: Aggregate Graphs can now include COMMENT -feature#1282: Email notification for Automation Network discovery process -feature#1347: Update automation logging to work better -feature#1395: Ensure messages have each new line keep the same prefix in cacti_log() -feature#1399: Allow 'requires' to include version against a plugin -feature#1400: User settings are now dynamic and can be reset (removed) to return to global settings -feature#1422: Automatically select the next unused data input field when clicking add on data input method -feature#1505: When displaying a graph, provide breadcrumb link to edit device -feature#1527: Update Fontawesome from 4.7 to 5.0.10 -feature#1580: Support Drag & Drop for Builtin Report Items -feature#1581: Allow Mass Adding of Graphs to Reports -feature#1584: Allow theme selection when installing -feature#1588: Check that PHP can run a test file -feature#1593: Allow External links to auto refresh -feature#1597: Ensure synchronised files have same attributes as originals -feature#1610: On Unix, redirect error messages to log files when running external scripts -feature#1628: Allow the User to define an initial Automation Network for discovery when installing -feature#1670: Improve Graph Management to show type of source for a graph -feature#1671: When duplicating a Graph Template, properly duplicate Data Query Graph Template Mappings -feature#1677: Default Tree nodes sorting to be inherited -feature#1691: On Graph context menu, add a 'Copy graph' option to copy graph image -feature#1692: Separate option for logging Input Validation issues -feature#1703: On Graph context menu, text is now multi-lingual -feature#1708: Allow the User to override global Automation email recipients at the Automation Network level -feature#1709: Suppress warning from RRDTool when attempting to make updates in the past -feature#1711: Add support for SSL connections to MySQL -feature#1731: Prevent loss of changes by warning user about unsaved items -feature#1734: When displaying a graph, provide more information when error image is displayed (see also #1428) -feature#1763: Enable automatic refresh for Time Graph View -feature#1806: Control low level debug routines via config.php (Develoepr Use) -feature#1819: Provide CLI program to enable graphs to be removed by scripts -feature#1969: Graph previews can now be linked using a host's external id -feature#2006: Introduce new Data Source Profile to handle decade long graphs -feature#2173: Introduce Device and Graph Template Caching to Speed UI -feature#2228: Add Device ID to Device search field -issue: Fix issue with display_custom_error_message() causing problem with system error message handling -issue: Graph List View was not fully responsive -issue: Move Graph removal function to Graph API -issue: On the Data Sources page, if there is no filtered Device and a Data Source is edited, device association is lost -issue: Typo in Dutch translations when an error occurred while downgrading -issue: Unable to display user profile tabs -issue: Verify all Fields not working due to Cacti 1.x upgrade error -issue#186: Cacti does not support jQueryUI 1.12.x -issue#187: Remove the use of jQuery Migrate plugin -issue#948: Do not create a new datasource when adding a new Graph for the same device/field -issue#454: Cacti Re-Index does not resolve index changes properly during re-index -issue#983: Import Template Preview is misleading -issue#1097: When copying template user, newly created user should always be enabled to allow logging in -issue#1097: When copying template user, it should be disable to prevent logging in as template user directly -issue#1174: When display a tree, disable drag and drop unless in edit mode -issue#1298: Display fatal error to prevent issues caused when system log is not writable -issue#1350: When switching an Automation Tree Rule's leaf type, remove invalid Automation Rule Items -issue#1383: CSRF Timeout does not obey session timeout -issue#1408: Update SQL / Backtrace to use new clean_up_lines() function -issue#1414: DSSTATS reports incorrectly that a data source does not exist -issue#1420: Fix issues found by Debian package builds -issue#1421: Fix issue when SQL had all bad modes, missing variable warning was generated -issue#1426: Fix issue where remote poller was not using unique filenames when attempting to verify files -issue#1437: Plugin install hover message sometimes shows line breaks rather than formatted text -issue#1454: When using oid_regexp_parse, filter indexes to those that match -issue#1473: Recovery Date overwritten by subsequent checks -issue#1494: Unable to Deep Link/Bookmark Trees -issue#1503: Undefined function clearstatscache in DSSTATS -issue#1507: When saving graph settings from the graph page, the graph template id should not be included -issue#1510: New Graphs Undefined Variable $graph_template_name -issue#1521: Force boost to be enabled when there are Remote Data Collectors -issue#1528: Saving a device can result in WARNINGS related to string vs array handling -issue#1529: Allow Aggregate Graphs to Sum Bandwidth and Percentile COMMENTS -issue#1543: Graph Preview appends header=false too many times -issue#1553: Poller does not set rrd_step_counter correctly if no steps taken -issue#1559: CLI Output Issues due to over escaping -issue#1560: Warning that escapeshellarg() is escaping a null -issue#1567: Technical support - add notification if Cacti and Spine version is different -issue#1574: User templates are not correctly being applied -issue#1589: Installer now checks that the temporary folder is writable -issue#1590: User Admin generates SQL error if user is not part of any groups -issue#1601: Aggregate Graphs can not include some classes of COMMENT -issue#1602: PHP ERROR: Call to undefined function api_data_source_cache_crc_update() -issue#1604: Failed to connect to remote collector -issue#1606: Boost debug log not functional -issue#1607: Boost next run time occurs in the past -issue#1608: Possible boost race conditions -issue#1609: Remote pollers update 'stats_poller' on main poller -issue#1617: Editing a data query results in missing $header variable -issue#1621: Realtime Popup can cause automatic logout -issue#1626: httpd-error.log have message about Fontconfig -issue#1634: Default snmp quick print setting resulting in false poller ASSERTS on some php releases -issue#1651: Check temporary folder has write access during import -issue#1655: Correct Cacti to handle new MySQL 8.0 reserved word `system` -issue#1658: Devices drop down should be filtered by Site -issue#1660: Reports based upon Tree don't maintain graph order -issue#1665: Must change password not working for local users when main realm is not local -issue#1669: Console log header grammar issue -issue#1674: Threads and Processes values not migrated to Poller table during upgrade -issue#1676: Allow automation discovery to add the same sysname on different hosts -issue#1682: Slow Select Statement lib/api_automation.php -issue#1689: Technical Support's RRDTool version should show detected RRD version -issue#1690: Report a warning if the default collation is not utf8mb4_unicode_ci -issue#1700: Mail sent without auth causes errors to appear in logs -issue#1710: RRDtool create command causes first update to fail -issue#1721: Console Side Bar not correct on first login -issue#1723: die() messages should include PHP_EOF for better logging -issue#1726: Poor page performance editing a Graphs Graph Items -issue#1746: Poller with no hosts does not exit until timeout is reached -issue#1761: Graph Management page shows bogus template names -issue#1783: Browser Back button still does not working -issue#1796: Import: Fixed handling of references to objects not included in file -issue#1799: Default User log sort should be date descending -issue#1810: Correct SQL errors with authentication set to no authentication -issue#1839: Dummy cosmetic bug on down device selection option -issue#1841: Data Source Stats table not properly migrated from pre 1.x Cacti plugin -issue#1849: SNMPAgent not sending traps -issue#1852: Reports Preview/Mails show no graphs -issue#1889: Insecure $ENV{ENV} which running setgid -issue#1901: Upgrade from 0.8.8h fails on external_links statement -issue#1921: Data Query XML field method 'rewrite_index' does not correctly query for value -issue#1926: Deselecting items should present warning or disable GO button -issue#1948: Device Template should warn about need to re-sync -issue#1953: set_default_action() should warn if more than one action provided -issue#1973: SpikeKill Menu does not display properly -issue#1976: Default admin permissions do not allow everything -issue#1982: Certain hooks should occur within api functions rather than UI functions -issue#2002: api_plugin_db_table_create should support non-string defaults -issue#2012: For kernel 3.2+, "Linux - Memory - Free" should grep for "MemAvailable:", not "MemFree:" -issue#2085: CLOG Regex Parser does not verify registered function exists -issue#2126: api_device.php generates undefined function poller_push_to_remote_db_connect() -issue#2127: Unable to save error when duplicating graph -issue#2135: api_tree_lock() and api_tree_unlock() forcing redirection incorrectly -issue#2143: export.php Illegal string offset 'method' -issue#2144: Device Management "Status" column does not sort properly -issue#2152: When editing a device, should show disable/enable option -issue#2153: Utilities page issues the wrong hook for tabs -issue#2163: LDAP functions are not consistent -issue#2164: Login page does not remember selected realm -issue#2171: datepicker and timepick translation not available -issue#2178: Header/Footer included more than once -issue#2182: Graph View missing 'html_graph_template_multiselect()' function -issue#2184: html_host_filter() does not handle host_id consequently -issue#2186: Boost generates invalid SQL during on demand update -issue#2188: SNMP timeout errors are being duplicated -issue#2191: i18n_themes is not properly primed in global_arrays.php -issue#2202: Can't create more than one graph with add_graphs.php from one template -issue#2207: Removing Graph Template does not Remove Data Query Associations -issue#2217: cmd.php not handling quoted snmp values properly -issue#2240: SNMP system Data Input Methods should not be modified on import -issue#2241: Spike removal not functional due to Debian packaging -security#1072: Prevent exploitation of Data Input Methods to escalate privileges (CVE-2009-4112) -security#1882: Bypass output validation in select cases -security#2212: Stored XSS in "Website Hostname" field -security#2213: Stored XSS in "Website Hostname" field - Devices -security#2214: Stored XSS in "Vertical Label" field - Graph -security#2215: Stored XSS in "Name" field - Color 1.1.38 -issue#1501: cmd.php poller not stripping alpha from snmp get values -issue#1515: Special characters not rendered properly in settings -issue#1530: Inconsistent behaviour handling blank Field Name/Value when editing data query suggested values -issue#1537: Numeric validation not ignoring blank elements 1.1.37 -issue#274: Allow Realtime Graph Popup Mode -issue#1405: When Data Query columns are wide, they cause rendering issues -issue#1414: DSSTATS reports incorrectly that a data source does not exist -issue#1419: Filtering log results in errors in the log -issue#1420: PHP NOTICE editing cdef and vdef items -issue#1421: CLI upgrade_database.php PHP Warning on execution -issue#1426: Remote poller erroring attempting to verify files -issue#1432: Delete confirmation does not disappear -issue#1443: Partial Save warnings under Settings -> Mail/Reporting/DNS -issue#1447: CLI audit_database.php not detecting database name, and failed to create audit tables when run fresh -issue#1453: CLI add_graph.php not allowing title to be set -issue#1456: Increase minimum php version maintaining support for RHEL6 -issue#1457: Path-Based Cross-Site Scripting (XSS) issues -issue#1458: Error in logs when creating new graphs -issue#1459: Automation filter not applied correctly -issue#1461: Setting output_format on input type causes no values to be returned -issue#1464: Poller stuck in infinitely loop causing excess logging -issue#1466: No scrollbars in mobile browsers -issue#1468: Increase max length of host.snmp_sysObjectID column -issue#1471: Undefined function found in global_languages.php -issue#1472: Change Device Options - Style needs updating -issue#1474: Check possibility for creation of temporary tables on install -issue#1487: Undefined constant in ldap.php -issue#1483: Create New Graphs - Paw Styling Issue -issue#1493: Can't create tree branches with '#' sign -feature#1489: Add ability to use parts of OID as value via regex -feature: Updated Chinese Simplified translations -feature: Updated Dutch translations -feature: JavaScript library Chart.js updated 2.7.2 -feature: Allow snmp formatting functions to detect UTF-8 output 1.1.36 -issue#934: Template names missing in graph management list -issue#1211: CDEF and VDEF Item Edit do not use correct procedures -issue#1250: Language support does not support localization properly -issue#1331: Log Rotation should occur at midnight on system -issue#1334: Console->Users->(Edit) Permissions checkmark descriptions missing -issue#1336: Debian test suite reports php error -issue#1338: Allow automation to be run in debug mode from GUI -issue#1339: First graph of second page does not render -issue#1340: Unable to open Time Graph View in new tab -issue#1348: Toggle context menu of Zoom -issue#1351: Errorimage does not render on systems without GD ttf support -issue#1353: New installation without config.php silently throws errors -issue#1355: Single tree can have the order of the tree changed -issue#1357: Data Profile disable fields shown temporarily as editable -issue#1359: Settings page generates error for removed plugin tab -issue#1362: DSStats Avg/Peak function broken due to change in RRDtool processing -issue#1365: Plugin Management enforce folder name -issue#1366: Improve error/info message display -issue#1380: Potential failure when updating script type -issue#1384: When installing/enabling plugins, current user and admin should get permissions -issue#1386: form_selectable_cell() ignores width if no style_or_class is passed -issue#1389: Poller is including plugins that are not installed -issue#1390: Plugin uninstall should prompt user before removal -issue#1396: Prevent installation/uninstallation of a plugin if dependency is present -issue#1397: Distinguish between plugin tabs and core tabs in settings -issue#1371: Allow dynamic setting of from name when emailing -issue: Data Query Cache filter layout more consistent -issue: Minor plugin permissions format change -issue: Implementation of error handling causes errors creating New Graphs -issue: Deprecated DDStats setting removed -issue: Graph context menu items are now context aware -issue: Validate spine path before allowing enabling of spine -issue: Errored settings fields now highlighted correctly on error -issue: Add the Default Device to the Default Tree at install time -issue: Secpass password verification error message unuseful -feature: Searching of SNMP Index in View Data Query Cache now works -feature: Presets now have default device Template -feature: JavaScript library c3.js updated (v0.4.21) / jstree.js (3.3.5) -feature: PHPSecLib updated 2.0.10 -feature: Updated Dutch translations 1.1.35 -issue#114: *all_max_peak* percentile calculations incorrect -issue#430: Pressing Back often fails to work as expected -issue#564: Fail to move items in graph template as desired -issue#981: Hyperlinks for Data Profile stats -issue#993: Realtime not working on remote pollers for certain data query -issue#1244: Errors importing templates with deprecated hashes -issue#1251: Allow zoom out through mouse mmiddle button -issue#1281: Max OIDs setting is for bulkget and not bulkwalk operations -issue#1286: Correct CHUNKED_ENCODING error when retrieving graph with some browsers -issue#1306: Graphs are not always refreshed properly -issue#1309: Provide meaningful authentication errors in graph_json.php and graph_image.php -issue#1310: Return button fails on change password page -issue#1315: Realtime not working on local data collector -issue#1316: CDEF Item Value dialog does not update creating items -issue#1319: Front end + remote poller - connection timeout issue -issue#1321: Use RRDtool pipelining functions within DSSTATS -issue#1323: Enhance form layout for readability -issue#1329: Spelling errors in automation_networks.php -issue: Validate regular expressions if specified in add_graphs.php -issue: Ensure compression levels are consistent when importing package 1.1.34 -issue#1040: PHP version 7.2 - ERROR PHP WARNING: sizeof() -issue#1195: Improved Javascript error message handling -issue#1245: Unable to reorder graph name suggested values -issue#1256: Error reporting of custom errors not displayed correctly -issue#1257: Boost excessively logging updates -issue#1258: cacti.sql updated to match expected schema -issue#1260: Tab images fail to render due to TrueType support in PHP GD Module -issue#1261: Automatic logout timeout does not apply to web basic authenication -issue#1263: CLI utility to validate database schema -issue#1266: Inconsistent usage graphWrapper CSS causes odd graph zoom behavior -issue#1268: Regex filters not working properly -issue#1274: Host CPU script checks value existance to avoid error -issue#1275: SNMP v3 authPriv fails to work -issue#1287: JSON calls return validation error in HTML format -issue#1289: Script Server should output parameter array rather than parameters -issue#1292: Chrome to aggressively caches Javascript files -issue#1293: Correctly identify if command 'snmpbulkwalk' is available -issue#1296: CactiErrorHandler does not ignore PHP suppressed errors -issue#1300: Automation discovery : New devices added by automation discovery have empty SNMP community field -issue#1302: Automatic logout should not be enforced on login page -issue#1304: mib_cache.php file contains unsafe transactions for binary logging -feature: CLI utilily to generate and verify file hashes for installed Cacti files -feature: Logging links back to appropriate areas for troubleshooting -feature: Logging lists filenames in reverse order 1.1.33 -issue#1253: Automatically generated RRDtool DEF names in Cacti 1.1.32 break existing Graph Templates 1.1.32 -issue#969: Undefined index: color_id / task_item when viewing graphs -issue#1166: Fix typo of 'locale' in global_languages.php -issue#1222: Graphs with large number of items causes RRDTool to error -issue#1230: PHP Fatal error: Call to undefined function get_max_tree_sequence() -issue#1238: SNMP functions fail to handle "Invalid object identifier" error -issue#1239: Browser console error in layout.js -issue#1240: Page layout issues caused by library update -issue#1246: Make SNMP Error return more info -issue: Missing or corrupted theme files can corrupt user settings -issue: Theme may not change until next login -issue: Tree edit Tree/Device/Graph drag areas incorrect -issue: Make callback error handling compatible with jQuery 3.x -issue: Ensure the snmp_error is cleared before every call -issue: Indicate unknown error when RRDTool returns no error message -feature: Update Javascript library: js.storage.js, d3.js, jquery.js, jquery.tablednd.js, jquery.timepicker.js 1.1.31 -issue#629: Site reload after delete the last letter in the searchbar -issue#1022: Discovery network stuck in "running" state does not return results -issue#1164: Version compare function fails on major/minor only versions -issue#1166: Invalid New User default language selection -issue#1175: Automatic logout inconsistent redirect -issue#1179: Warn during installation if installing moving to older version -issue#1183: Automatically detect missing Theme and use alternate -issue#1185: Layout with Graphs having large number of data columns -issue#1189: Allow ability to sort tree list by name asc/desc -issue#1190: Enabling, Disabling, Uninstalling plugin, you should page refresh -issue#1191: Tree sequences were not set or checked -issue#1197: Add more collection intervals to Data Source Profiles -issue#1206: Display issue with internationalization number format -issue#1210: CDEF and VDEF Items can not be properly edited -issue#1212: Navigation breadcrumbs fail to handle External links correctly -issue#1213: PHPMailer trying TLS despite SMTPSecure setting -issue#1215: Show version when installation prompts for license -issue#1217: Add ability to view/edit Input/Query when editing Data Template -issue: Named colors fail to import on install or upgrade -issue: Drag and Drop issues on multiple pages could corrupt sequencing -feature: Enhance filter to permit more glyphs for table headers -feature: Add a page refresh dropdown to the Automation Networks -feature: Enhanced SNMP v3 input forms -feature: Allow Trees to be rearranged using Drag and Drop -feature: Trap GUI callback errors and present error message 1.1.30 -issue#1155: Non-secure mail setting not functional due to changes in phpmailer -issue#1157: Resolve issue with branch permission api -issue#1158: Change CLOG to use regex replacement so line details are not mangled -issue#1161: Graph View regex's are not preserved during automatic page refresh -issue#1162: Error messages are not display when editing a user -issue#1166: Default language was not correctly set when editing a user -issue: basename function undefined during upgrade to 1.0.x -issue: Storage API and translations required for Change password function -issue: ALTER IGNORE still throws an error when attempting to drop the primary key -issue: Data Source profile form API generates error when system is half upgraded -issue: Resolve issue with importing packages -feature: Update package versions for Cacti version 1.1.29 1.1.29 -issue#871: Allow Nth Percentile and Bandwidth Summation to respect 'Base Value' in template -issue#965: Duplicate error message and incorrect error code when using LDAP authentication -issue#1084: Graph Tree Branch not properly populating when editing report item -issue#1104: Datetime formatting in developer debug mode incorrect -issue#1106: Template Filters has empty row -issue#1109: URL used in redirection when referrer already has parameters in it -issue#1110: Add CPU Total to 'SNMP - Get Processor Information' -issue#1111: PHP NOTICE when using LDAP authenication -issue#1116: Filters not allowing "None" or "All" when editing report item -issue#1119: Reduced amount of data fetched for CPU usage to just the data used -issue#1121: Bandwidth summation not using correct locale -issue#1122: Fix issue with local login / potential password problems -issue#1128: Resolve php warning when raising messages -issue#1130: Fix logging level issue where logs of same level as setting where not logged -issue#1131: Make upgrade_database.php use same version compare as /install/ system -issue#1133: Fix issues with variable name and debug log -issue#1141: When viewing graphs from list view, pagination causes list view filter to be cleared -issue#1143: ss_host_cpu.php - Division by zero / Invalid Return Value -issue#1146: Installation now checks URI path matchs with configuration option URL_PATH -issue: Updated Graph pagenation and filter reset -issue: Resolve issues with cacti_version_compare() processing -issue: Zoom context menu stays open after zoom out actions -issue: Paginator object was not always translated 1.1.28 -issue#958: User Group Tree permissions not calculated fully -issue#959: Issue viewing email reports due to email client decoding problems -issue#992: RRDfile naming issues that result from random sorting during export -issue#1012: Issue where disabled devices will not appear in Tree editor -issue#1044: Handle invalid exclusion regex properly when viewing the log -issue#1045: Issue with multiple pages and confirmation dialogs -issue#1048: Problem importing vdefs from templates -issue#1053: Remote Data Collector now works with https and self signed certificates -issue#1055: Errors in data source statistics inserts when invalid output is encountered -issue#1057: CVE-2017-16641 - Potential vulnerability in RRDtool functions -issue#1058: ICMP Ping to and IPv6 address fails to gather data for ping latency -issue#1059: Aggregate item filter should use regular expressions to avoid SQL errors due to flawed filter logic -issue#1064: When a Device Template is removed, Automation Templates for that Device Template remain -issue#1066: CVE-2017-16660 in remote_agent.php logging function -issue#1066: CVE-2017-16661 in view log file -issue#1071: CVE-2017-16785 in global_session.php Reflection XSS -issue#1074: Boost records get stuck in archive -issue#1079: Undefined index in lib/snmpagent.php -issue#1085: Undefined function html_log_input_error -issue#1086: Rerun data queries in automation process has no effect -issue#1087: cli/add_device.php --proxy option does not work with non-snmp devices -issue#1088: Set timeout for remote data collector context -issue: Minor performance increase in boost processing -issue: Poller output not empty not processed correctly on Log tab -feature: Timeout to the remote agent for realtime graphs -feature: Updated Dutch translations -feature: Database update adding additional indexes for increased performance -feature: Updated PHPMailer to version 5.2.26 -feature: Updated phpseclib to version 2.0.7 1.1.27 -issue#1033: Issues inserting into dsstats table due to legacy data -issue#1039: Using html_escape still double escapes. Use strip_tags instead -issue#1040: Resolving compatibility issue with PHP7.2 1.1.26 -issue#841: --input-fields variable not working with add_graphs.php cli -issue#986: Resolve minor appearance problem on Modern theme -issue#989: Resolve issue with data input method commands loosing spaces on import -issue#1000: add_graphs.php not recognizing input fields -issue#1003: Reversing resolution to Issue#995 due to adverse impact to polling times -issue#1008: Remove developer debug warning about thumbnail validation -issue#1009: Resolving minor issue with cmd_realtime.php and a changing hostname -issue#1010: CVE-2017-15194 - Path-Based Cross-Site Scripting (XSS) -issue#1027: Confirm that the PHP date.timezone setting is properly set during install -issue: Fixed database session handling for PHP 7.1 -issue: Fixed some missing i18n -issue: Fixed typo's -feature: Updated Dutch translations -feature: Schema changes; Examined queries without key usage and added/changed some keys -feature: Some small improvements 1.1.25 -issue#966: Email still using SMTP security even though set to none -issue#995: Redirecting exec_background() to dev null breaks some functions -issue#998: Allow removal of external data template and prevent their creation -issue: Remove spikes uses wrong variance value from WebGUI -issue: Changing filters on log page does not reset to first page -issue: Allow manual creation of external data sources once again -feature: Updated Dutch translations 1.1.24 -issue#932: Zoom positioning breaks when you scroll the graph page -issue#970: Remote Data Collector Cache Synchronization missing plugin sub-directories -issue#980: Resolve issue where a new tree branches refreshs before you have a chance to name it -issue#982: Data Source Profile size information not showing properly -issue: Long sysDescriptions on automation page cause columns to be hidden -issue: Resolve visual issues in Classic theme -feature: Allow Resynchronization of Poller Resource Cache -feature: Update Spanish Translation 1.1.23 -issue#963: SQL Errors with snmpagent and MariaDB 10.2 -issue#964: SQL Mode optimization failing in 1.1.22 1.1.22 -issue#950: Automation - New graph rule looses name on change -issue#952: CSV Export not rendering chinese characters correctly (Second attempt) -issue#955: Validation error trying to view graph debug syntax -issue: MySQL/MariaDB database sql_mode NO_AUTO_VALUE_ON_ZERO corrupts Cacti database -issue: When creating a data source, the data source profile does not default to the system default -feature: Enhance table filters to support new Cycle plugin -feature: Updated Dutch Translations 1.1.21 -issue#938: Problems upgrading to 1.1.20 with one table alter statement -issue#952: CSV Export not rendering chinese characters correctly -issue: Minor alignment issue on tables 1.1.20 -issue#920: Issue with scrollbars after update to 1.1.19 related to #902 -issue#921: Tree Mode no longer expands to accomodate full tree item names -issue#922: When using LDAP domains some setings are not passed correctly to the Cacti LDAP library -issue#923: Warninga in cacti.log are displayed incorrectly -issue#926: Update Utilities page to provide more information on rebuilding poller cache -issue#927: Minor schema change to support XtraDB Cluster -issue#929: Overlapping frames on certain themes -issue#931: Aggregate graphs missing from list view -issue#933: Aggregate graphs page counter off -issue#935: Support utf8 printable in data query inserts -issue#936: TimeZone query failure undefined function -issue: Taking actions on users does not use callbacks -issue: Undefined constant in lib/snmp.php on RHEL7 -issue: Human readable socket errno's not defined -issue: Audit of ping methods tcp, udp, and icmp ping. IPv6 will still not work till php 5.5.4 1.1.19 -issue#810: Scripts in packages don't match distribution -issue#919: Unable to upgrade to 1.1.18 -issue: Update documentation for minimum PHP 5.4 1.1.18 -issue#902: Correcting some issues with Console and External Links -issue#903: Upgrade pace.js to v0.7.8 -issue#904: Allow user to hide Graphs from disabled Devices -issue#906: Create a separate Realm for Realtime Graphs -issue#907: XSS issue in spikekill.php -issue#910: Boost last run duration generates an error on new install -issue#914: Unable to purge Cacti logfile from System Utilities -issue#915: Non-numeric data in ss_host_disk.php -issue#916: Resolve display of errors when encountering ldap issues -issue#918: Minor XSS and create generalized escape function -issue: Resolve JavaScript errors on Login page -issue: Resolve JavaScript errors on Permission Denied pages -issue: Graphs tab would appear in non-classic even if you did not have permissions -feature: Updated dutch translations 1.1.17 -issue#450: List View to Preview shows no results -issue#486: Export Device table results to CSV -issue#544: Allow Log Rotation to be other than Daily -issue#673: Downtime/Recovery time/date is set incorrectly -issue#819: Customized timespans for graphs -issue#888: Rebuilding Poller Cache when External data sources are present results in false positive warnings in the log -issue#891: Database.php unable to connect to MySQL when using port different than 3306 -issue#893: Warning messages when duplicating CDEF objects -issue#897: Due to browser use of special key, deprecate ctrl-shift-x for clearing filter -issue#898: Issue with tcp and udp ping due to file description allocation changes -issue: Unable use ipv6 ip addresses for snmp ping in the Cacti GUI -issue: Update language of the Rebuild Poller Cache menu pick -issue: Broken design for input controls with Sunrise theme -issue: Timespan switching not switching to Custom in Preview Mode -issue: Log rotation would not occur under certain conditions. Provide more control over log functions -issue: Purge log file always purged the cacti.log, not the selected log -issue: Unable to view graphs for errored data sources from Cacti log 1.1.16 -issue#865: Escape Data Query arguments to prevent issues with special characters -issue#872: Can't add device items to graphs generated with no device and no template -issue#875: When modifying Realm permissions, realms that are listed multiple times don't stay in sync -issue#877: Improving resolution to issue#847 and one additional vulnerability -issue#878: Ambiguous language in purge log function -issue#879: SQL Error when adding a report item to a report -issue#880: Device drop down is limited to 20 devices and lacks a scroll bar -issue#885: Graph generated with no device and no graph template forgets device definitions -issue#886: Unable to export templates other than Device templates -issue: Address additional corner cases around get_order_string usage -issue: Data Queries sharing a Data Source can result in poller output table not empty errors -issue: Fix Sunrise theme to properly theme multiselect widgets -issue: Increase height of multiselects so that more options are visible -issue: When a graph is locked, anchor tags are still functional -issue: Autocomplete does not populate none-value when the selected value is not set 1.1.15 -issue: PHP Fatal Exception on upgrade from 1.1.11 or earlier -feature: Added test to detect install upgrade code problems 1.1.14 -issue#849: Unable to select host in Graph Item pick -issue#850: Reporting not allowing Non-templated Graphs -issue#858: Pagination on SNMP Options wrong -issue#860: Network Discovery Subnet Range character limit too small -issue#861: The search filter does not support Cyrillic -issue#862: Automation - When editing Graph Rules, unable to Change Data Query -issue#863: Typo error in auth_login.php for LDAP authentication -issue#867: Cross-site scripting (XSS) vulnerability in auth_profile.php -issue: Link's not showing in Automation Graph and Tree rules on Sunshine theme -issue: Make Templates Export responsive -issue: Don't wrap menu glyphs and menuitems -issue: The function get_order_string() can fail when encountering reserved word columns -issue: Data Query Delete is not using callback -feature: Resize Graphs on Graph page to be responsive -feature: Make import text a hidden field as it is likely seldom used 1.1.13 -issue#605: Remove Spikes feature not fully functional -issue#814: Allow 'Save' feature from New Graphs -issue#837: Using the add_device.php CLI script, you can not 'default' the device threads to other than 1 -issue#838: CVE-2017-10970: XSS Issue in link.php -issue#839: The Database column name 'rows' is a reserved word in MariaDB 10.2+ -issue#845: External links tabs should appear at the end of the tab view -issue#846: Web crawl of Cacti site shows errors in the log -issue#847: CVE-2017-10970: XSS Issue in lib/html_form.php. -issue#853: Go and Clear buttons do not work in all cases on Graph Rules pages -issue: Up/Down arrow titles labeled incorrectly on Tree Management page -issue: Make the default Export Type a Device Template -issue: Fix SNMPagent MIB cache issues -issue: Realtime cache cleanup now only removes rrd and png -issue: When redirected from reports, you can receive a validation error -feature: updated Dutch language 1.1.12 -issue#822: Aggregate Graph Items are incorrectly editable -issue#823: Allow Filters to be hidden -issue#834: Add spacing on graphs pages -issue: Uninstalled plugins can not install -issue: Location of filter functions in host.php prevent full responsive filter implementation -feature: Implement first phase of responsive search filters 1.1.11 -issue#642: RRA not written or WARNING: Poller Output Table not Empty -issue#779: PHP running out of memory due to date format issues -issue#791: SeLinux causing problems due to recent enhancement of the Cacti log -issue#818: Unable to unselect all SpikeKill templates under settings -issue#831: Unable to add devices from automation devices that don't have a snmpSysname -issue: incorrect version of pace: fix progess bar -issue: date_format(): fix date separator character -issue: host.php: fix itemCount en rowCount when result = null -issue: clog: fix scandir for systems with limited permissions to log directory -issue: clog: fix listing of logfiles -issue: Stop New Graphs filter interface from taking too much space -issue: Pagination of clog is not done via ajax -issue: Unable to dry run spikekill's from Graphs page -issue: Default sort order does not highlight on Aggregate Template page -issue: Correct display issue with Graph Templates when editing Device -issue: External Data Sources show as having poller interval on Data Source page -issue: Allow Selecting 'External' as the Data Source Profile when creating non-templated Data Source -issue: Remove Field Order on Data Input output data as it's not required -issue: Data Templates not using Ajax callbacks to switch Data Sources -issue: Visual issue when creating non-templated Aggregate Graphs -feature: new skin: Sunrise -feature: Provide Non Compatible explanation when a plugin is not compatible -feature: Updated Dutch translations -feature: Allow Graph Templates with multiple flag to be created repeatedly from Graphs New interface -feature: Allow plugins to exclude files and directories from their remote poller synchronization process -feature: Add Device Description to View Poller Cache UI 1.1.10 -issue#779: Resolve random Apache segfault due to recursion -issue#786: Unable to create second RRA for a Data Source Profile with collection rate less than 5 minutes -issue#789: Unable to Clear Filter due to JavaScript name space collision -issue#791: cacti 1.1.9 and clog_webapi.php permission issue -issue#794: SQL Error when creating graphs manually -issue#798: Cosmetic issue when checking checkboxes in Cacti -issue#800: Unchecked loop in lib/html_utility.php causing race condition -issue#802: Issue updating device hostname with SNMP data queries -issue#803: Issues with utf8mb4 introduced via optimization -issue: If the device is down and snmp_sysUpTimeInstance is 0, time in state can be wrong -feature: Updated Dutch translations 1.1.9 -issue#788: Fails on PHP Fatal error if LDAP auth enabled 1.1.8 -issue#529: Issue on Graph New page with checkbox unselected -issue#552: Minor selectable row checkbox issue -issue#577: Dragging multiple items causes the tree to refresh too early -issue#617: Correct poller timeouts when no devices are associated with active data collector -issue#706: Classic external link template images missing -issue#726: Undefined variable in upgrade script -issue#728: Resolve issues with jQueryUI empty dialogs -issue#731: Add class to radio button labels to correct display issue -issue#736: Sequence numbers not visible when editing templates using modern theme -issue#739: Graph Titles missing on aggregate graphs -issue#740: Spacer manipulation broken after update to responsive forms -issue#741: Errors in dsstats with very large RRDfiles with more than 60 data sources -issue#748: Search results are not cleared on Aggregates -issue#754: Default Language for user and system are not set on new installation -issue#755: RRDtool Graph Watermark is incorrect -issue#756: Resolving some translation issues -issue#763: Template Export not functional -issue#765: Validation error when viewing Utility View -issue#771: Editing a report renders no options after creation -issue#780: Preview always shows thumbnails in reports interface -issue: Hide Aggregate system cdefs when editing graphs and graph templates -issue: Updating Utility View zoom was not updating table data -feature#723: Convert Data Source dropdown to autocomplete when editing standalone graphs -feature#735: Allow color selection in graphs and templates to be autocomplete -feature#753: Preliminary support for RRDtool 1.7. -feature: Add function to obtain the current execution user -feature: Implement Site timezones as autocomplete for performance -feature: For themes other than classic, make color id selection autocomplete -feature: CLOG timestamp is now formatted as defined in settings -feature: CLOG can show loginformation from rotated logfiles 1.1.7 -issue#470: Enhance Cacti's SNMP function and Data Query XML, add hex|string|guess -issue#653: Devices with empty sysNames are not added to discovered devices -issue#655: Data source not displaying device name -issue#658: Scheduled Reports (type "tree") not working -issue#662: Sending test Email should optionally bypass ping -issue#667: In Classic theme initial view of Tree view broken -issue#669: Invalid SQL Messages when upgrading to Cacti 1.0.5 -issue#670: Validation error when you do "Change Graph Template" in Cacti -issue#672: Cacti unable to enable snmp notification receiver mibs -issue#680: Sort order in Time Graph View -issue#687: Cacti DB access not compatible with PHP 7 -issue#696: Multiple issues with snmpagent notification UI -issue#699: Add custom error handler for ping functions -issue#704: Fix GUI issues for Graphs not belonging to a device -issue#707: Back button not working -issue#708: Issues finding lib/snmp.php in host disk functions -issue#712: Change Graph Template dropdown invalid -issue#717: Allow ajax callbacks when adding non-templated graph items -issue: Reports were not using Cacti's permission system for checking access -issue: User Admin page reported wrong permissions at Tree level missing some i18n as well -issue: Short data_name can cause data collection issues -feature: Updated Dutch language -feature: Updating PHPMailer to 5.2.23 -feature: Support input-output Data Query types -feature: Introduce new get_cacti_version() to reduce database calls on pages 1.1.6 -issue#620: The table poller_data_template_field_mappings can get out of sync when manipulating data templates -issue#622: Can not connect to MySQL over a socket -issue#628: Cacti upgrade process is complex and error pront for developers -issue#635: Error when saving change to data template -issue#637: When displaying tree graphs, use the same layout as preview mode -issue#646: When a plugin is disabled during page operations, warnings can appear -issue#651: Unable to view cacti log (because of allowed memory size exhausted) -issue#657: Error in log when host is down, using icmp and using cmd.php on FreeBSD -issue: List for creating a Graph type shows already added Graph Templates -issue: Fix and undefined variable on data source page when first creating a manual data source -issue: Remove tabindex and other non-required manual aria controls from pages -issue: Table type and column type in poller_output table wrong -issue: FILTER_VALIDATE_MAC not defined on PHP less than 5.5 -issue: When changing your language Cacti would not do a full page refresh -feature#106: Paginated CLOG and log administration -feature: Dutch translations -feature: Responsive Graphs page -feature: Convert forms from table based to div based for responsive design -feature: Better support for phones and tablets -feature: Simplified installation code to facilitate easier release cycle -feature: Updating Tablesorter to v2.28.9, adding widgets and pager 1.1.5 -issue#580: Data collection warnings when using cmd.php -issue#592: Incorrectly formatted HTML -issue#606: Replace in data input methods -issue#607: Allow draw_menu to specify multiple actions for the same URL -issue#608: Spaces adjacent to double quotes are eliminated during data input method import -issue#609: Honor the column setting in graph tree view mode -issue#610: Change Graph Template action not available -issue#611: Cacti Installation Wizard - Spine page incorrect on Windows -issue#612: Uncaught Error: Call to a member function row() on a string -issue#613: Network Automation, now requires a site or your are unable to save rules -issue#615: Data Input field length too short for longer scripts -issue#619: Export logging option in settings no longer used 1.1.4 -issue#524: Reporting not working when Tree branch is device -issue#560: Add 'Duplicate' and 'Convert to Graph Template' back to Graph Management page for Advanced mode -issue#573: Missing Graph Template dropdown items -issue#575: Very large hex strings result in scientific notation that RRDtool rejects -issue#579: Problems logging in using nginx web server -issue#581: session_start() warnings when manually sending reports -issue#584: Issues reporting memory recommendation on utilities page -issue#586: Overrunning pollers can cause system load spikes -issue#587: Data Collector setting under Network Discovery is not being used -issue#588: Devices with blank sysDescr are added to the first Device Template in error -issue#589: Automation discovery does not allow site association -issue#590: Unable to create a plugin based menu -issue#591: Row selection in Device Automation Templates not sane with drag-n-drop enabled -issue#601: Resolving some translation issues -issue#604: Unexpected backtrace on regular expression filters -issue#605: Remove Spikes non-numeric data causes warnings -issue: Ping email does not use a from email address -issue: Automation does not recognize default size or poller -issue: Unable to drag-n-drop on automation templates pages when enabled -issue: Fixed number of hosts in poller stats for first poller -issue: Fixed screenwidth issue in tab PHP-Info of Utilities module -issue: Recovery poller could get stuck in some situations -issue: Fix JavaScript errors when managing Aggregate Graphs -feature: Reorganize defaults to place more on device defaults page -feature: Update jQuery tableDnD to version 0.9 -feature: More tolerant of empty PHP_SELF found with some web servers 1.1.3 -issue#515: Unable to import color CSV file -issue#519: In non-classic themes its not possible to remove Cacti log or reporting tabs -issue#520: SQL error in graph automation -issue#521: Cacti allows removal of Data Query Graph Template associations when they are in use -issue#525: LAST GPRINT type not rendered correctly due to lack of escaping -issue#530: Undefined function get_vdef in lib/rrd.php -issue#531: Issues with TextAlign and Tick graph items -issue#532: Unreliable scroll height causes issues in Chrome -issue#533: User settings not cleared after saving profile -issue#534: Automation issue with AS clause -issue#538: Unable to rename tree folder -issue#541: Issues with mobile graph viewing -issue#555: DSStats SQL insert errors due to data collection issues -issue#563: Division by zero in removespikes.php -issue: Fixed rendering issues with HRULE's on graphs -issue: Update jsTree to 3.3.4 version -feature: Improved responsiveness UI tables, filters, and menus 1.1.2 -issue#492: Error while adding non data query (cg) graphs -issue#494: CLI error while importing template -issue#499: SQL error in graph automation resulting in no graphs on tree -issue#500: Generic SNMP device package damaged - Unix Ping Host -issue#505: Log rotation does not work in some cases -issue#506: Undefined index: cactiStatsDeviceFailedPolls -issue#507: Nextwork discovery 'export' produces no results -issue#509: Minor bug with device ownership selection -feature: Add new legend type that includes Current/Average/Minimum/Maximum -feature: Update d3.js to latest version 4.7.4 1.1.1 -issue#457: Continued LDAP issues with initial user creation -issue#461: The function escapeshell arg not appropriate on Windows -issue#462: LDAP authorization issues: group membership check broken for 'Group Member Type' = 'Username' -issue#464: Change default batch spike removal limits for standard deviation and variance -issue#465: Less than sign inside items and labels of graph break graph -issue#466: Call to member function row() on a non-object in lib/snmpagent.php -issue#467: Reduce the number of queries in log function -issue#472: Schema changes to improve performance -issue#485: When editing a device, the ping status was not always returned -issue: Back button issues due to syntax problems in JavaScript -issue: Zoom periodically would loose it's crosshairs after zooming -issue: Zoom would zoom out into the future even when disabled -issue: Fixing lite corruption in graph_templates_item table -feature: Make SpikeKill options more consistent -feature#459: Add variable date time option to report mail subject -feature#460: Add external_id to host variables -feature#469: Change re-index method of Data Query from Device edit -feature: Support generalized date format approach in the GUI -feature: Use localStorage over a Cookie for Zoom setting storage -feature: Fully implement 'Remove Orphans' from Package import process 1.1.0 -issue#337: Generic SNMP OID Graph Template damanged -issue#338: Extremely slow new graph/DS creation -issue#353: Broadcast & Multicast Packet counters missing -issue#376: Structured RRD path permission issues -issue#389: Manual template based graph creation not working -issue#407: The RRDfile does not exist message is misleading -issue#410: Select character data was interpreted as hex by cacti_snmp_walk() -issue#422: additional issues with LDAP authentication -issue#424: Automation does not discover devices w/o resolvable hostnames -issue#427: undefined index TotalVisibleMemorySize on FreeBSD -issue#432: SpikeKill menu wonky on Paw Theme -issue#434: password_verify not compatible in php5.4- -issue#435: urlPath missing from paw theme links -issue#436: Restricted user does not see graphs in tree view -issue#443: Allow remote_agent.php through a NAT -issue#446: No local admin when using multiple LDAP configuration -issue#447: Creating another non data query graph from same template reuses first data source -issue#449: exec_poll_php does not flush pipes when using script server -issue#450: Graph list view - No Graphs Found -issue: Improve email test exception errors and change default timeout to 10 seconds -issue: When on links page, breadcrumbs would become corrupted -issue: When upgrading from any version of Cacti to 1.0.5, SQL's relative to poller_reindex might appear -issue: Color page performance poor -issue: The Device dropdown on the Graph View page was unreliable -issue: Aggregate and non-Device Graphs in list view had not Device or Title description -issue: Re-engineer back button design to accomocate ajax and native navigation -issue: Make Graph Template filter wider -issue: Resolve some visual issues in Classic theme -feature: Add page refresh API to make page refreshing in Ajax easier to accomplish -feature: Update fontawesome to version 4.7 -feature: Use fontawesome glyphs for menu items -feature: Support multiple column sort in table library -feature: Add glyphs to main Cacti console menu 1.0.6 -issue#386: Allow special characters in graph title -issue#414: Install Wizard check path for spine -issue#415: SNMP session handling broken -issue#418: LDAP create user from template not working 1.0.5 -issue#296: Poller warning for Non-SNMP device -issue#319: Add default 'High Collection Rate' data source profile to new installs to demonstrate concept of multiple rates -issue#330: Import templates to non-default Data Profile -issue#337: Error when try create new graph - SNMP - Generic OID -issue#342: Infinite loop in poller_automation.php with invalid schedule -issue#343: Device discovery cannot handle dots in device name -issue#344: Unable to upgrade to latest Cacti on FreeBSD -issue#353: Legacy broadcast & multicast packet counters missing in interface.xml -issue#354: Place on tree dashes / ordering is not correct -issue#355: Replace table rows with count when using InnoDB tables -issue#357: If recovery mode runs longer than a polling interval, a second is spawned -issue#358: Sending test e-mail results in warning -issue#360: Issue importing cacti.sql with some charsets -issue#364: Moving graph item causes page render issue -issue#365: ss_host_disk.php and ss_host_cpu.php should use return -issue#367: Upgrade chart.js to version 2.5 -issue#368: Issue with device automation ip vs. ip_address -issue#369: Interface bits/second total Bandwidth wrong CDEF -issue#375: Drag and Drop of Devices and Graphs allows dropping onto self -issue#380: Ignores a non-standard SNMP port -issue#382: When using php5.5+ new users unable to change their password -issue#384: graph_view.php backtrace errors -issue#385: Unable to place an aggregate grapn on a subtree -issue#390: Display graphs from this aggregate icon next to graph not displaying -issue#392: cdef.php missing sql where for system cdef's -issue#398: checkbox is not honored when creating tree -issue#399: External link configuration: Order buttons don't work -issue#400: SNMP Engine ID (v3) field too short -issue#401: Graphs -> Apply Automation Rules fails -issue#404: Success even when test mail fails -issue#406: HRULE text format special characters not escaped -issue#408: Suppress SNMP units suffix from cacti_snmp_get() output -issue: Improve is_ipaddress functions -issue: Drag & drop showing when disabled on page automation_templates.php -issue: Output messages displayed incorrectly in automation_templates.php and automation_snmp.php -issue: Importing template from old Cacti would not show data templates -issue: Handle snmp error exceptions better -issue: Update Apache .htaccess files to support multiple version -issue: When executing a full sync, if the table structured has changed, recreate the remote table -issue: Multiple domains not working as expected -feature#197: Add external_id to Cacti for linking Cacti to other monitoring systems -feature#332: Support copy user groups -feature: Log proper IP address if logging in behind a NAT -feature: New qquery parsing rules: VALUE/TEST, VALUE/TABLE, VALUE/HEX2IP 1.0.4 -feature: Javascript: make menu movement smooth and use localStorage -feature: Added cacti_snmp_get_raw() for plugin developers -issue#288: Function cacti_snmp_get bad handling of wierd value into snmp_value -issue#298: Graph generation issue with SNMP - Bits/Sec + Total Bandwith -issue#301: Unresolvable DNS hostname causing backtraces -issue#302: spikekill memory leak -issue#303: Error when creating tree items with "&" in the name -issue#307: Aggregate graph gives CMDPHP errors -issue#308: UI resize issue -issue#309: Show "Save Successful" notification permanently -issue#311: Graph thumbnail settings in profile setting does not work -issue#320: Users can not change their own password -issue#324: Aggregate template graph template JavaScript error -issue#352: Add configurable auto-logout and page-reload options -issue#329: Customize the favicon -issue#334: primary key on poller output boost table not efficient/not being used correctly -issue: Fixed issues with Dark theme -issue: Fixed issues with Paw theme -issue: Fix timespan calculation -issue: Added misplaced join condition when generating RRDtool graphs -issue: Fix the selection of timestan based on local_graph_id and rra_id -issue: Correct error in discovery not adding devices -issue: Action message did not always display -issue: fix regex to use Domains like www.t-online.de -issue: Properly align Order columns. -issue: address renaming issues with tree items. -issue: Add device snmp --version is ambiguous -issue: SNMP Availability failed to report down devices - This only was occuring for cmd.php collector. -issue: i18n remove embedded HTML syntax -issue: Wrap menu items to avoid scrolling 1.0.3 -issue#297: Upgrade 0.8.8h to 1.0.0 fails to create poller_output_boost table -issue: Added missing template import hash for 1.0.2 1.0.2 -issue#279: Correct Boost Status display issue -issue#275: Permission View issue and Device Dropdown when in Classic Theme -issue#270: Major Mib Cache corruption. Rebuild your MIB Cache after upgrading -issue: Resolve Cacti logo on Graphs page in Classic Theme 1.0.1 -feature: SpikeKill allows filling range to last known good value -issue#261: Add IPv4 and IPv6 Specific Counters to interfaces.xml -issue#257: Poller Output Table not Empty WARNING messages in cacti.log -issue#256: New Graph - Add Graph Items Fails (Data Sources shows None) -issue#255: Errors Creating new Graphs - Undefined Index Errors -issue#254: Unable to Properly add Data Source -issue#251: Remote Data Collector stuck on upgrade page -issue#247: Devices missing from tree device list -issue#245: Drag and Drop in Tree Edit Erratic -issue#243: SMTP Ping Failure with not SNMP Authentication -issue#241: Authentication Method: None not functional -issue#240: SQL error when install plugin -issue#238: Duplicate color id's cause error during Upgrade -issue#231: SNMPv3 - PHP ERROR WARNING: Fatal error: Unknown user name in file -issue: Resolving visual issues with row counts. -issue: When deleting Graphs prevent the removal of Data Sources that are still in use -issue: Improve SNMP agent performance through SQL optimizations 1.0.0 -feature: Support for remote data collectors -feature: Support Internationalization (i18n) for the main Cacti site, and supported plugins -feature: Data Source Profiles replace RRA settings allowing a single system to have multiple polling intervals -feature: Redesigned Tree page including Drag & Drop functionality -feature: New Graph Permissions system designed to make permissions simple to manage -feature: Add Themes 'Classic', 'Modern', 'Dark', and 'Paw' -feature: Debug Data Sources by comparing them to the Data Template -feature: New special Data Source type to detect the poller interval -feature: Bulk inserts in PHP poller to address latency issues -feature: Optimize data collection through in memory caching giving a 50% reduction in polling times when dealing with large sites -feature: Support RRDtool VDEFs -feature: Support new Graph Items: AREA:STACK, GPRINT:AVERAGE, GPRINT:LAST, GPRINT:MAX, GPRINT:MIN, LINE:STACK, TEXTALIGN, TICK -feature: Support RRDtool features: Right Axis Support, Dynamic Labels, Tab Width, Legend Position, Legend Direction -feature; Resizeable table columns -feature: Deprecated Single Pane Tree View -feature: Role Based Access Control (RBAC) -feature: Support User Group Permissions -feature: Show number of in use Graphs, Data Sources, and Devices for a given Template -feature: Support bulk re-sync of graphs to assigned Graph Template -feature: Bulk Device Settings changes -feature: CDEFs, Colors, GPrint Presets consolidated to Presets menu -feature: Authentication cookies for 'remember me' functionality -feature: Automatic logout after session inactivity -feature: Replace Boost server in favor of RRDtool Proxy -feature: Graph Details include CSV output, zoom, debug, and download links -feature: Graph Export moved to a plugin -feature: User change password functionality -feature: Automation added to core functionality through the merge of the Discovery and AutoM8 plugins -feature: Change interface graphs from 32 bit to 64 bit with ease -feature: Plugins now have hooks in device templates and automation -feature: Allow users to preview template imports to determine if there will be issues from importing -feature: Automatic removal of orphaned graph items when importing newer versions of graph templates -feature: Support for MySQL 5.7 -feature: Support for PHP 7.0 -feature: Merge Aggregate Plugin - Aggregate graph creation -feature: Merge AutoM8 Plugin - Automation of graph creation -feature: Merge Boost Plugin - Faster polling, result caching, on-demand RRDtool file updates -feature: Merge CLog Plugin - View Cacti logs -feature: Merge Discovery Plugin - Device discovery -feature: Merge Domains Plugin - Support for domain (ADS/LDAP) specific user templates -feature: Merge DSStats Plugin - Cache Data Source values for easy retrieval -feature: Merge Logrotate Plugin - Rotate Cacti logs -feature: Merge Realtime Plugin - Realtime graph viewing -feature: Merge Reporting (Nectar) Plugin - Reporting -feature: Merge RRDclean Plugin - RRD file cleanup and management -feature: Merge Secpass Plugin - User password policy enforcement -feature: Merge Settings Plugin - Shared settings for plugins -feature: Merge SNMP Agent Plugin - SNMP Agent for Cacti providing system statistics -feature: Merge SpikeKill Plugin - Remove unwanted spikes from graphs -feature: Merge SSL Plugin - Force https -feature: Merge SuperLinks Plugin - Add external links within Cacti -feature: Merge UGroup Plugin - User groups with permissions -feature: Merge Watermark Plugin - Watermark your Cacti graphs -bug: Fixed issue where old graph templates (0.8.6-), could import bogus data causing issues with Data Input Methods -bug#0000168: Duplicate data sources should be avoided when creating new graphs -bug#0000851: Review an imported template -bug#0001155: When viewing graph tree do not show empty nodes -bug#0001337: Form to filter for graphs in host view mode -bug#0001552: Date ranges not shown on graphs in the view with Daily, Weekly, Monthly & Yearly graphs -bug#0001573: RRA templates/grouping -bug#0001577: Override session handling and store session in Database -bug#0001790: Allow for XML delimiter in fields of a script query -bug#0001820: Unable to use a Data Input Method Output Field in more than one Data Source Item -bug#0001827: Changing the graph template messes up the graph item fields -bug#0001836: Add mysql error message to log -bug#0001877: Cookies path is not properly set -bug#0001966: Expand Devices in tree view not honored -bug#0001970: Data query index order cache should be populated on re-index -bug#0001981: Cacti is not full UTF-8 -bug#0001986: CLI allow add_graphs.php to have multiples --snmp-field and --snmp-value options -bug#0001996: Allow using data input field in graph title -bug#0002096: Enumerated SNMP values not parsed correctly -bug#0002112: CLI add configurable parameters for device_add.php -bug#0002133: Restrict User to only manage specific device(s) -bug#0002135: Regular expression support for filter -bug#0002137: Data query oid_suffix parameter does not function -bug#0002159: Database creation file not fully compliant with strict SQL mode -bug#0002162: Unable to authenticate user with password containing UTF-8 -bug#0002196: Incorrect script server instance number in log -bug#0002225: Make -Cc SNMP option configurable -bug#0002255: Script query_unix_partitions.pl should only query local mounts -bug#0002336: Implement php-snmp class library -bug#0002340: Data query script execution should be escaped -bug#0002350: SNMP Data Query index_order ignored -bug#0002351: Ping does not work with non-English locale -bug#0002361: Spine does not log unknowns the same way cmd.php -bug#0002362: Poller cmd.php makes wrong hex-string to decimal conversion -bug#0002370: Cacti prints wrong date formats, does not honor a systems locale -bug#0002403: Typo in DELETE statement leading to poor graphing performance -bug#0002412: Graph Template duplication causes \t to be converted to TAB char -bug#0002418: Data Source Items named 'ds' break UI ability to add more items -bug#0002419: SNMP enum results not parsed correctly by cmd.php poller -bug#0002452: CVE-2014-4000 PHP Object Injection Vulnerabilities -bug#0002454: OS Command Injection -bug#0002468: Changing graph format to anything but PNG causes no output -bug#0002476: Add support for SNMP v3 EngineID -bug#0002483: Cisco ASA using Re-index method of verify all causes recache event every time -bug#0002484: Incorrect SQL request in cli script repair_database.php -bug#0002521: Unable to create two devices via CLI with the same IP-Address -bug#0002522: Zero padded hex strings are parsed incorrectly -bug#0002535: Graph Template Changes not updating RRDtool command -bug#0002636: Creating Data Template with "U" for min and max saves field data_input_field_id as 0 for first item -bug#0002697: CVE-2016-2313 allows remote authenticated users who use web authentication to bypass intended access -bug#0002698: When the host is down the wrong data type are used for some columns in the host table -bug#0002723: Renaming a disabled device still attempts to connect and get SNMP host information -bug#0002724: Multipage graphs the menu can disappear -bug#0002725: Changing graph template does not mark correct interfaces disabled on data query generated list 0.8.8h -bug:0002656: Authentication using web authentication as a user not in the cacti database allows complete access (regression) -bug:0002667: Cacti SQL Injection Vulnerability -bug:0002666: When click the [Clear] button after clicking the [Refresh] button in Preview Mode , fails to CSRFcheck -bug:0002673: CVE-2016-3659 - Cacti graph_view.php SQL Injection Vulnerability -bug:0002676: Outdated MIBs for non-unicast packets -bug:0002677: Index is a MySQL 5.6 reserved word -bug:0002681: generate_graph_def_name() generates reserved word "cf" 0.8.8g -bug:0002161: Graph management "graph()" function conflicts with graphviz PECL extension graph() -bug:0002320: Unable to delete more than 500 graphs at once -bug:0002591: graph_view.php - unable to advance to Next Page in Tree View -bug:0002608: cacti 0.8.8f - Data Templates - Poller/script issue with backslash -bug:0002618: bug/syntax error in html_utility.php -bug:0002616: cdef.php -- Extra php closing tag -bug:0002617: PHP Warning is thrown when trying to include auth_login.php -bug:0002623: log warning display wrong time_interval -bug:0002627: Graph tree doesn't work in Internet Explorer -bug:0002601: graphs_new.php query not sorted as per definition xml:index_order -bug:0002625: Plugins don't display the next page -bug:0002631: RRDtool export not XML compliant - results in empty CSV exports -bug:0002622: graph_view.php -- Navigation and Content Areas are not visible in Tree Mode -bug:0002626: Unable to add two users in a row - Notice: Undefined index: id -bug:0002620: Unable to copy user -bug:0002618: bug/syntax error in html_utility.php -bug:0002646: SQL injection in graph.php -bug:0002656: Authentication using web authentication as a user not in the cacti database allows complete access -bug:0002647: 0.8.8g rev 7767 Can add cacti devices to graph tree "Save Failed" -bug:0002652: CVE-2015-8604: SQL injection in graphs_new.php -bug:0002655: CVE-2015-8377: SQL injection vulnerability in the host_new_graphs_save function in graphs_new.php -bug:0002629: Cacti lacks tab icons in chrome from android -bug:0002619: Fix incorrect placement of htmlspecialchars() in tree.php -bug:0002642: ping.pl does not take into account host port numbers -bug:0002567: RRDtool 1.5.x Support -bug:0002269: |query_ifSpeed| in --upper-limit for graph template does not work with empty ifSpee 0.8.8f -bug:0002599: 0.8.8e Poller Script Parser is Broken -bug:0002600: cli/upgrade_database.php is missing releases -bug:0002603: Graph managment graphs.php save button does not work -bug:0002599: Poller Script Parser is Broken 0.8.8e -bug: Fixed issue with graph zooming failing to work -bug: Fixed various SQL Injection vectors -bug#0002569: Impossible to have a URL pointing directly to a graph -bug#0002574: SQL Injection Vulnerabilities in graph items and graph template items -bug#0002577: CVE-2015-4634 - SQL injection in graphs.php -bug#0002579: SQL Injection Vulnerabilities in data sources -bug#0002580: SQL Injection in cdef.php -bug#0002582: SQL Injection in data_templates.php -bug#0002583: SQL Injection in graph_templates.php -bug#0002584: SQL Injection in host_templates.php -bug#0002586: Cannot delete data sources from the GUI -bug#0002592: graph_view.php - viewing host in new tab - Undefined index: nodeid -bug#0002594: status_fail_date and status_rec_date are set incorrectly after host is marked down -bug#0002597: Incorrect value in Hosts column on Host Templates page -bug#0002598: Incorrect row number in Devices -> (Edit) page 0.8.8d -feature: Remove un-needed fonts and javascript files -bug: Fixed XSS VN: JVN#78187936 / TN:JPCERT#98968540 -bug#0002261: PHP 5.4.0 added new error_reporting variable, causing cacti to show errors -bug#0002391: Odd Behaviour on ReIndex of Data Query Data -bug#0002393: Broken thumbnail images for graph templates -bug#0002402: Subtree must not have the same header as the parent header -bug#0002474: CLI add_device.php dows not set availability_method correctly -bug#0002449: The Save button does not work: Invalid html on page Console -> Cacti Settings: empty form tag -bug#0002428: Fail to delete all data input items when removing more than 1000 data sources -bug#0002439: Password with special character don't work with LDAP authentication -bug#0002461: invalid bn with ldap and anonymous bind -bug#0002465: Graph Export return empty CSV file -bug#0002484: Incorrect SQL request in cli script repair_database.php -bug#0002485: Broken pagenation on graph viewing -bug#0002489: SNMP - Get Mounted Partitions using Re-index method of Index Count Changed causes recache event every time -bug#0002490: Can not select page for multiple datasources per device -bug#0002494: CSV export always shows last day -bug#0002504: Data template search not functional -bug#0002542: [FG-VD-15-017] Cacti Cross-Site Scripting Vulnerability Notification -bug#0002543: Unable to switch pages within graphs_new.php due to invalid URL generation -bug#0002544: Duplicate entry in $nav_url during list view -bug#0002571: SQL Injection and Location header injection from cdef id CVE-2015-4342 -bug#0002572: SQL injection in graph templates CVE-2015-4454 0.8.8c -bug#0002228: GPL incompatible files included in Cacti project in include/treeview -bug#0002383: Sanitize the step and id variables CVE-2013-5588, CVE-2013-5589 -bug#0002385: Cannot export host templates while including dependencies -bug#0002386: cli/upgrade_database.php is missing the last two releases -bug#0002390: Poller/script issue with slash and backslash -bug#0002405: SQL injection in graph_xport.php -bug#0002431: CVE-2014-2326 Unspecified HTML Injection Vulnerability -bug#0002432: CVE-2014-2327 Cross Site Request Forgery Vulnerability - Special Thanks to Deutsche Telekom CERT -bug#0002433: CVE-2014-2328 Unspecified Remote Command Execution Vulnerability -bug#0002434: Suppress SNMP UNITS Suffix from cacti_snmp_get() output -bug#0002438: Down Host Detection issue when using SNMP Desc or SNMP getNext -bug#0002446: Subtract plugin processing time from Poller sleep time -bug#0002453: CVE-2014-4002 Cross-Site Scripting Vulnerability - Special Thanks to G. Geshev (munmap) -bug#0002455: Incomplete and incorrect input parsing leads to remote code execution and SQL injection attack scenarios -bug#0002456: CVE-2014-5025 / CVE-2014-5026 - Cross-Site Scripting Vulnerability - Special Thanks to Adan Alvarez and Paul Gevers -bug#0002495: Graph Filter Date Range -bug: Fix COMMENT handling, even in case COMMENT is empty, with or without HR and with variable substitution -bug: Fix issues when SNMP data holds a "="; "explode" must be treated accordingly -bug: Fix filter highlighting on data sources for the data template field -bug: correct description of SNMP V3 parameters -feature: Added native jquery, jqueryui, and jstree -feature: Fixed issues with 'Clear' under preview not working -feature: Added new Tree navigation -feature: Added Columns and Thumbnails to Preview -feature: Added Columns to Tree (Preview only) -feature: Both Graphs and Columns default to 'Default' -feature: Resolved Left hand navigation taking entire page -feature: Added new graph zoom to tree view and preview offering a "quick" (default) and an "advanced" mode 0.8.8b -bug: Fixed issue with custom data source information being lost when saved from edit -bug: Repopulate the poller cache on new installations -bug: Fix issue with poller not escaping the script query path correctly -bug: Allow snmpv3 priv proto none -bug: Fix issue where host activate may flush the entire poller item cache -security: SQL injection and shell escaping issues 0.8.8a -bug#0002207: cannot export graph templates -bug#0002208: Graphs with CDEFs fail to generate -bug#0002209: External auth does not work behind a reverse proxy -bug#0002211: creating an index USING BTREE fails ony MySQL < 5.0.60 -bug#0002213: CLI upgrade script is missing 0.8.7i as a target -bug#0002214: SQL error during non-PIA upgrade to 088 when giving a default for a text field in plugin_realms -bug#0002216: use of define_syslog_variables() gone in PHP 5.4 -bug#0002217: url_path should default to /cacti/ -bug#0002221: Missing plugin directory causes endless loop in plugins.php -bug#0002222: tail_logfile hangs when cacti.log not readable, filling apache log with fgets warnings 0.8.8 -bug#0002056: un-initialized datetime used for host status (was: Zero length string != NULL) -bug#0002081: In Graph Management, search display graph title breaks when using pattern symbol "/" -bug#0002132: need to include pa.sql with the 0.8.7i and future releases -bug#0002134: rebuild_poller_cache.php --host-id deletes table poller_item completely -bug#0002141: cacti.sql missing BTREE PRIMARY KEY for poller_output -bug#0002146: Utilities -> View Log File -> refresh does not work -bug#0002150: usort_data_query_index() is broken -> graph order for hosts with data query sort option fails -bug#0002151: When building HTML forms with sub_checkbox on_change parameter is not used -bug#0002152: Issue with filter on graphs_new.php -bug#0002153: Cant search for patterns containing a forward-slash -bug#0002156: CDEF strings are not escaped before passed to rrdtool command -bug#0002158: Minor changes to grammar of displayed messages -bug#0002165: Using data input field in data source name (related to 2079 in 0.8.7i) -bug#0002167: New poller hook poller_finishing -bug#0002172: structure_rra_paths.php does not handle disabled data sources -bug#0002174: poller_item.host_id has wrong type -bug#0002178: typo in include/global_form.php: Mimimum -> Minimum -bug#0002181: session_unregister (use in functions.php) doesn't exist anymore in PHP 5.4 -bug#0002182: When there is no suitable (unique) index, graphs are not shown in data query ordering on host leafs -bug#0002189: Proper graph hooks -bug#0002191: Refresh issues -bug#0002194: changing data query XML does not propagate to existing data sources -bug: Fix input validation on cli/api_device.php -bug: Fix issue with data source template associate command line script inserting incorrect rra information -bug: Fix minor display issue on data source pages -bug: Fix minor issue with counting items in the poller_output table -bug: Graph settings and settings check boxes do not allow unchecking to be saved -bug: Fix minor issue with plugin library caused by non-session -bug: Fix SQL error on data input save for non-templated graphs -bug: user_log index added to increase performance -feature: Merge Plugin Architecture into Cacti -feature: Added index to data_template_data to increase performance 0.8.7i -bug#0001963: Bandwidth summation "total in" and "total out" are always 0 -bug#0002040: ICMP ping errors for Windows 7 with PHP 5.3 -bug#0002062: Multiple security vulnerabilities -bug#0002063: Multiple value poller output incorrectly interpreted as hexadecimal value -bug#0002064: Removing "~" (tilde) by sanitize_uri() conflicts with Apache UserDir translation -bug#0002066: Graph without host id "Notice: Undefined variable: host_id" -bug#0002067: Custom time range filter not working -bug#0002068: Missing header include in analyze_database.php -bug#0002071: MySQL table poller_item is dropped always when "Data Input Method" is changed or added. -bug#0002079: Using input field of a script in graph title does not work -bug#0002080: Database password containing "@" does not connect -bug#0002083: Adding a new users generates errors in apache logs -bug#0002084: Incorrect normalization of hrStorageTable values over 2^31 -bug#0002086: Incorrect usage of mysql custom tcp port -bug#0002087: PHP recache problems due to missing slashes in reindex table -bug#0002093: Unit exponent value of 0 not imported with graph template -bug#0002094: CDEF: "another cdef" references not included in template export -bug#0002106: Command line add device does not accept "None" for host template -bug: Update host template cli script help to fix incorrect options -bug: Refresh of Cacti log viewer not working -bug: Problems saving User Graph Permissions in IE9 -bug: Bandwidth summation fails if NAN values are present -bug: Special Type Code "host_id" available in Data Queries by Not Data Input Methods -bug: Do not generate error messages when creating non host based graphs -bug: Wrong index used for Data Queries using VALUE/REGEXP -bug: Fix issue with title variable replacement failing when no host is associated with graph -bug: Cacti generating MySQL 1100 Errors when modifying the tree -bug: Resolved "Fatal error: Cannot use string offset as an array" in lib/data_query.php -feature: Properly support ifHighSpeed replacement variable -feature: Increase granularity of availability options to correct spine bug -feature: Replace "event count" with last changed date for host availability 0.8.7h -bug#0001403: Reapply Suggested Names does not work correctly for graphs and data sources not associated with Data Queries -bug#0001568: Remove PHP 5.3 deprecated functions -bug#0001584: Concurrent changes to graph tree ordering can corrupt sort values -bug#0001626: Symbol ($) does not appear in labels/gprint strings to rrdtool during graph generation -bug#0001632: Script server treats quoted arguments with spaces incorrectly as multiple separate arguments -bug#0001646: MySQL SSL connection support -bug#0001660: Modifying data template values does not propagate as expected -bug#0001678: Adding graphs to a device fails to add entries to poller_item if using the script server -bug#0001768: Perform consistency check on ds maximum vs. ds minimum -bug#0001783: Graph Export export date is incorrect -bug#0001812: Data template copying ignores some item templating -bug#0001814: Command line device add script fails when SNMP default is disabled -bug#0001815: One minute polling not working correctly -bug#0001816: Cannot export graph data to CSV with IE 8 -bug#0001819: MySQL "TYPE=" command deprecated since MySQL 4.1 removed in MySQL 5.4.4 -bug#0001826: Zoomed graph views should auto refresh -bug#0001828: Reapply Suggested Name prompt as spelling problems -bug#0001835: Graph edit page has more than one html form tag -bug#0001847: Graph export API function has required argument not defined -bug#0001851: Graph creation selector does not work with data query that has no associated graph templates -bug#0001855: Improper formatting of data queries can result in SQL errors -bug#0001862: Ping script does not process output of update ping utility -bug#0001867: RRDtool Cacti fetch function does not work for some locales -bug#0001876: PHP function strip_quotes causes HEX values to be truncated -bug#0001880: Form validation error message does not highlight text area control -bug#0001882: Cacti snmp_walk function fails if max_oids is an empty value -bug#0001890: Default tree view mode set to single pane mode not working -bug#0001893: Data input method description text does not make sense -bug#0001900: Equal sign not correctly parsed in snmp data results -bug#0001903: Undefined variable: mode in lib/ldap.php on line 375 -bug#0001918: Script server does not accept more than one blank space before the function name -bug#0001926: Importing templates "using defaults for this installation" associates all rra's defined -bug#0001928: graph_image.php does not check local_graph_id -bug#0001929: Error when exporting templates are not properly reported -bug#0001930: No error reporting for wrong RRA -bug#0001934: Poller does not process SIGTERM signal correctly -bug#0001936: Removing multiple data sources is inefficient -bug#0001937: Technical support page uses check table which waits for table lock -bug#0001939: Do not query for number or items per host if concurrent polling processes is set to one -bug#0001954: Usage of PHP_SELF without basename in html.php (at least partly fixed) -bug#0001956: Attempts to update existing tree item fail -bug#0001967: Reflected XSS on Cacti 0.8.7g -bug#0001989: IE9 breaks Cacti when objects are hidden using 'display:none;' style tag -bug#0001993: Undefined index in lib/html.php -bug#0001995: REQUEST_URI not properly escaped in graph_view.php for preview mode -bug#0002005: Saving Script Server or Script Data Input Method Results in SQL Error -bug#0002060: NAN values in hdd utilisation graphs (Poller Output Table not Empty) -bug: Fix SQL injection issues in login page -bug: RRDtool fetch in Cacti fails to function properly on rrdtool files with NaN values in the output -bug: Accept "Connection refused" on TCP ping tests -bug: Add missing row selection javascript to graph preview -bug: Script server throws "undefined variable" error when in debug mode -bug: Removing graphs does not take advantage of bulk deletes -bug: Fixed issue with multiple "U" results for a data input method with multiple output parameters -bug: SNMP v3 use AuthNoPriv when privacy passphrase is empty -bug: Fixed sql errors when using template and search filter on graph management -bug: Delete Data Source multi fails to perform bulk deletes on Data Source items -bug: Allow Timespan Selector to work with $_REQUEST as well as $_POST -bug: While in the mrtg view of Cacti Graphs, or in viewing graph properties zoom fails -bug: The filepath api call should trim the filename before checking for the files existance -bug: Fix issues with IE9 while editing templates -bug: Form action in graph_items.php incorrect -bug: Initial drawing of tree causing Next/Previous with malformed URI -feature#0001519: Spine enhancement for parallel collection of data at device level -feature#0001667: Get values of |host_*| variables in graph elements from data source -feature#0001922: Reindex method "Index Count Changed" requires that OID_NUM_INDEXES is given for SNMP Data Queries -feature#0001923: Implement counting for script (server) data queries just like OID_NUM_INDEXES -feature#0001924: Allow for reindex method "Index Count Changed" to apply to script (server) queries as well -feature#0001952: Ability to use input field of a script in graph title -feature: Make reindexing and repopulating the poller cache a lossless process -feature: Change default font sizes -feature: Add analyze database and push out host cli scripts 0.8.7g -bug: RRDtool 1.4.x not recognized during installation -bug: Implement windows-aware shell escaping -bug: Fixed multiple cross site scripting vulnerabilities reported by Tomas Hoger of the Red Hat Security Response Team -bug#0001292: Over 8TByte Partition in Windows cant get correct data from snmp -bug#0001486: Unable to login after redirection to access denied page -bug#0001516: "Show the page that user pointed their browser" does not seem to work -bug#0001561: Over zelous HTML excaping on filter strings -bug#0001575: LDAP-Authentifications does not work due to ldap_host being set incorrect -bug#0001587: Feature from bug#0001271 breaks on large values -bug#0001607: Web Basic authentication does not work with fastcgi -bug#0001620: Max OID's max value reported incorrectly in Web UI -bug#0001747: oid_suffix do not work correctly for input direction on data queries -bug#0001756: Alternate font styles do not work correctly -bug#0001757: LDAP realm authentication outputs warning for undefined index -bug#0001763: Unable to add graph permissions on a user -bug#0001765: Tech support does not work correctly with RRDtool 1.4.x -bug#0001766: Page refresh setting not being honored -bug#0001771: "index count changed" not implemented for query_unix_partitions.pl, query_host_partitions.pl, query_cpu_partitions.pl, ss_host_cpu.php and ss_host_disk.php -bug#0001773: Character encoding problem after upgrade to 0.8.7f -bug#0001775: Tech support page does account for no memory limit set for PHP -bug#0001776: Simultaneous databases connections are not supported 0.8.7f -security: SQL injection and shell escaping issues reported by Bonsai Information Security (http://www.bonsai-sec.com) -security: Cross-site scripting issues reported by VUPEN Security (http://www.vupen.com) -security: MOPS-2010-023: Cacti Graph Viewer SQL Injection Vulnerability (http://php-security.org) -bug#0001125: XML parse error on template import with degree symbol -bug#0001311: Access denied for graph-only users when accessing index.php directly -bug#0001366: Exported data templates do not import special characters properly -bug#0001416: Graph Export fails with EXPORT FATAL ERROR: Export path /some/path/root/export is within a system path /root. Can not continue. -bug#0001452: Missing "<" and ">" in "Collection Methods=>Data Input Methods=>"Input String" after importing template -bug#0001461: Data query export/import fails -bug#0001492: RRDtool 1.3 series fonts (fontconfig) support -bug#0001506: Reindexing fails due to global include issue in lib/snmp.php -bug#0001522: Special characters break parsing of template data -bug#0001524: Export graphs and Classical Presentation does not honor per graph export rules -bug#0001528: ICMP Ping availabilty broken in UI for Windows Servers using IIS -bug#0001535: No display of parent ID in tree nodes for CLI tree add script -bug#0001543: All graphs are exported dispite graph export rules -bug#0001549: Function array_to_sql_or creates poor sql where clauses -bug#0001557: Quotes in Text Format graph template field break graph rendering -bug#0001587: 64bit HEX Strings do not convert to Decimal on 32bit Systems -bug#0001604: HEX Counter values enclosed in quotes not recognized as HEX -bug#0001609: Script server timeout too aggressive with 10 second poller interval -bug#0001628: Inconsistent message for Change SNMP Options related to available buttons -bug#0001695: Suppress deprecated warnings in Cacti code -bug#0001725: PHP Fatal Error while trying to add a tree node via cli -bug: When creating new graphs without a data source, print error to user instead of throwing php error -bug: Browser query string does not contain arguments -bug: Function inject_form_variables does not operate if more than 1 variable needs replacing -bug: Script imposed memory limits cause issues with some scripts -bug: Turn off process leveling if there are not enough poller items to substantiate it -bug: Add device should allow no-snmp type devices -bug: Firefox Autocomplete causes issues with password validation -bug: Access Denied messages do not allow re-direction to login page -bug: When clearing filter on new-graphs do not clear host or template -bug: When clearing filter, reset page to 1 for all queries -bug: Graph List selectors do not persist between pages -bug: allow empty [upper|lower]_limit even without autoscaling -bug: Availability method Ping or SNMP generates meaningless warnings -feature: Add logging to SQL Save error handling -feature: Add utility to convert database to InnoDB -feature: Return nav as the title for the page -feature: Detect and correct for RRDtool segfaults -feature: Add rra_id for hosts and graphs to be used during tree export -feature: Make the Graphs pages render like the rest of Cacti -feature: Convert base Cacti UI to use buttons and not images -feature: Make poller sane so that it can be used by other cacti processes -feature: Add snmp timeout warnings for lib/snmp.php 0.8.7e -bug#0001044: Creating a DS, Output field can't be selected for DT with a DIM when "Use Per-Data Source Value" is on -bug#0001341: SNMP query: add oid_suffix for weird SNMP queries -bug#0001345: Overwriting $snmp_index in query_snmp_host() breaks SNMP Data query if using get method -bug#0001346: Strip out noisy 'No Such Instance currently exists at this OID' -bug#0001404: timeout in "function ping_icmp" (lib/ping.php) -bug#0001405: Spaces in DS when .rrd file is created, so it fails -bug#0001407: Place graph thumbnail into div to lower page length changes on load graphs -bug#0001410: Thumbnail Columns is not honored for host display with snmp index group style -bug#0001411: Graph searching issue -bug#0001413: strip_quotes fails -bug#0001426: multiple form opening due to bug in draw_edit_form() -bug#0001436: CSV Export Start Date and End Date are always 1970-01-01 01:00:00 -bug#0001443: format_snmp_string can return a number with a leading space -bug#0001446: Wrong dates override in CSV export -bug#0001456: oid_uptime is not parsed correctly -bug#0001460: Skiping input parameters in data_query_field_list() may lead to SQL errors -bug#0001464: Typo in install/index.php -bug#0001467: Customisable oid index parse regexp for weird MIBs -bug#0001468: Tree is not expanded correctly -bug#0001469: Tree is not being expanded if user followed link outside of cacti -bug#0001476: Mark stacked columns in rrdtool_function_xport() output -bug#0001477: Spelling error in a variable in html_tree.php -bug#0001478: Combo boxes on Graph Management page produce URLs with leading spaces -bug: Top Graph Header Breaks When Plugins Used -bug: SNMP v3 Password issue caused by Firefox's Password AutoFill -bug: Strip Quotes does not properly handle the value 'U' -bug: Changes to the graph tree would not show up immediately for current user 0.8.7d -bug#0001336: Allow to specify on_change handler for checkbox_group -bug#0001338: When Using Web Basic Authentication HTML Bookmarks Do Not Work -bug#0001388: Spine uses illegal flag for ping on Mac OS X -bug#0001351: Deleting 1000 graphs along with their Data Sources crashes the Server -bug#0001361: SNMP query: 'No more variables left in this MIB View' instead of value of input field -bug#0001374: ss_host_disk.php etc. error corrected when using SNMP V3 (index off by 1) -bug#0001376: graph_items.php variable $id defined in wrong place -bug#0001377: Several bugs in new cli script "structured_rra_paths" -bug#0001378: ping.pl script fails when using tcp:hostname -bug#0001382: cdef.php error due to wrong function name -bug#0001383: syntax error in lib/rrd.php with PHP 4.4.4 -bug#0001384: utilities.php does not handle view_snmp_cache when host_id = -1 (Any) -bug#0001385: LDAP Error: Group DN could not be found -bug#0001391: parsing snmp string with "=" ?? --> WARNING: Result from SNMP not valid -bug#0001392: Problem on CDEF function ALL|SIMILAR_DATA_SOURCES_(NO)?DUPS -bug#0001394: Error of variable in lib/html_tree.php -bug#0001398: Cross site scripting checking is overly protective on search filters -bug#0001400: LDAP authentication results in PHP warning message -bug: Resolved issue with reapply suggested names not working for data sources under certain conditions -bug: Correct missing db_conn argument issue -bug: Deleting large number of hosts results in SQL errors due to MySQL buffer overrun -feature: SNMP cli version information added to tech support page 0.8.7c -bug#0000157: Dual pane tree does not have the option of not rendering all trees in one page -bug#0000486: RRA template edit allows invalid XFF values -bug#0000626: Setting "Default Graph Tree" does not work with dual pane view -bug#0000828: Truncated IOS description in |query_ifAlias| -bug#0000909: ALL_DATA_SOURCES_NODUPS breaks graphing when using "Consolidation Function" MAX -bug#0000943: scripts/ping.pl has incorrect response when "icmp hop redirect" occurs -bug#0000948: Exporting graphs to a local path does not work correctly in some cases -bug#0000986: Graphs that are done by graph type are not exported when using the tree view -bug#0001022: strip_quotes incorrectly parses script output -bug#0001090: LDAP authentication fails when using quote character in password -bug#0001135: Graph export feature not exporting as per user level selected -bug#0001136: Regex ambiguous for mbstring -bug#0001138: Lack of error checking causes graphs to not update when rrdtool crashes -bug#0001141: Script server appears broken for "index" and "query" requests (Documentation Fix) -bug#0001145: Save Failed error when changing Graph Details -bug#0001153: Undefined variable: local_graph_id in graphs.php on line 201 -bug#0001166: Installer does not properly handle disabled guest_user conversion -bug#0001174: Unidentified index warning -bug#0001175: Hide hosts in Graph Permissions that you already have access to -bug#0001176: Problem validating IPv6 addresses -bug#0001188: Graph export issues in tree mode -bug#0001191: Faulty IP address validation by ping.php script -bug#0001180: Graph Export to CSV failed by using IE 6 SP2 -bug#0001194: RRDtool URL is incorrect on the about page -bug#0001204: Since upgrade to 0.87b the hosts with ip address with 255 are down and have no datas -bug#0001206: Graphs are not zoom-able with PHP warnings turned on -bug#0001211: Allow use of "REMOTE_USER" if "PHP_AUTH_USER" is not set for authentication -bug#0001213: Template Copy does not hash copied template_items -bug#0001215: Impossible to define a none availability with the client cli/add_device.php -bug#0001216: CSV Export for zoomed graph, results in Validation error -bug#0001217: Default Graph Tree is not reflected in Left Pane of the graph page -bug#0001223: Missing Hard return on last GPRINT causes bad formatting -bug#0001228: LDAP server port not honored -bug#0001230: Poller stops updating rrd files -bug#0001236: Set 'stats_recache' to zero when no re-index is present -bug#0001238: Guest user has access to change password -bug#0001239: Using the TOTAL_ALL_DATA_SOURCES in a graph where all item are using the MAX CF yields an invalid(empty) CDEF -bug#0001240: SNMP string cleanup removes too many '=' signs -bug#0001244: Missing closing on host.php -bug#0001247: Snmp ping won't work for snmp v3 -bug#0001256: Spine-poller.c : Bug in size string sysUptime -bug#0001258: "Remove Verification" is an ambiguous definition, leads to data loss -bug#0001259: LDAP Authentication using Solaris 10 standard ldap client fails -bug#0001262: Do not allow deletion of Graph Export User -bug#0001264: CDEFs can't recognize |query_*| -bug#0001268: resource/snmp_queries/net-snmp_disk.xml has incorrect name for "Percent Available" -bug#0001271: Hex string to decimal conversion for proper RRDtool storage -bug#0001273: Escape windows paths to accommodate spaces -bug#0001281: ICMP Ping fails if an octet == 255 -bug#0001283: graph_image.php causes PHP Notice errors on view -bug#0001286: poller_item cache is not updated when "Data Input Method" is changed -bug#0001288: A host with ICMP ping selected as method does not properly perform ping -bug#0001291: Reapply Suggested Names fails on Script Queries -bug#0001293: When Creating Data Query Graphs, Performing Search will Cause List to Disappear -bug#0001294: Stack overflow if database is not correctly initialized -bug#0001295: Division by zero when rrd_step < poller_interval -bug#0001296: add_graphs.php does not add the graph template to the host -bug#0001299: When creating graphs the entire poller cache is recreated for a host -bug#0001314: Use Data Query variables as HRULE input for graph templates -bug#0001318: Graph Export with 1 minute poller re-exports graphs 5 times -bug#0001320: Invalid PHP_SELF Path -bug#0001326: If a user's password contains a single quote the login fails -bug#0001342: VRULE printed as HRULE on graph_templates.php graph template item list -bug#0001380: Expand description of ping retries -bug: Remove include/html files to mitigate XSS issues -bug: IE generates errors on both the host and graph settings pages -bug: Host save failed in FireFox 3 for non-SNMP V3 hosts, complaining about "password mismatch" -bug: Initialization of snmp_auth when using SNMP=NONE -bug: Speed up add_graphs.php in most cases (still slow only if --input-fields is used) -bug: If the poller_output table is not empty, do not flood the log -bug: Remove warnings appear in the httpd log relative to reset attempts on settings array -bug: Add API Automation tool quietMode to additional functions -bug: When Cacti is launched from within an iframe, cookies are dropped from IE6 -bug: Database upgrade and cacti.sql differ -bug: drop color setting background on FF does not work -bug: cli/add_tree.php requires as least a host-id for --list-graphs -bug: add_tree.php did not allow nodes with propagating sort options -bug: When adding a tree node via the api numeric and natural were reversed -bug: When saving a data query based data templates, their data sources would become corrupt -bug: If your system contains INNODB tables, the Technical Support page would hang -bug: The default user tree link icon would not be properly highlighted when opening graphs -bug: Severe performance problems when adding data query based graphs. -bug: Default refresh on Cacti Log was too quick -bug: Some users do not like the idea of automatic page refreshes -bug: Allow more rows to be visible in Cacti pages -bug: Ping and SNMP should test both conditions -bug: When step is less than poller interval, item will stop polling for long period of time -bug: When using Web Basic authentication, user is directed to default page and not REQUEST URI -feature#0000284: Custom for each device -feature#0000431: Add php-xml to requirements, verify required PHP extensions -feature#0000852: Have "Previous" and "Next" disappear when not in use (only for graph display) -feature#0001082: Mirror Graph Rename based on template function to work with Data Sources -feature#0001140: CLI-Script to associate a graph template to a host -feature#0001162: WEB UI now accepts max_oids on SNMP bulkwalks -feature#0001177: CLI Reindexing - poller_reindex_hosts.php: allow filter on "host description" -feature#0001189: Introducing |data_source_title| variable -feature#0001195: Add graph title to graphs page -feature#0001201: Reapply Suggested Names for Data Sources and cli/poller_data_sources_reapply_names.php -feature#0001205: Add filtering and pagination to cdef management; add "Duplicate CDEF" -feature#0001220: Disable snmpbulkwalk if max OIDS is less than 2 -feature#0001233: Move $export_types variable definition from templates_export.php to include/global_form.php -feature#0001233: Move $export_types variable definition from templates_export.php to include/global_form.php -feature#0001235: CLI script needs to activate a query: add_data_query.php -feature#0001250: Dispatching job in poller can lead to unbalanced threads -feature#0001249: New pseudo CDEF variables for "Count All|Similar Data Sources (NO)?DUPS" -feature#0001289: Add "Graph Properties" wrench to tree+preview mode -feature#0001323: List all graph template associated with a host template -feature#0001306: Add Blank Line as possible graph item -feature: Paginate Treeview Dual Pane -feature: Allow user to specify maximum graphs per page from Treeview Dual Pane -feature: Allow Treeview Dual Pane to be filtered for graph titles -feature: Allow the user to add or remove graph text from page for searching with the browser -feature: Add links to Graph Management and Data Sources to Device Edit Screen -feature: Add links to Graph Template and Host Edit to Graph Edit Screen -feature: Add links to Data Template and Host Edit to Data Source Edit Screen -feature: Support using the cacti database api with more than one connection -feature: Add some more debug lines to Data Query debugging (Verbose Query) -feature: Fix compatibility issues for RRDtool 1.3 -feature: Make the tabs section work a little better with existing plugins -feature: Add additional options to speed data query graph automation process -feature: Add additional indexes to speed data query graph creation -feature: Allow the cli reindexing of hosts to be limited to a single query -feature: New cli command host_update_template to allow re-templating of hosts using an updated template -feature: When reindexing hosts, allow a queryid to be specified -feature: Add command line Database upgrade script -feature: Add api call to associate graphs with their data sources -feature: Move the notes field to bottom of page -feature: New availability option "Ping or SNMP" -feature: Allow for specification of a default reindex method -feature: Show more colors on a single color's page -feature: Exit is either a database or table does not exist -feature: Add developer debug level to reduce SQL messages in DEBUG -feature: Add support for group membership for LDAP authenication 0.8.7b -bug#0000855: Unnecessary (and faulty) DEF generation for CF:AVERAGE -bug#0001083: Small visual fix for Cacti in "View Cacti Log File" -bug#0001089: Graph xport modification to increase default rows output -bug#0001091: Poller incorrectly identifies unique hosts -bug#0001093: CLI Scripts bring MySQL down on large installations -bug#0001094: Filtering broken on Data Sources page -bug#0001103: Fix looping poller recache events -bug#0001107: ss_fping.php 100% "Pkt Loss" does not work properly -bug#0001114: Graphs with no template and/or no host cause filtering errors on Graph Management page -bug#0001115: View Poller Cache does not show Data Sources that have no host -bug#0001118: Graph Generation fails if e.g. ifDescr contains some blanks -bug#0001132: TCP/UDP ping port ignored -bug#0001133: Downed Device Detection: None leads to database errors -bug#0001134: update_host_status handles ping_availability incorrectly -bug#0001143: "U" not allowed as min/max RRD value -bug#0001158: Deleted user causes error on user log viewer -bug#0001161: Re-assign duplicate radio button IDs -bug#0001164: Add HTML title attributes for certain pages -bug#0001168: ALL_DATA_SOURCES_NODUPS includes DUPs? SIMILAR_DATA_SOURCES_DUPS is available again -bug: Cacti does not guarentee RRA consolidation functions exist in RRA's -bug: Alert on changing logarithmic scaling removed -bug: add_hosts.php did not accept privacy protocol -security: Fix several security vulnerabilities -feature: show basic RRDtool graph options on Graph Template edit -feature: Add additional logging to Graph Xport -feature: Add rows dropdown to devices, graphs and data sources -feature: Add device_id and event count to devices -feature: Add ids to devices, graphs and data sources pages -feature: Add database repair utility -feature: Default Script Server/Script Queries now accept host specific ping_retries, max_oids -feature: Support for new variables |host_ping_retries| and |host_max_oids| 0.8.7a -bug#0000895: "Use Per-Data Source Value (Ignore this Value)" runs only when when checking "Allow Empty Input" -bug#0001029: Add --autoscale-min (rrdtool 1.2.x only) and --autoscale-max (using upper AND lower limit) -bug#0001035: Allow for --logarithmic scaling without autoscaling -bug#0001038: Data sources in RRAs have random order, messing up predefined CDEFs -bug#0001043: Graph Templates drop down populates with duplicates -bug#0001046: Upgrade from 0.8.6j to 0.8.7 defaults to Authentication Method NONE -bug#0001052: Graph template - GRINT creates CF function DEF -bug#0001055: Invalid date format - "half hour" not the GNU Date format -bug#0001057: SQL error when using 'Auth Method' None when no 'guest' user exists -bug#0001058: Graph Filter dropdowns do not respect user graph permissions -bug#0001059: Potential SQL injection vulnerability -bug#0001060: RRDtool 1.2.15 complain for garbage characters when rrdtool_function_xport is used -bug#0001061: cmd.php: potential call to invalid "availability_method" key on wrong hash -bug#0001064: Log file viewer inefficient filtering uses excess memory -bug#0001066: doc change for using COUNTERs as integers only -bug#0001067: Fixed extra spaces in GPRINT. Better Alignment for Autopadding -bug#0001068: doc change for patching cacti when running SELinux -bug#0001070: Cron interval detection causes multiple pollers to run -bug#0001073: Max OIDS is not saved in device view -bug#0001078: Undefined variable: rra in graph.php on line 241 -bug#0001079: Dates are not stored in host table using correct format -bug#0001080: Graph Export Generates SQL Errors -bug#0001081: Usernames with spaces and dashes are not able to save -feature#0001035: Allow for --units=si on logarithmic scaled graphs (rrdtool-1.2.x only). -feature#0001069: add opacity/alpha channel to graph items (rrdtool-1.2.x only). -feature#0001065: Move to Top for List and Tree View. Omit boring scrolling -feature: add availability pings to host interface 0.8.7 -bug#0000480: Fix error after altering graphs displayed per page -bug#0000740: Add support for setting the PHP session name of Cacti -bug#0000829: Add support for an specifying an uptime OID for SNMP queries -bug#0000830: Add filtering graphs by Graph Template -bug#0000833: Add favicon.ico support -bug#0000850: Add Select All for graph list view -bug#0000854: Move "Downed Host Detection" into the device edit screen -bug#0000873: Fix issues with the poller hanging in certain situations -bug#0000876: Add ability to search for host with a not UP status -bug#0000898: Selecting a CUSTOM timespan and then CLEARing yields "LAST HALF HOUR" preset -bug#0000899: Add local checking to the Paths tab on the Settings page -bug#0000902: Fix issues with cmd.php and PHP 4.4.1 under windows -bug#0000903: snmpgetnext function does not exist in PHP less than 5.0 -bug#0000904: Data Source creation fails without php-snmp -bug#0000906: Every tenth host does not show on tree during console edit -bug#0000907: Sorting of data sources when interface numbers are used without leading zeros are incorrectly sorted -bug#0000908: Graphs created by SNMP data queries are losing their specific names if the template is modified -bug#0000910: Cacti complains when trying to set the data source "maximum value" to any number with a decimal point -bug#0000912: Nth Percentile thumbnail graphs fail with RRDtool 1.2.15, 1.2.18 -bug#0000913: Allow direct linking to specific graph pages -bug#0000919: Fix problem with ping_tcp function -bug#0000920: Improved handling of rrdtool --font parameter -bug#0000921: Improvement to ping.pl script -bug#0000925: Support for host_* variables in the legend -bug#0000926: Stop removing useful characters when searching -bug#0000927: Classic export does not recognize thumbnail columns properly -bug#0000931: New rrdtool fails on empty comment -bug#0000934: Column 'status_last_error' in table 'host' too short. -bug#0000937: System output in hosts.php poor for Alcatel -bug#0000946: Timetick of zero returns down for device -bug#0000947: Trailing blank on OID in form causes problems -bug#0000953: SNMP Passphrase is displayed in cleartext -bug#0000954: Y-grid lables are not informative when using --alt-autoscale -bug#0000955: Fixed possible denial of service attack by modifying graph image URL -bug#0000956: Additional editing help with tree management -bug#0000957: Script server output's beginning/trailing data during "Include" causing a synchronization issue -bug#0000958: Slope Mode is now selectable -bug#0000959: Alarming added when poller output table is not empty -bug#0000963: TCP/UDP capitalization -bug#0000965: When setting filters under utilities, pressing enter takes you back to the main page -bug#0000966: Log file viewing utility has no ability to filter -bug#0000969: In some versions of PHP, the graph tree will not view properly -bug#0000970: Incorrect debug messages in lib/ping.php for failed UDP ping -bug#0000974: No graphs on Fedora core6 using sunone/iplanet 6.1 SP5 -bug#0000975: Add Nth Percentile aggregate_current - Summing Multiple Data Sources with like names for Nth Percentile -bug#0000982: Remove invalid references to the "output_string" column in the "data_input" table -bug#0000983: Bad SQL: snmp_query_graph_rrd.snmp_query_graph_id= -bug#0000984: Poller does not correctly flush poller_output table after a memory error -bug#0000989: hyphen - host description used with Data Source Path -bug#0001001: "Purge User Log" keeps invalid entries -bug#0001002: Cacti reports incomplete interface status -bug#0001007: SNMPv3 password field allows command injection -bug: ss_sql.php causes the script server to crash -bug: Timeshifter added to base code -bug: Allow query_ and host_ substitution in COMMENT and CDEF's. -bug: Command line interface scripts to add devices, graphs, tree's and permissions. -bug: Correct index error when creating graphs when you have no hosts on your system. -bug: More recent versions of net-snmp broke SNMP walk functions. -bug: Adjust for problematic responses from some SNMP agents (IBM AIX). -bug: Improve logging in cmd.php and poller.php when parameters are not specified correctly. -bug: Reduce the total number of SQL queries called -bug: Replace inefficient strip function in process_poller_output -bug: Some php_snmp implementations return strings as "Hex-STRING:". In these cases properly resolve the string -bug: Correctly assign right and left click actions for Opera -bug: Fix SQL error when viewing an invalid Data Source via the Log Viewer -bug: Fix command line user copy utility -feature: Paginate the Graph Creation Page -feature: Add SNMPv3 Support to Cacti -feature: Add a Notes field to the Device that can contain arbitrary information -feature: Add Availability Methods to Cacti including per Host Ping Methods and Timeouts -feature: Add Max OID's to te Host Level -feature: Allow CSV Export from the various Graphs page -feature: Add rra_path as a global.php config variable -feature: Add drop down actions to data queries -feature: Add drop down actions to data input methods -feature: Add drop down actions to user administration -feature: Add filtering and pagination to data queries -feature: Add filtering and pagination to data input methods -feature: Add filtering and pagination to host templates -feature: Add filtering and pagination to user administration -feature: Add extended LDAP authentication support -feature: Add Web Basic authentication -feature: Add authentication realm to modifiable user parameters -feature: Add multiple polling intervals -feature: Moved command line scripts to cli sub directory -feature: include/config.php now only includes database configuration -feature: include/config_* have been renamed to include/global_*. Note: Script servers need to be updated. -feature: Allow VRULE's in Cacti to specify an absolute timestamp in addition to [+/-]HH:MM -feature: Add 1 minute RRA -feature: Add item select highlighting to main pages -feature: Let poller.php be more intelligent about poller intervals less than 60 seconds -feature: Add consistency to Filters by adding nowrap to td items -feature: Add Graph and Data Source counts to Device page -feature: Add Poller Interval to Data Sources page -feature: Keep filters aligned with main page content on window resize -feature: Add Enable/Disable user -feature: Add copy and batch copy of users -feature: Reduce ADODB memory consumption during polling -feature: Add new RRDtool Function to facilitate CSV export -feature: Add the ability to ignore custom RRA settings when importing templates and use this behavior by default -feature: Add technical support output to System Utilities -compat: Add additional checking due to php-snmp changes in Windows -compat: Remove GIF as a supported file type for RRDtool 1.2.x and added SVG file type 0.8.6j -bug#0000842: SNMPv3 password field does not check if entered passwords match. -bug#0000848: Fix "PHP Script Server communications lost" error in the poller under high network load. -bug#0000859: User log "purge" now keeps the last successful login. -bug#0000861: Use downed host detection even when the SNMP community is blank. -bug#0000864: Apply natural sort to graph items in the tree. -bug#0000867: Apply various cleanups to poller.php and lib/poller.php. -bug#0000870: Add sorting to the graph templates list on the "Change Graph Template" page. -bug#0000877: Fix issue that caused PHP 5.2.0 to break the Windows cmd.php poller. -bug#0000882: Add "collapsible" branches to the graph tree editor. -bug#0000883: Fix exploit in cmd.php with register_argc_argv enabled in PHP. -bug#0000884: Add bottom navigation bar to graph viewing. -bug#0000885: Fix issue causing spaces to be removed when importing/exporting data input methods. -bug#0000886: Allow SNMP ping to utilize the snmpgetnext call instead of snmpget. -bug#0000890: Fix issue with dec-vulnerability-poller patch breaking graph_view.php. -bug#0000892: Fix hostname sorting on the devices page for IP addresses. -bug#0000894: poller.php does not give any output with MySQL disabled in CLI's php.ini. -bug: Template export produces invalid XML escaped character encoding. -bug: Data queries were not sorted properly during initial display. -bug: Apply various graph changes required for Boost plugin. -bug: If your system has no hosts or graphs, you would get a warning when creating new graphs. -bug: If using the CGI version of PHP, the script server risked not starting properly. 0.8.6i -bug#0000188: Add ability to sort columns by selecting column headers. -bug#0000199: Exported thumbnail graphics shows limited time range only. -bug#0000207: Correct unit size displayed in the default 'Localhost - Memory Usage' graph. -bug#0000286: Fix issue with bandwidth summation on exported graphs. -bug#0000313/#0000561: Don't print menu/titlebar by using CSS class noprint. -bug#0000316: Take the unit value field into account when creating graphs. -bug#0000395: Fix graph export FTP functionality in Unix environments. -bug#0000430: Add natural sort order option for graph trees. -bug#0000433: Remove script server restriction on varying case path names. -bug#0000488: Remove reliance on HTTP_USER_AGENT to prevent possible notices. -bug#0000527: Fix issue updating the RRA for a graph tree item. -bug#0000584: Add barometer decimal fix to scripts/weatherbug.pl. -bug#0000624: Generate DEFs for graph items other than AREA, STACK, and LINE. -bug#0000643: Always display a human readable sysUpTime in the device edit page. -bug#0000665: Invalid index error on empty or 0 return set from rrdfetch with Nth Percentile. -bug#0000672: When creating a device, the Host Template was not properly validated. -bug#0000678: Allow graph export to a Cacti sub directory. -bug#0000681: Increase the size of the arg1, arg2, and arg3 fields in the poller_item table. -bug#0000692: Fix problems with FTP and the tree export method. -bug#0000693: Fix problems with the "Expand Host" option and the tree export method. -bug#0000698: Make arguments to 'df' more compatible with FreeBSD 6.0 in the "Get Unix Partitions" data query. -bug#0000705: Fix problem with the current selected data source item and SIMILAR_DATA_SOURCES_NODUPS (again). -bug#0000709: Fix problems with FTP and the tree export method (duplicate). -bug#0000720: Fix undefined variable message in script_server.php. -bug#0000721: SNMPv2 Query has issues with ifAlias & ifName when none present. -bug#0000727: Allow a user with specific graph permissions to be used when exporting graphs. -bug#0000730: Allow non-standard MySQL ports to be specified. -bug#0000731: Use proper defaults when adding a device to a tree from the Devices page. -bug#0000739: Stop ignoring the "Unit value" parameter in the graph template. -bug#0000741: Fix issue with links getting mismatched after using zoom on a graph. -bug#0000746: Make sure clearing Cacti log file from web interface preserves file permissions. -bug#0000752: Allow OID's greater than 255 characters except for the index OID because of MySQL index limitations. -bug#0000758: LDAP user with non-alphanumeric characters in the password failed to authenticate. -bug#0000761: Correct input validation to allow all possible numbers in the RRAs form. -bug#0000766: Increase the size of the id field in the graph tree items table. -bug#0000769: Use only selected RRA's when exporting graphs. -bug#0000775: Add pagination to the SNMP cache viewer to handle large numbers of items. -bug#0000779: Scale down the size of text when viewing thumbnail graphs. -bug#0000781: Add an "enabled" filter status item in the devices list. -bug#0000785: Fix issue with Graph Tree View and Data Query Index Sorting showing "Non Indexed" even if empty. -bug#0000786: Expose the SNMP port field to data sources that use SNMP. -bug#0000789: Remove use of "action" attribute on graph tree image which is incompatible with newer Opera browsers and HTML4. -bug#0000797: Fix issue with filtering on multiple fields on the Data Sources and Graph Management pages. -bug#0000809: Add an option to "purge" the user_log table. -bug#0000814: Prevent Apache from segfaulting if the database permissions are not correct. -bug#0000815: Paginated the Cacti log file viewer to handle large numbers of items. -bug#0000821: Add missing menuarrow.gif image. -bug#0000823: Prevent Cacti from overwriting data during the creation of a new data template. -bug: Do not allow the device filter on the graph items editor to clear the selected data source. -bug: SQL query incorrectly formatted causing SQL queries to fail in preview mode. -bug: Setting a host template filter in devices, followed by moving off and then back on the page generated an error. -bug: PHP 5.1 snmpwalks utilize the bulk method by default. Therefore, prefer them over the bulkwalk binary. -bug: Allow read_config_option to force a database refresh when one is wanted. -bug: Fix to resolve script server script not returning data as expected. -bug: Make load average script compatible with Mac OS X systems. -bug: Correct an issue where under certain circumstances, |query_ifSize| was being implemented as the maximum value for an RRD. -bug: Correct issue where DHTML caching was not working with expand hosts enabled. -bug: Add SNMP retries option to Cacti's SNMP functions. -bug: Once Graph Export has been enabled, do not allow Cacti to run even after it has been disabled. -bug: Correct alphabetic tree sorting to be more natural. -bug: Fix meta refresh tags to use proper URL syntax. -bug: Do not allow the graphs setting page to use the refresh interval, which can cause it to refresh while the user is inputting data. -bug: Make sure that data query index ordering with the "index_order" XML field is always respected. -bug: Limit the number of rows retrieved from the poller_output table to minimize the impact low memory system configurations. 0.8.6h -bug#0000383: Add more verbose RRDtool debug output from Graph Management. -bug#0000522: Take 'oid_index_parse' into consideration when handling 'OID/REGEXP:' data query fields. -bug#0000528: Allow template_import.php to return without error when XML file is invalid in PHP 4.4 and above. -bug#0000557: Changing filter value resulted in invalid page/row selection. -bug#0000572: Added $database_port to config.php. -bug#0000570: Grammar edit for text about already up-to-date. -bug#0000571: Misleading diagnostic error messages during install have been updated. -bug#0000582: Ampersand present in graph template graph name causes XML import to fail. -bug#0000585: Graphing fails using AREA/STACK/LINE/HRULE/VRULE without defined color. -bug#0000586: Remove static reference to RRA ID #1. -bug#0000596: Proper escape of ' in graph titles. -bug#0000599: Add filtering to graphs and data templates. -bug#0000601: Add ability to add multiple hosts to a tree. -bug#0000603: user_log.ip field not ipv6 compatible. -bug#0000608: Minor coding error in lib/poller.php with a erroneous pclose statement. -bug#0000615: Add sysContact and sysLocation output to device edit page. -bug#0000619: Host templates not alphabetized on device creation form. -bug#0000625: Cannot modify/create a user with a period in the username. -bug#0000631: Invalid information concerning delimiter for index_order in SNMP Query documentation. -bug#0000650: Clicking Cancel in Create Graphs for this Host does nothing. -bug#0000656: Perl scripts using back ticks is not portable. -bug: Stop MySQL connect messages from appearing in user interface. -bug: Allow primary keys other than "ID" to work in sql_save and in HTML code. -bug: Save statistics even when the poller times out. -bug: Only call poller_commands.php or poller_export.php if they require calling. -bug: Incorporate a timeout to ss_fping.php so that a host that takes to long to finish at least returns data. -bug: Correct the display of custom data under data input methods to follow the proper order. -bug: Change the default behavior of ping.php to mark a host as up if either SNMP or ping are successful. -bug: Don't allow graph_export to delete your web site. -bug: Correct issue where SNMP was not returning both hex and text data under certain circumstances. -bug: Prevent a never ending table lock in lib/tree.php. -bug: Correct issue where either AREA or LINEx without color were causing RRD_NL without any elements in rrdtool_graph. -bug: Allow hostname to include the TCP: prefix for TCP based snmp and keep tcp, icmp, udp ping functional -bug: Better error reporting for Clear Cacti Log File in Utilities -bug: Graphs with items having Legend text defined but no color will fail under RRDtool 1.2.x. -feature: Add MySQL 5.x support. -feature: Add IPv6 support to lib/ping.php. -feature: When utilizing cmd.php, do not run the script_server if it is not required for a process. -feature: Incorporate snmpbulkwalk binary path to user interface to speed snmpv2 and snmpv3 walk calls. -feature: Incorporate snmpgetnext binary path to user interface to make available for certain plugins. -feature; Add support for Nth percentile functions, not just 95th. -feature: Add support for new Nth percentile variables: aggregate, aggregate_max, aggregate_sum. -feature: Allow additional filtering for graph item adding while creating graphs. -feature: Add Command line script to copy users: copy_cacti_user.php. -feature: Add Command line script to reindex hosts: poller_reindex_hosts.php. -feature: Add Command line script to rebuild the poller cache: rebuild_poller_cache.php. 0.8.6g -bug#0000351: Fix zooming capability in Safari. -bug#0000491: Allow underscore, dash, and forward slash characters through search string validation. -bug#0000498: Fix issue where editing data input methods damaged portions of the database. -bug#0000502: Fix Syslog support in unix. -bug#0000506/#0000517: Properly handle special XML characters when importing/exporting templates. -bug#0000508: Fix issues where filter functionality would not work in preview mode. -bug#0000512: Increase script server buffer size for large output. -bug#0000520: Fix issue where LDAP authentication causes crash/abort. -bug#0000521: Add graph/data source title mouseover support. -bug#0000525: Make sure that all files in the Cacti distribution contain an EOF character. -bug#0000530: Remove 132 character limitation for OID's during polling. -bug#0000531: Make sure that quote characters in suggested value fields are properly escaped. -bug#0000535: Fix template export support for PHP 4.4. -bug#0000536: Fix printing of zoomed graphs where in IE where a white box would appear over the graph. -bug#0000537: Re-implement functional SNMPv3 support (authNoPriv only) -bug#0000543: Always allow non-templated graph/data template fields to be blank. -bug#0000544: See graph tree export contrib below. -bug#0000547: Fix issue with escaping certain control characters, causing the graph tree to break. -bug#0000552: Fix typo on the Settings page. -bug: Fix multiple output support in the script server. -bug: Fix incompatible binary SNMP calling parameter issue with NET-SNMP versions earlier than 5.1. -bug: Fix issues encountered when polling invalid data sources. -bug: Fix issue where if a host was deleted, re-indexing would continue to attempt to be performed on it. -bug: Allow lib/ping.php to be included in user script server scripts. -bug: Eliminate the need to run php-win.exe in Windows environment. Will now work with just php.exe. -feature: Add a great new graph export format "Tree Presentation", thanks to our friend from Toulouse France (forums user: jaybob). -feature: Allow data query |query_*| variables to be used within a CDEF string. -feature: Force export functions into a separate poller process. -feature: Force re-caching of data queries into a separate poller process. -feature: Added filter capability to graph list view mode. -feature: Enhanced ss_fping.php and ping.php to inclue ICMP, TCP and UDP ping functionality and to specify a port. 0.8.6f -security: Hardened PHP Project Advisory #042005 - Cacti Authentification/Addslashes Bypass Vulnerability -security: Hardened PHP Project Advisory #022005 - Cacti Multiple SQL Injection Vulnerabilities -security: Hardened PHP Project Advisory #032005 - Cacti Remote Command Execution Vulnerability 0.8.6e -bug#0000143: Allow the user to enter 'U' for unknown minimum and maximum data source input values. -bug#0000377: Fix logarithmic graph creation issues. -bug#0000392: Implement caching to reduce the number of SQL queries needed to render the graph tree. -bug#0000402/#0000457: Allow bounds to be set properly for logarithmic graph creation. -bug#0000428: Unable to try login again after Access Denied. -bug#0000450: Force strict checking for data query parsing to prevent numeric values from being incorrectly handled. -bug#0000453: SPAN tag between each character of GraphTitle in Graph Management. -bug#0000458: Generate and error message and exit poller.php if the cactid binary path is invalid. -bug#0000463: Fix Syslog logging of poller statistics. -bug#0000464: Remove dates from Syslog generated messages. -bug#0000465: Allow for the mass resize of graphs. -bug#0000471: Remove the graph 'Settings' tab if the user is not allowed to save graph settings. -bug#0000478: Validate field input values on the Data Templates page. Prevent duplicate data template items from appearing as a result of this bug. -bug#0000481: Add several checks to prevent PHP errors when parsing data query XML files. -bug: Graph zoom feature had incorrect bounding box when using RRD 1.2.x -bug: Speed the generation of the Tree View Dual Pane by caching the Tree to a local session variable. -bug: Handle STACK graph items properly in RRDtool 1.2. -bug: Prevent data query recaches if the device returns empty input. -bug: Fix potential issues with graph gaps when using a large number of poller processes. -bug: Fix issues when zooming with new RRDtool 1.2 title fonts with a point size other than 10 -bug: Fix issues when zooming outside of the select areas causing a broken graph -bug: Fix issues experienced when users attempted to create custom graphs and thousands of data sources exist -feature: Add ability to filter by host status as well as add ability to filter accross both description and hostname -feature: Add additional options to control RRDtool 1.2 fonts. -feature: Allow the user to Enable/Disable Data Sources from the user interface and automatically disable hosts when deleting a device. -feature: Add Data Source information to the Cacti Log File to assist with troubleshooting. -feature: Add html links to both hosts and data sources in the Cacti Log File. -security: Fix several remote inclusion bugs that were exploitable when PHP's 'register_global' feature is turned on [IDEF0941], [IDEF1023], [IDEF1024]. -security: Fix several SQL injection bugs due to improper input validation [IDEF1001]. 0.8.6d -bug#0000416: Speed up binary net-snmp calls by removing MIB lookup requirement. -bug#0000434/#0000403: Allow for periods in script return variable names. -bug#0000436: Made snmp.php more like version 0.9 code base. -bug#0000419: Fixed session initialization problems with some browsers. -bug#0000394: Fixed a web server crash when reordering items in a graph tree. -bug#0000390: Remove deep linking in Cacti. -bug#0000389: Implement directory security in Cacti. -bug#0000443: Add SNMP port/timeout to the Host MIB CPU/disk script queries. -bug: Corrected issues encountered when creating multiple graphs from a single graph template. -bug: Corrected a problem where no graphs are displayed in the graph tree when authentication is turned off. -bug: Allow RRDtool fetch command to retrieve negative numbers. -bug: Increased some field lengths for very long OID's. -bug: Removed references to non-existing code when attempting to make database connections. -bug: Give poller cache more time to process entries during a clear operation, give it more memory. -bug: Changed default value in Unix ping script to correct for template bug. -bug: Fixed page refresh issue. -bug: Fixed include ordering in config.php to accommodate MySQL bugs and logging. -bug: Changed SNMP ping OID to be sysUptime because it is more common. -bug: Increased PHP timeout to accommodate for long running recache events causing poller issues. -bug: LDAP Auth with no DN specified and blank username would allow login. -feature: Basic support for RRDtool 1.2 including specifying a default True Type Font. -feature: Added support for spike suppression within the cmd.php poller. -feature: Support php_snmp version 2 builtin functions. 0.8.6c -bug#0000354: User Name field always displays "admin" in Mozilla web browser. -bug#0000293: JavaScript selection bug on the "New Graphs" page. -bug#0000352: Problem with the current data source item when using the "Similar Data Sources" special data source. -bug#0000348: Scale problems with the "ucd/net - Memory Usage" graph template. -bug#0000358: Problems adding the same graph to more than one graph tree. -bug#0000355: Allow scientific and negative numbers to be returned from a script. -bug#0000347: Change Order of Graph Templates and Data Queries in Host. -bug#0000339: LDAP description misspell 'allow'. -bug: Maximum runtime issues with the script server. -bug: User could select a data query graph type from "Graph Templates", causing duplicate data source items. -bug: Auto-recache failed and caused the poller to crash under specific circumstances. -bug: Problems saving a user's graph settings from the user admin page. -bug: Poller cache not being updated properly for some host types upon change. -bug: Hope it's final this time: 95th percentile and bandwidth summation fixes. -bug: Added more verbose error handling with template XML importing. -bug: Sort host templates when creating a host. -bug: Corrected user form edit array problem that didn't show the graph options for an edited user. -bug: Access Denied error when user doesn't have console access. -bug: Return type bug in cacti_snmp_walk() which could cause extra blank data query rows. -feature: Data queries now support indexes that span multiple OIDs (see the manual). -feature: Re-apply suggested naming to graphs from the user interface. -feature: TreeView-specific feature to speed up rendering the tree for large databases. -feature: Added retry logic to the MySQL connect statements. -feature: Changed default connect method to a 'pconnect' from a 'connect' to improve performance with large implementations. -feature: Add support for Safari on the graph zoom page. 0.8.6b -bug#0000318: Only delete the Cacti system user when uninstalling the RPM package rather than during each upgrade. -bug: Problems with the 95th percentile and bandwidth summation graph variables. -bug: Problem with random gaps in some or all graphs caused by staggered RRDtool update times. 0.8.6a -bug#0000287: Non-host based scripts failing to populate the poller cache (0.8.6). -bug#0000285: Data query variables on graphs should reflect the data source of each individual graph item (0.8.6). -bug#0000289: Check the value of PHP's "magic_quotes_gpc" setting to prevent potential security holes (0.8.6). -bug#0000295: Problem with the DHTML tree when Cacti is included inside of a parent frame. -bug#0000311: Set PHP's "max_execution_time" to "0" during all upgrades. -bug#0000303: Correct the logic that checks if the export path directory exists or not. -bug#0000310: Problems viewing data templates with the "Data Input Method" set to "None". -bug#0000304: Problems displaying duplicate data templates on the main "Data Templates" screen. -bug#0000302: Update the Windows install documentation to mention the "PHPRC" environment variable. -bug#0000293: Problem with the JavaScript that grays out already created graphs on the "New Graphs" page. -bug#0000312: Make sure that the "host_graph" table is populated in the installer for users coming from a version less than 0.8.4. -bug#0000296: Remove references to PHP's ob_flush() function it doesn't exist until verion 4.2. -bug#0000314: Respect graph export timing settings. -bug: Problem saving a templated graph or data source that contained a checkbox field that had a value different from the default. -bug: Typo in graphs.php when placing graph(s) on a tree. -bug: Make sure that there is a user logged in before trying to read a per-user graph configuration value. -bug: Fix support for multiple cmd.php/cactid polling sessions in a single poller.php session. -bug: Revert back to older RRDtool update method as to correct several poller related issues with 0.8.6. -bug: Fix PHP-SNMP support in cmd.php. -bug: Fix multiple graph/data template corruption issues when converting from graphs or data sources. 0.8.6 -bug#0000051: HTTP header caching problems (0.8.5). -bug#0000121: It is no longer possible to add the same graph twice to a single graph tree branch. -bug#0000123: Several UI fixes on the tree item edit page (0.8.5). -bug#0000124: Select all check boxes would actually invert the selection. -bug#0000128: Graph template item corruption issues (0.8.5a). -bug#0000139: Graph tree deletion corruption issue (0.8.5a). -bug#0000140: Replaced the 'None' option in several host drop downs with 'Any' and redefined 'None' to mean host = 0 (0.8.5a). -bug#0000144: Possible corruption issues when deleting tree items from the root of the tree. -bug#0000149: Error using the 'total' type for 95th percentile or bandwidth summation. -bug#0000151: Added the ability to duplicate a host template. -bug#0000160: A change in Mozilla 1.5+ caused extra vertical space to appear on many table rows throughout the console. -bug#0000164: HostMIB scripts do not respect SNMP port and timeout parameters. -bug#0000173: Increase the number of characters dedicated to each tier from 2 to 3 which increases the item per tier/branch limit to 999. -bug#0000174: Broken thumbnail graphs that contained a 95th percentile HRULE item. -bug#0000175: Strip quotes from SNMP output to prevent UI escaping issues. -bug#0000176: Added the '-P' argument to 'df' to prevent multi-line output for the query_unix_partitions.pl script. -bug#0000179: Updated ADODB to version 4.23 which enabled Cacti work with PHP 5. -bug#0000198: Strip greater and less than characters from SNMP output to prevent UI escaping issues. -bug#0000214: Rename 'Utilities' to 'System Utilities' and move it under the 'Utilities' menu heading. -bug#0000235: Limit the number of pages displayed for graph management, data sources, and devices. -bug#0000244: Prevent PHP errors from being displayed during summation/95th percentile calculation when the .rrd file does not exist. -bug#0000253: Fixed recursive CDEFs. -bug#0000254: CDEF dropdown list in adding another CDEF is not sorted. -bug#0000265: Removed "CANNOT FIND GUEST USER" error message. -bug#0000273: Fixed 'rrdtool fetch' parsing for RRDtool 1.0.9. -bug: A hash was not being generated for duplicated graph and data templates which would cause import/export for those templates to fail. -bug: A user's graph permissions may fail to delete properly after removing that user. -bug: The "Export Every x Times" feature did not work correctly. -bug: Work correctly with PHP's get_magic_quotes_gpc() turned off. -bug: Eliminated potential password injection attack in auth_login.php. -bug: Eliminated popen issues in cactid win32 with threads > 1. -feature/bug#0000118: Data source screen UI enhancements (0.8.5). -feature/bug#0000120: Deleting a tree header should delete all child items (0.8.4). -feature/bug#0000125: A forced sort type can be specified for data query indexes which will be used to sort data query results in the UI. -feature/bug#0000152: Added filter/search/pagination capabilities to the Devices page. -feature/bug#0000155: Allow hosts on the graph tree to be grouped by data query index (ie. switch port, partition, etc) instead of only graph template. -feature/bug#0000156: Added the ability to sort a graph tree branch alphabetically or numerically. -feature/bug#0000161: Removing a graph now gives the user the option to remove all associated data sources. -feature/bug#0000172: Added the ability to control which graph viewing areas should display thumbnail graphs and which ones should display full sized graphs. -feature/bug#0000185: Deleting a device gives the user the option of deleting all associated graphs and data sources. -feature/bug#0000187: Add host availability and device enabled/disable controls to the main devices page. -feature/bug#0000189: Add a system-wide defaults for SNMP community, version, port, timeout and retries configurable under 'Cacti Settings'. -feature/bug#0000192: Add the ability to log poller runtime statistics to the log. -feature/bug#0000194: Add host availability capability which allows Cacti to track of downed devices as well as a device's uptime history. -feature/bug#0000200: Implement three different auto re-index methods which allow Cacti to automatically 'refresh' a data query when an indexes changes. -feature/bug#0000213: Add a 'Clear' button to all filter forms which resets the form to its default state. -feature/bug#0000240: Add moonman's SIMILAR_DATA_SOURCES_NODUPS CDEF patch. -feature/bug#0000250: Allow host/graph tree items to change parents. -feature: Data query index types are now automatically selected which eliminates the need to prompt the user for this information at graph creation time. -feature: Better message handling on the "New Graphs" page. -feature: Get rid of the "Data Input Method" box from the data query edit screen as this data can be automatically derived. -feature: Customizable log levels. -feature: Ability to log to syslog (Unix) and event log (Windows) in addition to the log file. -feature: UDP/ICMP/SNMP ping support used to determine a host's availability status. -feature: A PHP script server which enables PHP script to be interpreted by the poller without spawning a separate PHP process for each item. See the manual for more details. -feature: Ability to choose the type of poller (cmd.php, cactid) and number of threads (cactid only) from the UI. -feature: Ability to spawn multiple simultaneous cmd.php/cactid processes to speed up the polling process. -feature: Allow data templates and data sources that use SNMP to override host fields (hostname, snmp port, etc) in the poller cache. -feature: Added Eric Steffen's Bonsai patch which enables users to zoom a graph by dragging a box around the area of interest. -feature: Added branix's graph export enhancements patch which adds many more graph export configuration options including remote FTP support. -feature: Ability to view/clear the log file from the console. -feature: Use a single RRDtool stdin pipe for all update, create, and graph export actions. -feature: Advanced timespan selector which provides a large number of presets and a calendar control for custom timespans. -feature: Better support for SNMP v2 from UI. Speed up some UI queries. -feature: Enable/Disable Poller from UI. -feature: Added ifOperStatus to Graph Creation page to show either Up or Down. -feature: Rearchitected poller subsystem to prepare for multiple poller architecture in future releases. -feature: Added validation logic in the pollers to prevent system and log anomalies. -feature: Removed SNMP v3 options until SNMP v3 is supported. 0.8.5a -bug#84: Updated internal CDEF caching to take CFs into account. -bug#86: Updated the LDAP code to correctly copy template users. -bug#136: Inaccurate total bandwidth readings for RRAs with a step > 1. -bug#138: Typo on install/index.php -bug#141: Incorrect pre-requisite file check when doing a graph export. -bug#142: Added the '-t' option when calling ucd-snmp or net-snmp to support numeric timeticks. -bug#145: phpMyAdmin was choking on the import of cacti.sql. -bug#146: Minor HTML fix in lib/form.php -bug: Fixed potential graph item input corruption when saving a graph template item. -bug: Fixed problem saving a data source using a template that had more than one item. -bug: Correctly display the console menu when authentication has been turned off. -bug: Correctly display the two pane tree when authentication has been turned off. -bug: Support regular expression characters in passwords: \+*?[^]$(){}=!<>|: -bug: Fixed certain re-ordering problems when deleting branches from a graph tree. -bug: Add support for a 3 digit exponents in RRDtool fetch output on Windows. -bug: Correctly escape community strings with a quotation mark under Windows. -bug: 95th percentile and bandwidth summation code should result in less errors when things don't go as planned. -bug: Fix 'data_input_data_fcache' orphan when deleting a data source. -feature: Make the 'None' option on the graph management and data sources host filter dropdowns only display items with no host assigned. Add an 'Any' option to display items assigned to all hosts. -cactid: Fix segfault problems on all platforms when performing SNMP queries. -cactid: Fix deadlock issues on Windows and Solaris when making popen calls. 0.8.5 -bug#102: Fix problem with SNMP community strings that contain certain variable shell characters. -bug#103: Under "New Graphs", make sure to highlight the host template line when the right-hand checkbox is selected. -bug#104: Typo in the usage for the query_unix_partitions.pl script. -bug#105: On the data query edit page, only display compatible items in the "Data Input Method" dropdown. -bug#106: Render the main menu based on a user's permissions so graph-only users cannot see a list of menu options when attempting to view 'index.php'. -bug#109: Replaced all instances of 'ifDesc' with the correct 'ifDescr' when dealing with the IF MIB. -bug#110: Be smarter about redirecting the user to the correct page when the user's login option is set to "Show the page that user pointed their browser to". -bug#111: Take host permissions into account when rendering the left-hand pane in tree view. -bug#112: Every 10th tree item was not being displayed. -bug#115: Fixed a bunch of misspellings of the word 'substitute' throughout the code. -bug#116: Restructured the edit screens for CDEF items and tree items, making them less confusing to users. -bug#119: Added a "Search:" label to the filter textboxes on the "Graph Management" and "Data Sources" pages. -bug#127: Added an HTML "title" tag to the three graph mode images. -bug#129: Added support for correctly parsing timeticks in both cmd.php and cactid. -bug#130: Users are sometimes redirected to the incorrect host when selecting the "Create Graphs for this Host" link under "Polling Hosts". -bug#131: Load averages above '10' were not being returned correctly from the loadavg_multi.pl script. -bug#133: Non-SNMP data sources were not being removed from the poller cache when a host became 'disabled'. -bug#134: Make sure to delete associated 'host' tree items when deleting a host. -bug#135: Fix the navigation display so it doesn't display errors when directly linking to a graph. -bug#137: Remove the 'td.shadow' CSS class as it isn't being used and contains an incorrect image reference. -bug: Allow the user to enter a "Unit Exponent Value" of '0'. -bug: Remove all references to $_SERVER["HTTP_REFERER"] for web servers that do not include this variable. -bug: Extend the "Maximum JavaScript Rows" feature to work for host templates as well. -bug: Fixed a few parsing problems that were causing problems for users including a '\' or '/' in their script's input string. -bug: The correct representation of memory usage using net-snmp should be 'free memory + cache memory + buffered memory'. -bug: Fixed a problem importing CDEF items correctly from an XML file. -bug: Deleting a GPRINT preset now correctly displays the name of the item about to be removed. -bug: Problems importing XML that contained a host template with more than one associated graph template. -bug: Added a potential workaround for the PHP session/popen bug which occurs on Windows systems using PHP in ISAPI mode. -feature: Data query variables such as |query_ifAlias| can now be included on the actual graph in the "Text Format" or "Value" field. -feature: Added two new special data sources to CDEFs, which enable users to use the data source's maximum or minimum value in a CDEF. -feature: Added a new SNMP query source type, "VALUE/REGEXP", which enables users to parse the SNMP value with a regular expression before passing it onto Cacti. -feature: Hide the "Console" tab from users that only have rights to view graphs. -feature: Added a new 95th percentile type, "max", which calculates 95th percentile based on the maximum of either inbound or outbound for each sample. This is how most co-location facilities calculate 95th percentile for billing purposes. -feature: Update ADODB to version 4.05. -feature: Data source graph inputs are automatically added and maintained by Cacti for new graph templates as to reduce user confusion. -feature: The "Graph Management" and "Data Sources" edit pages are much improved when using a template. -feature: Renamed "Polling Hosts" to "Devices" since polling hosts technically implies that you are managing the hosts that poll data, which could be reserved for later use. -feature: If you enter a value for a "host field" in the data template, Cacti will use that value rather than always defaulting to the host. If you leave it blank, Cacti will use the value from the host. -feature: Data input method type codes 'snmp_timeout' and 'snmp_port' are now supported. -feature: Users will only see tabs for the graph viewing modes that they have access to. -doc: Completely re-written manual in SGML/Docbook so HTML, PDF, and ASCII versions of the manual are now possible. The new manual also includes a better introduction to Cacti for new users and makes use of screen shots to illustrate various portions of the user interface. -cactid: Fixed segfault problems using cactid on Solaris platforms. 0.8.4 -bug#87: Deleting top level branches without children on the tree caused ordering problems. -bug#88: Possibly popen/pclose concurrency problem with cactid. -bug#89: Missing "check all" checkbox on polling hosts page when an empty column was drawn. -bug#91: Fix undefined index errors on data source checkbox popups. -bug#92: Fix undefined index errors on graph management checkbox popups. -bug#96: Problems creating graphs from data queries where there was only row row total in the query result. -bug#97: Typo in cmd.php -bug#98: Creating a data source or graph with no host or template, would result in an extra empty item. -bug#99: Deleting a graph or data template that was still attached to one or more items would cause the graph/data source to appear to still have the deleted template still attached. -bug: Removed size limits on Linux memory data template. -bug: Undefined variable errors when creating new graphs/data sources without a template. -bug: multiple problems that caused the Windows disk space and CPU graphs to stop working. -bug: Broken images for bandwidth summation graphs that were less than a day old. -bug: Graph order changes on the tree would affect other graph trees. -bug: Problem with the "Host MIB - Hard Drive Space" data template that broke Windows disk spaces graphs. -bug: Fixed the LDAP authentication code, which was partially broken in 0.8.3. -bug: Fixed a cmd.php parsing problem when input and output fields are sharing the same name. -bug: Added basename() to all PHP_SELF references to make sure all hrefs stay absolute. -bug: The RRA field is now honored for the dual pane tree view. -bug: The |date_time| graph variable now displays the current day of the month. -feature: The "Total All Items" CDEF is now able to total NaN's without becoming 'U'. -feature: Data query results are now grayed out if they have already been created. -feature: The "cacti Web Root" and "Web Server Document Root" settings are completely auto-detected now. -feature: Add SNMP port and SNMP timeout fields to each host. -feature: Removed the "Management IP" field in polling hosts in favor of "Hostname". -feature: Re-organized the menus expand/contract for less used items to help save vertical space. -feature: Added complete template to XML import and export support. -feature: Moved the graph creation features of "Polling Hosts" to a new menu item,"New Graphs". -feature: Added verbose debugging support for data queries. -doc: Added a FAQ. -cactid: Removed lots of potential buffer overflows. -cactid: Several libz/openssl autoconf fixes that improve FreeBSD 5.x support. -cactid: Fixed some potential segfaults on FreeBSD when reading information from the targets table. -cactid: The snmp_get() function now respects the SNMP version chosen under "Polling Hosts", so 64-bit counters should work. 0.8.3a -bug#81: Partial/complete poller cache rebuild failure after an upgrade. -bug#82: Undefined variable error messages under win32/IIS. -bug: Problems with overlapping graph permissions with multiple users. 0.8.3 -bug#50: When viewing a graph, only display it for the RRAs used on the graph. -bug#66: Users can see a list of all hosts in graph preview mode. -bug#71: Extra escape characters in the |date_time| variable output. -bug#72: Disk space graph for ucd/net was broken for original 0.8 users. -bug#75: Problems monitoring more than one CPU with query_host_cpu.php. -bug#76: Cactid segfault on Solaris caused by unchecked use of NULL with sprintf. -bug#77: Cactid segfault upon a MySQL connect error. -bug#79: Check for unique/valid data when the user selects a field to index their new data sources off of. -bug: Redirect user to the correct page after a forced password change. -bug: Problems entering negative numbers for upper/lower limit fields on graph pages. -bug: Never try to use internal SNMP support if SNMP version 2 or 3 is selected. -bug: Adding or removing data source items in a data template should update attached data sources as well. -bug: Problems updating certain fields when switching or turning off both graph and data templates. -bug: Got rid of the "Use Per-Data Source Value" checkbox where it isn't usable. -bug: Strange sequence/ordering behavior after updating an already created tree item. -bug: Error message displayed instead of 'Access Denied' message. -feature: Added host and graph template permissions for graph viewing users. -feature: Added a new 'dual pane' tree view type that draws the graph trees on a DHTML tree on the left side of the page. -feature: Added the ability to add hosts to a tree. -feature: Added a 'timespan' field to "Round Robin Archives" to determine the timespan (in seconds) of graphs using each RRA. -feature: Completely replaced the header images/layout for both the console and graph viewing pages -feature: Added a navigation bar in the header so you can keep track of you location in the UI. -feature: Added bandwidth summation support. See the manual for more information. -feature: Made the installer more verbose about SQL it runs during an upgrade. -cactid: Changed threading strategy to spawn threads based on hosts. -cactid: Created header files for each source file and moved precasts out of cactid.h. -cactid: A bunch of autoconf updates. 0.8.2a -bug: Fixed various problems updating the poller cache. -bug: Fixed the Weatherbug script to work under Redhat 9. -cactid: Updated poller to use detached threads based on each host. 0.8.2 -bug#47: The 'cacti_server_os' variable is now auto-detected. -bug#56: Possible endless loop for non 0.8 users in version upgrade loop. -bug#57: Cacti does not take the 'graph_tree_id' column into account when re-ordering trees which can cause unexpected results. -bug#59: Regular expression bug that caused 'query_unix_partitions.pl' not to function on FreeBSD. -bug#60: Incorrect index OID in the (currently unused) 'host_disk.xml' SNMP query. -bug#61: Problems adding additional graph items to an input after the template is in use by graphs. -bug#64: Cactid now checks for the RRDtool path in the 'settings' table.\ -bug#67: Problems with wrapping and 'diskfree.pl'. -bug: Problems deleting GPRINT presets. -bug: Undefined variable errors on the graph settings page if built in user authentication was turned off. -bug: Kill cached field value when messages are displayed. -bug: Graph trees now honor the RRA selected when creating the tree (andyfud.org.nz) -bug: Graph and data source titles are now properly updated when making changes to graph or data templates. -bug: Unexpected results when trying to delete top level branches from a graph tree. -bug: Problems expanding/contracting trees when two or more nested branches had the hidden flag set. -feature: Added ability to turn off checks for an entire host. -feature: Added SNMP and operating system variable printout to the about page. -feature: Added 95th percentile support. See the manual for more information. -feature: Added setting for data query maximum field length. -cactid: Added downed host detection. -cactid: Code cleanup: formatting, compiler warnings, and removal of unused functions. -cactid: Daemon support has been removed from cactid for the time being, it must be run out of CRON. -cactid: Have autoconf detect net-snmp before trying ucd-snmp to prevent failure on default Redhat installs. 0.8.1 -bug#40: Fixed OIDs in serveral Netware data templates. -bug#41: Data source and graph names are lost when created from a template. -bug#44: Fixed Host MIB logged in users OID in data template. -bug#46: Fixed an RRDtool/PHP binary variable mixup on the install page for win32 users. -bug#48: Changed the "Create" button on the settings page to "Save". -bug#52: Make sure the data source/graph names are pulled down after clicking "Create", so the user can press cancel. -bug: Changed references from $_SERVER["SCRIPT_NAME"] to $_SERVER["PHP_SELF"] because of strange behavior on PHP 4.3.2 under Windows. -bug: Make sure to filter on the "cached title" for on both the data sources and graph management pages. -bug: Fixed error when debug mode was on and the user tried to add a new graph or data source. -bug: Take tree permissions into account when displaying the "Default Tree" dropdown on the graph settings page. -bug: Incorrect graph title was displayed on graph tree delete confirmation. -bug: Win32: Graphs were being exported even when the graph export path was left blank. -bug: Exported graphs were displayed in the incorrect order. -bug: Legends were not displayed on exported graphs. -bug: HRULE items caused graphs to break. -feature: You can now use negative VRULE items, such as '-12:00' to display a line 12 hours ago. -bug: Data queries that had a non-integer index would not render graph/data source titles properly. -auth: LDAP authentication updates 0.8 -feature: Added support for graph, data source, and host templates. -feature: Added a stricter concept of hosts which enables better organization and easier graph creation. -feature: Created data queries which enable the retrieval of indexable data in the form of a query. -feature: Revised the entire UI creating more functional and attractive forms. -feature: New generic poller interface enables other pollers to handle the data gathering for Cacti. -feature: Added support for net-snmp 5.x. -docs: Revised the install documentation and re-wrote the manual for this version. -feature: The beginnings of a threaded c-based poller (cactid), which is not completely function at this point. -feature: And much much more... 0.6.8a -bug: Unchecked string being passed to rrdtool caused a potential security problem. -bug: The logout funtionality was broken for some users because of a missing fourth argument. -bug: Fixed some SNMP parsing problems. -bug: Fixed a problem with using quotes for data source input. 0.6.8 -feature: Added the following new rrdtool graph options: --units-exponent value, --unit, and --logarithmic. -feature: Added the ability to show exact numbers in GPRINT, users can now specify a custom GPRINT string on a per-graph item basis. -bug: Any data input source with more than one output would be added as a multi-data source .rrd file. -bug: Some data source file name issues. -bug: Cacti now checks to see if a host exists when adding it to be graphed. -feature: There is now an optional "remove verification" for most of cacti's dialogs. -feature: There is a "logout" button when viewing graphs (not for the guest user). -docs: Updated the Win32 docs (thanks Larry). -bug: Fixed some rare HTML "multipart/form" bugs with PHP. -feature: Added a "Default View Mode" for each user when viewing graphs. -bug: Fixed some bugs where you would change a parent graph item to a child or a child graph item to a parent when graph grouping was turned on. -bug: Fixed some potential security bugs by eliminating cacti's use of cookies. 0.6.7 -feature: Added a "none" option for a data source when creating a CDEF. This can be used if you check the "Use the current data source being used on the graph instead of a preset one" box. -feature: Each user has a default graph policy: ALLOW or DENY for their graph permissions. -bug: Unique .rrd filename/data source name issues for SNMP "Make Graph" have been fixed. -feature: Changing the data source for a graph group parent will change the data sources for each of the child items. -bug: Logging has been fixed so errors do not show up in the Apache error_log any more. -bug: VRULE's work correctly now. Enter a time in the "value" field to use them, such as "00:00" or "14:00". -feature: If you select a graph to be added to the graph hierarchy, the "This Item is a Graph" checkbox is automatically selected. -docs: Install docs have been updated for Unix/Win32, documentation on upgrading cacti has been added. See the 'docs/' directory for more information. -bug: SNMP can function on win32/unix without snmpwalk/snmpget binaries. This will only work if you have php-snmp support compiled into both your php binary and web server modules. This is already the case for win32. -bug: A bug when more than one data source was created using the same data input source with multiple outputs has been fixed. -feature: The default install/upgrade screen has been revised. 0.6.6 -feature: Multiple data sources per .rrd is supported. To use this feature, simply create a data input source with multiple outputs that 'Update RRA'. -feature: Graph item grouping, which enables you to delete/reorder groups of similair graph items. -feature: Graph preview and output preview in the console, which allows you to preview what a graph will look like/what rrdtool's output is. -feature: Graph-based permissions have added, you can also show/hide certain hierarchies per user. -feature: Multiple data source per .rrd file support, read the docs for more information. -feature: You can now export graphs to static png's/html's every n times. -feature: By default, SNMP data source names come from _, instead of just which is more unique. -feature: More options for users such as where to go when the user logs in and whether the user can have their own settings or not. 0.6.5 -bug: Fixed some of the data source naming issues. You can now use any data source name you want; cacti will take care of making the name "rrdtool friendly". -feature: Cacti will use PHP's builtin SNMP support if detected, SNMP is overall faster now too. NOTE: PHP's SNMP support may not work with all of your MIB names, you may have to use the OID instead! -feature: Basic high speed counter support has been added, use 'hcin'/'hcout' to use it. Also may not work with PHP's builtin SNMP support yet. -bug: Using the MAX consolidation function with graph data works better now. You can make graphs that look like the MRTG ones (5 minute maximum). This code still needs a little work though. 0.6.4 -bug: You can now add the same CDEF to multiple data sources in the same graph. -feature: Ability to "sync" changes with the .rrd file with rrdtool's TUNE function. Cacti also tries to fill in internal data source path and name information to keep graphs from "breaking" when possible. -settings: You can now change the PHP Binary path from within cacti. -feature: Cacti can now export static images/html files when it gathers data like MRTG did. -feature: Multiple graph hierarchies are supported. -feature: You can now "zoom in" on any portion of the graph hierarchy by clicking on a header item. -bug: Some changes were made to make cacti more win32 complaint; a tutorial on how to setup cacti on win32 can be found on the raXnet page. -feature: You can now create all graphs for an SNMP host with one click. -feature: You can customize the graph title when creating graphs using the 'Make Graph' or 'Make All Graphs' link. -feature: Data sources in cacti are no longer limited to 19 characters. If you create a data source name that rrdtool will not like, cacti will automatically modify the name and save it internally for rrdtool-only use. 0.6.3 -feature: Put limits (HTML 'maxlength') on fields that have a maximum length. -feature: Added 'cacti Settings' and 'User Administration' to the cacti menu. -feature: Added a 'Step' field for Data Sources to graph data at non-300 second intervals. -feature: Added a '--rigid' on/off option, plus the ability to choose between '--alt-autoscale' and '--alt-autoscale-max' when using auto scale. -feature: Added a 'Base Value' field to the graphs to adjust how the vertical axis is displayed. -feature: Updated the menu/header graphics for a smoother look and easier navigation. -feature: cacti now stores its settings in the database instead of config.php, so they can be manipulated under 'cacti Settings'. Database credentials are still located in config.php however. -feature: Added a preview of the rrdtool source when creating data sources. -feature: Added a "data source duplicate" function and moved "graph duplicate" to "Graphs" on the cacti menu. -settings: You can now turn on/off cacti's builtin authentication. -settings: You can control what is logged (create, graph, snmp, update). -feature: Added a "Total All Data Sources" CDEF, which can be used to represent the total of all of the data on a graph. -bug: Fixed a few add/edit/delete form-related bugs. -docs: Added some more content to the documentation and made it more visible from within cacti. 0.6.2 -bug: Fixed some bugs when creating CDEF's using multiple data sources. -bug: Fixed more SNMP parsing bugs with some versions of net-snmp. -feature: added an "auto-refresh" feature to the graphs (thanks Nossie). -bug: HRULE's and VRULE's acually work now. -docs: the beginnings of some real documentation. -bug: you can select the color black now. 0.6.1 -bug: Fixed a parsing bug with snmp, more parsing is done in cacti's code and not via arguments passed to snmpget. -auth: Updated the function used to hash passwords (more compatible with older MySQL versions), more strict on document caching. -feature: Easier installation: cacti now checks for common problems and gives suggestions. Database updates are also done at this time. -bug: Fixed a problem with adding new data input sources. -bug: Problem saving the wrong numbers for 'Round Robin Archives'. -feature: Ability to preview the output of the cron script from a web browser under 'Cron Printout'. -feature: Added 'Logout User' to the menu. -bug: Removed some occurances of /var/www/html and replaced them with more dynamic variables. 0.6 -new tree code -some html table issues in graph view mode -fixed the settings code for saved graph-view data 0.5 -initial release cacti-release-1.2.19/LICENSE000066400000000000000000000355031413633772300153310ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. cacti-release-1.2.19/README.md000066400000000000000000000260651413633772300156060ustar00rootroot00000000000000# Cacti â„¢ [![Build Status - Develop](https://travis-ci.org/Cacti/cacti.svg?branch=develop)](https://travis-ci.org/Cacti/cacti) [![Project Status](http://opensource.box.com/badges/active.svg)](http://opensource.box.com/badges) [![Translation Status](https://translate.cacti.net/widgets/cacti/-/core/svg-badge.svg)](https://translate.cacti.net "Translation Status") [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/cacti/cacti.svg)](http://isitmaintained.com/project/cacti/cacti "Average time to resolve an issue") [![Percentage of open issues](http://isitmaintained.com/badge/open/cacti/cacti.svg)](http://isitmaintained.com/project/cacti/cacti "Percentage of issues still open") ----------------------------------------------------------------------------- ## Running Cacti from the `develop` Branch ### IMPORTANT When using source or by downloading the code directly from the repository, it is important to run the database upgrade script if you experience any errors referring to missing tables or columns in the database. Changes to the database are committed to the `cacti.sql` file which is used for new installations and committed to the installer database upgrade for existing installations. Because the version number does not change until release in the `develop` branch, which will result in the database upgrade not running, it is important to either use the database upgrade script to force the current version or update the version in the database. #### Upgrading from Pre-Cacti 1.x Releases When Cacti was first developed nearly 20 years ago, MySQL was not as mature as it is now. When The Cacti Group went about engineering Cacti 1.x, a decision was made to force users to use the InnoDB storage engine for many of the Tables. This was done as the InnoDB storage engine provides a better user experience when your web site has several concurrent logins. Though a little slower, it also provides greater resiliancy for the developers. With that said, there are several changes that you MUST perform to MySQL/MariaDB before you upgrade, and a service restart is required. Depending on your release of MariaDB or MySQL, the following settings will either be required, or already enabled as default: ``` [mysqld] # required for multiple language support character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # Memory tunables - Cacti provides recommendations at upgrade time max_heap_table_size = XXX max_allowed_packet = 500M tmp_table_size = XXX join_buffer_size = XXX sort_buffer_size = XXX # important for compatibility sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER # innodb settings - Cacti provides recommendations at upgrade time innodb_buffer_pool_instances = XXX innodb_flush_log_at_trx_commit = 2 innodb_buffer_pool_size = XXX innodb_sort_buffer_size = XXX innodb_doublewrite = ON # required innodb_file_per_table = ON innodb_file_format = Barracuda innodb_large_prefix = 1 # not all version support innodb_flush_log_at_timeout = 3 # for SSD's/NVMe innodb_read_io_threads = 32 innodb_write_io_threads = 16 innodb_io_capacity = 10000 innodb_io_capacity_max = 20000 innodb_flush_method = O_DIRECT ``` The *required* settings are very important. Otherwise, you will encounter issues upgrading. The settings with XXX, Cacti will provide a recommendation at upgrade time. It is not out of the ordinary to have to restart MySQL/MariaDB during the upgrade to tune these settings. Please make special note of this before you begin your upgrade. Before you upgrade, you should make these required changes, then restart MySQL/MariaDB. After that, you can save yourself some time and poential errors by running the following scripts (assuming you are using bash): ``` for table in `mysql -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE table_schema='cacti' AND engine!='MEMORY'" cacti | grep -v TABLE_NAME`; do echo "Converting $table"; mysql -e "ALTER TABLE $table ENGINE=InnoDB ROW_FORMAT=Dynamic CHARSET=utf8mb4" cacti; done ``` This will convert any tables that are either InnoDB or MyISAM to Barracuda file format, dynamic row format and utf8mb4. Note, that if you have been using MySQL or MariaDB without innodb_file_per_table set to on, you might be better in backing up your database, resetting InnoDB by removing your ib* files in the /var/lib/mysql directory, and after which restoring your database and MySQL/MariaDB tables and permissions. Before you take such a step, you should always practice on a test server until you feel comfortable with the change. Good luck, and enjoy Cacti! #### Running Database Upgrade Script ``` sudo -u cacti php -q cli/upgrade_database.php --forcever=`cat include/cacti_version` ``` #### Updating Cacti Version in Database ``` update version set cacti = '1.1.38'; ``` ***Note:*** Change the above version to the correct version or risk the installer upgrading from a previous version. ----------------------------------------------------------------------------- ## About Cacti is a complete network graphing solution designed to harness the power of RRDtool's data storage and graphing functionality providing the following features: - Remote and local data collectors - Device discovery - Automation of device and graph creation - Graph and device templating - Custom data collection methods - User, group and domain access controls All of this is wrapped in an intuitive, easy to use interface that makes sense for both LAN-sized installations and complex networks with thousands of devices. Developed in the early 2000s by Ian Berry as a high school project, it has been used by thousands of companies and enthusiasts to monitor and manage their Enterprise Networks and Data Centers. ## Requirements Cacti should be able to run on any Linux, UNIX, or Windows based operating system with the following requirements: - PHP 5.4+ - MySQL 5.1+ - RRDtool 1.3+, 1.5+ recommended - NET-SNMP 5.5+ - Web Server with PHP support PHP Must also be compiled as a standalone cgi or cli binary. This is required for data gathering via cron. ### php-snmp We mark the php-snmp module as optional. So long as you are not using ipv6 devices, or using snmpv3 engine IDs or contexts, then using php-snmp should be safe. Otherwise, you should consider uninstalling the php-snmp module as it will create problems. We are aware of the problem with php-snmp and looking to get involved in the php project to resolve these issues. ### RRDtool RRDtool is available in multiple versions and a majority of them are supported by Cacti. Please remember to confirm your Cacti settings for the RRDtool version if you having problem rendering graphs. ## Documentation Documentation is available with the Cacti releases and also available for viewing on the [Documentation Repository](https://github.com/Cacti/documentation/blob/develop/README.md). ## Contribute Check out the main [Cacti](http://www.cacti.net) web site for downloads, change logs, release notes and more! ### Community forums Given the large scope of Cacti, the forums tend to generate a respectable amount of traffic. Doing your part in answering basic questions goes a long way since we cannot be everywhere at once. Contribute to the Cacti community by participating on the [Cacti Community Forums](http://forums.cacti.net). ### GitHub Documentation Get involved in creating and editing Cacti Documentation! Fork, change and submit a pull request to help improve the documentation on [GitHub](https://github.com/cacti/documentation). ### GitHub Development Get involved in development of Cacti! Join the developers and community on [GitHub](https://github.com/cacti)! ----------------------------------------------------------------------------- ## Functionality ### Data Sources Cacti handles the gathering of data through the concept of data sources. Data sources utilize input methods to gather data from devices, hosts, databases, scripts, etc... The possibilities are endless as to the nature of the data you are able to collect. Data sources are the direct link to the underlying RRD files; how data is stored within RRD files and how data is retrieved from RRD files. ### Graphs Graphs, the heart and soul of Cacti, are created by RRDtool using the defined data sources definition. ### Templating Bringing it all together, Cacti uses and extensive template system that allows for the creation and consumption of portable templates. Graph, data source, and RRA templates allow for the easy creation of graphs and data sources out of the box. Along with the Cacti community support, templates have become the standard way to support graphing any number of devices in use in today computing and networking environments. ### Data Collection (The Poller) Local and remote data collection support with the ability to set collection intervals. Check out ***Data Source Profile*** with in Cacti for more information. Data Source Profiles can be applied to graphs at creation time or at the data template level. Remote data collection has been made easy through replication of resources to remote data collectors. Even when connectivity to the main Cacti installation is lost from remote data collector, it will store collected data until connectivity is restored. Remote data collection only requires MySQL and HTTP/HTTPS access back to the main Cacti installation location. ### Network Discovery and Automation Cacti provides administrators a series of network automation functionality in order to reduce the time and effort it takes to setup and manage devices. - Multiple definable network discovery rules - Automation templates that specify how devices are configured ### Plugin Framework Cacti is more than a network monitoring system, it is an operations framework that allows the extension and augmentation of Cacti functionality. The Cacti Group continues to maintain an assortment of plugins. If you are looking to add features to Cacti, there is quite a bit of reference material to choose from on GitHub. ### Dynamic Graph Viewing Experience Cacti allows for many runtime augmentations while viewing graphs: - Dynamically loaded tree and graph view - Searching by string, graph and template types - Viewing augmentation - Simple time span adjustments - Convenient sliding time window buttons - Single click realtime graph option - Easy graph export to csv - RRA view with just a click ### User, Groups and Permissions Support for per user and per group permissions at a per realm (area of Cacti), per graph, per graph tree, per device, etc... The permission model in Cacti is role based access control (RBAC) to allow for flexible assignment of permissions. Support for enforcement of password complexity, password age and changing of expired passwords. ## RRDtool Graph Options Cacti supports most RRDtool graphing abilities including: ### Graph Options - Full right axis - Shift - Dash and dash offset - Alt y-grid - No grid fit - Units length - Tab width - Dynamic labels - Rules legend - Legend position ### Graph Items - VDEFs - Stacked lines - User definable line widths - Text alignment ----------------------------------------------------------------------------- Copyright (c) 2021 - The Cacti Group, Inc. cacti-release-1.2.19/about.php000066400000000000000000000103651413633772300161460ustar00rootroot00000000000000
raXnet

', ''); ?>


  • Ian Berry (raX)
  • Larry Adams (TheWitness)
  • Tony Roman (rony)
  • J.P. Pasnak, CD (Linegod)
  • Jimmy Conner (cigamit)
  • Reinhard Scheck (gandalf)
  • Andreas Braun (browniebraun)
  • Mark Brugnoli-Vinten (netniV)



__('Delete'), 5 => __('Convert to Normal Graph'), 4 => __('Place Graphs on Report'), 2 => __('Migrate Aggregate to use a Template'), 3 => __('Create New Aggregate from Aggregates') ); $agg_item_actions = array( 10 => __('Associate with Aggregate'), 11 => __('Disassociate with Aggregate') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'edit': top_header(); graph_edit(); bottom_footer(); break; default: top_header(); aggregate_graph(); bottom_footer(); break; } function add_tree_names_to_actions_array() { global $graph_actions; /* add a list of tree names to the actions dropdown */ $trees = db_fetch_assoc('SELECT id,name FROM graph_tree ORDER BY name'); if (cacti_sizeof($trees)) { foreach ($trees as $tree) { $graph_actions['tr_' . $tree['id']] = __('Place on a Tree (%s)', $tree['name']); } } } function form_save() { if (!isset_request_var('save_component_graph')) { header('Location: aggregate_graphs.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); return null; } /* remember some often used values */ $local_graph_id = get_nfilter_request_var('local_graph_id', 0); $graph_template_id = get_nfilter_request_var('graph_template_id', 0); $aggregate_template_id = get_nfilter_request_var('aggregate_template_id', 0); $graph_title = form_input_validate(get_nfilter_request_var('title_format'), 'title_format', '', false, 3); if (is_error_message()) { raise_message(2); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); return null; } /* get the aggregate graph id */ $aggregate_graph_id = db_fetch_cell_prepared('SELECT id FROM aggregate_graphs WHERE local_graph_id = ?', array($local_graph_id)); /* if user disabled template propagation we need to get graph data from form */ if (!isset_request_var('template_propogation')) { $aggregate_template_id = 0; $new_data = aggregate_validate_graph_params($_POST, false); } else { $new_data = array(); } if (is_error_message()) { raise_message(2); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); return null; } /* save graph data to cacti tables */ $graph_templates_graph_id = aggregate_graph_templates_graph_save( $local_graph_id, $graph_template_id, $graph_title, $aggregate_template_id, $new_data ); /* update title in aggregate graphs table */ db_execute_prepared('UPDATE aggregate_graphs SET title_format = ? WHERE id = ?', array($graph_title, $aggregate_graph_id)); /* next lets see if any of the aggregate has changed and save as applicable * if the graph is templates, we can simply ignore. A simple check will * determine if aggregation propagation is enabled */ if (!isset_request_var('template_propogation')) { /* template propagation is disabled */ $save = array(); $save['id'] = $aggregate_graph_id; $save['aggregate_template_id'] = $aggregate_template_id; $save['template_propogation'] = ''; $save['gprint_prefix'] = get_nfilter_request_var('gprint_prefix'); $save['gprint_format'] = isset_request_var('gprint_format') ? 'on':''; $save['total_prefix'] = get_nfilter_request_var('total_prefix'); $save['total'] = get_filter_request_var('total'); $save['graph_type'] = get_filter_request_var('graph_type'); $save['total_type'] = get_filter_request_var('total_type'); $save['order_type'] = get_filter_request_var('order_type'); /* see if anything changed, if so, we will have to push out the aggregate */ if (!empty($aggregate_graph_id)) { $old = db_fetch_row_prepared('SELECT * FROM aggregate_graphs WHERE id = ?', array($aggregate_graph_id)); $save_me = 0; $save_me += ($old['aggregate_template_id'] != $save['aggregate_template_id']); $save_me += ($old['template_propogation'] != $save['template_propogation']); $save_me += ($old['gprint_prefix'] != $save['gprint_prefix']); $save_me += ($old['gprint_format'] != $save['gprint_format']); $save_me += ($old['graph_type'] != $save['graph_type']); $save_me += ($old['total'] != $save['total']); $save_me += ($old['total_type'] != $save['total_type']); $save_me += ($old['total_prefix'] != $save['total_prefix']); $save_me += ($old['order_type'] != $save['order_type']); if ($save_me) { $aggregate_graph_id = sql_save($save, 'aggregate_graphs'); } /* save the template items now */ /* get existing item ids and sequences from graph template */ $graph_templates_items = array_rekey( db_fetch_assoc_prepared('SELECT id, sequence FROM graph_templates_item WHERE local_graph_id=0 AND graph_template_id = ? ORDER BY sequence', array($graph_template_id)), 'id', array('sequence') ); /* get existing aggregate template items */ $aggregate_graph_items_old = array_rekey( db_fetch_assoc_prepared('SELECT * FROM aggregate_graphs_graph_item WHERE aggregate_graph_id = ? ORDER BY sequence', array($aggregate_graph_id)), 'graph_templates_item_id', array('aggregate_graph_id', 'graph_templates_item_id', 'sequence', 'color_template', 't_graph_type_id', 'graph_type_id', 't_cdef_id', 'cdef_id', 'item_skip', 'item_total') ); /* update graph template item values with posted values */ aggregate_validate_graph_items($_POST, $graph_templates_items); $items_changed = false; $items_to_save = array(); $sequence = 1; foreach($graph_templates_items as $item_id => $data) { $item_new = array(); $item_new['aggregate_graph_id'] = $aggregate_graph_id; $item_new['graph_templates_item_id'] = $item_id; $item_new['color_template'] = isset($data['color_template']) ? $data['color_template']:0; $item_new['item_skip'] = isset($data['item_skip']) ? 'on':''; $item_new['item_total'] = isset($data['item_total']) ? 'on':''; $item_new['sequence'] = $sequence; /* compare with old item to see if we need to push out. */ if (!isset($aggregate_graph_items_old[$item_id])) { /* this item does not yet exist */ $items_changed = true; } else { /* compare data from user to data from DB */ foreach ($item_new as $field => $new_value) { if ($aggregate_graph_items_old[$item_id][$field] != $new_value) { $items_changed = true; } } /* fill in missing fields with db values */ $item_new = array_merge($aggregate_graph_items_old[$item_id], $item_new); } $items_to_save[] = $item_new; $sequence++; } if ($items_changed) { aggregate_graph_items_save($items_to_save, 'aggregate_graphs_graph_item'); } if ($save_me || $items_changed) { push_out_aggregates(0, $local_graph_id); } } } raise_message(1); header('Location: aggregate_graphs.php?header=false&action=edit&id=' . $local_graph_id); } /* ------------------------ The "actions" function ------------------------ */ function form_actions() { global $graph_actions, $agg_item_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* we are performing two set's of actions here */ $graph_actions += $agg_item_actions; /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { // delete api_aggregate_remove_multi($selected_items); } elseif (get_request_var('drp_action') == '2') { // migrate to template api_aggregate_convert_template($selected_items); } elseif (get_request_var('drp_action') == '3') { // create aggregate from aggregate $aggregate_name = get_request_var('aggregate_name'); api_aggregate_create($aggregate_name, $selected_items); } elseif (get_request_var('drp_action') == '4') { // add graphs to report $good = true; for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $graph_list .= '
  • ' . html_escape(get_graph_title($matches[1])) . '
  • '; $graph_array[$i] = $matches[1]; $i++; } } top_header(); /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); form_start('aggregate_graphs.php'); html_start_box($graph_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); $save_html = ''; if (isset($graph_array) && cacti_sizeof($graph_array)) { if (get_request_var('drp_action') == '1') { // delete print "

    " . __('Click \'Continue\' to delete the following Aggregate Graph(s).') . "

      $graph_list
    "; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // migrate to aggregate /* determine the common graph template if any */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { $local_graph_ids[] = $matches[1]; } } $lgid = implode(',',$local_graph_ids); /* for whatever reason, subquery performance in mysql is sub-optimal. Therefore, let's do this * as a few queries instead. */ $task_items = array_rekey(db_fetch_assoc("SELECT DISTINCT task_item_id FROM graph_templates_item WHERE local_graph_id IN($lgid)"), 'task_item_id', 'task_item_id'); if (cacti_sizeof($task_items)) { $task_items = implode(',', $task_items); $graph_templates = db_fetch_assoc("SELECT DISTINCT graph_template_id FROM graph_templates_item WHERE task_item_id IN ($task_items) AND graph_template_id>0"); } else { $graph_templates = array(); } if (cacti_sizeof($graph_templates) > 1) { print "

    " . __('The selected Aggregate Graphs represent elements from more than one Graph Template.') . "

    " . __('In order to migrate the Aggregate Graphs below to a Template based Aggregate, they must only be using one Graph Template. Please press \'Return\' and then select only Aggregate Graph that utilize the same Graph Template.') . "

      $graph_list
    "; $save_html = ""; } elseif (cacti_sizeof($graph_templates) == 0) { print "

    " . __('The selected Aggregate Graphs does not appear to have any matching Aggregate Templates.') . "

    " . __('In order to migrate the Aggregate Graphs below use an Aggregate Template, one must already exist. Please press \'Return\' and then first create your Aggergate Template before retrying.') . "

      $graph_list
    "; } else { $graph_template = $graph_templates[0]['graph_template_id']; $aggregate_templates = db_fetch_assoc_prepared('SELECT id, name FROM aggregate_graph_templates WHERE graph_template_id = ? ORDER BY name', array($graph_template)); if (cacti_sizeof($aggregate_templates)) { print "

    " . __('Click \'Continue\' and the following Aggregate Graph(s) will be migrated to use the Aggregate Template that you choose below.') . "

      $graph_list
    "; print " " . __('Aggregate Template:') . " "; $save_html = " "; } else { print "

    " . __('There are currently no Aggregate Templates defined for the selected Legacy Aggregates.') . "

    " . __('In order to migrate the Aggregate Graphs below to a Template based Aggregate, first create an Aggregate Template for the Graph Template \'%s\'.', db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array($graph_template))) . "

    " . __('Please press \'Return\' to continue.') . "

      $graph_list
    "; $save_html = ""; } } } elseif (get_request_var('drp_action') == '3') { // create aggregate from aggregates print "

    " . __('Click \'Continue\' to combine the following Aggregate Graph(s) into a single Aggregate Graph.') . "

      $graph_list
    "; print " " . __('Aggregate Name:') . ""; print " "; $save_html = " "; } elseif (get_request_var('drp_action') == '4') { global $alignment, $graph_timespans; $reports = db_fetch_assoc_prepared('SELECT id, name FROM reports WHERE user_id = ? ORDER BY name', array($_SESSION['sess_user_id'])); if (cacti_sizeof($reports)) { print "

    " . __('Click \'Continue\' to add the selected Graphs to the Report below.') . "

      $graph_list
    " . __('Report Name') . '
    '; form_dropdown('report_id', $reports, 'name', 'id', '', '', '0'); print ''; print '' . __('Timespan') . '
    '; form_dropdown('timespan',$graph_timespans, '', '', '', '', read_user_setting('default_timespan')); print ''; print '' . __('Align') . '
    '; form_dropdown('align',$alignment, '', '', '', '', REPORTS_ALIGN_CENTER); print ""; $save_html = " "; } else { print "" . __('You currently have no reports defined.') . ""; $save_html = ""; } } elseif (get_request_var('drp_action') == '5') { // conver to a normal graph print "

    " . __('Click \'Continue\' to convert the following Aggregate Graph(s) into a normal Graph.') . "

      $graph_list
    "; $save_html = " "; } elseif (get_request_var('drp_action') == '10') { // associate with aggregate print "

    " . __('Click \'Continue\' to associate the following Graph(s) with the Aggregate Graph.') . "

      $graph_list
    "; $save_html = " "; } elseif (get_request_var('drp_action') == '11') { // dis-associate with aggregate print "

    " . __('Click \'Continue\' to disassociate the following Graph(s) from the Aggregate.') . "

      $graph_list
    "; $save_html = " "; } elseif (preg_match("/^tr_([0-9]+)$/", get_request_var('drp_action'), $matches)) { // place on tree print "

    " . __('Click \'Continue\' to place the following Aggregate Graph(s) under the Tree Branch.') . "

      $graph_list

    " . __('Destination Branch:') . "
    "; grow_dropdown_tree($matches[1], '0', 'tree_item_id', '0'); print "

    "; $save_html = " "; } } else { raise_message(40); header('Location: aggregate_graphs.php?header=false'); exit; } print " $save_html "; html_end_box(false); form_end(); bottom_footer(); } /* ----------------------- item - Graph Items ----------------------- */ function item() { global $consolidation_functions, $graph_item_types, $struct_graph_item; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (isempty_request_var('id')) { $template_item_list = array(); $header_label = __('Graph Items [new]'); } else { $template_item_list = db_fetch_assoc_prepared('SELECT gti.id, gti.text_format, gti.value, gti.hard_return, gti.graph_type_id, gti.consolidation_function_id, dtr.data_source_name, gti.alpha, cdef.name AS cdef_name, vdef.name AS vdef_name, colors.hex, gtgp.name AS gprint_name FROM graph_templates_item AS gti LEFT JOIN data_template_rrd AS dtr ON gti.task_item_id=dtr.id LEFT JOIN data_local AS dl ON dtr.local_data_id=dl.id LEFT JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id LEFT JOIN cdef ON gti.cdef_id=cdef.id LEFT JOIN vdef ON gti.vdef_id=vdef.id LEFT JOIN graph_templates_gprint gtgp ON gti.gprint_id=gtgp.id LEFT JOIN colors ON gti.color_id=colors.id WHERE gti.local_graph_id = ? ORDER BY gti.sequence', array(get_request_var('id'))); $header_label = __esc('Graph Items [edit: %s]', get_graph_title(get_request_var('id'))); } $graph_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array(get_request_var('id'))); if (empty($graph_template_id)) { $add_text = 'aggregate_items.php?action=item_edit&local_graph_id=' . get_request_var('id'); } else { $add_text = ''; } html_start_box($header_label, '100%', '', '3', 'center', $add_text); draw_graph_items_list($template_item_list, 'aggregate_items.php', 'local_graph_id=' . get_request_var('id') , (empty($graph_template_id) ? false : true)); html_end_box(false); } /* ------------------------------------ graph - Graphs ------------------------------------ */ function graph_edit() { global $config, $struct_graph, $struct_aggregate_graph, $image_types, $consolidation_functions, $graph_item_types, $struct_graph_item; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ /* purge any old graphs */ aggregate_prune_graphs(get_request_var('id')); if (isset_request_var('reset')) { $_SESSION['aggregate_referer'] = 'aggregate_graphs.php'; } elseif (isset($_SERVER['HTTP_REFERER']) && !substr_count($_SERVER['HTTP_REFERER'], 'aggregate_graphs.php')) { $_SESSION['aggregate_referer'] = $_SERVER['HTTP_REFERER']; } elseif (isset($_SERVER['HTTP_REFERER']) && !isset($_SESSION['aggregate_referer'])) { $_SESSION['aggregate_referer'] = $_SERVER['HTTP_REFERER']; } $referer = isset($_SESSION['aggregate_referer']) ? $_SESSION['aggregate_referer'] : 'aggregate_graphs.php'; $use_graph_template = false; $aginfo = array(); $graphs = array(); if (!isempty_request_var('id')) { $graphs = db_fetch_row_prepared('SELECT * FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('id'))); if (cacti_sizeof($graphs)) { $aginfo = db_fetch_row_prepared('SELECT * FROM aggregate_graphs WHERE local_graph_id = ?', array($graphs['local_graph_id'])); if ($aginfo['title_format'] == '') { $aginfo['title_format'] = get_graph_title($graphs['local_graph_id']); } $header_label = __esc('[edit: %s]', get_graph_title(get_request_var('id'))); } else { $header_label = __('Aggregate Graph does not Exist'); } } if (cacti_sizeof($aginfo)) { if ($aginfo['aggregate_template_id'] > 0) { $template = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates WHERE id = ?', array($aginfo['aggregate_template_id'])); } else { $template = $aginfo; } $aggregate_tabs = array( 'details' => __('Details'), 'items' => __('Items'), 'preview' => __('Preview') ); } elseif (cacti_sizeof($graphs)) { $template = array(); $aggregate_tabs = array( 'details' => __('Details'), 'preview' => __('Preview') ); } else { raise_message('missing_aggregate', __('Aggregate Graphs Accessed does not Exist'), MESSAGE_LEVEL_ERROR); if (isset($_SERVER['HTTP_REFERER'])) { $referer = $_SERVER['HTTP_REFERER']; header('Location: ' . $referer); } else { header('Location: aggregate_graphs.php'); } exit; } /* ================= input validation and session storage ================= */ if (isset_request_var('tab')) { switch(get_nfilter_request_var('tab')) { case 'details': case 'items': case 'preview': $_SESSION['agg_tab'] = get_nfilter_request_var('tab'); set_request_var('tab', get_nfilter_request_var('tab')); break; default: if (isset($_SESSION['agg_tab'])) { set_request_var('tab', $_SESSION['agg_tab']); }else{ $_SESSION['agg_tab'] = 'details'; set_request_var('tab', 'details'); } } } elseif (isset($_SESSION['agg_tab'])) { set_request_var('tab', $_SESSION['agg_tab']); } else { set_request_var('tab', 'details'); } /* ================= input validation ================= */ $current_tab = get_nfilter_request_var('tab'); /* draw the categories tabs on the top of the page */ print "
    "; print "
    "; } elseif (!isempty_request_var('id') && $current_tab == 'details' && (!cacti_sizeof($template))) { print ""; } else { print ""; } if (!isempty_request_var('id') && $current_tab == 'preview') { $graph = db_fetch_row_prepared('SELECT * FROM graph_local WHERE id = ?', array(get_request_var('id'))); if (!cacti_sizeof($graph)) { html_start_box(__('Aggregate Preview Does Not Exist'), '100%', '', '3', 'center', ''); print "" . __('Aggreage Graph does not Exist') . ''; html_end_box(false); raise_message('noaggregate', __('Aggregate Graph does not Exist'), MESSAGE_LEVEL_ERROR); return false; } html_start_box(__('Aggregate Preview %s', $header_label), '100%', '', '3', 'center', ''); ?>


    "; html_start_box(__('Aggregate Graph %s', $header_label), '100%', true, '3', 'center', ''); $helper_string = '|host_description|'; if (isset($template)) { $data_query = db_fetch_cell_prepared('SELECT snmp_query_id FROM snmp_query_graph WHERE graph_template_id = ?', array($template['graph_template_id'])); if ($data_query > 0) { $data_query_info = get_data_query_array($data_query); foreach($data_query_info['fields'] as $field_name => $field_array) { if ($field_array['direction'] == 'input' || $field_array['direction'] == 'input-output') { $helper_string .= ($helper_string != '' ? ', ':'') . '|query_' . $field_name . '|'; } } } } // Append the helper string $struct_aggregate_graph['suggestions'] = array( 'method' => 'other', 'friendly_name' => __('Prefix Replacement Values'), 'description' => __('You may use these replacement values for the Prefix in the Aggregate Graph'), 'value' => $helper_string ); /* add template propagation to the structure */ draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($struct_aggregate_graph, (isset($aginfo) ? $aginfo : array())) ) ); html_end_box(true, true); if (isset($template)) { draw_aggregate_graph_items_list(0, $template['graph_template_id'], $aginfo); } form_hidden_box('save_component_template', '1', ''); ?> '; } /* we will show the classic representation only when we are not templating */ print "
    "; ?> '> '> $field_array) { if ($field_array['method'] != 'spacer') { if ($field_name != 'title') { $form_array += array($field_name => $struct_graph[$field_name]); $form_array[$field_name]['value'] = (isset($graphs) ? $graphs[$field_name] : ''); $form_array[$field_name]['form_id'] = (isset($graphs) ? $graphs['id'] : '0'); if (!(($use_graph_template == false) || ($graphs['t_' . $field_name] == 'on'))) { $form_array[$field_name]['method'] = 'template_' . $form_array[$field_name]['method']; $form_array[$field_name]['description'] = ''; } } } else { $form_array += array($field_name => $struct_graph[$field_name]); } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(true, true); } form_hidden_box('save_component_graph','1',''); form_hidden_box('save_component_input','1',''); form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); form_save_button($referer, 'return', 'id'); echo '
    '; ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'rfilter' => array( 'filter' => FILTER_VALIDATE_IS_REGEX, 'pageset' => true, 'default' => '' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'matching' => array( 'filter' => FILTER_CALLBACK, 'default' => 'on', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'custom' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => '' ), 'local_graph_ids' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_agraph_item'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } /* form the 'where' clause for our main sql query */ if (get_request_var('rfilter') == '') { $sql_where = ''; } elseif (validate_is_regex(get_request_var('rfilter'))) { $sql_where = 'WHERE gtg.title_cache RLIKE "' . get_request_var('rfilter') . '"'; } else { $filters = explode(' ', get_request_var('rfilter')); $sql_where = ''; $sql_where = aggregate_make_sql_where($sql_where, $filters, 'gtg.title_cache'); } if (get_request_var('matching') != 'false') { $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . ' (agi.local_graph_id IS NOT NULL)'; } $graph_template = db_fetch_cell_prepared('SELECT graph_template_id FROM aggregate_graphs AS ag WHERE ag.local_graph_id = ?', array(get_request_var('id'))); $aggregate_id = db_fetch_cell_prepared('SELECT id FROM aggregate_graphs WHERE local_graph_id = ?', array(get_request_var('id'))); $total_items = db_fetch_cell_prepared('SELECT COUNT(*) FROM aggregate_graphs_items WHERE aggregate_graph_id = ?', array($aggregate_id)); if (!empty($graph_template)) { $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . " (gtg.graph_template_id=$graph_template)"; } if (get_request_var('local_graph_ids') != '') { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' agi.local_graph_id IN(' . get_request_var('local_graph_ids') . ')'; } $total_rows = db_fetch_cell("SELECT COUNT(DISTINCT gl.id) AS total FROM graph_templates_graph AS gtg INNER JOIN graph_local AS gl ON gtg.local_graph_id=gl.id LEFT JOIN ( SELECT DISTINCT local_graph_id FROM aggregate_graphs_items WHERE aggregate_graph_id=$aggregate_id) AS agi ON gtg.local_graph_id=agi.local_graph_id $sql_where"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $graph_list = db_fetch_assoc("SELECT gtg.id, gtg.local_graph_id, gtg.height, gtg.width, gtg.title_cache, agi.local_graph_id AS agg_graph_id FROM graph_templates_graph AS gtg INNER JOIN graph_local AS gl ON gtg.local_graph_id=gl.id LEFT JOIN ( SELECT DISTINCT local_graph_id FROM aggregate_graphs_items WHERE aggregate_graph_id=$aggregate_id) AS agi ON gtg.local_graph_id=agi.local_graph_id $sql_where $sql_order $sql_limit"); ?>
    '> > ' title=''> ' title=''>
    '>
    array('display' => __('Graph Title'), 'align' => 'left', 'sort' => 'ASC'), 'local_graph_id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC'), 'agg_graph_id' => array('display' => __('Included in Aggregate'), 'align' => 'left', 'sort' => 'ASC'), 'height' => array('display' => __('Size'), 'align' => 'right', 'sort' => 'ASC')); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false, 'aggregate_graphs.php?action=edit&id=' . get_request_var('id')); if (cacti_sizeof($graph_list) > 0) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ form_alternate_row('line' . $graph['local_graph_id'], true); if (validate_is_regex(get_request_var('rfilter'))) { form_selectable_cell(filter_value($graph['title_cache'], get_request_var('rfilter')), $graph['local_graph_id']); } else { form_selectable_ecell(get_request_var('rfilter') != '' ? aggregate_format_text($graph['title_cache'], get_request_var('rfilter')) : $graph['title_cache'], $graph['local_graph_id']); } form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'right'); form_selectable_cell(($graph['agg_graph_id'] != '' ? "" . __('Yes') . '':"" . __('No') . ""), $graph['local_graph_id']); form_selectable_ecell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id'], '', 'right'); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } } else { print '' . __('No Graphs Found') . ''; } html_end_box(false); /* put the nav bar on the bottom as well */ print $nav; /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ form_hidden_box('local_graph_id', get_request_var('id'), ''); draw_actions_dropdown($agg_item_actions); form_end(); } function aggregate_make_sql_where($sql_where, $items, $field) { if ($sql_where != '') { $sql_where .= ' AND ('; } else { $sql_where = 'WHERE ('; } $indentation = 0; $termcount = 0; if (cacti_sizeof($items)) { foreach($items as $i) { $i = trim($i); while (substr($i,0,1) == '(') { $indentation++; $termcount = 0; $sql_where .= '('; $i = substr($i, 1); } $split = strpos($i, ')'); if ($split !== false) { $end = trim(substr($i, $split)); $i = substr($i, 0, $split); } else { $end = ''; } if ($i != '') { if (strtolower($i) == 'and') { $sql_where .= ' AND '; } elseif (strtolower($i) == 'or') { $sql_where .= ' OR '; } else { $sql_where .= ($termcount > 0 ? ' OR ':'') . $field . " LIKE '%" . trim($i) . "%'"; $termcount++; } } if ($end != '') { while (substr($end, 0, 1) == ')') { $indentation--; $termcount = 0; $sql_where .= ')'; $end = trim(substr($end, 1)); } } } } $sql_where .= ')'; return trim($sql_where); } function aggregate_format_text($text, $filter) { $items = explode(' ', $filter); $tags = array(); foreach($items as $i) { $i = trim($i); $i = str_replace('(','',$i); $i = str_replace(')','',$i); if (strtolower($i) == 'and' || strtolower($i) == 'or') { continue; } if (substr_count($text, $i) !== false) { $tagno = rand(); $tags[$tagno] = $i; $text = str_replace($i, "<<$tagno>>", $text); } } if (cacti_sizeof($tags)) { foreach($tags as $k => $t) { $text = str_replace("<<$k>>", "" . html_escape($t) . "", $text); } } return $text; } function aggregate_graph() { global $graph_actions, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '', ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'local_graph_ids' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_agraph'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } ?>
    '> ' title=''> ' title=''>
    array('display' => __('Graph Title'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The title for the Aggregate Graphs')), 'local_graph_id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database identifier for this object')), 'name' => array('display' => __('Aggregate Template'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Aggregate Template that this Aggregate Graphs is based upon')), 'height' => array('display' => __('Size'), 'align' => 'right', 'sort' => 'ASC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false, 'aggregate_graphs.php?filter=' . get_request_var('filter')); if (cacti_sizeof($graph_list)) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ $template_name = html_escape($graph['name']); form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell(filter_value(title_trim($graph['title_cache'], read_config_option('max_title_length')), get_request_var('filter'), 'aggregate_graphs.php?action=edit&id=' . $graph['local_graph_id']), $graph['local_graph_id']); form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'right'); form_selectable_cell((empty($graph['name']) ? '' . __('None') . '' : filter_value($template_name, get_request_var('filter'))), $graph['local_graph_id']); form_selectable_ecell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id'], '', 'right'); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } } else { print '' . __('No Aggregate Graphs Found') .''; } html_end_box(false); if (cacti_sizeof($graph_list)) { print $nav; } /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($graph_actions); /* remove old graphs */ purge_old_graphs(); form_end(); } function purge_old_graphs() { /* workaround to handle purged graphs */ $old_graphs = array_rekey(db_fetch_assoc('SELECT DISTINCT local_graph_id FROM aggregate_graphs_items AS pagi LEFT JOIN graph_local AS gl ON pagi.local_graph_id=gl.id WHERE gl.id IS NULL AND local_graph_id>0'), 'local_graph_id', 'local_graph_id'); if (cacti_sizeof($old_graphs)) { db_execute('DELETE FROM aggregate_graphs_items WHERE local_graph_id IN (' . implode(',', $old_graphs) . ')'); } $old_aggregates = array_rekey(db_fetch_assoc('SELECT DISTINCT local_graph_id FROM aggregate_graphs AS pag LEFT JOIN graph_local AS gl ON pag.local_graph_id=gl.id WHERE gl.id IS NULL AND local_graph_id>0'), 'local_graph_id', 'local_graph_id'); $old_agg_ids = array_rekey(db_fetch_assoc('SELECT DISTINCT pag.id FROM aggregate_graphs AS pag LEFT JOIN graph_local AS gl ON pag.local_graph_id=gl.id WHERE gl.id IS NULL'), 'id', 'id'); if (cacti_sizeof($old_aggregates)) { db_execute('DELETE FROM graph_templates_item WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); db_execute('DELETE FROM graph_templates_graph WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); db_execute('DELETE FROM aggregate_graphs WHERE local_graph_id IN (' . implode(',', $old_aggregates) . ')'); } if (cacti_sizeof($old_agg_ids)) { db_execute('DELETE FROM aggregate_graphs_items WHERE aggregate_graph_id IN (' . implode(',', $old_agg_ids) . ')'); } } cacti-release-1.2.19/aggregate_items.php000066400000000000000000000441231413633772300201620ustar00rootroot00000000000000 0 || get_request_var('aggregate_graph_id') > 0) { form_save_aggregate(); } if ($graph_item_types[get_request_var('graph_type_id')] == 'LEGEND') { /* this can be a major time saver when creating lots of graphs with the typical GPRINT LAST/AVERAGE/MAX legends */ $items = array( 0 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '4', 'text_format' => 'Current:', 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => 'Average:', 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => 'Maximum:', 'hard_return' => 'on' )); } foreach ($items as $item) { /* generate a new sequence if needed */ if (isempty_request_var('sequence')) { set_request_var('sequence', get_sequence(get_request_var('sequence'), 'sequence', 'graph_templates_item', 'local_graph_id=' . get_request_var('local_graph_id'))); } $save['id'] = get_filter_request_var('graph_template_item_id'); $save['graph_template_id'] = get_filter_request_var('graph_template_id'); $save['local_graph_template_item_id'] = get_filter_request_var('local_graph_template_item_id'); $save['local_graph_id'] = get_filter_request_var('local_graph_id'); $save['task_item_id'] = form_input_validate(get_filter_request_var('task_item_id'), 'task_item_id', '', true, 3); $save['color_id'] = form_input_validate((isset($item['color_id']) ? $item['color_id'] : get_filter_request_var('color_id')), 'color_id', '', true, 3); /* if alpha is disabled, use invisible_alpha instead */ if (!isset_request_var('alpha')) { set_request_var('alpha', get_nfilter_request_var('invisible_alpha')); } $save['alpha'] = form_input_validate((isset($item['alpha']) ? $item['alpha'] : get_nfilter_request_var('alpha')), 'alpha', '', true, 3); $save['graph_type_id'] = form_input_validate((isset($item['graph_type_id']) ? $item['graph_type_id'] : get_filter_request_var('graph_type_id')), 'graph_type_id', '', true, 3); $save['cdef_id'] = form_input_validate(get_filter_request_var('cdef_id'), 'cdef_id', '', true, 3); $save['consolidation_function_id'] = form_input_validate((isset($item['consolidation_function_id']) ? $item['consolidation_function_id'] : get_filter_request_var('consolidation_function_id')), 'consolidation_function_id', '', true, 3); $save['text_format'] = form_input_validate((isset($item['text_format']) ? $item['text_format'] : get_nfilter_request_var('text_format')), 'text_format', '', true, 3); $save['value'] = form_input_validate(get_nfilter_request_var('value'), 'value', '', true, 3); $save['hard_return'] = form_input_validate(((isset($item['hard_return']) ? $item['hard_return'] : (isset_request_var('hard_return') ? get_nfilter_request_var('hard_return') : ''))), 'hard_return', '', true, 3); $save['gprint_id'] = form_input_validate(get_filter_request_var('gprint_id'), 'gprint_id', '', true, 3); $save['sequence'] = get_filter_request_var('sequence'); if (!is_error_message()) { $graph_template_item_id = sql_save($save, 'graph_templates_item'); if ($graph_template_item_id) { raise_message(1); } else { raise_message(2); } } set_request_var('sequence', 0); } if (is_error_message()) { header('Location: ' . $config['url_path'] . 'aggregate_items.php?action=item_edit&graph_template_item_id=' . (empty($graph_template_item_id) ? get_filter_request_var('graph_template_item_id') : $graph_template_item_id) . '&id=' . get_filter_request_var('local_graph_id')); exit; } else { header('Location: ' . $config['url_path'] . 'aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id')); exit; } } } /* ----------------------- save aggregate graph item This saves any overrides to item properties from graph template item. Inserting new items here is not possible. Just editing existing ones. ----------------------- */ function form_save_aggregate() { global $config; if (!isset_request_var('save_component_item')) { return; } // two possible tables to save to - aggregate template or aggregate graph // with different key column combination $save_to = 'aggregate_graph_templates_item'; $key_cols = array('aggregate_template_id', 'graph_templates_item_id'); $location_success = 'aggregate_templates.php?action=edit&id=' . get_filter_request_var('aggregate_template_id'); $location_failure = 'aggregate_items.php?action=item_edit&aggregate_template_id=' . get_filter_request_var('aggregate_template_id') . '&id=' . get_filter_request_var('graph_template_item_id'); if (get_filter_request_var('aggregate_graph_id') > 0) { $save_to = 'aggregate_graphs_graph_item'; $key_cols = array('aggregate_graph_id', 'graph_templates_item_id'); $location_success = 'aggregate_graphs.php?action=edit&id=' . get_filter_request_var('local_graph_id'); $location_failure = 'aggregate_items.php?action=item_edit&aggregate_graph_id=' . get_filter_request_var('aggregate_graph_id') . '&id=' . get_filter_request_var('graph_template_item_id'); } // only some properties can be saved here $save = array(); $save['t_graph_type_id'] = form_input_validate((isset_request_var('t_graph_type_id') ? get_nfilter_request_var('t_graph_type_id') : ''), 't_graph_type_id', '', true, 3); $save['graph_type_id'] = form_input_validate((($save['t_graph_type_id']) ? get_filter_request_var('graph_type_id') : 0), 'graph_type_id', '', true, 3); $save['t_cdef_id'] = form_input_validate((isset_request_var('t_cdef_id') ? get_nfilter_request_var('t_cdef_id') : ''), 't_cdef_id', '', true, 3); $save['cdef_id'] = form_input_validate((($save['t_cdef_id']) ? get_filter_request_var('cdef_id') : 0), 'cdef_id', '', true, 3); if (!is_error_message()) { // sql_save will not give usefull return values when row key is // composed from multiple columns. need to manualy build query $sql_set = 'SET '; foreach ($save as $key => $value) { $sql_set .= $key . "=" . db_qstr($value) . ", "; } $sql_set = substr($sql_set, 0, -2); $sql_where = 'graph_templates_item_id = ' . get_filter_request_var('graph_template_item_id') . ' AND '; if ($save_to == 'aggregate_graph_templates_item') { $sql_where .= 'aggregate_template_id=' . get_filter_request_var('aggregate_template_id'); } else { $sql_where .= 'aggregate_graph_id=' . get_filter_request_var('aggregate_graph_id'); } $sql = "UPDATE $save_to $sql_set WHERE $sql_where LIMIT 1"; $success = db_execute($sql); if ($success) { raise_message(1); } else { raise_message(2); } // update existing graphs with the changest to this item if ($save_to == 'aggregate_graphs_graph_item') push_out_aggregates(0, get_filter_request_var('local_graph_id')); elseif ($save_to == 'aggregate_graph_templates_item') push_out_aggregates(get_filter_request_var('aggregate_template_id')); } if (is_error_message()) { header('Location: ' . $config['url_path'] . $location_failure); exit; } else { header('Location: ' . $config['url_path'] . $location_success); exit; } } /* ----------------------- item - Graph Items ----------------------- */ function item_movedown() { global $graph_item_types; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('local_graph_id'); /* ==================================================== */ $arr = get_graph_group(get_request_var('id')); $next_id = get_graph_parent(get_request_var('id'), 'next'); if ((!empty($next_id)) && (isset($arr[get_request_var('id')]))) { move_graph_group(get_request_var('id'), $arr, $next_id, 'next'); } elseif (preg_match('/(GPRINT|VRULE|HRULE|COMMENT)/', $graph_item_types[db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id')))])) { move_item_down('graph_templates_item', get_request_var('id'), 'local_graph_id=' . get_request_var('local_graph_id')); } } function item_moveup() { global $graph_item_types; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('local_graph_id'); /* ==================================================== */ $arr = get_graph_group(get_request_var('id')); $previous_id = get_graph_parent(get_request_var('id'), 'previous'); if ((!empty($previous_id)) && (isset($arr[get_request_var('id')]))) { move_graph_group(get_request_var('id'), $arr, $previous_id, 'previous'); } elseif (preg_match('/(GPRINT|VRULE|HRULE|COMMENT)/', $graph_item_types[db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id')))])) { move_item_up('graph_templates_item', get_request_var('id'), 'local_graph_id=' . get_request_var('local_graph_id')); } } function item_remove() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ db_execute_prepared('DELETE FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); } function item_edit() { global $config, $struct_graph_item, $graph_item_types, $consolidation_functions; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('local_graph_id'); get_filter_request_var('aggregate_graph_id'); get_filter_request_var('aggregate_template_id'); /* ==================================================== */ /* remember these search fields in session vars so we don't have to keep passing them around */ load_current_session_value('local_graph_id', 'sess_local_graph_id', ''); $id = (!isempty_request_var('id') ? '&id=' . get_request_var('id') : ''); /* this editor can work on aggregate template graph item or aggregate item */ if (!isempty_request_var('aggregate_graph_id')) { $id_field = 'aggregate_graph_id'; $table_name = 'aggregate_graphs_graph_item'; $page_name = 'aggregate_graphs.php'; } elseif (!isempty_request_var('aggregate_template_id')) { $id_field = 'aggregate_template_id'; $table_name = 'aggregate_graph_templates_item'; $page_name = 'aggregate_templates.php'; }else { /* TODO redirect somewhere and show an error message, rather than die */ die("We should have redirected somewhere but we ended up here instead" . PHP_EOL); } if (!isempty_request_var('id')) { $template_item = db_fetch_row_prepared('SELECT * FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); } /* override some template_item values from aggregate tables */ $item_overrides = db_fetch_row_prepared("SELECT * FROM $table_name WHERE $id_field = ? AND graph_templates_item_id = ?", array(get_request_var($id_field), get_request_var("id"))); if (cacti_sizeof($item_overrides) == 0) { /* this item is not currently in aggregate tables * item editor will not work in this case, so let's * save it now */ $item_new = array( $id_field => get_request_var($id_field), 'graph_templates_item_id' => get_request_var("id"), 'sequence' => $template_item['sequence'] ); aggregate_graph_items_save(array($item_new), $table_name); $item_overrides = db_fetch_row_prepared("SELECT * FROM $table_name WHERE $id_field = ? AND graph_templates_item_id = ?", array(get_request_var($id_field), get_request_var("id"))); } foreach (array_keys($template_item) as $field_name) { if (!array_key_exists($field_name, $item_overrides)) continue; # t_ coulmn in aggregate table must be "on" to override if (array_key_exists("t_".$field_name, $item_overrides) && $item_overrides["t_".$field_name] == "on") $template_item[$field_name] = $item_overrides[$field_name]; } html_start_box(__('Override Values for Graph Item'), '100%', true, '3', 'center', ''); $form_array = array(); foreach ($struct_graph_item as $field_name => $field_array) { $form_array += array($field_name => $struct_graph_item[$field_name]); /* should we draw an override checkbox */ if (array_key_exists('t_' . $field_name, $item_overrides)) { $form_array[$field_name]['sub_checkbox'] = array( 'name' => 't_' . $field_name, 'friendly_name' => __esc('Override this Value') . '
    ', 'value' => ($item_overrides['t_'.$field_name] == 'on' ? 'on' : ''), 'on_change' => 'toggleFieldEnabled(this.id);' ); } $form_array[$field_name]['value'] = (isset($template_item) ? $template_item[$field_name] : ''); $form_array[$field_name]['form_id'] = (isset($template_item) ? $template_item['id'] : '0'); } draw_edit_form( array( 'config' => array( 'post_to' => $config['url_path'] . 'aggregate_items.php' ), 'fields' => $form_array ) ); form_hidden_box('local_graph_id', get_request_var('local_graph_id'), '0'); form_hidden_box('graph_template_item_id', (isset($template_item) ? $template_item['id'] : '0'), ''); form_hidden_box('local_graph_template_item_id', (isset($template_item) ? $template_item['local_graph_template_item_id'] : '0'), ''); form_hidden_box('graph_template_id', (isset($template_item) ? $template_item['graph_template_id'] : '0'), ''); form_hidden_box('sequence', (isset($template_item) ? $template_item['sequence'] : '0'), ''); form_hidden_box('_graph_type_id', (isset($template_item) ? $template_item['graph_type_id'] : '0'), ''); form_hidden_box('save_component_item', '1', ''); form_hidden_box('invisible_alpha', $form_array['alpha']['value'], 'FF'); form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); form_hidden_box('aggregate_graph_id', get_request_var('aggregate_graph_id'), '0'); form_hidden_box('aggregate_template_id', get_request_var('aggregate_template_id'), '0'); html_end_box(true, true); form_save_button($config['url_path'] . "$page_name?action=edit&id=" . get_request_var('local_graph_id')); //Now we need some javascript to make it dynamic ?> __('Delete') ); /* set default action */ set_default_action(); if (get_request_var('action') == 'save') { if (isset_request_var('id') && get_filter_request_var('id') == 0 && isset_request_var('graph_template_id_prev') && get_filter_request_var('graph_template_id_prev') == 0) { set_request_var('action', 'edit'); } } switch (get_request_var('action')) { case 'save': aggregate_form_save(); break; case 'actions': aggregate_form_actions(); break; case 'edit': top_header(); aggregate_template_edit(); bottom_footer(); break; default: top_header(); aggregate_template(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ /** * aggregate_form_save the save function */ function aggregate_form_save() { /* make sure we are saving aggregate template */ if (!isset_request_var('save_component_template')) { header('Location: aggregate_templates.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); return null; } $save1 = array(); /* updating existing template or creating a new one? */ if (isset_request_var('id') && get_request_var('id') > 0) { $is_new = false; $save1['id'] = get_nfilter_request_var('id'); } else { $is_new = true; $save1['id'] = 0; } /* set some defaults for possibly disabled values */ if (!isset_request_var('total')) set_request_var('total', 0); if (!isset_request_var('total_type')) set_request_var('total_type', 0); if (!isset_request_var('order_type')) set_request_var('order_type', 0); if (!isset_request_var('total_prefix')) set_request_var('total_prefix', ''); /* populate aggregate template save array and validate posted values*/ $save1['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save1['graph_template_id'] = get_filter_request_var('graph_template_id_prev'); $save1['gprint_prefix'] = form_input_validate(get_nfilter_request_var('gprint_prefix'), 'gprint_prefix', '', true, 3); $save1['gprint_format'] = isset_request_var('gprint_format') ? 'on':''; $save1['graph_type'] = form_input_validate(get_nfilter_request_var('graph_type'), 'graph_type', '', false, 3); $save1['total'] = form_input_validate(get_nfilter_request_var('total'), 'total', '', false, 3); $save1['total_type'] = form_input_validate(get_nfilter_request_var('total_type'), 'total_type', '', false, 3); $save1['total_prefix'] = form_input_validate(get_nfilter_request_var('total_prefix'), 'total_prefix', '', true, 3); $save1['order_type'] = form_input_validate(get_nfilter_request_var('order_type'), 'order_type', '', false, 3); $save1['user_id'] = $_SESSION['sess_user_id']; /* form validation failed */ if (is_error_message()) { header('Location: aggregate_templates.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); return null; } cacti_log('AGGREGATE GRAPH TEMPLATE Saved ID: ' . $save1['id'] . ' Name: ' . $save1['name'], false, 'AGGREGATE', POLLER_VERBOSITY_DEBUG); /* do a quick comparison to see if anything changed */ if ($is_new == false) { $old = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates WHERE id = ?', array($save1['id'])); $save_me = 0; $save_me += ($old['name'] != $save1['name']); $save_me += ($old['gprint_prefix'] != $save1['gprint_prefix']); $save_me += ($old['gprint_format'] != $save1['gprint_format']); $save_me += ($old['graph_type'] != $save1['graph_type']); $save_me += ($old['total'] != $save1['total']); $save_me += ($old['total_type'] != $save1['total_type']); $save_me += ($old['total_prefix'] != $save1['total_prefix']); $save_me += ($old['order_type'] != $save1['order_type']); } else { $save_me = 1; } if ($save_me) { $id = sql_save($save1, 'aggregate_graph_templates', 'id'); /* update children of the template */ db_execute_prepared("UPDATE aggregate_graphs SET gprint_prefix = ?, gprint_format = ?, graph_type = ?, total = ?, total_prefix = ?, order_type = ? WHERE aggregate_template_id = ? AND template_propogation='on'", array($save1['gprint_prefix'], $save1['gprint_format'], $save1['graph_type'], $save1['total'], $save1['total_prefix'], $save1['order_type'], $id)); cacti_log('AGGREGATE GRAPH TEMPLATE Saved ID: ' . $id, false, 'AGGREGATE', POLLER_VERBOSITY_DEBUG); } else { $id = $save1['id']; } if (!$id) { raise_message(2); header('Location: aggregate_templates.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); return null; } /* save extra graph parameters */ /* validate posted graph params */ $params_new = aggregate_validate_graph_params($_POST, true); $params_new['aggregate_template_id'] = $id; /* compare new graph param values with existing in DB. * We need to know if there were changes so we only * rebuild existing graphs if needed. */ $params_changed = false; $params_old = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates_graph WHERE aggregate_template_id = ?', array($id)); if (!empty($params_old)) { foreach ($params_old as $field => $value_old) { if (isset($params_new[$field]) && $params_new[$field] != $value_old) { $params_changed = true; break; } } } else { $params_changed = true; } /* save only if all posted form fields passed validation */ if ($params_changed && !is_error_message()) { sql_save($params_new, 'aggregate_graph_templates_graph', 'aggregate_template_id', false); } /* save the template items now */ /* get existing item ids and sequences from graph template */ $graph_templates_items = array_rekey( db_fetch_assoc_prepared('SELECT id, sequence FROM graph_templates_item WHERE local_graph_id=0 AND graph_template_id = ?', array($save1['graph_template_id'])), 'id', array('sequence') ); /* get existing aggregate template items */ $aggregate_template_items_old = array_rekey( db_fetch_assoc_prepared('SELECT * FROM aggregate_graph_templates_item WHERE aggregate_template_id = ?', array($id)), 'graph_templates_item_id', array('sequence', 'color_template', 't_graph_type_id', 'graph_type_id', 't_cdef_id', 'cdef_id', 'item_skip', 'item_total') ); /* update graph template item values with posted values */ aggregate_validate_graph_items($_POST, $graph_templates_items); $items_changed = false; $items_to_save = array(); foreach($graph_templates_items as $item_id => $data) { $item_new = array(); $item_new['aggregate_template_id'] = $id; $item_new['graph_templates_item_id'] = $item_id; $item_new['color_template'] = isset($data['color_template']) ? $data['color_template']:0; $item_new['item_skip'] = isset($data['item_skip']) ? 'on':''; $item_new['item_total'] = isset($data['item_total']) ? 'on':''; $item_new['sequence'] = isset($data['sequence']) ? $data['sequence']:0; /* compare with old item to see if we need to push out. */ if (!isset($aggregate_template_items_old[$item_id])) { /* this item does not yet exist */ $items_changed = true; } else { // fill in missing fields with db values $item_new = array_merge($aggregate_template_items_old[$item_id], $item_new); /* compare data from user to data from DB */ foreach ($data as $field => $new_value) { if ($aggregate_template_items_old[$item_id][$field] != $new_value) $items_changed = true; } } $items_to_save[] = $item_new; } if ($items_changed) { aggregate_graph_items_save($items_to_save, 'aggregate_graph_templates_item'); } if ($save_me || $params_changed || $items_changed) { push_out_aggregates($id); } raise_message(1); header('Location: aggregate_templates.php?header=false&action=edit&id=' . (empty($id) ? get_nfilter_request_var('id') : $id)); } function aggregate_get_graph_items($table, $id) { } /* ------------------------ The 'actions' function ------------------------ */ /** * aggregate_form_actions the action function */ function aggregate_form_actions() { global $aggregate_actions, $config; /* ================= input validation ================= */ get_filter_request_var('drp_action'); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM aggregate_graph_templates WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM aggregate_graph_templates_item WHERE ' . array_to_sql_or($selected_items, 'aggregate_template_id')); db_execute('DELETE FROM aggregate_graph_templates_graph WHERE ' . array_to_sql_or($selected_items, 'aggregate_template_id')); db_execute("UPDATE aggregate_graphs SET aggregate_template_id=0, template_propogation='' WHERE " . array_to_sql_or($selected_items, 'aggregate_template_id')); } } else { } header('Location: aggregate_templates.php?header=false'); exit; } /* setup some variables */ $aggregate_list = ''; $i = 0; /* loop through each of the color templates selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $aggregate_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM aggregate_graph_templates WHERE id = ?', array($matches[1]))) . '
  • '; $aggregate_array[] = $matches[1]; } } top_header(); form_start('aggregate_templates.php'); html_start_box($aggregate_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($aggregate_array) && cacti_sizeof($aggregate_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

    " . __('Click \'Continue\' to Delete the following Aggregate Graph Template(s).') . "

      $aggregate_list
    \n"; $save_html = " "; } } else { raise_message(40); header('Location: aggregate_templates.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /** * aggregate_template_edit edit the color template */ function aggregate_template_edit() { global $image_types, $struct_aggregate_template; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (!isempty_request_var('id')) { $template = db_fetch_row_prepared('SELECT * FROM aggregate_graph_templates WHERE id = ?', array(get_request_var('id'))); $header_label = __esc('Aggregate Template [edit: %s]', $template['name']); } else { $header_label = __('Aggregate Template [new]'); } /* populate the graph template id if it's set */ if (isset_request_var('graph_template_id') && !isset($template)) { /* ================= input validation ================= */ get_filter_request_var('graph_template_id'); /* ==================================================== */ $template['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $template['id'] = 0; } form_start('aggregate_templates.php', 'template_edit'); html_start_box($header_label, '100%', true, '3', 'center', ''); $helper_string = '|host_description|'; if (isset($template)) { $data_query = db_fetch_cell_prepared('SELECT snmp_query_id FROM snmp_query_graph WHERE graph_template_id = ?', array($template['graph_template_id'])); if ($data_query > 0) { $data_query_info = get_data_query_array($data_query); foreach($data_query_info['fields'] as $field_name => $field_array) { if ($field_array['direction'] == 'input' || $field_array['direction'] == 'input-output') { $helper_string .= ($helper_string != '' ? ', ':'') . '|query_' . $field_name . '|'; } } } } // Append the helper string $struct_aggregate_template['suggestions'] = array( 'method' => 'other', 'friendly_name' => __('Prefix Replacement Values'), 'description' => __('You may use these replacement values for the Prefix in the Aggregate Graph'), 'value' => $helper_string ); draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($struct_aggregate_template, (isset($template) ? $template : array())) ) ); html_end_box(true, true); if (isset($template)) { draw_aggregate_graph_items_list(0, $template['graph_template_id'], $template); /* Draw Graph Configuration form, so user can override some parameters from graph template */ draw_aggregate_template_graph_config($template['id'], $template['graph_template_id']); } form_hidden_box('id', (isset($template['id']) ? $template['id'] : '0'), '0'); form_hidden_box('save_component_template', '1', ''); form_save_button('aggregate_templates.php', 'return', 'id'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'pgt.name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_graphs' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_agg_tmp'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } form_start('aggregate_templates.php', 'template'); html_start_box(__('Aggregate Templates'), '100%', '', '3', 'center', 'aggregate_templates.php?action=edit'); $filter_html = '
    ' . __('Search') . ' ' . __('Templates') . '
    '; print $filter_html; html_end_box(); form_end(); /* form the 'where' clause for our main sql query */ $sql_where = ''; if (get_request_var('filter') != '') { $sql_where = 'WHERE (pgt.name LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ' OR gt.name LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ')'; } if (get_request_var('has_graphs') == 'true') { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'graphs.graphs>0'; } $total_rows = db_fetch_cell("SELECT COUNT(pgt.id) FROM aggregate_graph_templates AS pgt LEFT JOIN ( SELECT aggregate_template_id, COUNT(*) AS graphs FROM aggregate_graphs GROUP BY aggregate_template_id ) AS graphs ON pgt.id=graphs.aggregate_template_id LEFT JOIN graph_templates AS gt ON gt.id=pgt.graph_template_id $sql_where"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $template_list = db_fetch_assoc("SELECT pgt.*, graphs.graphs, gt.name AS graph_template_name FROM aggregate_graph_templates AS pgt LEFT JOIN ( SELECT aggregate_template_id, COUNT(*) AS graphs FROM aggregate_graphs GROUP BY aggregate_template_id ) AS graphs ON pgt.id=graphs.aggregate_template_id LEFT JOIN graph_templates AS gt ON gt.id=pgt.graph_template_id $sql_where $sql_order $sql_limit"); $nav = html_nav_bar('aggregate_templates.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('Aggregate Templates'), 'page', 'main'); form_start('aggregate_templates.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'pgt.name' => array('display' => __('Template Title'), 'align' => 'left', 'sort' => 'ASC'), 'nosort' => array('display' => __('Deletable'), 'align' => 'right', 'tip' => __('Aggregate Templates that are in use can not be Deleted. In use is defined as being referenced by an Aggregate.')), 'graphs.graphs' => array('display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC'), 'graph_template_name' => array('display' => __('Graph Template'), 'align' => 'left', 'sort' => 'ASC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($template_list)) { foreach ($template_list as $template) { if ($template['graphs'] > 0) { $disabled = true; } else { $disabled = false; } form_alternate_row('line' . $template['id'], true, $disabled); form_selectable_cell(filter_value($template['name'], get_request_var('filter'), 'aggregate_templates.php?action=edit&id=' . $template['id'] . '&page=1'), $template['id']); form_selectable_cell($disabled ? __('No'):__('Yes'), $template['id'], '', 'right'); form_selectable_cell('' . number_format_i18n($template['graphs'], '-1') . '', $template['id'], '', 'right'); form_selectable_cell(filter_value($template['graph_template_name'], get_request_var('filter')), $template['id']); form_checkbox_cell($template['graph_template_name'], $template['id'], $disabled); form_end_row(); } } else { print "" . __('No Aggregate Templates Found') . "\n"; } html_end_box(false); if (cacti_sizeof($template_list)) { /* put the nav bar on the bottom as well */ print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($aggregate_actions); form_end(); ?> $error"; break; } // Check user password history if (!secpass_check_history($user_id, $password)) { $bad_password = true; $errorMessage = "" . __('You cannot use a previously entered password!') . ""; break; } // Password and Confirmed password checks if ($password !== $password_confirm) { $bad_password = true; $errorMessage = "" . __('Your new passwords do not match, please retype.') . ""; break; } // Compare current password with stored password if ((!empty($user['password']) || !empty($current_password)) && !compat_password_verify($current_password, $user['password'])) { $bad_password = true; $errorMessage = "" . __('Your current password is not correct. Please try again.') . ""; break; } // Check new password does not match stored password if (compat_password_verify($password, $user['password'])) { $bad_password = true; $errorMessage = "" . __('Your new password cannot be the same as the old password. Please try again.') . ""; break; } // If password isn't blank, password change is good to go if ($password != '') { if (read_config_option('secpass_expirepass') > 0) { db_execute_prepared("UPDATE user_auth SET lastchange = ? WHERE id = ? AND realm = 0 AND enabled = 'on'", array(time(), $user_id)); } $history = intval(read_config_option('secpass_history')); if ($history > 0) { $h = db_fetch_row_prepared("SELECT password, password_history FROM user_auth WHERE id = ? AND realm = 0 AND enabled = 'on'", array($user_id)); $op = $h['password']; $h = explode('|', $h['password_history']); while (cacti_count($h) > $history - 1) { array_shift($h); } $h[] = $op; $h = implode('|', $h); db_execute_prepared("UPDATE user_auth SET password_history = ? WHERE id = ? AND realm = 0 AND enabled = 'on'", array($h, $user_id)); } db_execute_prepared('INSERT IGNORE INTO user_log (username, result, time, ip) VALUES (?, 3, NOW(), ?)', array($user['username'], get_client_addr())); db_check_password_length(); db_execute_prepared("UPDATE user_auth SET must_change_password = '', password = ? WHERE id = ?", array(compat_password_hash($password,PASSWORD_DEFAULT), $user_id)); // Clear the auth cache for the user $token = ''; if (isset($_SERVER['HTTP_COOKIE']) && strpos($_SERVER['HTTP_COOKIE'], 'cacti_remembers') !== false) { $parts = explode(';', $_SERVER['HTTP_COOKIE']); foreach($parts as $p) { if (strpos($p, 'cacti_remembers') !== false) { $pparts = explode('%2C', $p); if (isset($pparts[1])) { $token = $pparts[1]; break; } } } } if ($token != '') { $sql_where = 'AND token != ' . db_qstr(hash('sha512', $token, false)); } else { $sql_where = ''; } db_execute_prepared("DELETE FROM user_auth_cache WHERE user_id = ? $sql_where", array($_SESSION['sess_user_id'])); kill_session_var('sess_change_password'); raise_message('password_success'); /* ok, at the point the user has been sucessfully authenticated; so we must decide what to do next */ /* if no console permissions show graphs otherwise, pay attention to user setting */ $realm_id = $user_auth_realm_filenames['index.php']; $has_console = db_fetch_cell_prepared('SELECT realm_id FROM user_auth_realm WHERE user_id = ? AND realm_id = ?', array($user_id, $realm_id)); if (basename(get_nfilter_request_var('ref')) == 'auth_changepassword.php' || basename(get_nfilter_request_var('ref')) == '') { if ($has_console) { set_request_var('ref', 'index.php'); } else { set_request_var('ref', 'graph_view.php'); } } if (!empty($has_console)) { switch ($user['login_opts']) { case '1': /* referer */ header('Location: ' . sanitize_uri(get_nfilter_request_var('ref'))); break; case '2': /* default console page */ header('Location: index.php'); break; case '3': /* default graph page */ header('Location: graph_view.php'); break; default: api_plugin_hook_function('login_options_navigate', $user['login_opts']); } } else { header('Location: graph_view.php'); } exit; } else { $bad_password = true; } break; } if (api_plugin_hook_function('custom_password', OPER_MODE_NATIVE) == OPER_MODE_RESKIN) { exit; } if (get_request_var('action') == 'force') { $errorMessage = "*** " . __('Forced password change') . " ***"; } /* Create tooltip for password complexity */ $secpass_tooltip = "" . __('Password requirements include:') . "
    "; $secpass_body = ''; if (read_config_option('secpass_minlen') > 0) { $secpass_body .= __('Must be at least %d characters in length', read_config_option('secpass_minlen')); } if (read_config_option('secpass_reqmixcase') == 'on') { $secpass_body .= ($secpass_body != '' ? '
    ':'') . __('Must include mixed case'); } if (read_config_option('secpass_reqnum') == 'on') { $secpass_body .= ($secpass_body != '' ? '
    ':'') . __('Must include at least 1 number'); } if (read_config_option('secpass_reqspec') == 'on') { $secpass_body .= ($secpass_body != '' ? '
    ':'') . __('Must include at least 1 special character'); } if (read_config_option('secpass_history') != '0') { $secpass_body .= ($secpass_body != '' ? '
    ':'') . __('Cannot be reused for %d password changes', read_config_option('secpass_history')+1); } $secpass_tooltip .= $secpass_body; $selectedTheme = get_selected_theme(); ?>
    '> '>
    Cacti password.'); } else { $title_message = __('Please enter your new Cacti password.'); } ?>

    '> ":"";?>
    \n"; cacti-release-1.2.19/auth_login.php000066400000000000000000000744141413633772300171720ustar00rootroot00000000000000 0) { domains_login_process($username); } break; default: $auth_local_required = true; break; } cacti_log("DEBUG: User '" . $username . "' attempt login locally? " . ($auth_local_required ? 'Yes':'No'), false, 'AUTH', POLLER_VERBOSITY_DEBUG); if ($auth_local_required) { secpass_login_process($username); if (!api_plugin_hook_function('login_process', false)) { /* Builtin Auth */ if ((!$user_auth)) { $stored_pass = db_fetch_cell_prepared('SELECT password FROM user_auth WHERE username = ? AND realm = 0', array($username)); if ($stored_pass != '') { $p = get_nfilter_request_var('login_password'); $valid = compat_password_verify($p, $stored_pass); cacti_log("DEBUG: User '" . $username . "' password is " . ($valid?'':'in') . 'valid', false, 'AUTH', POLLER_VERBOSITY_DEBUG); if ($valid) { $user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE username = ? AND realm = 0', array($username)); if (compat_password_needs_rehash($stored_pass, PASSWORD_DEFAULT)) { $p = compat_password_hash($p, PASSWORD_DEFAULT); db_check_password_length(); db_execute_prepared('UPDATE user_auth SET password = ? WHERE username = ?', array($p, $username)); } } } } } } /* Create user from template if requested */ if (!cacti_sizeof($user) && $copy_user && get_template_account() != '0' && $username != '') { cacti_log("NOTE: User '" . $username . "' does not exist, copying template user", false, 'AUTH'); $user_template = db_fetch_row_prepared('SELECT * FROM user_auth WHERE id = ?', array(get_template_account())); /* check that template user exists */ if (!empty($user_template)) { if ($realm == 3) { // This is an ldap login /* get user CN*/ $cn_full_name = read_config_option('cn_full_name'); $cn_email = read_config_option('cn_email'); if ($cn_full_name != '' || $cn_email != '') { $ldap_cn_search_response = cacti_ldap_search_cn($username, array($cn_full_name, $cn_email)); if (isset($ldap_cn_search_response['cn'])) { $data_override = array(); if (array_key_exists($cn_full_name, $ldap_cn_search_response['cn'])) { $data_override['full_name'] = $ldap_cn_search_response['cn'][$cn_full_name]; } else { $data_override['full_name'] = ''; } if (array_key_exists($cn_email, $ldap_cn_search_response['cn'])) { $data_override['email_address'] = $ldap_cn_search_response['cn'][$cn_email]; } else { $data_override['email_address'] = ''; } user_copy($user_template['username'], $username, 0, $realm, false, $data_override); } else { $ldap_response = (isset($ldap_cn_search_response[0]) ? $ldap_cn_search_response[0] : '(no response given)'); $ldap_code = (isset($ldap_cn_search_response['error_num']) ? $ldap_cn_search_response['error_num'] : '(no code given)'); cacti_log('LOGIN: Email Address and Full Name fields not found, reason: ' . $ldap_response . 'code: ' . $ldap_code, false, 'AUTH'); user_copy($user_template['username'], $username, 0, $realm); } } else { user_copy($user_template['username'], $username, 0, $realm); } } else { user_copy($user_template['username'], $username, 0, $realm); } /* requery newly created user */ $user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE username = ? AND realm = ?', array($username, $realm)); } else { /* error */ display_custom_error_message(__('Template user id %s does not exist.', read_config_option('user_template'))); cacti_log("LOGIN: Template user id '" . read_config_option('user_template') . "' does not exist.", false, 'AUTH'); header('Location: index.php?header=false'); exit; } } /* Guest account checking - Not for builtin */ $guest_user = false; if (!cacti_sizeof($user) && $user_auth && get_guest_account() != '0') { /* Locate guest user record */ $user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE id = ?', array(get_guest_account())); if ($user) { cacti_log("LOGIN: Authenticated user '" . $username . "' using guest account '" . $user['username'] . "'", false, 'AUTH'); $guest_user = true; } else { /* error */ display_custom_error_message(__('Guest user id %s does not exist.', read_config_option('guest_user'))); cacti_log("LOGIN: Unable to locate guest user '" . read_config_option('guest_user') . "'", false, 'AUTH'); header('Location: index.php?header=false'); exit; } } /* Process the user */ if (cacti_sizeof($user)) { cacti_log("LOGIN: User '" . $user['username'] . "' Authenticated", false, 'AUTH'); $client_addr = get_client_addr(''); db_execute_prepared('INSERT IGNORE INTO user_log (username, user_id, result, ip, time) VALUES (?, ?, 1, ?, NOW())', array($username, $user['id'], $client_addr)); /* is user enabled */ if (isset($user['enabled'])) { $user_enabled = $user['enabled']; } else { $user_enabled = 'on'; } if ($user_enabled != 'on') { /* Display error */ display_custom_error_message(__('Access Denied, user account disabled.')); header('Location: index.php?header=false'); exit; } if (!auth_user_has_access($user)) { /* error */ display_custom_error_message(__('You do not have access to any area of Cacti. Contact your administrator.')); cacti_log(sprintf("LOGIN: User %s with id %s does not have access to any area of Cacti", $user['username'], $user['id']), false, 'AUTH'); header('Location: index.php?header=false'); exit; } /* remember this user */ if (isset_request_var('remember_me') && read_config_option('auth_cache_enabled') == 'on') { set_auth_cookie($user); } /* set the php session */ $_SESSION['sess_user_id'] = $user['id']; /* handle 'force change password' */ if ($user['must_change_password'] == 'on' && read_config_option('auth_method') == 1 && $user['password_change'] == 'on') { $_SESSION['sess_change_password'] = true; } if (db_table_exists('user_auth_group')) { $group_options = db_fetch_cell_prepared('SELECT MAX(login_opts) FROM user_auth_group AS uag INNER JOIN user_auth_group_members AS uagm ON uag.id=uagm.group_id WHERE user_id = ? AND login_opts != 4', array($_SESSION['sess_user_id'])); if (!empty($group_options)) { $user['login_opts'] = $group_options; } } if (user_setting_exists('user_language', $_SESSION['sess_user_id'])) { $_SESSION['sess_user_language'] = read_user_setting('user_language'); } auth_login_redirect($user['login_opts']); } elseif (!$guest_user && $user_auth) { /* No guest account defined */ display_custom_error_message(__('Access Denied, please contact you Cacti Administrator.')); cacti_log('LOGIN: Access Denied, Either Guest account is not enabled or there is no User Template defined to copy', false, 'AUTH'); header('Location: index.php'); exit; } else { if ($auth_method == 1) { $realm = 0; } else { $realm = 3; } $id = db_fetch_cell_prepared('SELECT id FROM user_auth WHERE username = ? AND realm = ?', array($username, $realm)); /* BAD username/password builtin and LDAP */ db_execute_prepared('INSERT IGNORE INTO user_log (username, user_id, result, ip, time) VALUES (?, ?, 0, ?, NOW())', array($username, !empty($id) ? $id:0, get_client_addr(''))); cacti_log('LOGIN: ' . ($realm == 0 ? 'Local':'LDAP') . " Login Failed for user '" . $username . "' from IP Address '" . get_client_addr('') . "'.", false, 'AUTH'); } } function auth_user_has_access($user) { $access = false; // See if they have access to any realms $realms = db_fetch_cell_prepared('SELECT COUNT(*) FROM user_auth_realm WHERE user_id = ?', array($user['id'])); if ($realms > 0) { return true; } // See if they have general graph access as a guest account if (read_config_option('guest_user') > 0) { if ($user['show_tree'] == 'on' || $user['show_list'] == 'on' || $user['show_preview'] == 'on') { return true; } } // See if they have access to any group realms $user_groups = db_fetch_assoc_prepared('SELECT * FROM user_auth_group_members WHERE user_id = ?', array($user['id'])); if (cacti_sizeof($user_groups)) { foreach($user_groups as $g) { $realms = db_fetch_cell_prepared('SELECT COUNT(*) FROM user_auth_group_realm WHERE group_id = ?', array($g['group_id'])); if ($realms > 0) { return true; } // See if they have general graph access as a guest account if (read_config_option('guest_user') > 0) { if ($g['show_tree'] == 'on' || $g['show_list'] == 'on' || $g['show_preview'] == 'on') { return true; } } } } return false; } /* auth_display_custom_error_message - displays a custom error message to the browser that looks like the pre-defined error messages @arg $message - the actual text of the error message to display */ function auth_display_custom_error_message($message) { global $config; /* kill the session */ cacti_cookie_logout(); /* print error */ print ''; print ''; print ''; html_common_header(__('Cacti')); print ''; print '

    '; print $message; print ''; } function domains_login_process() { global $user, $realm, $username, $user_auth, $ldap_error, $ldap_error_message; if (is_numeric(get_nfilter_request_var('realm')) && get_nfilter_request_var('login_password') != '') { /* get user DN */ $ldap_dn_search_response = domains_ldap_search_dn($username, get_nfilter_request_var('realm')); if ($ldap_dn_search_response['error_num'] == '0') { $ldap_dn = $ldap_dn_search_response['dn']; } else { /* Error searching */ cacti_log('LOGIN: LDAP Error: ' . $ldap_dn_search_response['error_text'], false, 'AUTH'); $ldap_error = true; $ldap_error_message = __('LDAP Search Error: %s', $ldap_dn_search_response['error_text']); $user_auth = false; } if (!$ldap_error) { /* auth user with LDAP */ $ldap_auth_response = domains_ldap_auth($username, get_nfilter_request_var('login_password'), $ldap_dn, get_nfilter_request_var('realm')); if ($ldap_auth_response['error_num'] == '0') { /* User ok */ $user_auth = true; $copy_user = true; $realm = get_nfilter_request_var('realm'); $domain_name = db_fetch_cell_prepared('SELECT domain_name FROM user_domains WHERE domain_id = ?', array($realm-1000)); /* Locate user in database */ cacti_log("LOGIN: LDAP User '$username' Authenticated from Domain '$domain_name'", false, 'AUTH'); $user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE username = ? AND realm = ?', array($username, $realm)); /* Create user from template if requested */ $template_user = db_fetch_cell_prepared('SELECT user_id FROM user_domains WHERE domain_id = ?', array(get_nfilter_request_var('realm')-1000)); $template_username = db_fetch_cell_prepared('SELECT username FROM user_auth WHERE id = ?', array($template_user)); if (!cacti_sizeof($user) && $copy_user && $template_user > 0 && $username != '') { cacti_log("WARN: User '" . $username . "' does not exist, copying template user", false, 'AUTH'); /* check that template user exists */ $user_template = db_fetch_row_prepared('SELECT * FROM user_auth WHERE id = ?', array($template_user)); if (!empty($user_template['id']) && $user_template['id'] > 0) { /* template user found */ $cn_full_name = db_fetch_cell_prepared('SELECT cn_full_name FROM user_domains_ldap WHERE domain_id = ?', array(get_nfilter_request_var('realm')-1000)); $cn_email = db_fetch_cell_prepared('SELECT cn_email FROM user_domains_ldap WHERE domain_id = ?', array(get_nfilter_request_var('realm')-1000)); if ($cn_full_name != '' || $cn_email != '') { $ldap_cn_search_response = cacti_ldap_search_cn($username, array($cn_full_name,$cn_email) ); if (isset($ldap_cn_search_response['cn'])) { $data_override = array(); if (array_key_exists($cn_full_name, $ldap_cn_search_response['cn'])) { $data_override['full_name'] = $ldap_cn_search_response['cn'][$cn_full_name]; } else { $data_override['full_name'] = ''; } if (array_key_exists($cn_email, $ldap_cn_search_response['cn'])) { $data_override['email_address'] = $ldap_cn_search_response['cn'][$cn_email]; } else { $data_override['email_address'] = ''; } user_copy($user_template['username'], $username, 0, $realm, false, $data_override); } else { cacti_log('LOGIN: fields not found ' . $ldap_cn_search_response[0] . 'code: ' . $ldap_cn_search_response['error_num'], false, 'AUTH'); user_copy($user_template['username'], $username, 0, $realm); } } else { user_copy($user_template['username'], $username, 0, $realm); } /* requery newly created user */ $user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE username = ? AND realm = ?', array($username, $realm)); } else { /* error */ display_custom_error_message(__('Template user id %s does not exist.', $template_user)); cacti_log("LOGIN: Template user id '" . $template_user . "' does not exist.", false, 'AUTH'); header('Location: index.php?header=false'); exit; } } } else { /* error */ cacti_log('LOGIN: LDAP Error: ' . $ldap_auth_response['error_text'], false, 'AUTH'); $ldap_error = true; $ldap_error_message = __('LDAP Error: %s', $ldap_auth_response['error_text']); $user_auth = false; } } } } function domains_ldap_auth($username, $password = '', $dn = '', $realm = 0) { $ldap = new Ldap; if (!empty($username)) $ldap->username = $username; if (!empty($password)) $ldap->password = $password; $ldap->dn = $dn; $ld = db_fetch_row_prepared('SELECT * FROM user_domains_ldap WHERE domain_id = ?', array($realm-1000)); if (cacti_sizeof($ld)) { if (empty($dn) && !empty($ld['dn'])) { $ldap->dn = $ld['dn']; } if (!empty($ld['server'])) $ldap->host = $ld['server']; if (!empty($ld['port'])) $ldap->port = $ld['port']; if (!empty($ld['port_ssl'])) $ldap->port_ssl = $ld['port_ssl']; if (!empty($ld['proto_version'])) $ldap->version = $ld['proto_version']; if (!empty($ld['encryption'])) $ldap->encryption = $ld['encryption']; if (!empty($ld['referrals'])) $ldap->referrals = $ld['referrals']; if (!empty($ld['mode'])) $ldap->mode = $ld['mode']; if (!empty($ld['search_base'])) $ldap->search_base = $ld['search_base']; if (!empty($ld['search_filter'])) $ldap->search_filter = $ld['search_filter']; if (!empty($ld['specific_dn'])) $ldap->specific_dn = $ld['specific_dn']; if (!empty($ld['specific_password'])) $ldap->specific_password = $ld['specific_password']; if ($ld['group_require'] == 'on') { $ldap->group_require = true; } else { $ldap->group_require = false; } if (!empty($ld['group_dn'])) $ldap->group_dn = $ld['group_dn']; if (!empty($ld['group_attrib'])) $ldap->group_attrib = $ld['group_attrib']; if (!empty($ld['group_member_type'])) $ldap->group_member_type = $ld['group_member_type']; /* If the server list is a space delimited set of servers * process each server until you get a bind, or fail */ $ldap_servers = preg_split('/\s+/', $ldap->host); foreach($ldap_servers as $ldap_server) { $ldap->host = $ldap_server; $response = $ldap->Authenticate(); if ($response['error_num'] == 0) { return $response; } } return $response; } else { return false; } } function domains_ldap_search_dn($username, $realm) { $ldap = new Ldap; if (!empty($username)) $ldap->username = $username; $ld = db_fetch_row_prepared('SELECT * FROM user_domains_ldap WHERE domain_id = ?', array($realm-1000)); if (cacti_sizeof($ld)) { if (!empty($ld['dn'])) $ldap->dn = $ld['dn']; if (!empty($ld['server'])) $ldap->host = $ld['server']; if (!empty($ld['port'])) $ldap->port = $ld['port']; if (!empty($ld['port_ssl'])) $ldap->port_ssl = $ld['port_ssl']; if (!empty($ld['proto_version'])) $ldap->version = $ld['proto_version']; if (!empty($ld['encryption'])) $ldap->encryption = $ld['encryption']; if (!empty($ld['referrals'])) $ldap->referrals = $ld['referrals']; if (!empty($ld['mode'])) $ldap->mode = $ld['mode']; if (!empty($ld['search_base'])) $ldap->search_base = $ld['search_base']; if (!empty($ld['search_filter'])) $ldap->search_filter = $ld['search_filter']; if (!empty($ld['specific_dn'])) $ldap->specific_dn = $ld['specific_dn']; if (!empty($ld['specific_password'])) $ldap->specific_password = $ld['specific_password']; if ($ld['group_require'] == 'on') { $ldap->group_require = true; } else { $ldap->group_require = false; } if (!empty($ld['group_dn'])) $ldap->group_dn = $ld['group_dn']; if (!empty($ld['group_attrib'])) $ldap->group_attrib = $ld['group_attrib']; if (!empty($ld['group_member_type'])) $ldap->group_member_type = $ld['group_member_type']; /* If the server list is a space delimited set of servers * process each server until you get a bind, or fail */ $ldap_servers = preg_split('/\s+/', $ldap->host); foreach($ldap_servers as $ldap_server) { $ldap->host = $ldap_server; $response = $ldap->Search(); if ($response['error_num'] == 0) { return $response; } } return $response; } else { return false; } } if (api_plugin_hook_function('custom_login', OPER_MODE_NATIVE) == OPER_MODE_RESKIN) { return; } $selectedTheme = get_selected_theme(); ?>
    $ldap_error, 'ldap_error_message' => $ldap_error_message, 'username' => $username, 'user_enabled' => $user_enabled, 'action' => get_nfilter_request_var('action'))); ?>

    array( 'name' => __('Local'), 'selected' => false ), '2' => array( 'name' => __('LDAP'), 'selected' => true ) ) ); } else { $realms = get_auth_realms(true); } // try and remember previously selected realm if ($frv_realm && array_key_exists($frv_realm, $realms)) { foreach ($realms as $key => $realm) { $realms[$key]['selected'] = ($frv_realm == $key); } } ?>
    '>
    >
    '>
    cacti-release-1.2.19/auth_profile.php000066400000000000000000000447271413633772300175260ustar00rootroot00000000000000 array('regexp' => '/^([a-z_A-Z]+)$/'))); /* ==================================================== */ /* present a tabbed interface */ $tabs = array( 'general' => array( 'display' => __('General'), 'url' => $config['url_path'] . 'auth_profile.php?tab=general&header=false' ) ); $tabs = api_plugin_hook_function('auth_profile_tabs', $tabs); /* set the default tab */ load_current_session_value('tab', 'sess_profile_tabs', 'general'); $current_tab = get_nfilter_request_var('tab'); if (cacti_sizeof($tabs) > 1) { $i = 0; /* draw the tabs */ print "
    \n"; } if ($current_tab == 'general') { settings(); settings_javascript(); } else { api_plugin_hook_function('auth_profile_run_action', get_request_var('tab')); } bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function api_auth_logout_everywhere() { $user = $_SESSION['sess_user_id']; if (!empty($user)) { db_execute_prepared('DELETE FROM user_auth_cache WHERE user_id = ?', array($user)); } } function api_auth_clear_user_settings() { $user = $_SESSION['sess_user_id']; if (!empty($user)) { if (isset_request_var('tab') && get_nfilter_request_var('tab') == 'general') { db_execute_prepared('DELETE FROM settings_user WHERE user_id = ?', array($user)); kill_session_var('sess_user_config_array'); } elseif (isset_request_var('tab')) { api_plugin_hook('auth_profile_reset'); } raise_message('37'); } } function api_auth_clear_user_setting($name) { global $settings_user; $user = $_SESSION['sess_user_id']; if (!empty($user)) { if (isset_request_var('tab') && get_nfilter_request_var('tab') == 'general') { db_execute_prepared('DELETE FROM settings_user WHERE user_id = ? AND name = ?', array($user, $name)); foreach($settings_user as $tab => $settings) { if (isset($settings[$name])) { if (isset($settings[$name]['default'])) { db_execute_prepared('INSERT INTO settings_user (name, value, user_id) VALUES (?, ?, ?)', array($name, $settings[$name]['default'], $user)); print $settings[$name]['default']; kill_session_var('sess_user_config_array'); break; } } } } else { api_plugin_hook_function('auth_profile_reset_value', $name); } } } function api_auth_update_user_setting($name, $value) { global $settings_user; $user = $_SESSION['sess_user_id']; if (!empty($user)) { if ($name == 'full_name' || $name == 'email_address') { db_execute_prepared("UPDATE user_auth SET $name = ? WHERE id = ?", array($value, $user)); } else { foreach($settings_user as $tab => $settings) { if (isset($settings[$name])) { db_execute_prepared('REPLACE INTO settings_user (name, value, user_id) VALUES (?, ?, ?)', array($name, $value, $user)); kill_session_var('sess_user_config_array'); kill_session_var('selected_theme'); kill_session_var('sess_user_language'); break; } } } } } function form_save() { global $settings_user; // Save the users profile information if (isset_request_var('full_name') && isset_request_var('email_address') && isset($_SESSION['sess_user_id'])) { db_execute_prepared("UPDATE user_auth SET full_name = ?, email_address = ? WHERE id = ?", array( get_nfilter_request_var('full_name'), get_nfilter_request_var('email_address'), $_SESSION['sess_user_id'] ) ); } $errors = array(); // Save the users graph settings if they have permission if (is_view_allowed('graph_settings') == true && isset_request_var('tab') && get_nfilter_request_var('tab') == 'general') { save_user_settings($_SESSION['sess_user_id']); } elseif (isset_request_var('tab')) { api_plugin_hook('auth_profile_save'); } if (cacti_sizeof($errors) == 0) { raise_message(1); } else { raise_message(35); foreach($errors as $error) { raise_message($error); } } /* reset local settings cache so the user sees the new settings */ kill_session_var('sess_user_language'); kill_session_var('sess_user_config_array'); kill_session_var('selected_theme'); } /* -------------------------- User Settings Functions -------------------------- */ function settings() { global $tabs_graphs, $settings_user, $current_user, $graph_views, $current_user; /* you cannot have per-user graph settings if cacti's user management is not turned on */ if (read_config_option('auth_method') == 0) { raise_message(6); return; } if (isset($_SERVER['HTTP_REFERER'])) { $referer = $_SERVER['HTTP_REFERER']; if (strpos($referer, 'auth_profile.php') === false) { $timespan_sel_pos = strpos($referer, '&predefined_timespan'); if ($timespan_sel_pos) { $referer = substr($referer, 0, $timespan_sel_pos); } $_SESSION['profile_referer'] = $referer; } } elseif (!isset($_SESSION['profile_referer'])) { $_SESSION['profile_referer'] = 'graph_view.php'; } form_start('auth_profile.php', 'chk'); html_start_box(__('User Account Details'), '100%', true, '3', 'center', ''); $current_user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE id = ?', array($_SESSION['sess_user_id'])); if (!cacti_sizeof($current_user)) { return; } // Set the graph views the user has permission to unset($graph_views); if (is_view_allowed('show_tree')) { $graph_views[1] = __('Tree View'); } if (is_view_allowed('show_list')) { $graph_views[2] = __('List View'); } if (is_view_allowed('show_preview')) { $graph_views[2] = __('Preview View'); } if (cacti_sizeof($graph_views)) { $settings_user['general']['default_view_mode']['array'] = $graph_views; } else { unset($settings_user['general']['default_view_mode']); } /* file: user_admin.php, action: user_edit (host) */ $fields_user = array( 'username' => array( 'method' => 'value', 'friendly_name' => __('User Name'), 'description' => __('The login name for this user.'), 'value' => '|arg1:username|', 'max_length' => '40', 'size' => '40' ), 'full_name' => array( 'method' => 'textbox', 'friendly_name' => __('Full Name'), 'description' => __('A more descriptive name for this user, that can include spaces or special characters.'), 'value' => '|arg1:full_name|', 'max_length' => '120', 'size' => '60' ), 'email_address' => array( 'method' => 'textbox', 'friendly_name' => __('Email Address'), 'description' => __('An Email Address you be reached at.'), 'value' => '|arg1:email_address|', 'max_length' => '60', 'size' => '60' ), 'clear_settings' => array( 'method' => 'button', 'friendly_name' => __('Clear User Settings'), 'description' => __('Return all User Settings to Default values.'), 'value' => __('Clear User Settings'), 'on_click' => 'clearUserSettings()' ), 'private_data' => array( 'method' => 'button', 'friendly_name' => __('Clear Private Data'), 'description' => __('Clear Private Data including Column sizing.'), 'value' => __('Clear Private Data'), 'on_click' => 'clearPrivateData()' ) ); if (read_config_option('auth_cache_enabled') == 'on') { $fields_user += array( 'logout_everywhere' => array( 'method' => 'button', 'friendly_name' => __('Logout Everywhere'), 'description' => __('Clear all your Login Session Tokens.'), 'value' => __('Logout Everywhere'), 'on_click' => 'logoutEverywhere()' ) ); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_user, (isset($current_user) ? $current_user : array())) ) ); html_end_box(true, true); if (is_view_allowed('graph_settings') == true) { if (read_config_option('auth_method') != 0) { $settings_user['tree']['default_tree_id']['sql'] = get_allowed_trees(false, true); } html_start_box(__('User Settings'), '100%', true, '3', 'center', ''); foreach ($settings_user as $tab_short_name => $tab_fields) { $collapsible = true; print "
    " . $tabs_graphs[$tab_short_name] . ($collapsible ? "
    ":"") . "
    \n"; $form_array = array(); foreach ($tab_fields as $field_name => $field_array) { $form_array += array($field_name => $tab_fields[$field_name]); if ((isset($field_array['items'])) && (is_array($field_array['items']))) { foreach ($field_array['items'] as $sub_field_name => $sub_field_array) { if (graph_config_value_exists($sub_field_name, $_SESSION['sess_user_id'])) { $form_array[$field_name]['items'][$sub_field_name]['form_id'] = 1; } $form_array[$field_name]['items'][$sub_field_name]['value'] = db_fetch_cell_prepared('SELECT value FROM settings_user WHERE name = ? AND user_id = ?', array($sub_field_name, $_SESSION['sess_user_id'])); } } else { if (graph_config_value_exists($field_name, $_SESSION['sess_user_id'])) { $form_array[$field_name]['form_id'] = 1; } $user_row = db_fetch_row_prepared('SELECT value FROM settings_user WHERE name = ? AND user_id = ?', array($field_name, $_SESSION['sess_user_id'])); if (cacti_sizeof($user_row)) { $form_array[$field_name]['user_set'] = true; $form_array[$field_name]['value'] = $user_row['value']; } else { $form_array[$field_name]['user_set'] = false; $form_array[$field_name]['value'] = null; } } } draw_edit_form( array( 'config' => array( 'no_form_tag' => true ), 'fields' => $form_array ) ); } print "\n"; html_end_box(true, true); } form_hidden_box('save_component_graph_config','1',''); form_save_buttons(array(array('id' => 'return', 'value' => __esc('Return')))); form_end(); } function settings_javascript() { global $config; ?> __('Add Device'), 2 => __('Delete Device') ); $os_arr = array_rekey(db_fetch_assoc('SELECT DISTINCT os FROM automation_devices WHERE os IS NOT NULL AND os!=""'), 'os', 'os'); $status_arr = array( __('Down'), __('Up') ); $networks = array_rekey(db_fetch_assoc('SELECT an.id, an.name FROM automation_networks AS an INNER JOIN automation_devices AS ad ON an.id=ad.network_id ORDER BY name'), 'id', 'name'); set_default_action(); process_request_vars(); switch(get_request_var('action')) { case 'purge': purge_discovery_results(); break; case 'actions': form_actions(); break; case 'export': export_discovery_results(); break; default: display_discovery_page(); break; } function form_actions() { global $device_actions, $availability_options; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* add to cacti */ $i = 0; foreach($selected_items as $id) { $d = db_fetch_row_prepared('SELECT * FROM automation_devices WHERE id = ?', array($id)); $d['poller_id'] = get_filter_request_var('poller_id'); $d['host_template'] = get_filter_request_var('host_template'); $d['availability_method'] = get_filter_request_var('availability_method'); $d['notes'] = __('Added manually through device automation interface.'); $d['snmp_sysName'] = $d['sysName']; // pull ping options from network_id $n = db_fetch_row_prepared('SELECT * FROM automation_networks WHERE id = ?', array($d['network_id'])); if (cacti_sizeof($n)) { $d['ping_method'] = $n['ping_method']; $d['ping_port'] = $n['ping_port']; $d['ping_timeout'] = $n['ping_timeout']; $d['ping_retries'] = $n['ping_retries']; } $host_id = automation_add_device($d, true); $description = (trim($d['hostname']) != '' ? $d['hostname'] : $d['ip']); if ($host_id) { raise_message('automation_msg_' . $i, __esc('Device %s Added to Cacti', $description), MESSAGE_LEVEL_INFO); } else { raise_message('automation_msg_' . $i, __esc('Device %s Not Added to Cacti', $description), MESSAGE_LEVEL_ERROR); } $i++; } } elseif (get_nfilter_request_var('drp_action') == 2) { /* remove device */ foreach($selected_items as $id) { db_execute_prepared('DELETE FROM automation_devices WHERE id = ?', array($id)); } raise_message('automation_remove', __('Devices Removed from Cacti Automation database'), MESSAGE_LEVEL_INFO); } } header('Location: automation_devices.php?header=false'); exit; } /* setup some variables */ $device_list = ''; $device_array = array(); $i = 0; /* loop through each of the graphs selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $device_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT CONCAT(IF(hostname!="", hostname, "unknown"), " (", ip, ")") FROM automation_devices WHERE id = ?', array($matches[1]))) . '
  • '; $device_array[$i] = $matches[1]; $i++; } } top_header(); form_start('automation_devices.php', 'chk'); html_start_box($device_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); $available_host_templates = db_fetch_assoc_prepared('SELECT id, name FROM host_template ORDER BY name'); if (isset($device_array) && cacti_sizeof($device_array)) { if (get_request_var('drp_action') == '1') { /* add */ $pollers = db_fetch_assoc_prepared('SELECT id, name FROM poller ORDER BY name'); $availability_method = 0; $host_template = 0; $devices = db_fetch_assoc('SELECT id, sysName, sysDescr FROM automation_devices WHERE id IN (' . implode(',', $device_array) . ')'); foreach ($devices as $device) { $os = automation_find_os($device['sysDescr'], '', $device['sysName']); if (isset($os['host_template']) && $os['host_template'] > 0) { if ($host_template == 0) { $host_template = $os['host_template']; $availability_method = $os['availability_method']; } else if ($host_template != $os['host_template']) { // End up here if we have 2 devices with different Host Template matches $host_template = 0; $availability_method = 0; break; } } else { // Couldn't determine the Host Template for a device, so abort and don't set a default $host_template = 0; $availability_method = 0; break; } } print "

    " . __('Click \'Continue\' to add the following Discovered device(s).') . "

      $device_list
    "; print "
    " . __('Pollers') . ""; form_dropdown('poller_id', $pollers, 'name', 'id', '', '', ''); print "
    " . __('Select Template') . ""; form_dropdown('host_template', $available_host_templates, 'name', 'id', '', '', $host_template); print "
    " . __('Availability Method') . ""; form_dropdown('availability_method', $availability_options, '', '', '', '', $availability_method); print "
    "; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { /* remove */ print "

    " . __('Click \'Continue\' to Delete the following Discovered device(s).') . "

      $device_list
    "; $save_html = " "; } } else { raise_message(40); header('Location: automation_devices.php?header=false'); exit; } print " $save_html "; html_end_box(); form_end(); bottom_footer(); } function display_discovery_page() { global $item_rows, $os_arr, $status_arr, $networks, $device_actions; top_header(); draw_filter(); $total_rows = 0; if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } $results = get_discovery_results($total_rows, $rows); /* generate page list */ $nav = html_nav_bar('automation_devices.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 12, __('Devices'), 'page', 'main'); form_start('automation_devices.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'hostname' => array('display' => __('Device Name'), 'align' => 'left', 'sort' => 'ASC'), 'ip' => array('display' => __('IP'), 'align' => 'left', 'sort' => 'ASC'), 'sysName' => array('display' => __('SNMP Name'), 'align' => 'left', 'sort' => 'ASC'), 'sysLocation' => array('display' => __('Location'), 'align' => 'left', 'sort' => 'ASC'), 'sysContact' => array('display' => __('Contact'), 'align' => 'left', 'sort' => 'ASC'), 'sysDescr' => array('display' => __('Description'), 'align' => 'left', 'sort' => 'ASC'), 'os' => array('display' => __('OS'), 'align' => 'left', 'sort' => 'ASC'), 'time' => array('display' => __('Uptime'), 'align' => 'right', 'sort' => 'DESC'), 'snmp' => array('display' => __('SNMP'), 'align' => 'right', 'sort' => 'DESC'), 'up' => array('display' => __('Status'), 'align' => 'right', 'sort' => 'ASC'), 'mytime' => array('display' => __('Last Check'), 'align' => 'right', 'sort' => 'DESC')); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $snmp_version = read_config_option('snmp_version'); $snmp_port = read_config_option('snmp_port'); $snmp_timeout = read_config_option('snmp_timeout'); $snmp_username = read_config_option('snmp_username'); $snmp_password = read_config_option('snmp_password'); $max_oids = read_config_option('max_get_size'); $ping_method = read_config_option('ping_method'); $availability_method = read_config_option('availability_method'); $status = array("" . __('Down') . '',"" . __('Up') . ''); if (cacti_sizeof($results)) { foreach($results as $host) { form_alternate_row('line' . base64_encode($host['ip']), true); if ($host['hostname'] == '') { $host['hostname'] = __('Not Detected'); } form_selectable_cell(filter_value($host['hostname'], get_request_var('filter')), $host['id']); form_selectable_cell(filter_value($host['ip'], get_request_var('filter')), $host['id']); form_selectable_cell(filter_value(snmp_data($host['sysName']), get_request_var('filter')), $host['id'], '', 'text-align:left'); form_selectable_cell(filter_value(snmp_data($host['sysLocation']), get_request_var('filter')), $host['id'], '', 'text-align:left'); form_selectable_cell(filter_value(snmp_data($host['sysContact']), get_request_var('filter')), $host['id'], '', 'text-align:left'); form_selectable_cell(filter_value(snmp_data($host['sysDescr']), get_request_var('filter')), $host['id'], '', 'text-align:left;white-space:normal;'); form_selectable_cell(filter_value(snmp_data($host['os']), get_request_var('filter')), $host['id'], '', 'text-align:left'); form_selectable_cell(snmp_data(get_uptime($host)), $host['id'], '', 'text-align:right'); form_selectable_cell($status[$host['snmp']], $host['id'], '', 'text-align:right'); form_selectable_cell($status[$host['up']], $host['id'], '', 'text-align:right'); form_selectable_cell(substr($host['mytime'],0,16), $host['id'], '', 'text-align:right'); form_checkbox_cell($host['ip'], $host['id']); form_end_row(); } } else { print "" . __('No Devices Found') . ""; } html_end_box(false); if (cacti_sizeof($results)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($device_actions); form_end(); bottom_footer(); } function process_request_vars() { /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'hostname', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'status' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'network' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'snmp' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'os' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_autom'); /* ================= input validation ================= */ } function get_discovery_results(&$total_rows = 0, $rows = 0, $export = false) { global $os_arr, $status_arr, $networks, $device_actions; $sql_where = ''; $status = get_request_var('status'); $network = get_request_var('network'); $snmp = get_request_var('snmp'); $os = get_request_var('os'); $filter = get_request_var('filter'); if ($status == __('Down')) { $sql_where .= 'WHERE up=0'; } else if ($status == __('Up')) { $sql_where .= 'WHERE up=1'; } if ($network > 0) { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'network_id=' . $network; } if ($snmp == __('Down')) { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'snmp=0'; } else if ($snmp == __('Up')) { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . 'snmp=1'; } if ($os != '-1' && in_array($os, $os_arr)) { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . "os='$os'"; } if ($filter != '') { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . '(hostname LIKE ' . db_qstr('%' . $filter . '%') . ' OR ip LIKE ' . db_qstr('%' . $filter . '%') . ' OR sysName LIKE ' . db_qstr('%' . $filter . '%') . ' OR sysDescr LIKE ' . db_qstr('%' . $filter . '%') . ' OR sysLocation LIKE ' . db_qstr('%' . $filter . '%') . ' OR sysContact LIKE ' . db_qstr('%' . $filter . '%') . ' )'; } if ($export) { return db_fetch_assoc("SELECT * FROM automation_devices $sql_where ORDER BY INET_ATON(ip)"); } else { $total_rows = db_fetch_cell("SELECT COUNT(*) FROM automation_devices $sql_where"); $page = get_request_var('page'); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*($page-1)) . ',' . $rows; $sql_query = "SELECT *,sysUptime snmp_sysUpTimeInstance, FROM_UNIXTIME(time) AS mytime FROM automation_devices $sql_where $sql_order $sql_limit"; return db_fetch_assoc($sql_query); } } function draw_filter() { global $item_rows, $os_arr, $status_arr, $networks, $device_actions; html_start_box(__('Discovery Filters'), '100%', '', '3', 'center', ''); ?>
    '> ' title=''> ' title=''> ' title=''> ' title=''>
    $r) { $host['$h'] = str_replace(',','',$r); } print ($host['hostname'] == '' ? __('Not Detected'):$host['hostname']) . ','; print $host['ip'] . ','; print export_data($host['sysName']) . ','; print export_data($host['sysLocation']) . ','; print export_data($host['sysContact']) . ','; print export_data($host['sysDescr']) . ','; print export_data($host['os']) . ','; print export_data($uptime) . ','; print ($host['snmp'] == 1 ? __('Up'):__('Down')) . ','; print ($host['up'] == 1 ? __('Up'):__('Down')) . "\n"; } } } function purge_discovery_results() { get_filter_request_var('network'); if (get_request_var('network') > 0) { db_execute_prepared('DELETE FROM automation_devices WHERE network_id = ?', array(get_request_var('network'))); } else { db_execute('TRUNCATE TABLE automation_devices'); } header('Location: automation_devices.php?header=false'); exit; } function snmp_data($item) { if ($item == '') { return __('N/A'); } else { return html_escape(str_replace(':',' ', $item)); } } function export_data($item) { if ($item == '') { return 'N/A'; } else { return $item; } } cacti-release-1.2.19/automation_graph_rules.php000066400000000000000000001076061413633772300216140ustar00rootroot00000000000000 __('Duplicate'), AUTOMATION_ACTION_GRAPH_ENABLE => __('Enable'), AUTOMATION_ACTION_GRAPH_DISABLE => __('Disable'), AUTOMATION_ACTION_GRAPH_DELETE => __('Delete'), ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': save(); break; case 'actions': automation_graph_rules_form_actions(); break; case 'item_movedown': automation_graph_rules_item_movedown(); header('Location: automation_graph_rules.php?action=edit&id=' . get_filter_request_var('id')); break; case 'item_moveup': automation_graph_rules_item_moveup(); header('Location: automation_graph_rules.php?action=edit&id=' . get_filter_request_var('id')); break; case 'item_remove': automation_graph_rules_item_remove(); header('Location: automation_graph_rules.php?action=edit&id=' . get_filter_request_var('id')); break; case 'item_edit': top_header(); automation_graph_rules_item_edit(); bottom_footer(); break; case 'qedit': automation_change_query_type(); header('Location: automation_graph_rules.php?header=false&action=edit&name=' . get_request_var('name') . '&id=' . get_filter_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); break; case 'remove': automation_graph_rules_remove(); header ('Location: automation_graph_rules.php'); break; case 'edit': top_header(); automation_graph_rules_edit(); bottom_footer(); break; default: top_header(); automation_graph_rules(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function save() { if (isset_request_var('save_component_automation_graph_rule')) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $save['id'] = get_nfilter_request_var('id'); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['snmp_query_id'] = form_input_validate(get_nfilter_request_var('snmp_query_id'), 'snmp_query_id', '^[0-9]+$', false, 3); $save['graph_type_id'] = (isset_request_var('graph_type_id')) ? form_input_validate(get_nfilter_request_var('graph_type_id'), 'graph_type_id', '^[0-9]+$', false, 3) : 0; $save['enabled'] = (isset_request_var('enabled') ? 'on' : ''); if (!is_error_message()) { $rule_id = sql_save($save, 'automation_graph_rules'); if ($rule_id) { raise_message(1); } else { raise_message(2); } } header('Location: automation_graph_rules.php?header=false&action=edit&id=' . (empty($rule_id) ? get_nfilter_request_var('id') : $rule_id)); } elseif (isset_request_var('save_component_automation_graph_rule_item')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); /* ==================================================== */ $save = array(); $save['id'] = form_input_validate(get_request_var('item_id'), 'item_id', '^[0-9]+$', false, 3); $save['rule_id'] = form_input_validate(get_request_var('id'), 'id', '^[0-9]+$', false, 3); $save['sequence'] = form_input_validate(get_nfilter_request_var('sequence'), 'sequence', '^[0-9]+$', false, 3); $save['operation'] = form_input_validate(get_nfilter_request_var('operation'), 'operation', '^[-0-9]+$', true, 3); $save['field'] = form_input_validate(((isset_request_var('field') && get_nfilter_request_var('field') != '0') ? get_nfilter_request_var('field') : ''), 'field', '', true, 3); $save['operator'] = form_input_validate((isset_request_var('operator') ? get_nfilter_request_var('operator') : ''), 'operator', '^[0-9]+$', true, 3); $save['pattern'] = form_input_validate((isset_request_var('pattern') ? get_nfilter_request_var('pattern') : ''), 'pattern', '', true, 3); if (!is_error_message()) { $item_id = sql_save($save, 'automation_graph_rule_items'); if ($item_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: automation_graph_rules.php?header=false&action=item_edit&id=' . get_request_var('id') . '&item_id=' . (empty($item_id) ? get_request_var('item_id') : $item_id) . '&rule_type=' . AUTOMATION_RULE_TYPE_GRAPH_ACTION); } else { header('Location: automation_graph_rules.php?header=false&action=edit&id=' . get_request_var('id') . '&rule_type=' . AUTOMATION_RULE_TYPE_GRAPH_ACTION); } } elseif (isset_request_var('save_component_automation_match_item')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); /* ==================================================== */ unset($save); $save['id'] = form_input_validate(get_request_var('item_id'), 'item_id', '^[0-9]+$', false, 3); $save['rule_id'] = form_input_validate(get_request_var('id'), 'id', '^[0-9]+$', false, 3); $save['rule_type'] = AUTOMATION_RULE_TYPE_GRAPH_MATCH; $save['sequence'] = form_input_validate(get_nfilter_request_var('sequence'), 'sequence', '^[0-9]+$', false, 3); $save['operation'] = form_input_validate(get_nfilter_request_var('operation'), 'operation', '^[-0-9]+$', true, 3); $save['field'] = form_input_validate(((isset_request_var('field') && get_nfilter_request_var('field') != '0') ? get_nfilter_request_var('field') : ''), 'field', '', true, 3); $save['operator'] = form_input_validate((isset_request_var('operator') ? get_nfilter_request_var('operator') : ''), 'operator', '^[0-9]+$', true, 3); $save['pattern'] = form_input_validate((isset_request_var('pattern') ? get_nfilter_request_var('pattern') : ''), 'pattern', '', true, 3); if (!is_error_message()) { $item_id = sql_save($save, 'automation_match_rule_items'); if ($item_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: automation_graph_rules.php?header=false&action=item_edit&id=' . get_request_var('id') . '&item_id=' . (empty($item_id) ? get_request_var('item_id') : $item_id) . '&rule_type=' . AUTOMATION_RULE_TYPE_GRAPH_MATCH); } else { header('Location: automation_graph_rules.php?header=false&action=edit&id=' . get_request_var('id') . '&rule_type=' . AUTOMATION_RULE_TYPE_GRAPH_MATCH); } } else { raise_message(2); header('Location: automation_graph_rules.php?header=false'); } } /* ------------------------ The 'actions' function ------------------------ */ function automation_graph_rules_form_actions() { global $config, $automation_graph_rules_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action'); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_GRAPH_DELETE) { /* delete */ db_execute('DELETE FROM automation_graph_rules WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM automation_graph_rule_items WHERE ' . array_to_sql_or($selected_items, 'rule_id')); db_execute('DELETE FROM automation_match_rule_items WHERE ' . array_to_sql_or($selected_items, 'rule_id')); } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_GRAPH_DUPLICATE) { /* duplicate */ for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $automation_graph_rules_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM automation_graph_rules WHERE id = ?', array($matches[1]))) . '
  • '; $automation_graph_rules_array[] = $matches[1]; } } top_header(); form_start('automation_graph_rules.php', 'automation_graph_rules'); html_start_box($automation_graph_rules_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_GRAPH_DELETE) { /* delete */ print "

    " . __('Press \'Continue\' to delete the following Graph Rules.') . "

      $automation_graph_rules_list
    "; } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_GRAPH_DUPLICATE) { /* duplicate */ print "

    " . __('Click \'Continue\' to duplicate the following Rule(s). You can optionally change the title format for the new Graph Rules.') . "

      $automation_graph_rules_list

    " . __('Title Format') . '
    '; form_text_box('name_format', '<' . __('rule_name') . '> (1)', '', '255', '30', 'text'); print "

    \n"; } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_GRAPH_ENABLE) { /* enable */ print "

    " . __('Click \'Continue\' to enable the following Rule(s).') . "

      $automation_graph_rules_list

    " . __('Make sure, that those rules have successfully been tested!') . "

    \n"; } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_GRAPH_DISABLE) { /* disable */ print "

    " . __('Click \'Continue\' to disable the following Rule(s).') . "

      $automation_graph_rules_list
    \n"; } if (!isset($automation_graph_rules_array)) { raise_message(40); header('Location: automation_graph_rules.php?header=false'); exit; } else { $save_html = " "; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* -------------------------- Rule Item Functions -------------------------- */ function automation_graph_rules_item_movedown() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_MATCH) { move_item_down('automation_match_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id') . ' AND rule_type=' . get_request_var('rule_type')); } elseif (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_ACTION) { move_item_down('automation_graph_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id')); } } function automation_graph_rules_item_moveup() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_MATCH) { move_item_up('automation_match_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id') . ' AND rule_type=' . get_request_var('rule_type')); } elseif (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_ACTION) { move_item_up('automation_graph_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id')); } } function automation_graph_rules_item_remove() { /* ================= input validation ================= */ get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_MATCH) { db_execute_prepared('DELETE FROM automation_match_rule_items WHERE id = ?', array(get_request_var('item_id'))); } elseif (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_ACTION) { db_execute_prepared('DELETE FROM automation_graph_rule_items WHERE id = ?', array(get_request_var('item_id'))); } } function automation_graph_rules_item_edit() { global $config; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ global_item_edit(get_request_var('id'), get_request_var('item_id'), get_request_var('rule_type')); form_hidden_box('rule_type', get_request_var('rule_type'), get_request_var('rule_type')); form_hidden_box('id', (isset_request_var('id') ? get_request_var('id') : '0'), ''); form_hidden_box('item_id', (isset_request_var('item_id') ? get_request_var('item_id') : '0'), ''); if(get_request_var('rule_type') == AUTOMATION_RULE_TYPE_GRAPH_MATCH) { form_hidden_box('save_component_automation_match_item', '1', ''); } else { form_hidden_box('save_component_automation_graph_rule_item', '1', ''); } form_save_button('automation_graph_rules.php?action=edit&id=' . get_request_var('id') . '&rule_type='. get_request_var('rule_type')); ?> 0) { $snmp_query_id = get_filter_request_var('snmp_query_id'); $name = get_nfilter_request_var('name'); db_execute_prepared('UPDATE automation_graph_rules SET snmp_query_id = ?, name = ? WHERE id = ?', array($snmp_query_id, $name, $id)); $graph_type = db_fetch_cell_prepared('SELECT id FROM snmp_query_graph WHERE snmp_query_id = ? ORDER BY name LIMIT 1', array($snmp_query_id)); db_execute_prepared('UPDATE automation_graph_rules SET graph_type_id = ? WHERE id = ?', array($graph_type, $id)); } elseif (isset_request_var('graph_type_id') && $id > 0) { $snmp_query_id = get_filter_request_var('graph_type_id'); $name = get_nfilter_request_var('name'); db_execute_prepared('UPDATE automation_graph_rules SET graph_type_id = ?, name = ? WHERE id = ?', array($snmp_query_id, $name, $id)); } } function automation_graph_rules_edit() { global $config; global $fields_automation_graph_rules_edit1, $fields_automation_graph_rules_edit2, $fields_automation_graph_rules_edit3; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('snmp_query_id'); get_filter_request_var('graph_type_id'); get_filter_request_var('show_graphs'); get_filter_request_var('show_hosts'); get_filter_request_var('show_rule'); /* ==================================================== */ /* clean up rule name */ if (isset_request_var('name')) { set_request_var('name', sanitize_search_string(get_request_var('name'))); } /* handle show_rule mode */ if (isset_request_var('show_rule')) { if (get_request_var('show_rule') == '0') { kill_session_var('automation_graph_rules_show_rule'); $_SESSION['automation_graph_rules_show_rule'] = false; } elseif (get_request_var('show_rule') == '1') { $_SESSION['automation_graph_rules_show_rule'] = true; } } elseif (!isset($_SESSION['automation_graph_rules_show_rule'])) { $_SESSION['automation_graph_rules_show_rule'] = true; } /* handle show_graphs mode */ if (isset_request_var('show_graphs')) { if (get_request_var('show_graphs') == '0') { kill_session_var('automation_graph_rules_show_graphs'); } elseif (get_request_var('show_graphs') == '1') { $_SESSION['automation_graph_rules_show_graphs'] = true; } } /* handle show_hosts mode */ if (isset_request_var('show_hosts')) { if (get_request_var('show_hosts') == '0') { kill_session_var('automation_graph_rules_show_hosts'); } elseif (get_request_var('show_hosts') == '1') { $_SESSION['automation_graph_rules_show_hosts'] = true; } } /* * display the rule ------------------------------------------------------------------------------------- */ $rule = array(); if (!isempty_request_var('id')) { $rule = db_fetch_row_prepared('SELECT * FROM automation_graph_rules where id = ?', array(get_request_var('id'))); if (!isempty_request_var('graph_type_id')) { $rule['graph_type_id'] = get_request_var('graph_type_id'); # set query_type for display } # setup header $header_label = __esc('Rule Selection [edit: %s]', $rule['name']); } else { $rule = array ( 'name' => get_request_var('name'), 'snmp_query_id' => get_request_var('snmp_query_id'), ); $header_label = __('Rule Selection [new]'); } /* * show rule? ------------------------------------------------------------------------------------------ */ if (!isempty_request_var('id')) { ?>
    *'>
    *'>
    0) { ?>
    *'>
    array('no_form_tag' => true), 'fields' => inject_form_variables($form_array, (isset($rule) ? $rule : array())) )); html_end_box(true, true); form_hidden_box('id', (isset($rule['id']) ? $rule['id'] : '0'), ''); form_hidden_box('item_id', (isset($rule['item_id']) ? $rule['item_id'] : '0'), ''); form_hidden_box('save_component_automation_graph_rule', '1', ''); /* * display the rule items ------------------------------------------------------------------------------- */ if (!empty($rule['id'])) { # display graph rules for host match display_match_rule_items(__('Device Selection Criteria'), $rule['id'], AUTOMATION_RULE_TYPE_GRAPH_MATCH, 'automation_graph_rules.php'); # fetch graph action rules display_graph_rule_items(__('Graph Creation Criteria'), $rule['id'], AUTOMATION_RULE_TYPE_GRAPH_ACTION, 'automation_graph_rules.php'); } form_save_button('automation_graph_rules.php', 'return'); print '
    '; } if (!empty($rule['id'])) { /* display list of matching hosts */ if (isset($_SESSION['automation_graph_rules_show_hosts'])) { if ($_SESSION['automation_graph_rules_show_hosts']) { display_matching_hosts($rule, AUTOMATION_RULE_TYPE_GRAPH_MATCH, 'automation_graph_rules.php?action=edit&id=' . get_request_var('id')); } } /* display list of new graphs */ if (isset($_SESSION['automation_graph_rules_show_graphs'])) { if ($_SESSION['automation_graph_rules_show_graphs']) { display_new_graphs($rule, 'automation_graph_rules.php?action=edit&id=' . get_request_var('id')); } } } ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'status' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'snmp_query_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_autom_gr'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } if ((!empty($_SESSION['sess_autom_gr_status'])) && (!isempty_request_var('status'))) { if ($_SESSION['sess_autom_gr_status'] != get_nfilter_request_var('status')) { set_request_var('page', 1); } } html_start_box(__('Graph Rules'), '100%', '', '3', 'center', 'automation_graph_rules.php?action=edit'); ?>
    '> '> '>
    array('display' => __('Rule Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this rule.')), 'id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this rule. Useful in performing debugging and automation.')), 'snmp_query_name' => array('display' => __('Data Query'), 'align' => 'left', 'sort' => 'ASC'), 'graph_type_name' => array('display' => __('Graph Type'), 'align' => 'left', 'sort' => 'ASC'), 'enabled' => array('display' => __('Enabled'), 'align' => 'right', 'sort' => 'ASC'), ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($automation_graph_rules_list)) { foreach ($automation_graph_rules_list as $automation_graph_rules) { $snmp_query_name = ((empty($automation_graph_rules['snmp_query_name'])) ? __('None') : html_escape($automation_graph_rules['snmp_query_name'])); $graph_type_name = ((empty($automation_graph_rules['graph_type_name'])) ? __('None') : html_escape($automation_graph_rules['graph_type_name'])); form_alternate_row('line' . $automation_graph_rules['id'], true); form_selectable_cell(filter_value($automation_graph_rules['name'], get_request_var('filter'), 'automation_graph_rules.php?action=edit&id=' . $automation_graph_rules['id'] . '&page=1'), $automation_graph_rules['id']); form_selectable_cell($automation_graph_rules['id'], $automation_graph_rules['id'], '', 'text-align:right'); form_selectable_cell(filter_value($snmp_query_name, get_request_var('filter')), $automation_graph_rules['id']); form_selectable_cell(filter_value($graph_type_name, get_request_var('filter')), $automation_graph_rules['id']); form_selectable_cell($automation_graph_rules['enabled'] ? __('Enabled') : __('Disabled'), $automation_graph_rules['id'], '', 'text-align:right'); form_checkbox_cell($automation_graph_rules['name'], $automation_graph_rules['id']); form_end_row(); } } else { print "" . __('No Graph Rules Found') . "\n"; } html_end_box(false); if (cacti_sizeof($automation_graph_rules_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($automation_graph_rules_actions); form_end(); } cacti-release-1.2.19/automation_networks.php000066400000000000000000001236211413633772300211500ustar00rootroot00000000000000 __('Delete'), 2 => __('Disable'), 3 => __('Enable'), 4 => __('Discover Now'), 5 => __('Cancel Discovery') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'edit': top_header(); network_edit(); bottom_footer(); break; default: top_header(); networks(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_network')) { $network_id = api_networks_save($_POST); header('Location: automation_networks.php?header=false&action=edit&id=' . (empty($network_id) ? get_nfilter_request_var('id') : $network_id)); } } function api_networks_remove($network_id){ db_execute_prepared('DELETE FROM automation_networks WHERE id = ?', array($network_id)); db_execute_prepared('DELETE FROM automation_devices WHERE network_id = ?', array($network_id)); } function api_networks_enable($network_id){ db_execute_prepared('UPDATE automation_networks SET enabled="on" WHERE id = ?', array($network_id)); } function api_networks_disable($network_id){ db_execute_prepared('UPDATE automation_networks SET enabled="" WHERE id = ?', array($network_id)); } function api_networks_cancel($network_id){ db_execute_prepared('UPDATE IGNORE automation_processes SET command="cancel" WHERE task="tmaster" AND network_id = ?', array($network_id)); } function api_networks_discover($network_id, $discover_debug) { global $config; $enabled = db_fetch_cell_prepared('SELECT enabled FROM automation_networks WHERE id = ?', array($network_id)); $running = db_fetch_cell_prepared('SELECT count(*) FROM automation_processes WHERE network_id = ?', array($network_id)); $name = db_fetch_cell_prepared('SELECT name FROM automation_networks WHERE id = ?', array($network_id)); $poller_id = db_fetch_cell_prepared('SELECT poller_id FROM automation_networks WHERE id = ?', array($network_id)); if ($enabled == 'on') { if (!$running) { if ($config['poller_id'] == $poller_id) { $args_debug = ($discover_debug) ? ' --debug' : ''; exec_background(read_config_option('path_php_binary'), '-q ' . read_config_option('path_webroot') . "/poller_automation.php --network=$network_id --force" . $args_debug); } else { $args_debug = ($discover_debug) ? '&debug=true' : ''; $hostname = db_fetch_cell_prepared('SELECT hostname FROM poller WHERE id = ?', array($poller_id)); $fgc_contextoption = get_default_contextoption(); $fgc_context = stream_context_create($fgc_contextoption); $response = @file_get_contents(get_url_type() .'://' . $hostname . $config['url_path'] . 'remote_agent.php?action=discover&network=' . $network_id . $args_debug, false, $fgc_context); } } else { $_SESSION['automation_message'] = __esc('Can Not Restart Discovery for Discovery in Progress for Network \'%s\'', $name); raise_message('automation_message'); } } else { $_SESSION['automation_message'] = __esc('Can Not Perform Discovery for Disabled Network \'%s\'', $name); raise_message('automation_message'); } force_session_data(); } function api_networks_save($post) { if (empty($post['network_id'])) { $save['id'] = form_input_validate($post['id'], 'id', '^[0-9]+$', false, 3); /* general information */ $save['name'] = form_input_validate($post['name'], 'name', '', false, 3); $save['poller_id'] = form_input_validate($post['poller_id'], 'poller_id', '^[0-9]+$', false, 3); $save['site_id'] = form_input_validate($post['site_id'], 'site_id', '^[0-9]+$', false, 3); $save['subnet_range'] = form_input_validate($post['subnet_range'], 'subnet_range', '', false, 3); $save['dns_servers'] = form_input_validate($post['dns_servers'], 'dns_servers', '', true, 3); $save['threads'] = form_input_validate($post['threads'], 'threads', '^[0-9]+$', false, 3); $save['run_limit'] = form_input_validate($post['run_limit'], 'run_limit', '^[0-9]+$', false, 3); $save['enabled'] = (isset($post['enabled']) ? 'on':''); /* notification settings */ $save['notification_enabled'] = (isset($post['notification_enabled']) ? 'on':''); $save['notification_email'] = form_input_validate($post['notification_email'], 'notification_email', '', true, 3); $save['notification_fromname'] = form_input_validate($post['notification_fromname'], 'notification_fromname', '', true, 3); $save['notification_fromemail'] = form_input_validate($post['notification_fromemail'], 'notification_fromemail', '', true, 3); $save['enable_netbios'] = (isset($post['enable_netbios']) ? 'on':''); $save['add_to_cacti'] = (isset($post['add_to_cacti']) ? 'on':''); $save['same_sysname'] = (isset($post['same_sysname']) ? 'on':''); $save['rerun_data_queries'] = (isset($post['rerun_data_queries']) ? 'on':''); /* discovery connectivity settings */ $save['snmp_id'] = form_input_validate($post['snmp_id'], 'snmp_id', '^[0-9]+$', false, 3); $save['ping_method'] = form_input_validate($post['ping_method'], 'ping_method', '^[0-9]+$', false, 3); $save['ping_port'] = form_input_validate($post['ping_port'], 'ping_port', '^[0-9]+$', false, 3); $save['ping_timeout'] = form_input_validate($post['ping_timeout'], 'ping_timeout', '^[0-9]+$', false, 3); $save['ping_retries'] = form_input_validate($post['ping_retries'], 'ping_retries', '^[0-9]+$', false, 3); /* discovery schedule settings */ $save['sched_type'] = form_input_validate($post['sched_type'], 'sched_type', '^[0-9]+$', false, 3); $save['start_at'] = form_input_validate($post['start_at'], 'start_at', '', false, 3);; // accomodate a schedule start change if ($post['orig_start_at'] != $post['start_at']) { $save['next_start'] = '0000-00-00'; } if ($post['orig_sched_type'] != $post['sched_type']) { $save['next_start'] = '0000-00-00'; } $save['recur_every'] = form_input_validate($post['recur_every'], 'recur_every', '', true, 3); $save['day_of_week'] = form_input_validate(isset($post['day_of_week']) ? implode(',', $post['day_of_week']):'', 'day_of_week', '', true, 3); $save['month'] = form_input_validate(isset($post['month']) ? implode(',', $post['month']):'', 'month', '', true, 3); $save['day_of_month'] = form_input_validate(isset($post['day_of_month']) ? implode(',', $post['day_of_month']):'', 'day_of_month', '', true, 3); $save['monthly_week'] = form_input_validate(isset($post['monthly_week']) ? implode(',', $post['monthly_week']):'', 'monthly_week', '', true, 3); $save['monthly_day'] = form_input_validate(isset($post['monthly_day']) ? implode(',', $post['monthly_day']):'', 'monthly_day', '', true, 3); /* check for bad rules */ if ($save['sched_type'] == '3') { if ($save['day_of_week'] == '') { $save['enabled'] = ''; $_SESSION['automation_message'] = __esc('ERROR: You must specify the day of the week. Disabling Network %s!.', $save['name']); raise_message('automation_message'); } } elseif ($save['sched_type'] == '4') { if ($save['month'] == '' || $save['day_of_month'] == '') { $save['enabled'] = ''; $_SESSION['automation_message'] = __esc('ERROR: You must specify both the Months and Days of Month. Disabling Network %s!', $save['name']); raise_message('automation_message'); } } elseif ($save['sched_type'] == '5') { if ($save['month'] == '' || $save['monthly_day'] == '' || $save['monthly_week'] == '') { $save['enabled'] = ''; $_SESSION['automation_message'] = __esc('ERROR: You must specify the Months, Weeks of Months, and Days of Week. Disabling Network %s!', $save['name']); raise_message('automation_message'); } } /* validate the network definitions and rais error if failed */ $continue = true; $total_ips = 0; $networks = explode(',', $save['subnet_range']); if (cacti_sizeof($networks)) { foreach($networks as $net) { $ips = automation_calculate_total_ips($net); if ($ips !== false) { $total_ips += $ips; } else { $continue = false; $_SESSION['automation_message'] = __esc('ERROR: Network \'%s\' is Invalid.', $net); raise_message('automation_message'); break; } } } if ($continue) { $save['total_ips'] = $total_ips; $network_id = 0; if (!is_error_message()) { $network_id = sql_save($save, 'automation_networks'); if ($network_id) { raise_message(1); } else { raise_message(2); } } return $network_id; } } } /* ------------------------ The 'actions' function ------------------------ */ function form_actions() { global $config, $network_actions, $fields_networkss_edit; /* ================= input validation ================= */ get_filter_request_var('drp_action'); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ foreach($selected_items as $item) { api_networks_remove($item); } } elseif (get_nfilter_request_var('drp_action') == '3') { /* enable */ foreach($selected_items as $item) { api_networks_enable($item); } } elseif (get_nfilter_request_var('drp_action') == '2') { /* disable */ foreach($selected_items as $item) { api_networks_disable($item); } } elseif (get_nfilter_request_var('drp_action') == '4') { /* run now */ $discover_debug = isset_request_var('discover_debug'); foreach($selected_items as $item) { api_networks_discover($item, $discover_debug); } sleep(2); } elseif (get_nfilter_request_var('drp_action') == '5') { /* cancel */ foreach($selected_items as $item) { api_networks_cancel($item); } } } header('Location: automation_networks.php?header=false'); exit; } /* setup some variables */ $networks_list = ''; $i = 0; /* loop through each of the device types selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $networks_info = db_fetch_row_prepared('SELECT name FROM automation_networks WHERE id = ?', array($matches[1])); $networks_list .= '
  • ' . html_escape($networks_info['name']) . '
  • '; $networks_array[$i] = $matches[1]; } $i++; } top_header(); form_start('automation_networks.php'); html_start_box($network_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

    " . __('Click \'Continue\' to delete the following Network(s).') . "

      $networks_list
    "; } elseif (get_nfilter_request_var('drp_action') == '3') { /* enable */ print "

    " . __('Click \'Continue\' to enable the following Network(s).') . "

      $networks_list
    "; } elseif (get_nfilter_request_var('drp_action') == '2') { /* disable */ print "

    " . __('Click \'Continue\' to disable the following Network(s).') . "

      $networks_list
    "; } elseif (get_nfilter_request_var('drp_action') == '4') { /* discover now */ print "

    " . __('Click \'Continue\' to discover the following Network(s).') . "

      $networks_list

    "; } elseif (get_nfilter_request_var('drp_action') == '5') { /* cancel discovery now */ print "

    " . __('Click \'Continue\' to cancel on going Network Discovery(s).') . "

      $networks_list
    "; } if (!isset($networks_array)) { raise_message(40); header('Location: automation_networks.php?header=false'); exit; } else { $save_html = ""; } print " " . ($save_html != '' ? " $save_html" : "") . " "; html_end_box(); form_end(); bottom_footer(); } function network_edit() { global $config, $ping_methods;; $ping_methods[PING_SNMP] = __('SNMP Get'); /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $sched_types = array( '1' => __('Manual'), '2' => __('Daily'), '3' => __('Weekly'), '4' => __('Monthly'), '5' => __('Monthly on Day')); if (!isempty_request_var('id')) { $network = db_fetch_row_prepared('SELECT * FROM automation_networks WHERE id = ?', array(get_request_var('id'))); $header_label = __esc('Network Discovery Range [edit: %s]', $network['name']); } else { $header_label = __('Network Discovery Range [new]'); } /* file: mactrack_device_types.php, action: edit */ $fields = array( 'spacer0' => array( 'method' => 'spacer', 'friendly_name' => __('General Settings'), 'collapsible' => 'true' ), 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('Give this Network a meaningful name.'), 'value' => '|arg1:name|', 'max_length' => '250', 'placeholder' => __('New Network Discovery Range') ), 'poller_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Data Collector'), 'description' => __('Choose the Cacti Data Collector/Poller to be used to gather data from this Device.'), 'value' => '|arg1:poller_id|', 'default' => read_config_option('default_poller'), 'sql' => 'SELECT id, name FROM poller ORDER BY name', ), 'site_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Associated Site'), 'description' => __('Choose the Cacti Site that you wish to associate discovered Devices with.'), 'value' => '|arg1:site_id|', 'default' => read_config_option('default_site'), 'sql' => 'SELECT id, name FROM sites ORDER BY name', 'none_value' => __('None') ), 'subnet_range' => array( 'method' => 'textarea', 'friendly_name' => __('Subnet Range'), 'description' => __('Enter valid Network Ranges separated by commas. You may use an IP address, a Network range such as 192.168.1.0/24 or 192.168.1.0/255.255.255.0, or using wildcards such as 192.168.*.*'), 'value' => '|arg1:subnet_range|', 'textarea_rows' => '4', 'textarea_cols' => '80', 'max_length' => '1024', 'placeholder' => '192.168.1.0/24' ), 'total_ips' => array( 'method' => 'other', 'friendly_name' => __('Total IP Addresses'), 'description' => __('Total addressable IP Addresses in this Network Range.'), 'value' => (isset($network['total_ips']) ? number_format_i18n($network['total_ips']) : 0) ), 'dns_servers' => array( 'method' => 'textbox', 'friendly_name' => __('Alternate DNS Servers'), 'description' => __('A space delimited list of alternate DNS Servers to use for DNS resolution. If blank, the poller OS will be used to resolve DNS names.'), 'value' => '|arg1:dns_servers|', 'max_length' => '250', 'placeholder' => __('Enter IPs or FQDNs of DNS Servers') ), 'sched_type' => array( 'method' => 'drop_array', 'friendly_name' => __('Schedule Type'), 'description' => __('Define the collection frequency.'), 'value' => '|arg1:sched_type|', 'array' => $sched_types, 'default' => 1 ), 'threads' => array( 'method' => 'drop_array', 'friendly_name' => __('Discovery Threads'), 'description' => __('Define the number of threads to use for discovering this Network Range.'), 'value' => '|arg1:threads|', 'array' => array( '1' => __('%d Thread', 1), '2' => __('%d Threads', 2), '3' => __('%d Threads', 3), '4' => __('%d Threads', 4), '5' => __('%d Threads', 5), '6' => __('%d Threads', 6), '7' => __('%d Threads', 7), '8' => __('%d Threads', 8), '9' => __('%d Threads', 9), '10' => __('%d Threads', 10), '20' => __('%d Threads', 20), '50' => __('%d Threads', 50) ), 'default' => 1 ), 'run_limit' => array( 'method' => 'drop_array', 'friendly_name' => __('Run Limit'), 'description' => __('After the selected Run Limit, the discovery process will be terminated.'), 'value' => '|arg1:run_limit|', 'array' => array( '60' => __('%d Minute', 1), '300' => __('%d Minutes', 5), '600' => __('%d Minutes', 10), '1200' => __('%d Minutes', 20), '1800' => __('%d Minutes', 30), '3600' => __('%d Hour', 1), '7200' => __('%d Hours', 2), '14400' => __('%d Hours', 4), '28800' => __('%d Hours', 8), ), 'default' => 1200 ), 'enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Enabled'), 'description' => __('Enable this Network Range.'), 'value' => '|arg1:enabled|' ), 'enable_netbios' => array( 'method' => 'checkbox', 'friendly_name' => __('Enable NetBIOS'), 'description' => __('Use NetBIOS to attempt to resolve the hostname of up hosts.'), 'value' => '|arg1:enable_netbios|', 'default' => '' ), 'add_to_cacti' => array( 'method' => 'checkbox', 'friendly_name' => __('Automatically Add to Cacti'), 'description' => __('For any newly discovered Devices that are reachable using SNMP and who match a Device Rule, add them to Cacti.'), 'value' => '|arg1:add_to_cacti|' ), 'same_sysname' => array( 'method' => 'checkbox', 'friendly_name' => __('Allow same sysName on different hosts'), 'description' => __('When discovering devices, allow duplicate sysnames to be added on different hosts'), 'value' => '|arg1:same_sysname|' ), 'rerun_data_queries' => array( 'method' => 'checkbox', 'friendly_name' => __('Rerun Data Queries'), 'description' => __('If a device previously added to Cacti is found, rerun its data queries.'), 'value' => '|arg1:rerun_data_queries|' ), 'spacern' => array( 'method' => 'spacer', 'friendly_name' => __('Notification Settings'), 'collapsible' => 'true' ), 'notification_enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Notification Enabled'), 'description' => __('If checked, when the Automation Network is scanned, a report will be sent to the Notification Email account..'), 'value' => '|arg1:notification_enabled|', 'default' => '' ), 'notification_email' => array( 'method' => 'textbox', 'friendly_name' => __('Notification Email'), 'description' => __('The Email account to be used to send the Notification Email to.'), 'value' => '|arg1:notification_email|', 'max_length' => '250', 'default' => '' ), 'notification_fromname' => array( 'method' => 'textbox', 'friendly_name' => __('Notification From Name'), 'description' => __('The Email account name to be used as the senders name for the Notification Email. If left blank, Cacti will use the default Automation Notification Name if specified, otherwise, it will use the Cacti system default Email name'), 'value' => '|arg1:notification_fromname|', 'max_length' => '32', 'size' => '30', 'default' => '' ), 'notification_fromemail' => array( 'method' => 'textbox', 'friendly_name' => __('Notification From Email Address'), 'description' => __('The Email Address to be used as the senders Email for the Notification Email. If left blank, Cacti will use the default Automation Notification Email Address if specified, otherwise, it will use the Cacti system default Email Address'), 'value' => '|arg1:notification_fromemail|', 'max_length' => '128', 'default' => '' ), 'spacer2' => array( 'method' => 'spacer', 'friendly_name' => __('Discovery Timing'), 'collapsible' => 'true' ), 'start_at' => array( 'method' => 'textbox', 'friendly_name' => __('Starting Date/Time'), 'description' => __('What time will this Network discover item start?'), 'value' => '|arg1:start_at|', 'max_length' => '30', 'default' => date('Y-m-d H:i:s'), 'size' => 20 ), 'recur_every' => array( 'method' => 'drop_array', 'friendly_name' => __('Rerun Every'), 'description' => __('Rerun discovery for this Network Range every X.'), 'value' => '|arg1:recur_every|', 'default' => '1', 'array' => array( 1 => '1', 2 => '2', 3 => '3', 4 => '4', 5 => '5', 6 => '6', 7 => '7' ), ), 'day_of_week' => array( 'method' => 'drop_multi', 'friendly_name' => __('Days of Week'), 'description' => __('What Day(s) of the week will this Network Range be discovered.'), 'array' => array( 1 => __('Sunday'), 2 => __('Monday'), 3 => __('Tuesday'), 4 => __('Wednesday'), 5 => __('Thursday'), 6 => __('Friday'), 7 => __('Saturday') ), 'value' => '|arg1:day_of_week|', 'class' => 'day_of_week' ), 'month' => array( 'method' => 'drop_multi', 'friendly_name' => __('Months of Year'), 'description' => __('What Months(s) of the Year will this Network Range be discovered.'), 'array' => array( 1 => __('January'), 2 => __('February'), 3 => __('March'), 4 => __('April'), 5 => __('May'), 6 => __('June'), 7 => __('July'), 8 => __('August'), 9 => __('September'), 10 => __('October'), 11 => __('November'), 12 => __('December') ), 'value' => '|arg1:month|', 'class' => 'month' ), 'day_of_month' => array( 'method' => 'drop_multi', 'friendly_name' => __('Days of Month'), 'description' => __('What Day(s) of the Month will this Network Range be discovered.'), 'array' => array(1 => '1', 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32 => __('Last')), 'value' => '|arg1:day_of_month|', 'class' => 'days_of_month' ), 'monthly_week' => array( 'method' => 'drop_multi', 'friendly_name' => __('Week(s) of Month'), 'description' => __('What Week(s) of the Month will this Network Range be discovered.'), 'array' => array( 1 => __('First'), 2 => __('Second'), 3 => __('Third'), '32' => __('Last') ), 'value' => '|arg1:monthly_week|', 'class' => 'monthly_week' ), 'monthly_day' => array( 'method' => 'drop_multi', 'friendly_name' => __('Day(s) of Week'), 'description' => __('What Day(s) of the week will this Network Range be discovered.'), 'array' => array( 1 => __('Sunday'), 2 => __('Monday'), 3 => __('Tuesday'), 4 => __('Wednesday'), 5 => __('Thursday'), 6 => __('Friday'), 7 => __('Saturday') ), 'value' => '|arg1:monthly_day|', 'class' => 'monthly_day' ), 'spacer1' => array( 'method' => 'spacer', 'friendly_name' => __('Reachability Settings'), 'collapsible' => 'true' ), 'snmp_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('SNMP Options'), 'description' => __('Select the SNMP Options to use for discovery of this Network Range.'), 'value' => '|arg1:snmp_id|', 'sql' => 'SELECT id, name FROM automation_snmp ORDER BY name' ), 'ping_method' => array( 'friendly_name' => __('Ping Method'), 'description' => __('The type of ping packet to send.'), 'value' => '|arg1:ping_method|', 'method' => 'drop_array', 'default' => read_config_option('ping_method'), 'array' => $ping_methods ), 'ping_port' => array( 'method' => 'textbox', 'friendly_name' => __('Ping Port'), 'value' => '|arg1:ping_port|', 'description' => __('TCP or UDP port to attempt connection.'), 'default' => read_config_option('ping_port'), 'max_length' => 5, 'size' => 5 ), 'ping_timeout' => array( 'friendly_name' => __('Ping Timeout Value'), 'description' => __('The timeout value to use for host ICMP and UDP pinging. This host SNMP timeout value applies for SNMP pings.'), 'method' => 'textbox', 'value' => '|arg1:ping_timeout|', 'default' => read_config_option('ping_timeout'), 'max_length' => 5, 'size' => 5 ), 'ping_retries' => array( 'friendly_name' => __('Ping Retry Count'), 'description' => __('After an initial failure, the number of ping retries Cacti will attempt before failing.'), 'method' => 'textbox', 'value' => '|arg1:ping_retries|', 'default' => read_config_option('ping_retries'), 'max_length' => 5, 'size' => 5 ), 'orig_start_at' => array( 'method' => 'hidden', 'value' => '|arg1:start_at|', ), 'orig_sched_type' => array( 'method' => 'hidden', 'value' => '|arg1:sched_type|', ) ); form_start('automation_networks.php', 'form_network'); html_start_box($header_label, '100%', true, '3', 'center', ''); draw_edit_form( array( 'config' => array('no_form_tag' => 'true'), 'fields' => inject_form_variables($fields, (isset($network) ? $network : array())) ) ); html_end_box(true, true); form_hidden_box('save_component_network', '1', ''); form_hidden_box('id', !isempty_request_var('id') ? get_request_var('id'):0, 0); form_save_button('automation_networks.php', 'return'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'refresh' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '20' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_networks'); /* ================= input validation ================= */ $refresh['page'] = 'automation_networks.php?header=false'; $refresh['seconds'] = get_request_var('refresh'); $refresh['logout'] = 'false'; set_page_refresh($refresh); if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } elseif (get_request_var('rows') == -2) { $rows = 99999999; } else { $rows = get_request_var('rows'); } html_start_box(__('Network Filters'), '100%', '', '3', 'center', 'automation_networks.php?action=edit'); networks_filter(); html_end_box(); $sql_where = ''; $networks = get_networks($sql_where, $rows); $total_rows = db_fetch_cell('SELECT COUNT(*) FROM automation_networks ' . $sql_where); $nav = html_nav_bar('automation_networks.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 14, __('Networks'), 'page', 'main'); form_start('automation_networks.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $sched_types = array( '1' => __('Manual'), '2' => __('Daily'), '3' => __('Weekly'), '4' => __('Monthly'), '5' => __('Monthly on Day') ); $display_text = array( 'name' => array('display' => __('Network Name'), 'align' => 'left', 'sort' => 'ASC'), 'data_collector' => array('display' => __('Data Collector'), 'align' => 'left', 'sort' => 'DESC'), 'sched_type' => array('display' => __('Schedule'), 'align' => 'left', 'sort' => 'DESC'), 'total_ips' => array('display' => __('Total IPs'), 'align' => 'right', 'sort' => 'DESC'), 'nosort1' => array('display' => __('Status'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The Current Status of this Networks Discovery')), 'nosort2' => array('display' => __('Progress'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('Pending/Running/Done')), 'nosort3' => array('display' => __('Up/SNMP Hosts'), 'align' => 'right', 'sort' => 'DESC'), 'threads' => array('display' => __('Threads'), 'align' => 'right', 'sort' => 'DESC'), 'last_runtime' => array('display' => __('Last Runtime'), 'align' => 'right', 'sort' => 'ASC'), 'nosort4' => array('display' => __('Next Start'), 'align' => 'right', 'sort' => 'ASC'), 'last_started' => array('display' => __('Last Started'), 'align' => 'right', 'sort' => 'ASC')); $status = 'Idle'; html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($networks)) { foreach ($networks as $network) { if ($network['enabled'] == '') { $mystat = "" . __('Disabled') . ""; $progress = "0/0/0"; $status = array(); $updown['up'] = $updown['snmp'] = '0'; } else { $running = db_fetch_cell_prepared('SELECT COUNT(*) FROM automation_processes WHERE network_id = ? AND status != "done"', array($network['id'])); if ($running > 0) { $status = db_fetch_row_prepared('SELECT COUNT(*) AS total, SUM(CASE WHEN status=0 THEN 1 ELSE 0 END) AS pending, SUM(CASE WHEN status=1 THEN 1 ELSE 0 END) AS running, SUM(CASE WHEN status=2 THEN 1 ELSE 0 END) AS done FROM automation_ips WHERE network_id = ?', array($network['id'])); $mystat = "" . __('Running') . ""; if (empty($status['total'])) { $progress = "0/0/0"; } else { $progress = $status['pending'] . '/' . $status['running'] . '/' . $status['done']; } $updown = db_fetch_row_prepared("SELECT SUM(up_hosts) AS up, SUM(snmp_hosts) AS snmp FROM automation_processes WHERE network_id = ?", array($network['id'])); if (empty($updown['up'])) { $updown['up'] = 0; $updown['snmp'] = 0; } } else { db_execute_prepared('DELETE FROM automation_processes WHERE network_id = ?', array($network['id'])); $updown['up'] = $network['up_hosts']; $updown['snmp'] = $network['snmp_hosts']; $mystat = "" . __('Idle') . ""; $progress = "0/0/0"; } } form_alternate_row('line' . $network['id'], true); form_selectable_cell('' . html_escape($network['name']) . '', $network['id']); form_selectable_ecell($network['data_collector'], $network['id']); form_selectable_cell($sched_types[$network['sched_type']], $network['id']); form_selectable_cell(number_format_i18n($network['total_ips']), $network['id'], '', 'right'); form_selectable_cell($mystat, $network['id'], '', 'right'); form_selectable_cell($progress, $network['id'], '', 'right'); form_selectable_cell(number_format_i18n($updown['up']) . '/' . number_format_i18n($updown['snmp']), $network['id'], '', 'right'); form_selectable_cell(number_format_i18n($network['threads']), $network['id'], '', 'right'); form_selectable_cell(round($network['last_runtime'],2), $network['id'], '', 'right'); form_selectable_cell($network['enabled'] == '' || $network['sched_type'] == '1' ? __('N/A'):($network['next_start'] == '0000-00-00 00:00:00' ? substr($network['start_at'],0,16):substr($network['next_start'],0,16)), $network['id'], '', 'right'); form_selectable_cell($network['last_started'] == '0000-00-00 00:00:00' ? __('Never'):substr($network['last_started'],0,16), $network['id'], '', 'right'); form_checkbox_cell($network['name'], $network['id']); form_end_row(); } } else { print "" . __('No Networks Found') . ""; } html_end_box(false); if (cacti_sizeof($networks)) { /* put the nav bar on the bottom as well */ print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($network_actions); form_end(); } function networks_filter() { global $item_rows; ?>
    '> ' value=''> ' value=''>
    __('Delete'), 2 => __('Duplicate'), ); /* set default action */ set_default_action(); /* correct for a cancel button */ if (isset_request_var('cancel')) { set_request_var('action', ''); } switch (get_request_var('action')) { case 'save': form_automation_snmp_save(); break; case 'actions': form_automation_snmp_actions(); break; case 'ajax_dnd': automation_snmp_item_dnd(); break; case 'item_movedown': get_filter_request_var('id'); automation_snmp_item_movedown(); header('Location: automation_snmp.php?action=edit&id=' . get_request_var('id')); break; case 'item_moveup': get_filter_request_var('id'); automation_snmp_item_moveup(); header('Location: automation_snmp.php?action=edit&id=' . get_request_var('id')); break; case 'item_remove_confirm': automation_snmp_item_remove_confirm(); break; case 'item_remove': get_filter_request_var('id'); automation_snmp_item_remove(); header('Location: automation_snmp.php?header=false&action=edit&header=false&id=' . get_request_var('id')); break; case 'item_edit': top_header(); automation_snmp_item_edit(); bottom_footer(); break; case 'edit': top_header(); automation_snmp_edit(); bottom_footer(); break; default: top_header(); automation_snmp(); bottom_footer(); break; } function form_automation_snmp_save() { if (isset_request_var('save_component_automation_snmp')) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $save['id'] = get_nfilter_request_var('id'); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); if (!is_error_message()) { $id = sql_save($save, 'automation_snmp'); if ($id) { raise_message(1); } else { raise_message(2); } } header('Location: automation_snmp.php?header=false&action=edit&id=' . (empty($id) ? get_nfilter_request_var('id') : $id)); } elseif (isset_request_var('save_component_automation_snmp_item')) { /* ================= input validation ================= */ get_filter_request_var('item_id'); get_filter_request_var('id'); /* ==================================================== */ $save = array(); $save['id'] = form_input_validate(get_nfilter_request_var('item_id'), '', '^[0-9]+$', false, 3); $save['snmp_id'] = form_input_validate(get_nfilter_request_var('id'), 'snmp_id', '^[0-9]+$', false, 3); $save['sequence'] = form_input_validate(get_nfilter_request_var('sequence'), 'sequence', '^[0-9]+$', false, 3); $save['snmp_community'] = form_input_validate(get_nfilter_request_var('snmp_community'), 'snmp_community', '', false, 3); $save['snmp_version'] = form_input_validate(get_nfilter_request_var('snmp_version'), 'snmp_version', '', false, 3); $save['snmp_username'] = form_input_validate(get_nfilter_request_var('snmp_username'), 'snmp_username', '', true, 3); $save['snmp_password'] = form_input_validate(get_nfilter_request_var('snmp_password'), 'snmp_password', '', true, 3); $save['snmp_auth_protocol'] = form_input_validate(get_nfilter_request_var('snmp_auth_protocol'), 'snmp_auth_protocol', '', true, 3); $save['snmp_priv_passphrase'] = form_input_validate(get_nfilter_request_var('snmp_priv_passphrase'), 'snmp_priv_passphrase', '', true, 3); $save['snmp_priv_protocol'] = form_input_validate(get_nfilter_request_var('snmp_priv_protocol'), 'snmp_priv_protocol', '', true, 3); $save['snmp_context'] = form_input_validate(get_nfilter_request_var('snmp_context'), 'snmp_context', '', true, 3); $save['snmp_engine_id'] = form_input_validate(get_nfilter_request_var('snmp_engine_id'), 'snmp_engine_id', '', true, 3); $save['snmp_port'] = form_input_validate(get_nfilter_request_var('snmp_port'), 'snmp_port', '^[0-9]+$', false, 3); $save['snmp_timeout'] = form_input_validate(get_nfilter_request_var('snmp_timeout'), 'snmp_timeout', '^[0-9]+$', false, 3); $save['snmp_retries'] = form_input_validate(get_nfilter_request_var('snmp_retries'), 'snmp_retries', '^[0-9]+$', false, 3); $save['max_oids'] = form_input_validate(get_nfilter_request_var('max_oids'), 'max_oids', '^[0-9]+$', false, 3); if (!is_error_message()) { $item_id = sql_save($save, 'automation_snmp_items'); if ($item_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: automation_snmp.php?header=false&action=item_edit&id=' . get_nfilter_request_var('id') . '&item_id=' . (empty($item_id) ? get_filter_request_var('id') : $item_id)); } else { header('Location: automation_snmp.php?header=false&action=edit&id=' . get_nfilter_request_var('id')); } } else { raise_message(2); header('Location: automation_snmp.php?header=false'); } } /* ------------------------ The 'actions' function ------------------------ */ function form_automation_snmp_actions() { global $config, $automation_snmp_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action'); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM automation_snmp WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM automation_snmp_items WHERE ' . str_replace('id', 'snmp_id', array_to_sql_or($selected_items, 'id'))); } elseif (get_nfilter_request_var('drp_action') == '2') { /* duplicate */ for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $snmp_groups .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM automation_snmp WHERE id = ?', array($matches[1]))) . '
  • '; $automation_array[$i] = $matches[1]; $i++; } } general_header(); ?> "; if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

    " . __('Click \'Continue\' to delete the following SNMP Option(s).') . "

      $snmp_groups
    "; } elseif (get_nfilter_request_var('drp_action') == '2') { /* duplicate */ print "

    " . __('Click \'Continue\' to duplicate the following SNMP Options. You can optionally change the title format for the new SNMP Options.') . "

      $snmp_groups

    " . __('Name Format') . '
    '; form_text_box('name_format', '<' . __('name') . '> (1)', '', '255', '30', 'text'); print "

    "; } } print " $save_html "; html_end_box(); form_end(); bottom_footer(); } /* -------------------------- SNMP Options Functions -------------------------- */ function automation_duplicate_snmp_option($id, $new_name) { $name = db_fetch_cell_prepared('SELECT name FROM automation_snmp WHERE id = ?', array($id)); $new_name = str_replace('', $name, $new_name); $save['id'] = 0; $save['name'] = $new_name; $newid = sql_save($save, 'automation_snmp'); if ($newid > 0 && $id > 0) { db_execute_prepared("INSERT INTO automation_snmp_items (snmp_id, sequence, snmp_version, snmp_community, snmp_port, snmp_timeout, snmp_retries, max_oids, snmp_username, snmp_password, snmp_auth_protocol, snmp_priv_passphrase, snmp_priv_protocol, snmp_context, snmp_engine_id) SELECT $newid AS snmp_id, sequence, snmp_version, snmp_community, snmp_port, snmp_timeout, snmp_retries, max_oids, snmp_username, snmp_password, snmp_auth_protocol, snmp_priv_passphrase, snmp_priv_protocol, snmp_context, snmp_engine_id FROM automation_snmp_items WHERE snmp_id = ?", array($id)); raise_message('option_duplicated', __('Automation SNMP Options has been Duplicated.'), MESSAGE_LEVEL_INFO); } else { raise_message('missing_options', __('Automation Item does not exist. Can not Duplicate.'), MESSAGE_LEVEL_ERROR); } } function automation_snmp_item_dnd() { /* ================= Input validation ================= */ get_filter_request_var('id'); /* ================= Input validation ================= */ if (isset_request_var('snmp_item') && is_array(get_nfilter_request_var('snmp_item'))) { $items = get_request_var('snmp_item'); $sequence = 1; foreach($items as $item) { $item = str_replace('line', '', $item); input_validate_input_number($item); db_execute_prepared('UPDATE automation_snmp_items SET sequence = ? WHERE id = ?', array($sequence, $item)); $sequence++; } } header('Location: automation_snmp.php?action=edit&header=false&id=' . get_request_var('id')); exit; } function automation_snmp_item_movedown() { /* ================= input validation ================= */ get_filter_request_var('item_id'); get_filter_request_var('id'); /* ==================================================== */ move_item_down('automation_snmp_items', get_request_var('item_id'), 'snmp_id=' . get_request_var('id')); } function automation_snmp_item_moveup() { /* ================= input validation ================= */ get_filter_request_var('item_id'); get_filter_request_var('id'); /* ==================================================== */ move_item_up('automation_snmp_items', get_request_var('item_id'), 'snmp_id=' . get_request_var('id')); } function automation_snmp_item_remove_confirm() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); /* ==================================================== */ form_start('automation_snmp.php'); html_start_box('', '100%', '', '3', 'center', ''); $snmp = db_fetch_row_prepared('SELECT * FROM automation_snmp WHERE id = ?', array(get_request_var('id'))); $item = db_fetch_row_prepared('SELECT * FROM automation_snmp_items WHERE id = ?', array(get_request_var('item_id'))); ?>


    %s', $item['snmp_version']);?>
    %s', ($item['snmp_version'] != 3 ? html_escape($item['snmp_community']):html_escape($item['snmp_username'])));?>

    ' onClick='$("#cdialog").dialog("close");' name='cancel'> ' name='continue' title=''> array( 'method' => 'view', 'friendly_name' => __('Sequence'), 'description' => __('Sequence of Item.'), 'value' => '|arg1:sequence|'), ); draw_edit_form(array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_automation_snmp_item_edit, (isset($automation_snmp_item) ? $automation_snmp_item : array())) )); html_end_box(true, true); form_hidden_box('item_id', (isset_request_var('item_id') ? get_request_var('item_id') : '0'), ''); form_hidden_box('id', (isset($automation_snmp_item['snmp_id']) ? $automation_snmp_item['snmp_id'] : '0'), ''); form_hidden_box('save_component_automation_snmp_item', '1', ''); form_save_button('automation_snmp.php?action=edit&id=' . get_request_var('id')); ?> array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('Fill in the name of this SNMP Option Set.'), 'value' => '|arg1:name|', 'default' => '', 'max_length' => '100', 'size' => '40' ) ); draw_edit_form(array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_automation_snmp_edit, $snmp_group) )); html_end_box(true, true); form_hidden_box('id', (isset_request_var('id') ? get_request_var('id'): '0'), ''); form_hidden_box('save_component_automation_snmp', '1', ''); if (!isempty_request_var('id')) { $items = db_fetch_assoc_prepared('SELECT * FROM automation_snmp_items WHERE snmp_id = ? ORDER BY sequence', array(get_request_var('id'))); html_start_box(__('Automation SNMP Options'), '100%', '', '3', 'center', 'automation_snmp.php?action=item_edit&id=' . get_request_var('id')); $display_text = array( array('display' => __('Item'), 'align' => 'left'), array('display' => __('Version'), 'align' => 'left'), array('display' => __('Community'), 'align' => 'left'), array('display' => __('Port'), 'align' => 'right'), array('display' => __('Timeout'), 'align' => 'right'), array('display' => __('Retries'), 'align' => 'right'), array('display' => __('Max OIDS'), 'align' => 'right'), array('display' => __('Auth Username'), 'align' => 'left'), array('display' => __('Auth Password'), 'align' => 'left'), array('display' => __('Auth Protocol'), 'align' => 'left'), array('display' => __('Priv Passphrase'), 'align' => 'left'), array('display' => __('Priv Protocol'), 'align' => 'left'), array('display' => __('Context'), 'align' => 'left'), array('display' => __('Action'), 'align' => 'right') ); html_header($display_text); $i = 1; $total_items = cacti_sizeof($items); if (cacti_sizeof($items)) { foreach ($items as $item) { form_alternate_row('line' . $item['id'], true, true); $form_data = "" . __('Item#%d', $i) . ''; $form_data .= '' . $item['snmp_version'] . ''; $form_data .= '' . ($item['snmp_version'] == 3 ? __('none') : html_escape($item['snmp_community'])) . ''; $form_data .= '' . $item['snmp_port'] . ''; $form_data .= '' . $item['snmp_timeout'] . ''; $form_data .= '' . $item['snmp_retries'] . ''; $form_data .= '' . $item['max_oids'] . ''; $form_data .= '' . ($item['snmp_version'] == 3 ? html_escape($item['snmp_username']) : __('N/A')) . ''; $form_data .= '' . (($item['snmp_version'] == 3 AND $item['snmp_password'] !== '') ? '*********' : __('N/A')) . ''; $form_data .= '' . ($item['snmp_version'] == 3 ? $item['snmp_auth_protocol'] : __('N/A')) . ''; $form_data .= '' . ($item['snmp_version'] == 3 ? '*********' : __('N/A')) . ''; $form_data .= '' . ($item['snmp_version'] == 3 ? $item['snmp_priv_protocol'] : __('N/A')) . ''; $form_data .= '' . ($item['snmp_version'] == 3 ? html_escape($item['snmp_context']) : __('N/A')) . ''; $form_data .= ''; if (read_config_option('drag_and_drop') == '') { if ($i < $total_items && $total_items > 1) { $form_data .= ''; } else { $form_data .= ''; } if ($i > 1 && $i <= $total_items) { $form_data .= ''; } else { $form_data .= ''; } } $form_data .= ''; $form_data .= ''; print $form_data; $i++; } } else { print "" . __('No SNMP Items') . ""; } html_end_box(); } form_save_button('automation_snmp.php', 'return'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_autom_snmp'); if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Automation SNMP Options'), '100%', '', '3', 'center', 'automation_snmp.php?action=edit'); ?>
    '> ' title=''> ' title=''>
    array('display' => __('SNMP Option Set'), 'align' => 'left', 'sort' => 'ASC'), 'networks' => array('display' => __('Networks Using'), 'align' => 'right', 'sort' => 'DESC'), 'totals' => array('display' => __('SNMP Entries'), 'align' => 'right', 'sort' => 'DESC'), 'v1entries' => array('display' => __('V1 Entries'), 'align' => 'right', 'sort' => 'DESC'), 'v2entries' => array('display' => __('V2 Entries'), 'align' => 'right', 'sort' => 'DESC'), 'v3entries' => array('display' => __('V3 Entries'), 'align' => 'right', 'sort' => 'DESC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($snmp_groups)) { foreach ($snmp_groups as $snmp_group) { form_alternate_row('line' . $snmp_group['id'], true); form_selectable_cell(filter_value($snmp_group['name'], get_request_var('filter'), 'automation_snmp.php?action=edit&id=' . $snmp_group['id'] . '&page=1'), $snmp_group['id']); form_selectable_cell($snmp_group['networks'], $snmp_group['id'], '', 'text-align:right;'); form_selectable_cell($snmp_group['totals'], $snmp_group['id'], '', 'text-align:right;'); form_selectable_cell($snmp_group['v1entries'], $snmp_group['id'], '', 'text-align:right;'); form_selectable_cell($snmp_group['v2entries'], $snmp_group['id'], '', 'text-align:right;'); form_selectable_cell($snmp_group['v3entries'], $snmp_group['id'], '', 'text-align:right;'); form_checkbox_cell($snmp_group['name'], $snmp_group['id']); form_end_row(); } } else { print "" . __('No SNMP Option Sets Found') . ""; } html_end_box(false); if (cacti_sizeof($snmp_groups)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($automation_snmp_actions); form_end(); ?> __('Delete') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'ajax_dnd': automation_template_dnd(); break; case 'actions': form_actions(); break; case 'movedown': automation_movedown(); header('Location: automation_templates.php?header=false'); break; case 'moveup': automation_moveup(); header('Location: automation_templates.php?header=false'); break; case 'remove': automation_remove(); header('Location: automation_templates.php?header=false'); break; case 'edit': top_header(); template_edit(); bottom_footer(); break; default: top_header(); template(); bottom_footer(); break; } function automation_template_dnd() { /* ================= Input validation ================= */ get_filter_request_var('id'); /* ================= Input validation ================= */ if (isset_request_var('template_ids') && is_array(get_nfilter_request_var('template_ids'))) { $aids = get_nfilter_request_var('template_ids'); $sequence = 1; foreach($aids as $id) { $id = str_replace('line', '', $id); input_validate_input_number($id); db_execute_prepared('UPDATE automation_templates SET sequence = ? WHERE id = ?', array($sequence, $id)); $sequence++; } } header('Location: automation_templates.php?header=false'); exit; } function automation_movedown() { move_item_down('automation_templates', get_filter_request_var('id')); } function automation_moveup() { move_item_up('automation_templates', get_filter_request_var('id')); } function automation_remove() { db_execute_prepared('DELETE FROM automation_templates WHERE id = ?', array(get_filter_request_var('id'))); } function form_actions() { global $at_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM automation_templates WHERE ' . array_to_sql_or($selected_items, 'id')); } } header('Location: automation_templates.php?header=false'); exit; } /* setup some variables */ $at_list = ''; $i = 0; foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $at_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT ht.name FROM automation_templates AS at INNER JOIN host_template AS ht ON ht.id=at.host_template WHERE at.id = ?', array($matches[1]))) . '
  • '; $at_array[$i] = $matches[1]; $i++; } } top_header(); form_start('automation_templates.php'); html_start_box($at_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($at_array) && cacti_sizeof($at_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

    " . __('Click \'Continue\' to delete the folling Automation Template(s).') . "

      $at_list
    \n"; $save_html = " "; } } else { raise_message(40); header('Location: automation_templates.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } function form_save() { if (isset_request_var('save_component_template')) { $redirect_back = false; $save['id'] = get_nfilter_request_var('id'); $save['host_template'] = form_input_validate(get_nfilter_request_var('host_template'), 'host_template', '', false, 3); $save['availability_method'] = form_input_validate(get_nfilter_request_var('availability_method'), 'availability_method', '', false, 3); $save['sysDescr'] = get_nfilter_request_var('sysDescr'); $save['sysName'] = get_nfilter_request_var('sysName'); $save['sysOid'] = get_nfilter_request_var('sysOid'); if (function_exists('filter_var')) { $save['sysDescr'] = filter_var($save['sysDescr'], FILTER_SANITIZE_STRING); } else { $save['sysDescr'] = strip_tags($save['sysDescr']); } if (!is_error_message()) { $template_id = sql_save($save, 'automation_templates'); if ($template_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message() || isempty_request_var('id')) { header('Location: automation_templates.php?header=false&id=' . (empty($template_id) ? get_nfilter_request_var('id') : $template_id)); } else { header('Location: automation_templates.php?header=false'); } } } function automation_get_child_branches($tree_id, $id, $spaces, $headers) { $items = db_fetch_assoc_prepared('SELECT id, title FROM graph_tree_items WHERE graph_tree_id = ? AND host_id=0 AND local_graph_id=0 AND parent = ? ORDER BY position', array($tree_id, $id)); $spaces .= '--'; if (cacti_sizeof($items)) { foreach($items as $i) { $headers['tr_' . $tree_id . '_bi_' . $i['id']] = $spaces . ' ' . $i['title']; $headers = automation_get_child_branches($tree_id, $i['id'], $spaces, $headers); } } return $headers; } function automation_get_tree_headers() { $headers = array(); $trees = db_fetch_assoc('SELECT id, name FROM graph_tree ORDER BY name'); foreach ($trees as $tree) { $headers['tr_' . $tree['id'] . '_br_0'] = $tree['name']; $spaces = ''; $headers = automation_get_child_branches($tree['id'], 0, $spaces, $headers); } return $headers; } function template_edit() { global $availability_options; $host_template_names = db_fetch_assoc('SELECT id, name FROM host_template'); $template_names = array(); if (cacti_sizeof($host_template_names)) { foreach ($host_template_names as $ht) { $template_names[$ht['id']] = $ht['name']; } } $fields_automation_template_edit = array( 'host_template' => array( 'method' => 'drop_array', 'friendly_name' => __('Device Template'), 'description' => __('Select a Device Template that Devices will be matched to.'), 'value' => '|arg1:host_template|', 'array' => $template_names, ), 'availability_method' => array( 'method' => 'drop_array', 'friendly_name' => __('Availability Method'), 'description' => __('Choose the Availability Method to use for Discovered Devices.'), 'value' => '|arg1:availability_method|', 'default' => read_config_option('availability_method'), 'array' => $availability_options, ), 'sysDescr' => array( 'method' => 'textbox', 'friendly_name' => __('System Description Match'), 'description' => __('This is a unique string that will be matched to a devices sysDescr string to pair it to this Automation Template. Any Perl regular expression can be used in addition to any SQL Where expression.'), 'value' => '|arg1:sysDescr|', 'max_length' => '255', ), 'sysName' => array( 'method' => 'textbox', 'friendly_name' => __('System Name Match'), 'description' => __('This is a unique string that will be matched to a devices sysName string to pair it to this Automation Template. Any Perl regular expression can be used in addition to any SQL Where expression.'), 'value' => '|arg1:sysName|', 'max_length' => '128', ), 'sysOid' => array( 'method' => 'textbox', 'friendly_name' => __('System OID Match'), 'description' => __('This is a unique string that will be matched to a devices sysOid string to pair it to this Automation Template. Any Perl regular expression can be used in addition to any SQL Where expression.'), 'value' => '|arg1:sysOid|', 'max_length' => '128', ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_template' => array( 'method' => 'hidden', 'value' => '1' ) ); /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (!isempty_request_var('id')) { $host_template = db_fetch_row_prepared('SELECT * FROM automation_templates WHERE id = ?', array(get_request_var('id'))); if (isset($template_names[$host_template['host_template']])) { $header_label = __esc('Automation Templates [edit: %s]', $template_names[$host_template['host_template']]); } else { $header_label = __('Automation Templates for [Deleted Template]'); } } else { $header_label = __('Automation Templates [new]'); set_request_var('id', 0); } form_start('automation_templates.php', 'form_network'); html_start_box($header_label, '100%', true, '3', 'center', ''); draw_edit_form( array( 'config' => array('no_form_tag' => 'true'), 'fields' => inject_form_variables($fields_automation_template_edit, (isset($host_template) ? $host_template : array())) ) ); html_end_box(true, true); form_save_button('automation_templates.php'); } function template() { global $at_actions, $item_rows, $availability_options; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_autot'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Device Automation Templates'), '100%', '', '3', 'center', 'automation_templates.php?action=edit'); ?>
    '> ' title=''> ' title=''>
    __('Template Name'), 'align' => 'left'), array('display' => __('Availability Method'), 'align' => 'left'), array('display' => __('System Description Match'), 'align' => 'left'), array('display' => __('System Name Match'), 'align' => 'left'), array('display' => __('System ObjectId Match'), 'align' => 'left') ); if (read_config_option('drag_and_drop') == '') { $display_text[] = array('display' => __('Order'), 'align' => 'center'); } html_header_checkbox($display_text, false); $i = 1; $total_items = cacti_sizeof($dts); if (cacti_sizeof($dts)) { foreach ($dts as $dt) { if ($dt['name'] == '') { $name = __('Unknown Template'); } else { $name = $dt['name']; } form_alternate_row('line' . $dt['id'], true); form_selectable_cell(filter_value($name, get_request_var('filter'), 'automation_templates.php?action=edit&id=' . $dt['id']), $dt['id']); form_selectable_cell($availability_options[$dt['availability_method']], $dt['id']); form_selectable_cell(filter_value($dt['sysDescr'], get_request_var('filter')), $dt['id']); form_selectable_cell(filter_value($dt['sysName'], get_request_var('filter')), $dt['id']); form_selectable_cell(filter_value($dt['sysOid'], get_request_var('filter')), $dt['id']); if (read_config_option('drag_and_drop') == '') { $add_text = ''; if ($i < $total_items && $total_items > 1) { $add_text .= ''; } else { $add_text .= ''; } if ($i > 1 && $i <= $total_items) { $add_text .= ''; } else { $add_text .= ''; } form_selectable_cell($add_text, $dt['id'], '', 'center'); } form_checkbox_cell($name, $dt['id']); form_end_row(); $i++; } } else { print "" . __('No Automation Device Templates Found') . "\n"; } html_end_box(false); if (cacti_sizeof($dts)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($at_actions); form_end(); ?> __('Duplicate'), AUTOMATION_ACTION_TREE_ENABLE => __('Enable'), AUTOMATION_ACTION_TREE_DISABLE => __('Disable'), AUTOMATION_ACTION_TREE_DELETE => __('Delete'), ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': automation_tree_rules_form_save(); break; case 'actions': automation_tree_rules_form_actions(); break; case 'change_leaf': automation_tree_rules_change_leaf(); header('Location: automation_tree_rules.php?header=false&action=edit&id=' . get_request_var('id')); break; case 'item_movedown': automation_tree_rules_item_movedown(); header('Location: automation_tree_rules.php?action=edit&id=' . get_request_var('id')); break; case 'item_moveup': automation_tree_rules_item_moveup(); header('Location: automation_tree_rules.php?action=edit&id=' . get_request_var('id')); break; case 'item_remove': automation_tree_rules_item_remove(); header('Location: automation_tree_rules.php?action=edit&id=' . get_request_var('id')); break; case 'item_edit': top_header(); automation_tree_rules_item_edit(); bottom_footer(); break; case 'remove': automation_tree_rules_remove(); header ('Location: automation_tree_rules.php'); break; case 'edit': top_header(); automation_tree_rules_edit(); bottom_footer(); break; default: top_header(); automation_tree_rules(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function automation_tree_rules_form_save() { if (isset_request_var('save_component_automation_tree_rule')) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $save['id'] = get_request_var('id'); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', true, 3); $save['tree_id'] = form_input_validate(get_nfilter_request_var('tree_id'), 'tree_id', '^[0-9]+$', false, 3); $save['tree_item_id'] = isset_request_var('tree_item_id') ? form_input_validate(get_nfilter_request_var('tree_item_id'), 'tree_item_id', '^[0-9]+$', false, 3) : 0; $save['leaf_type'] = (isset_request_var('leaf_type')) ? form_input_validate(get_nfilter_request_var('leaf_type'), 'leaf_type', '^[0-9]+$', false, 3) : 0; $save['host_grouping_type'] = isset_request_var('host_grouping_type') ? form_input_validate(get_nfilter_request_var('host_grouping_type'), 'host_grouping_type', '^[0-9]+$', false, 3) : 0; $save['enabled'] = (isset_request_var('enabled') ? 'on' : ''); if (!is_error_message()) { $rule_id = sql_save($save, 'automation_tree_rules'); if ($rule_id) { raise_message(1); } else { raise_message(2); } } header('Location: automation_tree_rules.php?header=false&action=edit&id=' . (empty($rule_id) ? get_request_var('id') : $rule_id)); } elseif (isset_request_var('save_component_automation_match_item')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); /* ==================================================== */ $save = array(); $save['id'] = form_input_validate(get_request_var('item_id'), 'item_id', '^[0-9]+$', false, 3); $save['rule_id'] = form_input_validate(get_request_var('id'), 'id', '^[0-9]+$', false, 3); $save['rule_type'] = AUTOMATION_RULE_TYPE_TREE_MATCH; $save['sequence'] = form_input_validate(get_nfilter_request_var('sequence'), 'sequence', '^[0-9]+$', false, 3); $save['operation'] = form_input_validate(get_nfilter_request_var('operation'), 'operation', '^[-0-9]+$', true, 3); $save['field'] = form_input_validate(((isset_request_var('field') && get_nfilter_request_var('field') != '0') ? get_nfilter_request_var('field') : ''), 'field', '', true, 3); $save['operator'] = form_input_validate((isset_request_var('operator') ? get_nfilter_request_var('operator') : ''), 'operator', '^[0-9]+$', true, 3); $save['pattern'] = form_input_validate((isset_request_var('pattern') ? get_nfilter_request_var('pattern') : ''), 'pattern', '', true, 3); if (!is_error_message()) { $item_id = sql_save($save, 'automation_match_rule_items'); if ($item_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: automation_tree_rules.php?header=false&action=item_edit&id=' . get_request_var('id') . '&item_id=' . (empty($item_id) ? get_request_var('item_id') : $item_id) . '&rule_type=' . AUTOMATION_RULE_TYPE_TREE_MATCH); } else { header('Location: automation_tree_rules.php?header=false&action=edit&id=' . get_request_var('id') . '&rule_type=' . AUTOMATION_RULE_TYPE_TREE_MATCH); } } elseif (isset_request_var('save_component_automation_tree_rule_item')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); /* ==================================================== */ unset($save); $save['id'] = form_input_validate(get_request_var('item_id'), 'item_id', '^[0-9]+$', false, 3); $save['rule_id'] = form_input_validate(get_request_var('id'), 'id', '^[0-9]+$', false, 3); $save['sequence'] = form_input_validate(get_nfilter_request_var('sequence'), 'sequence', '^[0-9]+$', false, 3); $save['field'] = form_input_validate((isset_request_var('field') ? get_nfilter_request_var('field') : ''), 'field', '', true, 3); $save['sort_type'] = form_input_validate(get_nfilter_request_var('sort_type'), 'sort_type', '^[0-9]+$', false, 3); $save['propagate_changes'] = (isset_request_var('propagate_changes') ? 'on' : ''); $save['search_pattern'] = isset_request_var('search_pattern') ? form_input_validate(get_nfilter_request_var('search_pattern'), 'search_pattern', '', false, 3) : ''; $save['replace_pattern'] = isset_request_var('replace_pattern') ? form_input_validate(get_nfilter_request_var('replace_pattern'), 'replace_pattern', '', true, 3) : ''; if (!is_error_message()) { $automation_graph_rule_item_id = sql_save($save, 'automation_tree_rule_items'); if ($automation_graph_rule_item_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: automation_tree_rules.php?header=false&action=item_edit&id=' . get_request_var('id') . '&item_id=' . (empty($automation_graph_rule_item_id) ? get_request_var('item_id') : $automation_graph_rule_item_id) . '&rule_type=' . AUTOMATION_RULE_TYPE_TREE_ACTION); } else { header('Location: automation_tree_rules.php?header=false&action=edit&id=' . get_request_var('id') . '&rule_type=' . AUTOMATION_RULE_TYPE_TREE_ACTION); } } else { raise_message(2); header('Location: automation_tree_rules.php?header=false'); } } /* ------------------------ The 'actions' function ------------------------ */ function automation_tree_rules_form_actions() { global $automation_tree_rules_actions; global $config; /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_TREE_DELETE) { /* DELETE */ cacti_log('form_actions DELETE: ' . serialize($selected_items), true, 'AUTOM8 TRACE', POLLER_VERBOSITY_MEDIUM); db_execute('DELETE FROM automation_tree_rules WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM automation_tree_rule_items WHERE ' . array_to_sql_or($selected_items, 'rule_id')); db_execute('DELETE FROM automation_match_rule_items WHERE ' . array_to_sql_or($selected_items, 'rule_id')); } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_TREE_DUPLICATE) { /* duplicate */ for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $automation_tree_rules_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM automation_tree_rules WHERE id = ?', array($matches[1]))) . '
  • '; $automation_tree_rules_array[] = $matches[1]; } } top_header(); form_start('automation_tree_rules.php', 'automation_tree_rules_action'); html_start_box($automation_tree_rules_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_TREE_DELETE) { /* DELETE */ print "

    " . __('Click \'Continue\' to delete the following Rule(s).') . "

      $automation_tree_rules_list
    \n"; } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_TREE_DUPLICATE) { /* duplicate */ print "

    " . __('Click \'Continue\' to duplicate the following Rule(s). You can optionally change the title format for the new Rules.') . "

      $automation_tree_rules_list

    " . __('Title Format') . '
    '; form_text_box('name_format', '<' . __('rule_name') . '> (1)', '', '255', '30', 'text'); print "

    \n"; } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_TREE_ENABLE) { /* enable */ print "

    " . __('Click \'Continue\' to enable the following Rule(s).') . "

      $automation_tree_rules_list

    " . __('Make sure, that those rules have successfully been tested!') . "

    \n"; } elseif (get_nfilter_request_var('drp_action') == AUTOMATION_ACTION_TREE_DISABLE) { /* disable */ print "

    " . __('Click \'Continue\' to disable the following Rule(s).') . "

      $automation_tree_rules_list
    \n"; } if (!isset($automation_tree_rules_array)) { raise_message(40); header('Location: automation_tree_rules.php?header=false'); exit; }else { $save_html = " "; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } function automation_tree_rules_change_leaf() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('leaf_type'); /* ==================================================== */ automation_change_tree_rule_leaf_type(get_request_var('leaf_type'), get_request_var('id')); } /* -------------------------- Rule Item Functions -------------------------- */ function automation_tree_rules_item_movedown() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_MATCH) { move_item_down('automation_match_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id') . ' AND rule_type=' . get_request_var('rule_type')); } elseif (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_ACTION) { move_item_down('automation_tree_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id')); } } function automation_tree_rules_item_moveup() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_MATCH) { move_item_up('automation_match_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id') . ' AND rule_type=' . get_request_var('rule_type')); } elseif (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_ACTION) { move_item_up('automation_tree_rule_items', get_request_var('item_id'), 'rule_id=' . get_request_var('id')); } } function automation_tree_rules_item_remove() { /* ================= input validation ================= */ get_filter_request_var('item_id'); get_filter_request_var('rule_type'); /* ==================================================== */ if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_MATCH) { db_execute_prepared('DELETE FROM automation_match_rule_items WHERE id = ?', array(get_request_var('item_id'))); } elseif (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_ACTION) { db_execute_prepared('DELETE FROM automation_tree_rule_items WHERE id = ?', array(get_request_var('item_id'))); } } function automation_tree_rules_item_edit() { global $config; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('item_id'); get_filter_request_var('rule_type'); get_filter_request_var('show_trees'); /* ==================================================== */ /* handle show_trees mode */ if (isset_request_var('show_trees')) { if (get_request_var('show_trees') == '0') { kill_session_var('automation_tree_rules_show_trees'); } elseif (get_request_var('show_trees') == '1') { $_SESSION['automation_tree_rules_show_trees'] = true; } } if (!isempty_request_var('rule_type') && !isempty_request_var('item_id')) { if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_ACTION) { $item = db_fetch_row_prepared('SELECT * FROM automation_tree_rule_items WHERE id = ?', array(get_request_var('item_id'))); if ($item['field'] != AUTOMATION_TREE_ITEM_TYPE_STRING) { ?>
    *'>

    '; /* display list of matching trees */ if (!isempty_request_var('rule_type') && !isempty_request_var('item_id')) { if (get_request_var('rule_type') == AUTOMATION_RULE_TYPE_TREE_ACTION) { if (isset($_SESSION['automation_tree_rules_show_trees']) && ($item['field'] != AUTOMATION_TREE_ITEM_TYPE_STRING)) { if ($_SESSION['automation_tree_rules_show_trees']) { display_matching_trees(get_request_var('id'), AUTOMATION_RULE_TYPE_TREE_ACTION, $item, 'automation_tree_rules.php?action=item_edit&id=' . get_request_var('id') . '&item_id=' . get_request_var('item_id') . '&rule_type=' . get_request_var('rule_type')); } } } } //Now we need some javascript to make it dynamic ?>
    *'>
    array('no_form_tag' => true), 'fields' => inject_form_variables($form_array, (isset($rule) ? $rule : array())) )); form_hidden_box('id', (isset($rule['id']) ? $rule['id'] : '0'), ''); form_hidden_box('item_id', (isset($rule['item_id']) ? $rule['item_id'] : '0'), ''); form_hidden_box('save_component_automation_tree_rule', '1', ''); html_end_box(true, true); /* * display the rule items ------------------------------------------------------------------------------- */ if (!empty($rule['id'])) { # display tree rules for host match display_match_rule_items(__('Object Selection Criteria'), $rule['id'], AUTOMATION_RULE_TYPE_TREE_MATCH, 'automation_tree_rules.php'); # fetch tree action rules display_tree_rule_items(__('Tree Creation Criteria'), $rule['id'], $rule['leaf_type'], AUTOMATION_RULE_TYPE_TREE_ACTION, 'automation_tree_rules.php'); } form_save_button('automation_tree_rules.php', 'return'); print '
    '; if (!empty($rule['id'])) { /* display list of matching hosts */ if (isset($_SESSION['automation_tree_rules_show_objects'])) { if ($_SESSION['automation_tree_rules_show_objects']) { if ($rule['leaf_type'] == TREE_ITEM_TYPE_HOST) { display_matching_hosts($rule, AUTOMATION_RULE_TYPE_TREE_MATCH, 'automation_tree_rules.php?action=edit&id=' . get_request_var('id')); } elseif ($rule['leaf_type'] == TREE_ITEM_TYPE_GRAPH) { display_matching_graphs($rule, AUTOMATION_RULE_TYPE_TREE_MATCH, 'automation_tree_rules.php?action=edit&id=' . get_request_var('id')); } } } } ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'status' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_autom_tr'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Tree Rules'), '100%', '', '3', 'center', 'automation_tree_rules.php?action=edit'); ?>
    '> '> '>
    array('display' => __('Rule Name'), 'align' => 'left', 'sort' => 'ASC'), 'id' => array('display' => __('ID'), 'align' => 'right', 'sort' => 'ASC'), 'tree_name' => array('display' => __('Hook into Tree'), 'align' => 'left', 'sort' => 'ASC'), 'subtree_name' => array('display' => __('At Subtree'), 'align' => 'left', 'sort' => 'ASC'), 'leaf_type' => array('display' => __('This Type'), 'align' => 'left', 'sort' => 'ASC'), 'host_grouping_type' => array('display' => __('Using Grouping'), 'align' => 'left', 'sort' => 'ASC'), 'enabled' => array('display' => __('Enabled'), 'align' => 'right', 'sort' => 'ASC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($automation_tree_rules)) { foreach ($automation_tree_rules as $automation_tree_rule) { $tree_item_type_name = ((empty($automation_tree_rule['leaf_type'])) ? '' . __('None') . '' : $automation_tree_item_types[$automation_tree_rule['leaf_type']]); $subtree_name = ((empty($automation_tree_rule['subtree_name'])) ? '' . __('ROOT') . '' : html_escape($automation_tree_rule['subtree_name'])); $tree_host_grouping_type = ((empty($host_group_types[$automation_tree_rule['host_grouping_type']])) ? '' : $host_group_types[$automation_tree_rule['host_grouping_type']]); form_alternate_row('line' . $automation_tree_rule['id'], true); form_selectable_cell(filter_value($automation_tree_rule['name'], get_request_var('filter'), 'automation_tree_rules.php?action=edit&id=' . $automation_tree_rule['id'] . '&page=1'), $automation_tree_rule['id']); form_selectable_cell($automation_tree_rule['id'], $automation_tree_rule['id'], '', 'text-align:right'); form_selectable_ecell($automation_tree_rule['tree_name'], $automation_tree_rule['id']); form_selectable_cell($subtree_name, $automation_tree_rule['id']); form_selectable_cell($tree_item_type_name, $automation_tree_rule['id']); form_selectable_cell($tree_host_grouping_type, $automation_tree_rule['id']); form_selectable_cell($automation_tree_rule['enabled'] ? __('Enabled'):__('Disabled'), $automation_tree_rule['id'], '', 'text-align:right'); form_checkbox_cell($automation_tree_rule['name'], $automation_tree_rule['id']); form_end_row(); } } else { print "" . __('No Tree Rules Found') . "\n"; } html_end_box(false); if (cacti_sizeof($automation_tree_rules)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($automation_tree_rules_actions); form_end(); } cacti-release-1.2.19/boost_rrdupdate.php000077500000000000000000000056171413633772300202430ustar00rootroot00000000000000#!/usr/bin/env php Require all denied # Apache 2.2 Order Allow,Deny Deny from all cacti-release-1.2.19/cache/boost/index.php000066400000000000000000000000501413633772300203220ustar00rootroot00000000000000 Require all denied # Apache 2.2 Order Allow,Deny Deny from all cacti-release-1.2.19/cache/mibcache/index.php000066400000000000000000000000531413633772300207320ustar00rootroot00000000000000 Require all denied # Apache 2.2 Order Allow,Deny Deny from all cacti-release-1.2.19/cache/realtime/index.php000066400000000000000000000000501413633772300207760ustar00rootroot00000000000000 Require all denied # Apache 2.2 Order Allow,Deny Deny from all cacti-release-1.2.19/cache/spikekill/index.php000066400000000000000000000000501413633772300211630ustar00rootroot00000000000000 0 INTO ismaria; IF ismaria THEN -- MariaDB version NO_AUTO_CREATE_USER started to be default SET majn = 10; SET medn = 1; SET minn = 7; ELSE -- MySQL version it started to be default (8.0.11) SET majn = 8; SET medn = 0; SET minn = 11; END IF; SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(@@VERSION, '.', 3),'-',1) INTO realversion; SELECT CONVERT(SUBSTRING_INDEX(realversion, '.', 1), SIGNED INTEGER) INTO majv; SELECT CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(realversion, '.', 2), '.', -1), SIGNED INTEGER) INTO medv; SELECT CONVERT(SUBSTRING_INDEX(SUBSTRING_INDEX(realversion, '.', 3), '.', -1), SIGNED INTEGER) INTO minv; IF majv >= majn AND medv >= medn AND minv >= minn THEN SET ret = FALSE; END IF; RETURN ret; END // DELIMITER ; SET @sqlmode= ""; SELECT IF(NOAUTOCREATENEEDED(), 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION', 'NO_ENGINE_SUBSTITUTION') INTO @sqlmode; SET SESSION sql_mode = @sqlmode; -- -- Table structure for table `aggregate_graph_templates` -- CREATE TABLE `aggregate_graph_templates` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, `graph_template_id` int(10) unsigned NOT NULL, `gprint_prefix` varchar(64) NOT NULL, `gprint_format` char(2) DEFAULT '', `graph_type` int(10) unsigned NOT NULL, `total` int(10) unsigned NOT NULL, `total_type` int(10) unsigned NOT NULL, `total_prefix` varchar(64) NOT NULL, `order_type` int(10) unsigned NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `graph_template_id` (`graph_template_id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Template Definitions for Aggregate Graphs'; -- -- Table structure for table `aggregate_graph_templates_graph` -- CREATE TABLE `aggregate_graph_templates_graph` ( `aggregate_template_id` int(10) unsigned NOT NULL, `t_image_format_id` char(2) DEFAULT '', `image_format_id` tinyint(1) NOT NULL DEFAULT '0', `t_height` char(2) DEFAULT '', `height` mediumint(8) NOT NULL DEFAULT '0', `t_width` char(2) DEFAULT '', `width` mediumint(8) NOT NULL DEFAULT '0', `t_upper_limit` char(2) DEFAULT '', `upper_limit` varchar(20) NOT NULL DEFAULT '0', `t_lower_limit` char(2) DEFAULT '', `lower_limit` varchar(20) NOT NULL DEFAULT '0', `t_vertical_label` char(2) DEFAULT '', `vertical_label` varchar(200) DEFAULT '', `t_slope_mode` char(2) DEFAULT '', `slope_mode` char(2) DEFAULT 'on', `t_auto_scale` char(2) DEFAULT '', `auto_scale` char(2) DEFAULT '', `t_auto_scale_opts` char(2) DEFAULT '', `auto_scale_opts` tinyint(1) NOT NULL DEFAULT '0', `t_auto_scale_log` char(2) DEFAULT '', `auto_scale_log` char(2) DEFAULT '', `t_scale_log_units` char(2) DEFAULT '', `scale_log_units` char(2) DEFAULT '', `t_auto_scale_rigid` char(2) DEFAULT '', `auto_scale_rigid` char(2) DEFAULT '', `t_auto_padding` char(2) DEFAULT '', `auto_padding` char(2) DEFAULT '', `t_base_value` char(2) DEFAULT '', `base_value` mediumint(8) NOT NULL DEFAULT '0', `t_grouping` char(2) DEFAULT '', `grouping` char(2) NOT NULL DEFAULT '', `t_unit_value` char(2) DEFAULT '', `unit_value` varchar(20) DEFAULT '', `t_unit_exponent_value` char(2) DEFAULT '', `unit_exponent_value` varchar(5) NOT NULL DEFAULT '', t_alt_y_grid char(2) default '', alt_y_grid char(2) default NULL, t_right_axis char(2) DEFAULT '', right_axis varchar(20) DEFAULT NULL, t_right_axis_label char(2) DEFAULT '', right_axis_label varchar(200) DEFAULT NULL, t_right_axis_format char(2) DEFAULT '', right_axis_format mediumint(8) DEFAULT NULL, t_right_axis_formatter char(2) DEFAULT '', right_axis_formatter varchar(10) DEFAULT NULL, t_left_axis_formatter char(2) DEFAULT '', left_axis_formatter varchar(10) DEFAULT NULL, t_no_gridfit char(2) DEFAULT '', no_gridfit char(2) DEFAULT NULL, t_unit_length char(2) DEFAULT '', unit_length varchar(10) DEFAULT NULL, t_tab_width char(2) DEFAULT '', tab_width varchar(20) DEFAULT '30', t_dynamic_labels char(2) default '', dynamic_labels char(2) default NULL, t_force_rules_legend char(2) DEFAULT '', force_rules_legend char(2) DEFAULT NULL, t_legend_position char(2) DEFAULT '', legend_position varchar(10) DEFAULT NULL, t_legend_direction char(2) DEFAULT '', legend_direction varchar(10) DEFAULT NULL, PRIMARY KEY (`aggregate_template_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Aggregate Template Graph Data'; -- -- Table structure for table `aggregate_graph_templates_item` -- CREATE TABLE `aggregate_graph_templates_item` ( `aggregate_template_id` int(10) unsigned NOT NULL, `graph_templates_item_id` int(10) unsigned NOT NULL, `sequence` mediumint(8) unsigned NOT NULL DEFAULT '0', `color_template` int(11) NOT NULL, `t_graph_type_id` char(2) DEFAULT '', `graph_type_id` tinyint(3) NOT NULL DEFAULT '0', `t_cdef_id` char(2) DEFAULT '', `cdef_id` mediumint(8) unsigned DEFAULT NULL, `item_skip` char(2) NOT NULL, `item_total` char(2) NOT NULL, PRIMARY KEY (`aggregate_template_id`,`graph_templates_item_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Aggregate Template Graph Items'; -- -- Table structure for table `aggregate_graphs` -- CREATE TABLE `aggregate_graphs` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `aggregate_template_id` int(10) unsigned NOT NULL, `template_propogation` char(2) NOT NULL DEFAULT '', `local_graph_id` int(10) unsigned NOT NULL, `title_format` varchar(128) NOT NULL, `graph_template_id` int(10) unsigned NOT NULL, `gprint_prefix` varchar(64) NOT NULL, `gprint_format` char(2) DEFAULT '', `graph_type` int(10) unsigned NOT NULL, `total` int(10) unsigned NOT NULL, `total_type` int(10) unsigned NOT NULL, `total_prefix` varchar(64) NOT NULL, `order_type` int(10) unsigned NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `aggregate_template_id` (`aggregate_template_id`), KEY `local_graph_id` (`local_graph_id`), KEY `title_format` (`title_format`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Aggregate Graph Definitions'; -- -- Table structure for table `aggregate_graphs_graph_item` -- CREATE TABLE `aggregate_graphs_graph_item` ( `aggregate_graph_id` int(10) unsigned NOT NULL, `graph_templates_item_id` int(10) unsigned NOT NULL, `sequence` mediumint(8) unsigned NOT NULL DEFAULT '0', `color_template` int(11) unsigned NOT NULL, `t_graph_type_id` char(2) DEFAULT '', `graph_type_id` tinyint(3) NOT NULL DEFAULT '0', `t_cdef_id` char(2) DEFAULT '', `cdef_id` mediumint(8) unsigned DEFAULT NULL, `item_skip` char(2) NOT NULL, `item_total` char(2) NOT NULL, PRIMARY KEY (`aggregate_graph_id`,`graph_templates_item_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Aggregate Graph Graph Items'; -- -- Table structure for table `aggregate_graphs_items` -- CREATE TABLE `aggregate_graphs_items` ( `aggregate_graph_id` int(10) unsigned NOT NULL, `local_graph_id` int(10) unsigned NOT NULL, `sequence` mediumint(8) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`aggregate_graph_id`,`local_graph_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Aggregate Graph Items'; -- -- Table structure for table `automation_devices` -- CREATE TABLE `automation_devices` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `network_id` int(10) unsigned NOT NULL DEFAULT '0', `hostname` varchar(100) NOT NULL DEFAULT '', `ip` varchar(17) NOT NULL DEFAULT '', `snmp_community` varchar(100) NOT NULL DEFAULT '', `snmp_version` tinyint(1) unsigned NOT NULL DEFAULT '1', `snmp_port` mediumint(5) unsigned NOT NULL DEFAULT '161', `snmp_username` varchar(50) DEFAULT NULL, `snmp_password` varchar(50) DEFAULT NULL, `snmp_auth_protocol` char(6) DEFAULT '', `snmp_priv_passphrase` varchar(200) DEFAULT '', `snmp_priv_protocol` char(6) DEFAULT '', `snmp_context` varchar(64) DEFAULT '', `snmp_engine_id` varchar(64) DEFAULT '', `sysName` varchar(100) NOT NULL DEFAULT '', `sysLocation` varchar(255) NOT NULL DEFAULT '', `sysContact` varchar(255) NOT NULL DEFAULT '', `sysDescr` varchar(255) NOT NULL DEFAULT '', `sysUptime` bigint(20) unsigned NOT NULL DEFAULT '0', `os` varchar(64) NOT NULL DEFAULT '', `snmp` tinyint(4) NOT NULL DEFAULT '0', `known` tinyint(4) NOT NULL DEFAULT '0', `up` tinyint(4) NOT NULL DEFAULT '0', `time` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `ip` (`ip`), KEY `hostname` (`hostname`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table of Discovered Devices'; -- -- Table structure for table `automation_graph_rule_items` -- CREATE TABLE `automation_graph_rule_items` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `rule_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `sequence` smallint(3) unsigned NOT NULL DEFAULT '0', `operation` smallint(3) unsigned NOT NULL DEFAULT '0', `field` varchar(255) NOT NULL DEFAULT '', `operator` smallint(3) unsigned NOT NULL DEFAULT '0', `pattern` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Automation Graph Rule Items'; -- -- Dumping data for table `automation_graph_rule_items` -- INSERT INTO `automation_graph_rule_items` VALUES (1,1,1,0,'ifOperStatus',7,'Up'),(2,1,2,1,'ifIP',16,''),(3,1,3,1,'ifHwAddr',16,''),(4,2,1,0,'ifOperStatus',7,'Up'),(5,2,2,1,'ifIP',16,''),(6,2,3,1,'ifHwAddr',16,''); -- -- Table structure for table `automation_graph_rules` -- CREATE TABLE `automation_graph_rules` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `snmp_query_id` smallint(3) unsigned NOT NULL DEFAULT '0', `graph_type_id` smallint(3) unsigned NOT NULL DEFAULT '0', `enabled` char(2) DEFAULT '', PRIMARY KEY (`id`), KEY `name` (`name`(171)) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Automation Graph Rules'; -- -- Dumping data for table `automation_graph_rules` -- INSERT INTO `automation_graph_rules` VALUES (1,'Traffic 64 bit Server',1,12,'on'),(2,'Traffic 64 bit Server Linux',1,12,'on'),(3,'Disk Space',3,17,'on'); -- -- Table structure for table `automation_ips` -- CREATE TABLE `automation_ips` ( `ip_address` varchar(20) NOT NULL DEFAULT '', `hostname` varchar(100) DEFAULT NULL, `network_id` int(10) unsigned DEFAULT NULL, `pid` int(10) unsigned DEFAULT NULL, `status` int(10) unsigned DEFAULT NULL, `thread` int(10) unsigned DEFAULT NULL, PRIMARY KEY (`ip_address`), KEY `pid` (`pid`) ) ENGINE=MEMORY COMMENT='List of discoverable ip addresses used for scanning'; -- -- Table structure for table `automation_match_rule_items` -- CREATE TABLE `automation_match_rule_items` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `rule_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `rule_type` smallint(3) unsigned NOT NULL DEFAULT '0', `sequence` smallint(3) unsigned NOT NULL DEFAULT '0', `operation` smallint(3) unsigned NOT NULL DEFAULT '0', `field` varchar(255) NOT NULL DEFAULT '', `operator` smallint(3) unsigned NOT NULL DEFAULT '0', `pattern` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Automation Match Rule Items'; -- -- Dumping data for table `automation_match_rule_items` -- INSERT INTO `automation_match_rule_items` VALUES (1,1,1,1,0,'h.snmp_sysDescr',8,''),(2,1,1,2,1,'h.snmp_version',12,'2'),(3,1,3,1,0,'ht.name',1,'Linux'),(4,2,1,1,0,'ht.name',1,'Linux'),(5,2,1,2,1,'h.snmp_version',12,'2'),(6,2,3,1,0,'ht.name',1,'SNMP'),(7,2,3,2,1,'gt.name',1,'Traffic'),(8,1,1,3,1,'h.snmp_sysDescr',2,'Windows'); -- -- Table structure for table `automation_networks` -- CREATE TABLE `automation_networks` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `poller_id` int(10) unsigned DEFAULT '1', `site_id` int(10) unsigned DEFAULT '1', `name` varchar(128) NOT NULL DEFAULT '' COMMENT 'The name for this network', `subnet_range` varchar(1024) NOT NULL DEFAULT '' COMMENT 'Defined subnet ranges for discovery', `dns_servers` varchar(128) NOT NULL DEFAULT '' COMMENT 'DNS Servers to use for name resolution', `enabled` char(2) DEFAULT '', `notification_enabled` char(2) DEFAULT '', `notification_email` varchar(255) DEFAULT '', `notification_fromname` varchar(32) DEFAULT '', `notification_fromemail` varchar(128) DEFAULT '', `snmp_id` int(10) unsigned DEFAULT NULL, `enable_netbios` char(2) DEFAULT '', `add_to_cacti` char(2) DEFAULT '', `same_sysname` char(2) DEFAULT '', `total_ips` int(10) unsigned DEFAULT '0', `up_hosts` int(10) unsigned NOT NULL DEFAULT '0', `snmp_hosts` int(10) unsigned NOT NULL DEFAULT '0', `ping_method` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'The ping method (ICMP:TCP:UDP)', `ping_port` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'For TCP:UDP the port to ping', `ping_timeout` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'The ping timeout in seconds', `ping_retries` int(10) unsigned DEFAULT '0', `sched_type` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Schedule type: manual or automatic', `threads` int(10) unsigned DEFAULT '1', `run_limit` int(10) unsigned DEFAULT '0' COMMENT 'The maximum runtime for the discovery', `start_at` varchar(20) DEFAULT NULL, `next_start` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `recur_every` int(10) unsigned DEFAULT '1', `day_of_week` varchar(45) DEFAULT NULL COMMENT 'The days of week to run in crontab format', `month` varchar(45) DEFAULT NULL COMMENT 'The months to run in crontab format', `day_of_month` varchar(45) DEFAULT NULL COMMENT 'The days of month to run in crontab format', `monthly_week` varchar(45) DEFAULT NULL, `monthly_day` varchar(45) DEFAULT NULL, `last_runtime` double NOT NULL DEFAULT '0' COMMENT 'The last runtime for discovery', `last_started` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'The time the discovery last started', `last_status` varchar(128) NOT NULL DEFAULT '' COMMENT 'The last exit message if any', `rerun_data_queries` char(2) DEFAULT NULL COMMENT 'Rerun data queries or not for existing hosts', PRIMARY KEY (`id`), KEY `poller_id` (`poller_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores scanning subnet definitions'; -- -- Dumping data for table `automation_networks` -- INSERT INTO `automation_networks` VALUES (1,1,0,'Test Network','192.168.1.0/24','','on','','','','',1,'on','on','',254,0,0,1,22,400,1,2,10,1200,'0000-00-00 00:00:00','0000-00-00 00:00:00',2,'4','','','','',0,'0000-00-00 00:00:00','','on'); -- -- Table structure for table `automation_processes` -- CREATE TABLE `automation_processes` ( `pid` int(8) unsigned NOT NULL, `poller_id` int(10) unsigned DEFAULT '1', `network_id` int(10) unsigned NOT NULL DEFAULT '0', `task` varchar(20) DEFAULT '', `status` varchar(20) DEFAULT NULL, `command` varchar(20) DEFAULT NULL, `up_hosts` int(10) unsigned DEFAULT '0', `snmp_hosts` int(10) unsigned DEFAULT '0', `heartbeat` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`pid`,`network_id`) ) ENGINE=MEMORY COMMENT='Table tracking active poller processes'; -- -- Table structure for table `automation_snmp` -- CREATE TABLE `automation_snmp` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Group of SNMP Option Sets'; -- -- Dumping data for table `automation_snmp` -- INSERT INTO `automation_snmp` VALUES (1,'Default Option Set'); -- -- Table structure for table `automation_snmp_items` -- CREATE TABLE `automation_snmp_items` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `snmp_id` int(10) unsigned NOT NULL DEFAULT '0', `sequence` int(10) unsigned NOT NULL DEFAULT '0', `snmp_version` tinyint(1) unsigned NOT NULL DEFAULT '1', `snmp_community` varchar(100) NOT NULL, `snmp_port` mediumint(5) unsigned NOT NULL DEFAULT '161', `snmp_timeout` int(10) unsigned NOT NULL DEFAULT '500', `snmp_retries` tinyint(1) unsigned NOT NULL DEFAULT '3', `max_oids` int(12) unsigned DEFAULT '10', `bulk_walk_size` int(11) DEFAULT '-1', `snmp_username` varchar(50) DEFAULT NULL, `snmp_password` varchar(50) DEFAULT NULL, `snmp_auth_protocol` char(6) DEFAULT '', `snmp_priv_passphrase` varchar(200) DEFAULT '', `snmp_priv_protocol` char(6) DEFAULT '', `snmp_context` varchar(64) DEFAULT '', `snmp_engine_id` varchar(64) DEFAULT '', PRIMARY KEY (`id`,`snmp_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Set of SNMP Options'; -- -- Dumping data for table `automation_snmp_items` -- INSERT INTO `automation_snmp_items` VALUES (1,1,1,'2','public',161,1000,3,10,-1,'admin','baseball','MD5','','DES','',''),(2,1,2,'2','private',161,1000,3,10,-1,'admin','baseball','MD5','','DES','',''); -- -- Table structure for table `automation_templates` -- CREATE TABLE `automation_templates` ( `id` int(8) NOT NULL AUTO_INCREMENT, `host_template` int(8) NOT NULL DEFAULT '0', `availability_method` int(10) unsigned DEFAULT '2', `sysDescr` varchar(255) DEFAULT '', `sysName` varchar(255) DEFAULT '', `sysOid` varchar(60) DEFAULT '', `sequence` int(10) unsigned DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Templates of SNMP Sys variables used for automation'; -- -- Dumping data for table `automation_templates` -- INSERT INTO `automation_templates` VALUES (1,3,2,'Linux','','',2),(2,1,2,'HP ETHERNET','','',1); -- -- Table structure for table `automation_tree_rule_items` -- CREATE TABLE `automation_tree_rule_items` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `rule_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `sequence` smallint(3) unsigned NOT NULL DEFAULT '0', `field` varchar(255) NOT NULL DEFAULT '', `sort_type` smallint(3) unsigned NOT NULL DEFAULT '0', `propagate_changes` char(2) DEFAULT '', `search_pattern` varchar(255) NOT NULL DEFAULT '', `replace_pattern` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Automation Tree Rule Items'; -- -- Dumping data for table `automation_tree_rule_items` -- INSERT INTO `automation_tree_rule_items` VALUES (1,1,1,'ht.name',1,'','^(.*)\\s*Linux\\s*(.*)$','${1}\\n${2}'),(2,1,2,'h.hostname',1,'','^(\\w*)\\s*(\\w*)\\s*(\\w*).*$',''),(3,2,1,'0',2,'on','Traffic',''),(4,2,2,'gtg.title_cache',1,'','^(.*)\\s*-\\s*Traffic -\\s*(.*)$','${1}\\n${2}'); -- -- Table structure for table `automation_tree_rules` -- CREATE TABLE `automation_tree_rules` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', `tree_id` smallint(3) unsigned NOT NULL DEFAULT '0', `tree_item_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `leaf_type` smallint(3) unsigned NOT NULL DEFAULT '0', `host_grouping_type` smallint(3) unsigned NOT NULL DEFAULT '0', `enabled` char(2) DEFAULT '', PRIMARY KEY (`id`), KEY `name` (`name`(171)) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Automation Tree Rules'; -- -- Dumping data for table `automation_tree_rules` -- INSERT INTO `automation_tree_rules` VALUES (1,'New Device',1,0,3,1,'on'),(2,'New Graph',1,0,2,1,''); -- -- Table structure for table `cdef` -- CREATE TABLE cdef ( `id` mediumint(8) unsigned NOT NULL auto_increment, `hash` varchar(32) NOT NULL default '', `system` mediumint(8) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL default '', PRIMARY KEY (id), KEY `hash` (`hash`), KEY `name` (`name`(171)) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `cdef` -- INSERT INTO cdef VALUES (3,'3d352eed9fa8f7b2791205b3273708c7',0,'Make Stack Negative'); INSERT INTO cdef VALUES (4,'e961cc8ec04fda6ed4981cf5ad501aa5',0,'Make Per 5 Minutes'); INSERT INTO cdef VALUES (12,'f1ac79f05f255c02f914c920f1038c54',0,'Total All Data Sources'); INSERT INTO cdef VALUES (2,'73f95f8b77b5508157d64047342c421e',0,'Turn Bytes into Bits'); INSERT INTO cdef VALUES (14,'634a23af5e78af0964e8d33b1a4ed26b',0,'Multiply by 1024'); INSERT INTO cdef VALUES (15,'068984b5ccdfd2048869efae5166f722',0,'Total All Data Sources, Multiply by 1024'); -- -- Table structure for table `cdef_items` -- CREATE TABLE cdef_items ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', cdef_id mediumint(8) unsigned NOT NULL default '0', sequence mediumint(8) unsigned NOT NULL default '0', type tinyint(2) NOT NULL default '0', value varchar(150) NOT NULL default '', PRIMARY KEY (id), KEY cdef_id_sequence (`cdef_id`,`sequence`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `cdef_items` -- INSERT INTO cdef_items VALUES (7,'9bbf6b792507bb9bb17d2af0970f9be9',2,1,4,'CURRENT_DATA_SOURCE'); INSERT INTO cdef_items VALUES (9,'a4b8eb2c3bf4920a3ef571a7a004be53',2,2,6,'8'); INSERT INTO cdef_items VALUES (8,'caa4e023ac2d7b1c4b4c8c4adfd55dfe',2,3,2,'3'); INSERT INTO cdef_items VALUES (10,'c888c9fe6b62c26c4bfe23e18991731d',3,1,4,'CURRENT_DATA_SOURCE'); INSERT INTO cdef_items VALUES (11,'1e1d0b29a94e08b648c8f053715442a0',3,3,2,'3'); INSERT INTO cdef_items VALUES (12,'4355c197998c7f8b285be7821ddc6da4',3,2,6,'-1'); INSERT INTO cdef_items VALUES (13,'40bb7a1143b0f2e2efca14eb356236de',4,1,4,'CURRENT_DATA_SOURCE'); INSERT INTO cdef_items VALUES (14,'42686ea0925c0220924b7d333599cd67',4,3,2,'3'); INSERT INTO cdef_items VALUES (15,'faf1b148b2c0e0527362ed5b8ca1d351',4,2,6,'300'); INSERT INTO cdef_items VALUES (16,'0ef6b8a42dc83b4e43e437960fccd2ea',12,1,4,'ALL_DATA_SOURCES_NODUPS'); INSERT INTO cdef_items VALUES (18,'86370cfa0008fe8c56b28be80ee39a40',14,1,4,'CURRENT_DATA_SOURCE'); INSERT INTO cdef_items VALUES (19,'9a35cc60d47691af37f6fddf02064e20',14,2,6,'1024'); INSERT INTO cdef_items VALUES (20,'5d7a7941ec0440b257e5598a27dd1688',14,3,2,'3'); INSERT INTO cdef_items VALUES (21,'44fd595c60539ff0f5817731d9f43a85',15,1,4,'ALL_DATA_SOURCES_NODUPS'); INSERT INTO cdef_items VALUES (22,'aa38be265e5ac31783e57ce6f9314e9a',15,2,6,'1024'); INSERT INTO cdef_items VALUES (23,'204423d4b2598f1f7252eea19458345c',15,3,2,'3'); CREATE TABLE `color_templates` ( `color_template_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`color_template_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Color Templates'; -- -- Dumping data for table `color_templates` -- INSERT INTO `color_templates` VALUES (1,'Yellow: light -> dark, 4 colors'); INSERT INTO `color_templates` VALUES (2,'Red: light yellow > dark red, 8 colors'); INSERT INTO `color_templates` VALUES (3,'Red: light -> dark, 16 colors'); INSERT INTO `color_templates` VALUES (4,'Green: dark -> light, 16 colors'); -- -- Table structure for table `color_template_items` -- CREATE TABLE `color_template_items` ( `color_template_item_id` int(12) unsigned NOT NULL AUTO_INCREMENT, `color_template_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `color_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `sequence` mediumint(8) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`color_template_item_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Color Items for Color Templates'; -- -- Dumping data for table `color_template_items` -- INSERT INTO `color_template_items` VALUES (1,1,4,1); INSERT INTO `color_template_items` VALUES (2,1,24,2); INSERT INTO `color_template_items` VALUES (3,1,98,3); INSERT INTO `color_template_items` VALUES (4,1,25,4); INSERT INTO `color_template_items` VALUES (5,2,25,1); INSERT INTO `color_template_items` VALUES (6,2,29,2); INSERT INTO `color_template_items` VALUES (7,2,30,3); INSERT INTO `color_template_items` VALUES (8,2,31,4); INSERT INTO `color_template_items` VALUES (9,2,33,5); INSERT INTO `color_template_items` VALUES (10,2,35,6); INSERT INTO `color_template_items` VALUES (11,2,41,7); INSERT INTO `color_template_items` VALUES (12,2,9,8); INSERT INTO `color_template_items` VALUES (13,3,15,1); INSERT INTO `color_template_items` VALUES (14,3,31,2); INSERT INTO `color_template_items` VALUES (15,3,28,3); INSERT INTO `color_template_items` VALUES (16,3,8,4); INSERT INTO `color_template_items` VALUES (17,3,34,5); INSERT INTO `color_template_items` VALUES (18,3,33,6); INSERT INTO `color_template_items` VALUES (19,3,35,7); INSERT INTO `color_template_items` VALUES (20,3,41,8); INSERT INTO `color_template_items` VALUES (21,3,36,9); INSERT INTO `color_template_items` VALUES (22,3,42,10); INSERT INTO `color_template_items` VALUES (23,3,44,11); INSERT INTO `color_template_items` VALUES (24,3,48,12); INSERT INTO `color_template_items` VALUES (25,3,9,13); INSERT INTO `color_template_items` VALUES (26,3,49,14); INSERT INTO `color_template_items` VALUES (27,3,51,15); INSERT INTO `color_template_items` VALUES (28,3,52,16); INSERT INTO `color_template_items` VALUES (29,4,76,1); INSERT INTO `color_template_items` VALUES (30,4,84,2); INSERT INTO `color_template_items` VALUES (31,4,89,3); INSERT INTO `color_template_items` VALUES (32,4,17,4); INSERT INTO `color_template_items` VALUES (33,4,86,5); INSERT INTO `color_template_items` VALUES (34,4,88,6); INSERT INTO `color_template_items` VALUES (35,4,90,7); INSERT INTO `color_template_items` VALUES (36,4,94,8); INSERT INTO `color_template_items` VALUES (37,4,96,9); INSERT INTO `color_template_items` VALUES (38,4,93,10); INSERT INTO `color_template_items` VALUES (39,4,91,11); INSERT INTO `color_template_items` VALUES (40,4,22,12); INSERT INTO `color_template_items` VALUES (41,4,12,13); INSERT INTO `color_template_items` VALUES (42,4,95,14); INSERT INTO `color_template_items` VALUES (43,4,6,15); INSERT INTO `color_template_items` VALUES (44,4,92,16); -- -- Table structure for table `colors` -- CREATE TABLE colors ( id mediumint(8) unsigned NOT NULL auto_increment, name varchar(40) default '', hex varchar(6) NOT NULL default '', read_only char(2) default '', PRIMARY KEY (id), UNIQUE KEY hex (hex) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `colors` -- INSERT INTO colors VALUES (1,'Black','000000','on'); INSERT INTO colors VALUES (2,'White','FFFFFF','on'); INSERT INTO colors VALUES (4,'','FAFD9E',''); INSERT INTO colors VALUES (5,'','C0C0C0',''); INSERT INTO colors VALUES (6,'','74C366',''); INSERT INTO colors VALUES (7,'','6DC8FE',''); INSERT INTO colors VALUES (8,'','EA8F00',''); INSERT INTO colors VALUES (9,'Red','FF0000','on'); INSERT INTO colors VALUES (10,'','4444FF',''); INSERT INTO colors VALUES (11,'Magenta','FF00FF','on'); INSERT INTO colors VALUES (12,'Green','00FF00','on'); INSERT INTO colors VALUES (13,'','8D85F3',''); INSERT INTO colors VALUES (14,'','AD3B6E',''); INSERT INTO colors VALUES (15,'','EACC00',''); INSERT INTO colors VALUES (16,'','12B3B5',''); INSERT INTO colors VALUES (17,'','157419',''); INSERT INTO colors VALUES (18,'','C4FD3D',''); INSERT INTO colors VALUES (19,'','817C4E',''); INSERT INTO colors VALUES (20,'','002A97',''); INSERT INTO colors VALUES (21,'','0000FF',''); INSERT INTO colors VALUES (22,'','00CF00',''); INSERT INTO colors VALUES (24,'','F9FD5F',''); INSERT INTO colors VALUES (25,'','FFF200',''); INSERT INTO colors VALUES (26,'','CCBB00',''); INSERT INTO colors VALUES (27,'','837C04',''); INSERT INTO colors VALUES (28,'','EAAF00',''); INSERT INTO colors VALUES (29,'','FFD660',''); INSERT INTO colors VALUES (30,'','FFC73B',''); INSERT INTO colors VALUES (31,'','FFAB00',''); INSERT INTO colors VALUES (33,'','FF7D00',''); INSERT INTO colors VALUES (34,'','ED7600',''); INSERT INTO colors VALUES (35,'','FF5700',''); INSERT INTO colors VALUES (36,'','EE5019',''); INSERT INTO colors VALUES (37,'','B1441E',''); INSERT INTO colors VALUES (38,'','FFC3C0',''); INSERT INTO colors VALUES (39,'','FF897C',''); INSERT INTO colors VALUES (40,'','FF6044',''); INSERT INTO colors VALUES (41,'','FF4105',''); INSERT INTO colors VALUES (42,'','DA4725',''); INSERT INTO colors VALUES (43,'','942D0C',''); INSERT INTO colors VALUES (44,'','FF3932',''); INSERT INTO colors VALUES (45,'','862F2F',''); INSERT INTO colors VALUES (46,'','FF5576',''); INSERT INTO colors VALUES (47,'','562B29',''); INSERT INTO colors VALUES (48,'','F51D30',''); INSERT INTO colors VALUES (49,'','DE0056',''); INSERT INTO colors VALUES (50,'','ED5394',''); INSERT INTO colors VALUES (51,'','B90054',''); INSERT INTO colors VALUES (52,'','8F005C',''); INSERT INTO colors VALUES (53,'','F24AC8',''); INSERT INTO colors VALUES (54,'','E8CDEF',''); INSERT INTO colors VALUES (55,'','D8ACE0',''); INSERT INTO colors VALUES (56,'','A150AA',''); INSERT INTO colors VALUES (57,'','750F7D',''); INSERT INTO colors VALUES (58,'','8D00BA',''); INSERT INTO colors VALUES (59,'','623465',''); INSERT INTO colors VALUES (60,'','55009D',''); INSERT INTO colors VALUES (61,'','3D168B',''); INSERT INTO colors VALUES (62,'','311F4E',''); INSERT INTO colors VALUES (63,'','D2D8F9',''); INSERT INTO colors VALUES (64,'','9FA4EE',''); INSERT INTO colors VALUES (65,'','6557D0',''); INSERT INTO colors VALUES (66,'','4123A1',''); INSERT INTO colors VALUES (67,'','4668E4',''); INSERT INTO colors VALUES (68,'','0D006A',''); INSERT INTO colors VALUES (69,'','00004D',''); INSERT INTO colors VALUES (70,'','001D61',''); INSERT INTO colors VALUES (71,'','00234B',''); INSERT INTO colors VALUES (72,'','002A8F',''); INSERT INTO colors VALUES (73,'','2175D9',''); INSERT INTO colors VALUES (74,'','7CB3F1',''); INSERT INTO colors VALUES (75,'','005199',''); INSERT INTO colors VALUES (76,'','004359',''); INSERT INTO colors VALUES (77,'','00A0C1',''); INSERT INTO colors VALUES (78,'','007283',''); INSERT INTO colors VALUES (79,'','00BED9',''); INSERT INTO colors VALUES (80,'','AFECED',''); INSERT INTO colors VALUES (81,'','55D6D3',''); INSERT INTO colors VALUES (82,'','00BBB4',''); INSERT INTO colors VALUES (83,'','009485',''); INSERT INTO colors VALUES (84,'','005D57',''); INSERT INTO colors VALUES (85,'','008A77',''); INSERT INTO colors VALUES (86,'','008A6D',''); INSERT INTO colors VALUES (87,'','00B99B',''); INSERT INTO colors VALUES (88,'','009F67',''); INSERT INTO colors VALUES (89,'','00694A',''); INSERT INTO colors VALUES (90,'','00A348',''); INSERT INTO colors VALUES (91,'','00BF47',''); INSERT INTO colors VALUES (92,'','96E78A',''); INSERT INTO colors VALUES (93,'','00BD27',''); INSERT INTO colors VALUES (94,'','35962B',''); INSERT INTO colors VALUES (95,'','7EE600',''); INSERT INTO colors VALUES (96,'','6EA100',''); INSERT INTO colors VALUES (97,'','CAF100',''); INSERT INTO colors VALUES (98,'','F5F800',''); INSERT INTO colors VALUES (99,'','CDCFC4',''); INSERT INTO colors VALUES (100,'','BCBEB3',''); INSERT INTO colors VALUES (101,'','AAABA1',''); INSERT INTO colors VALUES (102,'','8F9286',''); INSERT INTO colors VALUES (103,'','797C6E',''); INSERT INTO colors VALUES (104,'','2E3127',''); INSERT INTO colors VALUES (105,'Night','0C090A','on'); INSERT INTO colors VALUES (106,'Gunmetal','2C3539','on'); INSERT INTO colors VALUES (107,'Midnight','2B1B17','on'); INSERT INTO colors VALUES (108,'Charcoal','34282C','on'); INSERT INTO colors VALUES (109,'Dark Slate Grey','25383C','on'); INSERT INTO colors VALUES (110,'Oil','3B3131','on'); INSERT INTO colors VALUES (111,'Black Cat','413839','on'); INSERT INTO colors VALUES (112,'Iridium','3D3C3A','on'); INSERT INTO colors VALUES (113,'Black Eel','463E3F','on'); INSERT INTO colors VALUES (114,'Black Cow','4C4646','on'); INSERT INTO colors VALUES (115,'Gray Wolf','504A4B','on'); INSERT INTO colors VALUES (116,'Vampire Gray','565051','on'); INSERT INTO colors VALUES (117,'Gray Dolphin','5C5858','on'); INSERT INTO colors VALUES (118,'Carbon Gray','625D5D','on'); INSERT INTO colors VALUES (119,'Ash Gray','666362','on'); INSERT INTO colors VALUES (120,'Cloudy Gray','6D6968','on'); INSERT INTO colors VALUES (121,'Smokey Gray','726E6D','on'); INSERT INTO colors VALUES (122,'Gray','736F6E','on'); INSERT INTO colors VALUES (123,'Granite','837E7C','on'); INSERT INTO colors VALUES (124,'Battleship Gray','848482','on'); INSERT INTO colors VALUES (125,'Gray Cloud','B6B6B4','on'); INSERT INTO colors VALUES (126,'Gray Goose','D1D0CE','on'); INSERT INTO colors VALUES (127,'Platinum','E5E4E2','on'); INSERT INTO colors VALUES (128,'Metallic Silver','BCC6CC','on'); INSERT INTO colors VALUES (129,'Blue Gray','98AFC7','on'); INSERT INTO colors VALUES (130,'Light Slate Gray','6D7B8D','on'); INSERT INTO colors VALUES (131,'Slate Gray','657383','on'); INSERT INTO colors VALUES (132,'Jet Gray','616D7E','on'); INSERT INTO colors VALUES (133,'Mist Blue','646D7E','on'); INSERT INTO colors VALUES (134,'Marble Blue','566D7E','on'); INSERT INTO colors VALUES (135,'Slate Blue','737CA1','on'); INSERT INTO colors VALUES (136,'Steel Blue','4863A0','on'); INSERT INTO colors VALUES (137,'Blue Jay','2B547E','on'); INSERT INTO colors VALUES (138,'Dark Slate Blue','2B3856','on'); INSERT INTO colors VALUES (139,'Midnight Blue','151B54','on'); INSERT INTO colors VALUES (140,'Navy Blue','000080','on'); INSERT INTO colors VALUES (141,'Blue Whale','342D7E','on'); INSERT INTO colors VALUES (142,'Lapis Blue','15317E','on'); INSERT INTO colors VALUES (143,'Cornflower Blue','151B8D','on'); INSERT INTO colors VALUES (144,'Earth Blue','0000A0','on'); INSERT INTO colors VALUES (145,'Cobalt Blue','0020C2','on'); INSERT INTO colors VALUES (146,'Blueberry Blue','0041C2','on'); INSERT INTO colors VALUES (147,'Sapphire Blue','2554C7','on'); INSERT INTO colors VALUES (148,'Blue Eyes','1569C7','on'); INSERT INTO colors VALUES (149,'Royal Blue','2B60DE','on'); INSERT INTO colors VALUES (150,'Blue Orchid','1F45FC','on'); INSERT INTO colors VALUES (151,'Blue Lotus','6960EC','on'); INSERT INTO colors VALUES (152,'Light Slate Blue','736AFF','on'); INSERT INTO colors VALUES (153,'Slate Blue','357EC7','on'); INSERT INTO colors VALUES (154,'Glacial Blue Ice','368BC1','on'); INSERT INTO colors VALUES (155,'Silk Blue','488AC7','on'); INSERT INTO colors VALUES (156,'Blue Ivy','3090C7','on'); INSERT INTO colors VALUES (157,'Blue Koi','659EC7','on'); INSERT INTO colors VALUES (158,'Columbia Blue','87AFC7','on'); INSERT INTO colors VALUES (159,'Baby Blue','95B9C7','on'); INSERT INTO colors VALUES (160,'Light Steel Blue','728FCE','on'); INSERT INTO colors VALUES (161,'Ocean Blue','2B65EC','on'); INSERT INTO colors VALUES (162,'Blue Ribbon','306EFF','on'); INSERT INTO colors VALUES (163,'Blue Dress','157DEC','on'); INSERT INTO colors VALUES (164,'Dodger Blue','1589FF','on'); INSERT INTO colors VALUES (165,'Cornflower Blue','6495ED','on'); INSERT INTO colors VALUES (166,'Sky Blue','6698FF','on'); INSERT INTO colors VALUES (167,'Butterfly Blue','38ACEC','on'); INSERT INTO colors VALUES (168,'Iceberg','56A5EC','on'); INSERT INTO colors VALUES (169,'Crystal Blue','5CB3FF','on'); INSERT INTO colors VALUES (170,'Deep Sky Blue','3BB9FF','on'); INSERT INTO colors VALUES (171,'Denim Blue','79BAEC','on'); INSERT INTO colors VALUES (172,'Light Sky Blue','82CAFA','on'); INSERT INTO colors VALUES (173,'Day Sky Blue','82CAFF','on'); INSERT INTO colors VALUES (174,'Jeans Blue','A0CFEC','on'); INSERT INTO colors VALUES (175,'Blue Angel','B7CEEC','on'); INSERT INTO colors VALUES (176,'Pastel Blue','B4CFEC','on'); INSERT INTO colors VALUES (177,'Sea Blue','C2DFFF','on'); INSERT INTO colors VALUES (178,'Powder Blue','C6DEFF','on'); INSERT INTO colors VALUES (179,'Coral Blue','AFDCEC','on'); INSERT INTO colors VALUES (180,'Light Blue','ADDFFF','on'); INSERT INTO colors VALUES (181,'Robin Egg Blue','BDEDFF','on'); INSERT INTO colors VALUES (182,'Pale Blue Lily','CFECEC','on'); INSERT INTO colors VALUES (183,'Light Cyan','E0FFFF','on'); INSERT INTO colors VALUES (184,'Water','EBF4FA','on'); INSERT INTO colors VALUES (185,'Alice Blue','F0F8FF','on'); INSERT INTO colors VALUES (186,'Azure','F0FFFF','on'); INSERT INTO colors VALUES (187,'Light Slate','CCFFFF','on'); INSERT INTO colors VALUES (188,'Light Aquamarine','93FFE8','on'); INSERT INTO colors VALUES (189,'Electric Blue','9AFEFF','on'); INSERT INTO colors VALUES (190,'Aquamarine','7FFFD4','on'); INSERT INTO colors VALUES (191,'Cyan or Aqua','00FFFF','on'); INSERT INTO colors VALUES (192,'Tron Blue','7DFDFE','on'); INSERT INTO colors VALUES (193,'Blue Zircon','57FEFF','on'); INSERT INTO colors VALUES (194,'Blue Lagoon','8EEBEC','on'); INSERT INTO colors VALUES (195,'Celeste','50EBEC','on'); INSERT INTO colors VALUES (196,'Blue Diamond','4EE2EC','on'); INSERT INTO colors VALUES (197,'Tiffany Blue','81D8D0','on'); INSERT INTO colors VALUES (198,'Cyan Opaque','92C7C7','on'); INSERT INTO colors VALUES (199,'Blue Hosta','77BFC7','on'); INSERT INTO colors VALUES (200,'Northern Lights Blue','78C7C7','on'); INSERT INTO colors VALUES (201,'Medium Turquoise','48CCCD','on'); INSERT INTO colors VALUES (202,'Turquoise','43C6DB','on'); INSERT INTO colors VALUES (203,'Jellyfish','46C7C7','on'); INSERT INTO colors VALUES (204,'Macaw Blue Green','43BFC7','on'); INSERT INTO colors VALUES (205,'Light Sea Green','3EA99F','on'); INSERT INTO colors VALUES (206,'Dark Turquoise','3B9C9C','on'); INSERT INTO colors VALUES (207,'Sea Turtle Green','438D80','on'); INSERT INTO colors VALUES (208,'Medium Aquamarine','348781','on'); INSERT INTO colors VALUES (209,'Greenish Blue','307D7E','on'); INSERT INTO colors VALUES (210,'Grayish Turquoise','5E7D7E','on'); INSERT INTO colors VALUES (211,'Beetle Green','4C787E','on'); INSERT INTO colors VALUES (212,'Teal','008080','on'); INSERT INTO colors VALUES (213,'Sea Green','4E8975','on'); INSERT INTO colors VALUES (214,'Camouflage Green','78866B','on'); INSERT INTO colors VALUES (215,'Sage Green','848b79','on'); INSERT INTO colors VALUES (216,'Hazel Green','617C58','on'); INSERT INTO colors VALUES (217,'Venom Green','728C00','on'); INSERT INTO colors VALUES (218,'Fern Green','667C26','on'); INSERT INTO colors VALUES (219,'Dark Forrest Green','254117','on'); INSERT INTO colors VALUES (220,'Medium Sea Green','306754','on'); INSERT INTO colors VALUES (221,'Medium Forest Green','347235','on'); INSERT INTO colors VALUES (222,'Seaweed Green','437C17','on'); INSERT INTO colors VALUES (223,'Pine Green','387C44','on'); INSERT INTO colors VALUES (224,'Jungle Green','347C2C','on'); INSERT INTO colors VALUES (225,'Shamrock Green','347C17','on'); INSERT INTO colors VALUES (226,'Medium Spring Green','348017','on'); INSERT INTO colors VALUES (227,'Forest Green','4E9258','on'); INSERT INTO colors VALUES (228,'Green Onion','6AA121','on'); INSERT INTO colors VALUES (229,'Spring Green','4AA02C','on'); INSERT INTO colors VALUES (230,'Lime Green','41A317','on'); INSERT INTO colors VALUES (231,'Clover Green','3EA055','on'); INSERT INTO colors VALUES (232,'Green Snake','6CBB3C','on'); INSERT INTO colors VALUES (233,'Alien Green','6CC417','on'); INSERT INTO colors VALUES (234,'Green Apple','4CC417','on'); INSERT INTO colors VALUES (235,'Yellow Green','52D017','on'); INSERT INTO colors VALUES (236,'Kelly Green','4CC552','on'); INSERT INTO colors VALUES (237,'Zombie Green','54C571','on'); INSERT INTO colors VALUES (238,'Frog Green','99C68E','on'); INSERT INTO colors VALUES (239,'Green Peas','89C35C','on'); INSERT INTO colors VALUES (240,'Dollar Bill Green','85BB65','on'); INSERT INTO colors VALUES (241,'Dark Sea Green','8BB381','on'); INSERT INTO colors VALUES (242,'Iguana Green','9CB071','on'); INSERT INTO colors VALUES (243,'Avocado Green','B2C248','on'); INSERT INTO colors VALUES (244,'Pistachio Green','9DC209','on'); INSERT INTO colors VALUES (245,'Salad Green','A1C935','on'); INSERT INTO colors VALUES (246,'Hummingbird Green','7FE817','on'); INSERT INTO colors VALUES (247,'Nebula Green','59E817','on'); INSERT INTO colors VALUES (248,'Stoplight Go Green','57E964','on'); INSERT INTO colors VALUES (249,'Algae Green','64E986','on'); INSERT INTO colors VALUES (250,'Jade Green','5EFB6E','on'); INSERT INTO colors VALUES (251,'Emerald Green','5FFB17','on'); INSERT INTO colors VALUES (252,'Lawn Green','87F717','on'); INSERT INTO colors VALUES (253,'Chartreuse','8AFB17','on'); INSERT INTO colors VALUES (254,'Dragon Green','6AFB92','on'); INSERT INTO colors VALUES (255,'Mint green','98FF98','on'); INSERT INTO colors VALUES (256,'Green Thumb','B5EAAA','on'); INSERT INTO colors VALUES (257,'Light Jade','C3FDB8','on'); INSERT INTO colors VALUES (258,'Tea Green','CCFB5D','on'); INSERT INTO colors VALUES (259,'Green Yellow','B1FB17','on'); INSERT INTO colors VALUES (260,'Slime Green','BCE954','on'); INSERT INTO colors VALUES (261,'Goldenrod','EDDA74','on'); INSERT INTO colors VALUES (262,'Harvest Gold','EDE275','on'); INSERT INTO colors VALUES (263,'Sun Yellow','FFE87C','on'); INSERT INTO colors VALUES (264,'Yellow','FFFF00','on'); INSERT INTO colors VALUES (265,'Corn Yellow','FFF380','on'); INSERT INTO colors VALUES (266,'Parchment','FFFFC2','on'); INSERT INTO colors VALUES (267,'Cream','FFFFCC','on'); INSERT INTO colors VALUES (268,'Lemon Chiffon','FFF8C6','on'); INSERT INTO colors VALUES (269,'Cornsilk','FFF8DC','on'); INSERT INTO colors VALUES (270,'Beige','F5F5DC','on'); INSERT INTO colors VALUES (271,'Blonde','FBF6D9','on'); INSERT INTO colors VALUES (272,'Antique White','FAEBD7','on'); INSERT INTO colors VALUES (273,'Champagne','F7E7CE','on'); INSERT INTO colors VALUES (274,'Blanched Almond','FFEBCD','on'); INSERT INTO colors VALUES (275,'Vanilla','F3E5AB','on'); INSERT INTO colors VALUES (276,'Tan Brown','ECE5B6','on'); INSERT INTO colors VALUES (277,'Peach','FFE5B4','on'); INSERT INTO colors VALUES (278,'Mustard','FFDB58','on'); INSERT INTO colors VALUES (279,'Rubber Ducky Yellow','FFD801','on'); INSERT INTO colors VALUES (280,'Bright Gold','FDD017','on'); INSERT INTO colors VALUES (281,'Golden Brown','EAC117','on'); INSERT INTO colors VALUES (282,'Macaroni and Cheese','F2BB66','on'); INSERT INTO colors VALUES (283,'Saffron','FBB917','on'); INSERT INTO colors VALUES (284,'Beer','FBB117','on'); INSERT INTO colors VALUES (285,'Cantaloupe','FFA62F','on'); INSERT INTO colors VALUES (286,'Bee Yellow','E9AB17','on'); INSERT INTO colors VALUES (287,'Brown Sugar','E2A76F','on'); INSERT INTO colors VALUES (288,'BurlyWood','DEB887','on'); INSERT INTO colors VALUES (289,'Deep Peach','FFCBA4','on'); INSERT INTO colors VALUES (290,'Ginger Brown','C9BE62','on'); INSERT INTO colors VALUES (291,'School Bus Yellow','E8A317','on'); INSERT INTO colors VALUES (292,'Sandy Brown','EE9A4D','on'); INSERT INTO colors VALUES (293,'Fall Leaf Brown','C8B560','on'); INSERT INTO colors VALUES (294,'Orange Gold','D4A017','on'); INSERT INTO colors VALUES (295,'Sand','C2B280','on'); INSERT INTO colors VALUES (296,'Cookie Brown','C7A317','on'); INSERT INTO colors VALUES (297,'Caramel','C68E17','on'); INSERT INTO colors VALUES (298,'Brass','B5A642','on'); INSERT INTO colors VALUES (299,'Khaki','ADA96E','on'); INSERT INTO colors VALUES (300,'Camel Brown','C19A6B','on'); INSERT INTO colors VALUES (301,'Bronze','CD7F32','on'); INSERT INTO colors VALUES (302,'Tiger Orange','C88141','on'); INSERT INTO colors VALUES (303,'Cinnamon','C58917','on'); INSERT INTO colors VALUES (304,'Bullet Shell','AF9B60','on'); INSERT INTO colors VALUES (305,'Dark Goldenrod','AF7817','on'); INSERT INTO colors VALUES (306,'Copper','B87333','on'); INSERT INTO colors VALUES (307,'Wood','966F33','on'); INSERT INTO colors VALUES (308,'Oak Brown','806517','on'); INSERT INTO colors VALUES (309,'Moccasin','827839','on'); INSERT INTO colors VALUES (310,'Army Brown','827B60','on'); INSERT INTO colors VALUES (311,'Sandstone','786D5F','on'); INSERT INTO colors VALUES (312,'Mocha','493D26','on'); INSERT INTO colors VALUES (313,'Taupe','483C32','on'); INSERT INTO colors VALUES (314,'Coffee','6F4E37','on'); INSERT INTO colors VALUES (315,'Brown Bear','835C3B','on'); INSERT INTO colors VALUES (316,'Red Dirt','7F5217','on'); INSERT INTO colors VALUES (317,'Sepia','7F462C','on'); INSERT INTO colors VALUES (318,'Orange Salmon','C47451','on'); INSERT INTO colors VALUES (319,'Rust','C36241','on'); INSERT INTO colors VALUES (320,'Red Fox','C35817','on'); INSERT INTO colors VALUES (321,'Chocolate','C85A17','on'); INSERT INTO colors VALUES (322,'Sedona','CC6600','on'); INSERT INTO colors VALUES (323,'Papaya Orange','E56717','on'); INSERT INTO colors VALUES (324,'Halloween Orange','E66C2C','on'); INSERT INTO colors VALUES (325,'Pumpkin Orange','F87217','on'); INSERT INTO colors VALUES (326,'Construction Cone Orange','F87431','on'); INSERT INTO colors VALUES (327,'Sunrise Orange','E67451','on'); INSERT INTO colors VALUES (328,'Mango Orange','FF8040','on'); INSERT INTO colors VALUES (329,'Dark Orange','F88017','on'); INSERT INTO colors VALUES (330,'Coral','FF7F50','on'); INSERT INTO colors VALUES (331,'Basket Ball Orange','F88158','on'); INSERT INTO colors VALUES (332,'Light Salmon','F9966B','on'); INSERT INTO colors VALUES (333,'Tangerine','E78A61','on'); INSERT INTO colors VALUES (334,'Dark Salmon','E18B6B','on'); INSERT INTO colors VALUES (335,'Light Coral','E77471','on'); INSERT INTO colors VALUES (336,'Bean Red','F75D59','on'); INSERT INTO colors VALUES (337,'Valentine Red','E55451','on'); INSERT INTO colors VALUES (338,'Shocking Orange','E55B3C','on'); INSERT INTO colors VALUES (339,'Scarlet','FF2400','on'); INSERT INTO colors VALUES (340,'Ruby Red','F62217','on'); INSERT INTO colors VALUES (341,'Ferrari Red','F70D1A','on'); INSERT INTO colors VALUES (342,'Fire Engine Red','F62817','on'); INSERT INTO colors VALUES (343,'Lava Red','E42217','on'); INSERT INTO colors VALUES (344,'Love Red','E41B17','on'); INSERT INTO colors VALUES (345,'Grapefruit','DC381F','on'); INSERT INTO colors VALUES (346,'Chestnut Red','C34A2C','on'); INSERT INTO colors VALUES (347,'Cherry Red','C24641','on'); INSERT INTO colors VALUES (348,'Mahogany','C04000','on'); INSERT INTO colors VALUES (349,'Chilli Pepper','C11B17','on'); INSERT INTO colors VALUES (350,'Cranberry','9F000F','on'); INSERT INTO colors VALUES (351,'Red Wine','990012','on'); INSERT INTO colors VALUES (352,'Burgundy','8C001A','on'); INSERT INTO colors VALUES (353,'Chestnut','954535','on'); INSERT INTO colors VALUES (354,'Blood Red','7E3517','on'); INSERT INTO colors VALUES (355,'Sienna','8A4117','on'); INSERT INTO colors VALUES (356,'Sangria','7E3817','on'); INSERT INTO colors VALUES (357,'Firebrick','800517','on'); INSERT INTO colors VALUES (358,'Maroon','810541','on'); INSERT INTO colors VALUES (359,'Plum Pie','7D0541','on'); INSERT INTO colors VALUES (360,'Velvet Maroon','7E354D','on'); INSERT INTO colors VALUES (361,'Plum Velvet','7D0552','on'); INSERT INTO colors VALUES (362,'Rosy Finch','7F4E52','on'); INSERT INTO colors VALUES (363,'Puce','7F5A58','on'); INSERT INTO colors VALUES (364,'Dull Purple','7F525D','on'); INSERT INTO colors VALUES (365,'Rosy Brown','B38481','on'); INSERT INTO colors VALUES (366,'Khaki Rose','C5908E','on'); INSERT INTO colors VALUES (367,'Pink Bow','C48189','on'); INSERT INTO colors VALUES (368,'Lipstick Pink','C48793','on'); INSERT INTO colors VALUES (369,'Rose','E8ADAA','on'); INSERT INTO colors VALUES (370,'Desert Sand','EDC9AF','on'); INSERT INTO colors VALUES (371,'Pig Pink','FDD7E4','on'); INSERT INTO colors VALUES (372,'Cotton Candy','FCDFFF','on'); INSERT INTO colors VALUES (373,'Pink Bubblegum','FFDFDD','on'); INSERT INTO colors VALUES (374,'Misty Rose','FBBBB9','on'); INSERT INTO colors VALUES (375,'Pink','FAAFBE','on'); INSERT INTO colors VALUES (376,'Light Pink','FAAFBA','on'); INSERT INTO colors VALUES (377,'Flamingo Pink','F9A7B0','on'); INSERT INTO colors VALUES (378,'Pink Rose','E7A1B0','on'); INSERT INTO colors VALUES (379,'Pink Daisy','E799A3','on'); INSERT INTO colors VALUES (380,'Cadillac Pink','E38AAE','on'); INSERT INTO colors VALUES (381,'Carnation Pink','F778A1','on'); INSERT INTO colors VALUES (382,'Blush Red','E56E94','on'); INSERT INTO colors VALUES (383,'Hot Pink','F660AB','on'); INSERT INTO colors VALUES (384,'Watermelon Pink','FC6C85','on'); INSERT INTO colors VALUES (385,'Violet Red','F6358A','on'); INSERT INTO colors VALUES (386,'Deep Pink','F52887','on'); INSERT INTO colors VALUES (387,'Pink Cupcake','E45E9D','on'); INSERT INTO colors VALUES (388,'Pink Lemonade','E4287C','on'); INSERT INTO colors VALUES (389,'Neon Pink','F535AA','on'); INSERT INTO colors VALUES (390,'Dimorphotheca Magenta','E3319D','on'); INSERT INTO colors VALUES (391,'Bright Neon Pink','F433FF','on'); INSERT INTO colors VALUES (392,'Pale Violet Red','D16587','on'); INSERT INTO colors VALUES (393,'Tulip Pink','C25A7C','on'); INSERT INTO colors VALUES (394,'Medium Violet Red','CA226B','on'); INSERT INTO colors VALUES (395,'Rogue Pink','C12869','on'); INSERT INTO colors VALUES (396,'Burnt Pink','C12267','on'); INSERT INTO colors VALUES (397,'Bashful Pink','C25283','on'); INSERT INTO colors VALUES (398,'Carnation Pink','C12283','on'); INSERT INTO colors VALUES (399,'Plum','B93B8F','on'); INSERT INTO colors VALUES (400,'Viola Purple','7E587E','on'); INSERT INTO colors VALUES (401,'Purple Iris','571B7E','on'); INSERT INTO colors VALUES (402,'Plum Purple','583759','on'); INSERT INTO colors VALUES (403,'Indigo','4B0082','on'); INSERT INTO colors VALUES (404,'Purple Monster','461B7E','on'); INSERT INTO colors VALUES (405,'Purple Haze','4E387E','on'); INSERT INTO colors VALUES (406,'Eggplant','614051','on'); INSERT INTO colors VALUES (407,'Grape','5E5A80','on'); INSERT INTO colors VALUES (408,'Purple Jam','6A287E','on'); INSERT INTO colors VALUES (409,'Dark Orchid','7D1B7E','on'); INSERT INTO colors VALUES (410,'Purple Flower','A74AC7','on'); INSERT INTO colors VALUES (411,'Medium Orchid','B048B5','on'); INSERT INTO colors VALUES (412,'Purple Amethyst','6C2DC7','on'); INSERT INTO colors VALUES (413,'Dark Violet','842DCE','on'); INSERT INTO colors VALUES (414,'Violet','8D38C9','on'); INSERT INTO colors VALUES (415,'Purple Sage Bush','7A5DC7','on'); INSERT INTO colors VALUES (416,'Lovely Purple','7F38EC','on'); INSERT INTO colors VALUES (417,'Purple','8E35EF','on'); INSERT INTO colors VALUES (418,'Aztech Purple','893BFF','on'); INSERT INTO colors VALUES (419,'Medium Purple','8467D7','on'); INSERT INTO colors VALUES (420,'Jasmine Purple','A23BEC','on'); INSERT INTO colors VALUES (421,'Purple Daffodil','B041FF','on'); INSERT INTO colors VALUES (422,'Tyrian Purple','C45AEC','on'); INSERT INTO colors VALUES (423,'Crocus Purple','9172EC','on'); INSERT INTO colors VALUES (424,'Purple Mimosa','9E7BFF','on'); INSERT INTO colors VALUES (425,'Heliotrope Purple','D462FF','on'); INSERT INTO colors VALUES (426,'Crimson','E238EC','on'); INSERT INTO colors VALUES (427,'Purple Dragon','C38EC7','on'); INSERT INTO colors VALUES (428,'Lilac','C8A2C8','on'); INSERT INTO colors VALUES (429,'Blush Pink','E6A9EC','on'); INSERT INTO colors VALUES (430,'Mauve','E0B0FF','on'); INSERT INTO colors VALUES (431,'Wisteria Purple','C6AEC7','on'); INSERT INTO colors VALUES (432,'Blossom Pink','F9B7FF','on'); INSERT INTO colors VALUES (433,'Thistle','D2B9D3','on'); INSERT INTO colors VALUES (434,'Periwinkle','E9CFEC','on'); INSERT INTO colors VALUES (435,'Lavender Pinocchio','EBDDE2','on'); INSERT INTO colors VALUES (436,'Lavender Blue','E3E4FA','on'); INSERT INTO colors VALUES (437,'Pearl','FDEEF4','on'); INSERT INTO colors VALUES (438,'SeaShell','FFF5EE','on'); INSERT INTO colors VALUES (439,'Milk White','FEFCFF','on'); -- -- Table structure for table `data_input` -- CREATE TABLE data_input ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', name varchar(200) NOT NULL default '', input_string varchar(512) default NULL, type_id tinyint(2) NOT NULL default '0', PRIMARY KEY (id), KEY `name_type_id` (`name`(171), `type_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_input` -- INSERT INTO data_input VALUES (1,'3eb92bb845b9660a7445cf9740726522','Get SNMP Data','',2); INSERT INTO data_input VALUES (2,'bf566c869ac6443b0c75d1c32b5a350e','Get SNMP Data (Indexed)','',3); INSERT INTO data_input VALUES (3,'274f4685461170b9eb1b98d22567ab5e','Unix - Get Free Disk Space','/scripts/diskfree.sh ',1); INSERT INTO data_input VALUES (4,'95ed0993eb3095f9920d431ac80f4231','Unix - Get Load Average','perl /scripts/loadavg_multi.pl',1); INSERT INTO data_input VALUES (5,'79a284e136bb6b061c6f96ec219ac448','Unix - Get Logged In Users','perl /scripts/unix_users.pl ',1); INSERT INTO data_input VALUES (6,'362e6d4768937c4f899dd21b91ef0ff8','Linux - Get Memory Usage','perl /scripts/linux_memory.pl ',1); INSERT INTO data_input VALUES (7,'a637359e0a4287ba43048a5fdf202066','Unix - Get System Processes','perl /scripts/unix_processes.pl',1); INSERT INTO data_input VALUES (8,'47d6bfe8be57a45171afd678920bd399','Unix - Get TCP Connections','perl /scripts/unix_tcp_connections.pl ',1); INSERT INTO data_input VALUES (9,'cc948e4de13f32b6aea45abaadd287a3','Unix - Get Web Hits','perl /scripts/webhits.pl ',1); INSERT INTO data_input VALUES (10,'8bd153aeb06e3ff89efc73f35849a7a0','Unix - Ping Host','perl /scripts/ping.pl ',1); INSERT INTO data_input VALUES (11,'80e9e4c4191a5da189ae26d0e237f015','Get Script Data (Indexed)','',4); INSERT INTO data_input VALUES (12,'332111d8b54ac8ce939af87a7eac0c06','Get Script Server Data (Indexed)','',6); -- -- Table structure for table `data_input_data` -- CREATE TABLE data_input_data ( data_input_field_id mediumint(8) unsigned NOT NULL default '0', data_template_data_id int(10) unsigned NOT NULL default '0', t_value char(2) default NULL, value text, PRIMARY KEY (data_input_field_id,data_template_data_id), KEY data_template_data_id (data_template_data_id), KEY t_value (t_value) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_input_data` -- INSERT INTO `data_input_data` VALUES (1,4,'',''); INSERT INTO `data_input_data` VALUES (1,5,'',''); INSERT INTO `data_input_data` VALUES (1,6,'',''); INSERT INTO `data_input_data` VALUES (1,19,'',''); INSERT INTO `data_input_data` VALUES (1,20,'',''); INSERT INTO `data_input_data` VALUES (1,22,'',''); INSERT INTO `data_input_data` VALUES (1,23,'',''); INSERT INTO `data_input_data` VALUES (1,24,'',''); INSERT INTO `data_input_data` VALUES (1,25,'',''); INSERT INTO `data_input_data` VALUES (1,26,'',''); INSERT INTO `data_input_data` VALUES (1,27,'',''); INSERT INTO `data_input_data` VALUES (1,30,'',''); INSERT INTO `data_input_data` VALUES (1,31,'',''); INSERT INTO `data_input_data` VALUES (1,32,'',''); INSERT INTO `data_input_data` VALUES (1,33,'',''); INSERT INTO `data_input_data` VALUES (1,34,'',''); INSERT INTO `data_input_data` VALUES (1,58,'',''); INSERT INTO `data_input_data` VALUES (1,59,'',''); INSERT INTO `data_input_data` VALUES (1,68,'',''); INSERT INTO `data_input_data` VALUES (2,4,'',''); INSERT INTO `data_input_data` VALUES (2,5,'',''); INSERT INTO `data_input_data` VALUES (2,6,'',''); INSERT INTO `data_input_data` VALUES (2,19,'',''); INSERT INTO `data_input_data` VALUES (2,20,'',''); INSERT INTO `data_input_data` VALUES (2,22,'',''); INSERT INTO `data_input_data` VALUES (2,23,'',''); INSERT INTO `data_input_data` VALUES (2,24,'',''); INSERT INTO `data_input_data` VALUES (2,25,'',''); INSERT INTO `data_input_data` VALUES (2,26,'',''); INSERT INTO `data_input_data` VALUES (2,27,'',''); INSERT INTO `data_input_data` VALUES (2,30,'',''); INSERT INTO `data_input_data` VALUES (2,31,'',''); INSERT INTO `data_input_data` VALUES (2,32,'',''); INSERT INTO `data_input_data` VALUES (2,33,'',''); INSERT INTO `data_input_data` VALUES (2,34,'',''); INSERT INTO `data_input_data` VALUES (2,58,'',''); INSERT INTO `data_input_data` VALUES (2,59,'',''); INSERT INTO `data_input_data` VALUES (2,68,'',''); INSERT INTO `data_input_data` VALUES (3,4,'',''); INSERT INTO `data_input_data` VALUES (3,5,'',''); INSERT INTO `data_input_data` VALUES (3,6,'',''); INSERT INTO `data_input_data` VALUES (3,19,'',''); INSERT INTO `data_input_data` VALUES (3,20,'',''); INSERT INTO `data_input_data` VALUES (3,22,'',''); INSERT INTO `data_input_data` VALUES (3,23,'',''); INSERT INTO `data_input_data` VALUES (3,24,'',''); INSERT INTO `data_input_data` VALUES (3,25,'',''); INSERT INTO `data_input_data` VALUES (3,26,'',''); INSERT INTO `data_input_data` VALUES (3,27,'',''); INSERT INTO `data_input_data` VALUES (3,30,'',''); -- -- Table structure for table `data_input_fields` -- CREATE TABLE data_input_fields ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', data_input_id mediumint(8) unsigned NOT NULL default '0', name varchar(200) NOT NULL default '', data_name varchar(50) NOT NULL default '', input_output char(3) NOT NULL default '', update_rra char(2) default '0', sequence smallint(5) NOT NULL default '0', type_code varchar(40) default NULL, regexp_match varchar(200) default NULL, allow_nulls char(2) default NULL, PRIMARY KEY (id), KEY data_input_id (data_input_id), KEY input_output (input_output), KEY type_code_data_input_id (type_code, data_input_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_input_fields` -- INSERT INTO `data_input_fields` VALUES (1,'92f5906c8dc0f964b41f4253df582c38',1,'SNMP IP Address','management_ip','in','',0,'hostname','',''); INSERT INTO `data_input_fields` VALUES (2,'32285d5bf16e56c478f5e83f32cda9ef',1,'SNMP Community','snmp_community','in','',0,'snmp_community','',''); INSERT INTO `data_input_fields` VALUES (3,'ad14ac90641aed388139f6ba86a2e48b',1,'SNMP Username','snmp_username','in','',0,'snmp_username','','on'); INSERT INTO `data_input_fields` VALUES (4,'9c55a74bd571b4f00a96fd4b793278c6',1,'SNMP Password','snmp_password','in','',0,'snmp_password','','on'); INSERT INTO `data_input_fields` VALUES (5,'012ccb1d3687d3edb29c002ea66e72da',1,'SNMP Version (1, 2, or 3)','snmp_version','in','',0,'snmp_version','','on'); INSERT INTO `data_input_fields` VALUES (6,'4276a5ec6e3fe33995129041b1909762',1,'OID','oid','in','',0,'snmp_oid','',''); INSERT INTO `data_input_fields` VALUES (7,'617cdc8a230615e59f06f361ef6e7728',2,'SNMP IP Address','management_ip','in','',0,'hostname','',''); INSERT INTO `data_input_fields` VALUES (8,'acb449d1451e8a2a655c2c99d31142c7',2,'SNMP Community','snmp_community','in','',0,'snmp_community','',''); INSERT INTO `data_input_fields` VALUES (9,'f4facc5e2ca7ebee621f09bc6d9fc792',2,'SNMP Username (v3)','snmp_username','in','',0,'snmp_username','','on'); INSERT INTO `data_input_fields` VALUES (10,'1cc1493a6781af2c478fa4de971531cf',2,'SNMP Password (v3)','snmp_password','in','',0,'snmp_password','','on'); INSERT INTO `data_input_fields` VALUES (11,'b5c23f246559df38662c255f4aa21d6b',2,'SNMP Version (1, 2, or 3)','snmp_version','in','',0,'snmp_version','',''); INSERT INTO `data_input_fields` VALUES (12,'6027a919c7c7731fbe095b6f53ab127b',2,'Index Type','index_type','in','',0,'index_type','',''); INSERT INTO `data_input_fields` VALUES (13,'cbbe5c1ddfb264a6e5d509ce1c78c95f',2,'Index Value','index_value','in','',0,'index_value','',''); INSERT INTO `data_input_fields` VALUES (14,'e6deda7be0f391399c5130e7c4a48b28',2,'Output Type ID','output_type','in','',0,'output_type','',''); INSERT INTO `data_input_fields` VALUES (15,'edfd72783ad02df128ff82fc9324b4b9',3,'Disk Partition','partition','in','',1,'','',''); INSERT INTO `data_input_fields` VALUES (16,'8b75fb61d288f0b5fc0bd3056af3689b',3,'Kilobytes Free','kilobytes','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (17,'363588d49b263d30aecb683c52774f39',4,'1 Minute Average','1min','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (18,'ad139a9e1d69881da36fca07889abf58',4,'5 Minute Average','5min','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (19,'5db9fee64824c08258c7ff6f8bc53337',4,'10 Minute Average','10min','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (20,'c0cfd0beae5e79927c5a360076706820',5,'Username (Optional)','username','in','',1,'','','on'); INSERT INTO `data_input_fields` VALUES (21,'52c58ad414d9a2a83b00a7a51be75a53',5,'Logged In Users','users','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (22,'05eb5d710f0814871b8515845521f8d7',6,'Grep String','grepstr','in','',1,'','',''); INSERT INTO `data_input_fields` VALUES (23,'86cb1cbfde66279dbc7f1144f43a3219',6,'Result (in Kilobytes)','kilobytes','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (24,'d5a8dd5fbe6a5af11667c0039af41386',7,'Number of Processes','proc','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (25,'8848cdcae831595951a3f6af04eec93b',8,'Grep String','grepstr','in','',1,'','','on'); INSERT INTO `data_input_fields` VALUES (26,'3d1288d33008430ce354e8b9c162f7ff',8,'Connections','connections','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (27,'c6af570bb2ed9c84abf32033702e2860',9,'(Optional) Log Path','log_path','in','',1,'','','on'); INSERT INTO `data_input_fields` VALUES (28,'f9389860f5c5340c9b27fca0b4ee5e71',9,'Web Hits','webhits','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (29,'5fbadb91ad66f203463c1187fe7bd9d5',10,'IP Address','ip','in','',1,'hostname','',''); INSERT INTO `data_input_fields` VALUES (30,'6ac4330d123c69067d36a933d105e89a',10,'Milliseconds','out_ms','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (31,'d39556ecad6166701bfb0e28c5a11108',11,'Index Type','index_type','in','',0,'index_type','',''); INSERT INTO `data_input_fields` VALUES (32,'3b7caa46eb809fc238de6ef18b6e10d5',11,'Index Value','index_value','in','',0,'index_value','',''); INSERT INTO `data_input_fields` VALUES (33,'74af2e42dc12956c4817c2ef5d9983f9',11,'Output Type ID','output_type','in','',0,'output_type','',''); INSERT INTO `data_input_fields` VALUES (34,'8ae57f09f787656bf4ac541e8bd12537',11,'Output Value','output','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (35,'172b4b0eacee4948c6479f587b62e512',12,'Index Type','index_type','in','',0,'index_type','',''); INSERT INTO `data_input_fields` VALUES (36,'30fb5d5bcf3d66bb5abe88596f357c26',12,'Index Value','index_value','in','',0,'index_value','',''); INSERT INTO `data_input_fields` VALUES (37,'31112c85ae4ff821d3b288336288818c',12,'Output Type ID','output_type','in','',0,'output_type','',''); INSERT INTO `data_input_fields` VALUES (38,'5be8fa85472d89c621790b43510b5043',12,'Output Value','output','out','on',0,'','',''); INSERT INTO `data_input_fields` VALUES (39,'c1f36ee60c3dc98945556d57f26e475b',2,'SNMP Port','snmp_port','in','',0,'snmp_port','',''); INSERT INTO `data_input_fields` VALUES (40,'fc64b99742ec417cc424dbf8c7692d36',1,'SNMP Port','snmp_port','in','',0,'snmp_port','',''); INSERT INTO `data_input_fields` VALUES (41,'20832ce12f099c8e54140793a091af90',1,'SNMP Authentication Protocol (v3)','snmp_auth_protocol','in','',0,'snmp_auth_protocol','',''); INSERT INTO `data_input_fields` VALUES (42,'c60c9aac1e1b3555ea0620b8bbfd82cb',1,'SNMP Privacy Passphrase (v3)','snmp_priv_passphrase','in','',0,'snmp_priv_passphrase','',''); INSERT INTO `data_input_fields` VALUES (43,'feda162701240101bc74148415ef415a',1,'SNMP Privacy Protocol (v3)','snmp_priv_protocol','in','',0,'snmp_priv_protocol','',''); INSERT INTO `data_input_fields` VALUES (44,'2cf7129ad3ff819a7a7ac189bee48ce8',2,'SNMP Authentication Protocol (v3)','snmp_auth_protocol','in','',0,'snmp_auth_protocol','',''); INSERT INTO `data_input_fields` VALUES (45,'6b13ac0a0194e171d241d4b06f913158',2,'SNMP Privacy Passphrase (v3)','snmp_priv_passphrase','in','',0,'snmp_priv_passphrase','',''); INSERT INTO `data_input_fields` VALUES (46,'3a33d4fc65b8329ab2ac46a36da26b72',2,'SNMP Privacy Protocol (v3)','snmp_priv_protocol','in','',0,'snmp_priv_protocol','',''); -- -- Table structure for table `data_local` -- CREATE TABLE data_local ( id int(10) unsigned NOT NULL auto_increment, data_template_id mediumint(8) unsigned NOT NULL default '0', host_id mediumint(8) unsigned NOT NULL default '0', snmp_query_id mediumint(8) NOT NULL default '0', snmp_index varchar(255) NOT NULL default '', orphan tinyint(1) unsigned NOT NULL default '0', PRIMARY KEY (id), KEY data_template_id (data_template_id), KEY snmp_query_id (snmp_query_id), KEY snmp_index (snmp_index), KEY host_id_snmp_query_id (host_id, snmp_query_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_local` -- -- -- Table structure for table `data_debug` -- CREATE TABLE `data_debug` ( `id` int(11) unsigned NOT NULL auto_increment, `started` int(11) NOT NULL default '0', `done` int(11) NOT NULL default '0', `user` int(11) NOT NULL default '0', `datasource` int(11) NOT NULL default '0', `info` text NOT NULL default '', `issue` text NOT NULL NULL default '', PRIMARY KEY (`id`), KEY `user` (`user`), KEY `done` (`done`), KEY `datasource` (`datasource`), KEY `started` (`started`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Datasource Debugger Information'; -- -- Dumping data for table `data_debug` -- -- -- Table structure for table `data_source_profiles` -- CREATE TABLE `data_source_profiles` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `hash` varchar(32) NOT NULL DEFAULT '', `name` varchar(255) NOT NULL DEFAULT '', `step` int(10) unsigned NOT NULL DEFAULT '300', `heartbeat` int(10) unsigned NOT NULL DEFAULT '600', `x_files_factor` double DEFAULT '0.5', `default` char(2) DEFAULT '', PRIMARY KEY (`id`), KEY `name` (`name`(171)) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores Data Source Profiles'; -- -- Dumping data for table `data_source_profiles` -- INSERT INTO `data_source_profiles` VALUES (1,'d62c52891f4f9688729a5bc9fad91b18','5 Minute Collection',300,600,0.5,'on'); INSERT INTO `data_source_profiles` VALUES (2,'c0dd0e46b9ca268e7ed4162d329f9215','30 Second Collection',30,1200,0.5,''); INSERT INTO `data_source_profiles` VALUES (3,'66d35da8f75c912ede3dbe901fedcae0','1 Minute Collection',60,600,0.5,''); -- -- Table structure for table `data_source_profiles_cf` -- CREATE TABLE `data_source_profiles_cf` ( `data_source_profile_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `consolidation_function_id` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`data_source_profile_id`,`consolidation_function_id`), KEY `data_source_profile_id` (`data_source_profile_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Maps the Data Source Profile Consolidation Functions'; -- -- Dumping data for table `data_source_profiles_cf` -- INSERT INTO `data_source_profiles_cf` VALUES (1,1); INSERT INTO `data_source_profiles_cf` VALUES (1,2); INSERT INTO `data_source_profiles_cf` VALUES (1,3); INSERT INTO `data_source_profiles_cf` VALUES (1,4); INSERT INTO `data_source_profiles_cf` VALUES (2,1); INSERT INTO `data_source_profiles_cf` VALUES (2,2); INSERT INTO `data_source_profiles_cf` VALUES (2,3); INSERT INTO `data_source_profiles_cf` VALUES (2,4); INSERT INTO `data_source_profiles_cf` VALUES (3,1); INSERT INTO `data_source_profiles_cf` VALUES (3,2); INSERT INTO `data_source_profiles_cf` VALUES (3,3); INSERT INTO `data_source_profiles_cf` VALUES (3,4); -- -- Table structure for table `data_source_profiles_rra` -- CREATE TABLE `data_source_profiles_rra` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `data_source_profile_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL DEFAULT '', `steps` int(10) unsigned DEFAULT '1', `rows` int(10) unsigned NOT NULL DEFAULT '700', `timespan` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `data_source_profile_id` (`data_source_profile_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores RRA Definitions for Data Source Profiles'; -- -- Dumping data for table `data_source_profiles_rra` -- INSERT INTO `data_source_profiles_rra` VALUES (1,1,'Daily (5 Minute Average)',1,600,86400); INSERT INTO `data_source_profiles_rra` VALUES (2,1,'Weekly (30 Minute Average)',6,700,604800); INSERT INTO `data_source_profiles_rra` VALUES (3,1,'Monthly (2 Hour Average)',24,775,2618784); INSERT INTO `data_source_profiles_rra` VALUES (4,1,'Yearly (1 Day Average)',288,797,31536000); INSERT INTO `data_source_profiles_rra` VALUES (5,2,'Daily (30 Second Average)',1,2900,86400); INSERT INTO `data_source_profiles_rra` VALUES (6,2,'Weekly (15 Minute Average)',30,1346,604800); INSERT INTO `data_source_profiles_rra` VALUES (7,2,'Monthly (1 Hour Average)',120,1445,2618784); INSERT INTO `data_source_profiles_rra` VALUES (8,2,'Yearly (4 Hour Average)',480,4380,31536000); INSERT INTO `data_source_profiles_rra` VALUES (9,3,'Daily (1 Minute Average)',1,2900,86400); INSERT INTO `data_source_profiles_rra` VALUES (10,3,'Weekly (15 Minute Average)',15,1440,604800); INSERT INTO `data_source_profiles_rra` VALUES (11,3,'Monthly (1 Hour Average)',60,8784,2618784); INSERT INTO `data_source_profiles_rra` VALUES (12,3,'Yearly (12 Hour Average)',720,7305,31536000); -- -- Table structure for table `data_source_purge_action` -- CREATE TABLE `data_source_purge_action` ( `id` integer UNSIGNED auto_increment, `name` varchar(128) NOT NULL default '', `local_data_id` int(10) unsigned NOT NULL default '0', `action` tinyint(2) NOT NULL default 0, PRIMARY KEY (`id`), UNIQUE KEY name (`name`)) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='RRD Cleaner File Actions'; -- -- Table structure for table `data_source_purge_temp` -- CREATE TABLE `data_source_purge_temp` ( `id` integer UNSIGNED auto_increment, `name_cache` varchar(255) NOT NULL default '', `local_data_id` int(10) unsigned NOT NULL default '0', `name` varchar(128) NOT NULL default '', `size` integer UNSIGNED NOT NULL default '0', `last_mod` TIMESTAMP NOT NULL default '0000-00-00 00:00:00', `in_cacti` tinyint NOT NULL default '0', `data_template_id` mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE KEY name (`name`), KEY local_data_id (`local_data_id`), KEY in_cacti (`in_cacti`), KEY data_template_id (`data_template_id`)) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='RRD Cleaner File Repository'; -- -- Table structure for table `data_source_stats_daily` -- CREATE TABLE `data_source_stats_daily` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `average` DOUBLE DEFAULT NULL, `peak` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`rrd_name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `data_source_stats_hourly` -- CREATE TABLE `data_source_stats_hourly` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `average` DOUBLE DEFAULT NULL, `peak` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`rrd_name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `data_source_stats_hourly_cache` -- CREATE TABLE `data_source_stats_hourly_cache` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `time` timestamp NOT NULL default '0000-00-00 00:00:00', `value` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`time`,`rrd_name`), KEY `time` USING BTREE (`time`) ) ENGINE=MEMORY; -- -- Table structure for table `data_source_stats_hourly_last` -- CREATE TABLE `data_source_stats_hourly_last` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `value` DOUBLE DEFAULT NULL, `calculated` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`rrd_name`) ) ENGINE=MEMORY; -- -- Table structure for table `data_source_stats_monthly` -- CREATE TABLE `data_source_stats_monthly` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `average` DOUBLE DEFAULT NULL, `peak` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`rrd_name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `data_source_stats_weekly` -- CREATE TABLE `data_source_stats_weekly` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `average` DOUBLE DEFAULT NULL, `peak` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`rrd_name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `data_source_stats_yearly` -- CREATE TABLE `data_source_stats_yearly` ( `local_data_id` int(10) unsigned NOT NULL, `rrd_name` varchar(19) NOT NULL, `average` DOUBLE DEFAULT NULL, `peak` DOUBLE DEFAULT NULL, PRIMARY KEY (`local_data_id`,`rrd_name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `data_template` -- CREATE TABLE data_template ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', name varchar(150) NOT NULL default '', PRIMARY KEY (id), KEY `name` (`name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_template` -- -- -- Table structure for table `data_template_data` -- CREATE TABLE data_template_data ( id int(10) unsigned NOT NULL auto_increment, local_data_template_data_id int(10) unsigned NOT NULL default '0', local_data_id int(10) unsigned NOT NULL default '0', data_template_id mediumint(8) unsigned NOT NULL default '0', data_input_id mediumint(8) unsigned NOT NULL default '0', t_name char(2) default NULL, name varchar(250) NOT NULL default '', name_cache varchar(255) NOT NULL default '', data_source_path varchar(255) default '', t_active char(2) default '', active char(2) default NULL, t_rrd_step char(2) default '', rrd_step mediumint(8) unsigned NOT NULL default '0', t_data_source_profile_id char(2) default '', data_source_profile_id mediumint(8) unsigned NOT NULL default '1', PRIMARY KEY (id), KEY local_data_id (local_data_id), KEY data_template_id (data_template_id), KEY data_input_id (data_input_id), KEY name_cache (name_cache) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_template_data` -- -- -- Table structure for table `data_template_rrd` -- CREATE TABLE data_template_rrd ( id int(10) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', local_data_template_rrd_id int(10) unsigned NOT NULL default '0', local_data_id int(10) unsigned NOT NULL default '0', data_template_id mediumint(8) unsigned NOT NULL default '0', t_rrd_maximum char(2) default NULL, rrd_maximum varchar(20) NOT NULL default '0', t_rrd_minimum char(2) default NULL, rrd_minimum varchar(20) NOT NULL default '0', t_rrd_heartbeat char(2) default NULL, rrd_heartbeat mediumint(6) NOT NULL default '0', t_data_source_type_id char(2) default NULL, data_source_type_id smallint(5) NOT NULL default '0', t_data_source_name char(2) default NULL, data_source_name varchar(19) NOT NULL default '', t_data_input_field_id char(2) default NULL, data_input_field_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (id), UNIQUE KEY `duplicate_dsname_contraint` (`local_data_id`,`data_source_name`,`data_template_id`), KEY local_data_id (local_data_id), KEY data_template_id (data_template_id), KEY local_data_template_rrd_id (local_data_template_rrd_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `data_template_rrd` -- CREATE TABLE external_links ( id int(11) NOT NULL AUTO_INCREMENT, sortorder int(11) NOT NULL DEFAULT '0', enabled char(2) DEFAULT 'on', contentfile varchar(255) NOT NULL default '', title varchar(20) NOT NULL default '', style varchar(10) NOT NULL DEFAULT '', extendedstyle varchar(50) NOT NULL DEFAULT '', refresh int unsigned default NULL, PRIMARY KEY (id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Contains external links that are embedded into Cacti'; -- -- Table structure for table `graph_local` -- CREATE TABLE graph_local ( id int(10) unsigned NOT NULL auto_increment, graph_template_id mediumint(8) unsigned NOT NULL default '0', host_id mediumint(8) unsigned NOT NULL default '0', snmp_query_id mediumint(8) NOT NULL default '0', snmp_query_graph_id mediumint(8) NOT NULL default '0', snmp_index varchar(255) NOT NULL default '', PRIMARY KEY (id), KEY host_id (host_id), KEY graph_template_id (graph_template_id), KEY snmp_query_id (snmp_query_id), KEY snmp_query_graph_id (snmp_query_graph_id), KEY snmp_index (snmp_index) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Creates a relationship for each item in a custom graph.'; -- -- Dumping data for table `graph_local` -- -- -- Table structure for table `graph_template_input` -- CREATE TABLE graph_template_input ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', graph_template_id mediumint(8) unsigned NOT NULL default '0', name varchar(255) NOT NULL default '', description text, column_name varchar(50) NOT NULL default '', PRIMARY KEY (id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores the names for graph item input groups.'; -- -- Dumping data for table `graph_template_input` -- -- -- Table structure for table `graph_template_input_defs` -- CREATE TABLE graph_template_input_defs ( graph_template_input_id int(10) unsigned NOT NULL default '0', graph_template_item_id int(12) unsigned NOT NULL default '0', PRIMARY KEY (graph_template_input_id,graph_template_item_id), KEY graph_template_input_id (graph_template_input_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores the relationship for what graph items are associated'; -- -- Dumping data for table `graph_template_input_defs` -- -- -- Table structure for table `graph_templates` -- CREATE TABLE graph_templates ( `id` mediumint(8) unsigned NOT NULL auto_increment, `hash` char(32) NOT NULL default '', `name` char(255) NOT NULL default '', `multiple` char(2) NOT NULL default '', `test_source` char(2) NOT NULL default '', PRIMARY KEY (`id`), KEY `multiple_name` (`multiple`, `name`), KEY `name` (`name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Contains each graph template name.'; -- -- Dumping data for table `graph_templates` -- -- -- Table structure for table `graph_templates_gprint` -- CREATE TABLE graph_templates_gprint ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', name varchar(100) NOT NULL default '', gprint_text varchar(255) default NULL, PRIMARY KEY (id), KEY `name` (`name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `graph_templates_gprint` -- INSERT INTO graph_templates_gprint VALUES (2,'e9c43831e54eca8069317a2ce8c6f751','Normal','%8.2lf %s'); INSERT INTO graph_templates_gprint VALUES (3,'19414480d6897c8731c7dc6c5310653e','Exact Numbers','%8.0lf'); INSERT INTO graph_templates_gprint VALUES (4,'304a778405392f878a6db435afffc1e9','Load Average','%8.2lf'); -- -- Table structure for table `graph_templates_graph` -- CREATE TABLE graph_templates_graph ( id int(10) unsigned NOT NULL auto_increment, local_graph_template_graph_id int(10) unsigned NOT NULL default '0', local_graph_id int(10) unsigned NOT NULL default '0', graph_template_id mediumint(8) unsigned NOT NULL default '0', t_image_format_id char(2) default '', image_format_id tinyint(1) NOT NULL default '0', t_title char(2) default '', title varchar(255) NOT NULL default '', title_cache varchar(255) NOT NULL default '', t_height char(2) default '', height mediumint(8) NOT NULL default '0', t_width char(2) default '', width mediumint(8) NOT NULL default '0', t_upper_limit char(2) default '', upper_limit varchar(20) NOT NULL default '0', t_lower_limit char(2) default '', lower_limit varchar(20) NOT NULL default '0', t_vertical_label char(2) default '', vertical_label varchar(200) default NULL, t_slope_mode char(2) default '', slope_mode char(2) default 'on', t_auto_scale char(2) default '', auto_scale char(2) default NULL, t_auto_scale_opts char(2) default '', auto_scale_opts tinyint(1) NOT NULL default '0', t_auto_scale_log char(2) default '', auto_scale_log char(2) default NULL, t_scale_log_units char(2) default '', scale_log_units char(2) default NULL, t_auto_scale_rigid char(2) default '', auto_scale_rigid char(2) default NULL, t_auto_padding char(2) default '', auto_padding char(2) default NULL, t_base_value char(2) default '', base_value mediumint(8) NOT NULL default '0', `t_grouping` char(2) default '', `grouping` char(2) NOT NULL default '', t_unit_value char(2) default '', unit_value varchar(20) default NULL, t_unit_exponent_value char(2) default '', unit_exponent_value varchar(5) NOT NULL default '', t_alt_y_grid char(2) default '', alt_y_grid char(2) default NULL, t_right_axis char(2) DEFAULT '', right_axis varchar(20) DEFAULT NULL, t_right_axis_label char(2) DEFAULT '', right_axis_label varchar(200) DEFAULT NULL, t_right_axis_format char(2) DEFAULT '', right_axis_format mediumint(8) DEFAULT NULL, t_right_axis_formatter char(2) DEFAULT '', right_axis_formatter varchar(10) DEFAULT NULL, t_left_axis_formatter char(2) DEFAULT '', left_axis_formatter varchar(10) DEFAULT NULL, t_no_gridfit char(2) DEFAULT '', no_gridfit char(2) DEFAULT NULL, t_unit_length char(2) DEFAULT '', unit_length varchar(10) DEFAULT NULL, t_tab_width char(2) DEFAULT '', tab_width varchar(20) DEFAULT '30', t_dynamic_labels char(2) default '', dynamic_labels char(2) default NULL, t_force_rules_legend char(2) DEFAULT '', force_rules_legend char(2) DEFAULT NULL, t_legend_position char(2) DEFAULT '', legend_position varchar(10) DEFAULT NULL, t_legend_direction char(2) DEFAULT '', legend_direction varchar(10) DEFAULT NULL, PRIMARY KEY (id), KEY local_graph_id (local_graph_id), KEY graph_template_id (graph_template_id), KEY title_cache (title_cache) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores the actual graph data.'; -- -- Dumping data for table `graph_templates_graph` -- -- -- Table structure for table `graph_templates_item` -- CREATE TABLE graph_templates_item ( id int(10) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', local_graph_template_item_id int(10) unsigned NOT NULL default '0', local_graph_id int(10) unsigned NOT NULL default '0', graph_template_id mediumint(8) unsigned NOT NULL default '0', task_item_id int(10) unsigned NOT NULL default '0', color_id mediumint(8) unsigned NOT NULL default '0', alpha char(2) default 'FF', graph_type_id tinyint(3) NOT NULL default '0', line_width DECIMAL(4,2) DEFAULT 0, dashes varchar(20) DEFAULT NULL, dash_offset mediumint(4) DEFAULT NULL, cdef_id mediumint(8) unsigned NOT NULL default '0', vdef_id mediumint(8) unsigned NOT NULL default '0', shift char(2) default NULL, consolidation_function_id tinyint(2) NOT NULL default '0', textalign varchar(10) default NULL, text_format varchar(255) default NULL, value varchar(255) default NULL, hard_return char(2) default NULL, gprint_id mediumint(8) unsigned NOT NULL default '0', sequence mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (id), KEY graph_template_id (graph_template_id), KEY local_graph_id_sequence (local_graph_id, sequence), KEY local_graph_template_item_id (local_graph_template_item_id), KEY task_item_id (task_item_id), KEY cdef_id (cdef_id), KEY vdef_id (vdef_id), KEY color_id (color_id), KEY gprint_id (gprint_id), KEY `lgi_gti` (`local_graph_id`,`graph_template_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores the actual graph item data.'; -- -- Dumping data for table `graph_templates_item` -- -- -- Table structure for table `graph_tree` -- CREATE TABLE graph_tree ( `id` smallint(5) unsigned NOT NULL auto_increment, `enabled` char(2) DEFAULT 'on', `locked` tinyint(4) DEFAULT '0', `locked_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `sort_type` tinyint(3) unsigned NOT NULL default '1', `name` varchar(255) NOT NULL default '', `sequence` int(10) unsigned DEFAULT '1', `user_id` int(10) unsigned DEFAULT '1', `last_modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(10) unsigned DEFAULT '1', PRIMARY KEY (`id`), KEY `sequence` (`sequence`), KEY `name` (`name`(171)) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `graph_tree` -- INSERT INTO graph_tree VALUES (1,'on',0,'0000-00-00',1,'Default Tree',1,1,'0000-00-00','1'); -- -- Table structure for table `graph_tree_items` -- CREATE TABLE graph_tree_items ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, parent bigint(20) unsigned DEFAULT NULL, position int(10) unsigned DEFAULT NULL, graph_tree_id smallint(5) unsigned NOT NULL DEFAULT '0', local_graph_id int(10) unsigned NOT NULL DEFAULT '0', title varchar(255) DEFAULT NULL, host_id mediumint(8) unsigned NOT NULL DEFAULT '0', site_id int unsigned DEFAULT '0', host_grouping_type tinyint(3) unsigned NOT NULL DEFAULT '1', sort_children_type tinyint(3) unsigned NOT NULL DEFAULT '0', graph_regex varchar(60) DEFAULT '', host_regex varchar(60) DEFAULT '', PRIMARY KEY (`id`), KEY `graph_tree_id` (`graph_tree_id`), KEY `host_id` (`host_id`), KEY `site_id` (`site_id`), KEY `local_graph_id` (`local_graph_id`), KEY `parent_position`(`parent`, `position`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `graph_tree_items` -- -- -- Table structure for table `host` -- CREATE TABLE host ( id mediumint(8) unsigned NOT NULL auto_increment, poller_id int(10) unsigned NOT NULL default '1', site_id int(10) unsigned NOT NULL default '1', host_template_id mediumint(8) unsigned NOT NULL default '0', description varchar(150) NOT NULL default '', hostname varchar(100) default NULL, location varchar(40) default NULL, notes text, external_id varchar(40) default NULL, snmp_community varchar(100) default NULL, snmp_version tinyint(1) unsigned NOT NULL default '1', snmp_username varchar(50) default NULL, snmp_password varchar(50) default NULL, snmp_auth_protocol char(6) default '', snmp_priv_passphrase varchar(200) default '', snmp_priv_protocol char(6) default '', snmp_context varchar(64) default '', snmp_engine_id varchar(64) default '', snmp_port mediumint(5) unsigned NOT NULL default '161', snmp_timeout mediumint(8) unsigned NOT NULL default '500', snmp_sysDescr varchar(300) NOT NULL default '', snmp_sysObjectID varchar(128) NOT NULL default '', snmp_sysUpTimeInstance bigint(20) unsigned NOT NULL default '0', snmp_sysContact varchar(300) NOT NULL default '', snmp_sysName varchar(300) NOT NULL default '', snmp_sysLocation varchar(300) NOT NULL default '', availability_method smallint(5) unsigned NOT NULL default '1', ping_method smallint(5) unsigned default '0', ping_port int(12) unsigned default '0', ping_timeout int(12) unsigned default '500', ping_retries int(12) unsigned default '2', max_oids int(12) unsigned default '10', bulk_walk_size int(11) DEFAULT '-1', device_threads tinyint(2) unsigned NOT NULL DEFAULT '1', deleted char(2) default '', disabled char(2) default NULL, status tinyint(2) NOT NULL default '0', status_event_count mediumint(8) unsigned NOT NULL default '0', status_fail_date timestamp NOT NULL default '0000-00-00 00:00:00', status_rec_date timestamp NOT NULL default '0000-00-00 00:00:00', status_last_error varchar(255) default '', min_time decimal(10,5) default '9.99999', max_time decimal(10,5) default '0.00000', cur_time decimal(10,5) default '0.00000', avg_time decimal(10,5) default '0.00000', polling_time DOUBLE default '0', total_polls int(12) unsigned default '0', failed_polls int(12) unsigned default '0', availability decimal(8,5) NOT NULL default '100.00000', last_updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY poller_id_disabled (poller_id, disabled), KEY site_id (site_id), KEY external_id (external_id), KEY disabled (disabled), KEY status (status), KEY site_id_location (site_id, location), KEY hostname (hostname), KEY poller_id_last_updated (poller_id, last_updated) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host` -- -- -- Table structure for table `host_graph` -- CREATE TABLE host_graph ( host_id mediumint(8) unsigned NOT NULL default '0', graph_template_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (host_id,graph_template_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host_graph` -- -- -- Table structure for table `host_snmp_cache` -- CREATE TABLE host_snmp_cache ( host_id mediumint(8) unsigned NOT NULL default '0', snmp_query_id mediumint(8) unsigned NOT NULL default '0', field_name varchar(50) NOT NULL default '', field_value varchar(512) default NULL, snmp_index varchar(255) NOT NULL default '', oid TEXT NOT NULL, present tinyint NOT NULL DEFAULT '1', last_updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (host_id, snmp_query_id, field_name, snmp_index), KEY host_id (host_id, field_name), KEY snmp_index (snmp_index), KEY field_name (field_name), KEY field_value (field_value), KEY snmp_query_id (snmp_query_id), KEY last_updated (last_updated), KEY present (present) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host_snmp_cache` -- -- -- Table structure for table `host_snmp_query` -- CREATE TABLE host_snmp_query ( host_id mediumint(8) unsigned NOT NULL default '0', snmp_query_id mediumint(8) unsigned NOT NULL default '0', sort_field varchar(50) NOT NULL default '', title_format varchar(50) NOT NULL default '', reindex_method tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (host_id,snmp_query_id), KEY host_id (host_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host_snmp_query` -- -- -- Table structure for table `host_template` -- CREATE TABLE host_template ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', name varchar(100) NOT NULL default '', PRIMARY KEY (id), KEY `name` (`name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host_template` -- -- -- Table structure for table `host_template_graph` -- CREATE TABLE host_template_graph ( host_template_id mediumint(8) unsigned NOT NULL default '0', graph_template_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (host_template_id,graph_template_id), KEY host_template_id (host_template_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host_template_graph` -- -- -- Table structure for table `host_template_snmp_query` -- CREATE TABLE host_template_snmp_query ( host_template_id mediumint(8) unsigned NOT NULL default '0', snmp_query_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (host_template_id, snmp_query_id), KEY host_template_id (host_template_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `host_template_snmp_query` -- -- -- Table structure for table `plugin_config` -- CREATE TABLE `plugin_config` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `directory` varchar(32) NOT NULL default '', `name` varchar(64) NOT NULL default '', `status` tinyint(2) NOT NULL default '0', `author` varchar(64) NOT NULL default '', `webpage` varchar(255) NOT NULL default '', `version` varchar(10) NOT NULL default '', PRIMARY KEY (`id`), KEY `status` (`status`), KEY `directory` (`directory`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `plugin_hooks` -- CREATE TABLE `plugin_hooks` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `name` varchar(32) NOT NULL default '', `hook` varchar(64) NOT NULL default '', `file` varchar(255) NOT NULL default '', `function` varchar(128) NOT NULL default '', `status` int(8) NOT NULL default '0', PRIMARY KEY (`id`), KEY `hook` (`hook`), KEY `status` (`status`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `plugin_realms` -- CREATE TABLE `plugin_realms` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `plugin` varchar(32) NOT NULL default '', `file` text NOT NULL, `display` varchar(64) NOT NULL default '', PRIMARY KEY (`id`), KEY `plugin` (`plugin`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `plugin_db_changes` -- CREATE TABLE `plugin_db_changes` ( `id` mediumint(8) unsigned NOT NULL auto_increment, `plugin` varchar(16) NOT NULL default '', `table` varchar(64) NOT NULL default '', `column` varchar(64) NOT NULL, `method` varchar(16) NOT NULL default '', PRIMARY KEY (`id`), KEY `plugin` (`plugin`), KEY `method` (`method`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; REPLACE INTO `plugin_realms` VALUES (1, 'internal', 'plugins.php', 'Plugin Management'); INSERT INTO `plugin_hooks` VALUES (1, 'internal', 'config_arrays', '', 'plugin_config_arrays', 1); INSERT INTO `plugin_hooks` VALUES (2, 'internal', 'draw_navigation_text', '', 'plugin_draw_navigation_text', 1); -- -- Table structure for table `poller` -- CREATE TABLE `poller` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `disabled` char(2) DEFAULT '', `name` varchar(30) DEFAULT NULL, `notes` varchar(1024) DEFAULT '', `status` int(10) unsigned NOT NULL DEFAULT '0', `timezone` varchar(40) DEFAULT '', `hostname` varchar(100) NOT NULL DEFAULT '', `dbdefault` varchar(20) NOT NULL DEFAULT '', `dbhost` varchar(64) NOT NULL DEFAULT '', `dbuser` varchar(20) NOT NULL DEFAULT '', `dbpass` varchar(64) NOT NULL DEFAULT '', `dbport` int(10) unsigned DEFAULT '3306', `dbretries` int(10) unsigned DEFAULT '2', `dbssl` char(3) DEFAULT '', `dbsslkey` varchar(255) DEFAULT NULL, `dbsslcert` varchar(255) DEFAULT NULL, `dbsslca` varchar(255) DEFAULT NULL, `total_time` double DEFAULT '0', `max_time` double DEFAULT NULL, `min_time` double DEFAULT NULL, `avg_time` double DEFAULT NULL, `total_polls` int(10) unsigned DEFAULT '0', `processes` int(10) unsigned DEFAULT '1', `threads` int(10) unsigned DEFAULT '1', `sync_interval` int(10) unsigned DEFAULT '7200', `snmp` mediumint(8) unsigned DEFAULT '0', `script` mediumint(8) unsigned DEFAULT '0', `server` mediumint(8) unsigned DEFAULT '0', `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `last_status` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `last_sync` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `requires_sync` char(2) DEFAULT '', PRIMARY KEY (`id`), KEY `name` (`name`), KEY `disabled` (`disabled`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Pollers for Cacti'; INSERT INTO poller (id,name,hostname) VALUES (1,'Main Poller', 'localhost'); -- -- Table structure for table `poller_command` -- CREATE TABLE poller_command ( poller_id smallint(5) unsigned NOT NULL default '1', time timestamp NOT NULL default '0000-00-00 00:00:00', action tinyint(3) unsigned NOT NULL default '0', command varchar(191) NOT NULL default '', last_updated timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (poller_id, action, command), KEY poller_id_last_updated (poller_id, last_updated) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `poller_data_template_field_mappings` -- CREATE TABLE `poller_data_template_field_mappings` ( `data_template_id` int(10) unsigned NOT NULL DEFAULT '0', `data_name` varchar(40) NOT NULL DEFAULT '', `data_source_names` varchar(125) NOT NULL DEFAULT '', `last_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`data_template_id`, `data_name`, `data_source_names`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Tracks mapping of Data Templates to their Data Source Names'; -- -- Table structure for table `poller_item` -- CREATE TABLE poller_item ( `local_data_id` int(10) unsigned NOT NULL default '0', `poller_id` int(10) unsigned NOT NULL default '1', `host_id` mediumint(8) unsigned NOT NULL default '0', `action` tinyint(2) unsigned NOT NULL default '1', `present` tinyint NOT NULL DEFAULT '1', `last_updated` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `hostname` varchar(100) NOT NULL default '', `snmp_community` varchar(100) NOT NULL default '', `snmp_version` tinyint(1) unsigned NOT NULL default '0', `snmp_username` varchar(50) NOT NULL default '', `snmp_password` varchar(50) NOT NULL default '', `snmp_auth_protocol` char(6) NOT NULL default '', `snmp_priv_passphrase` varchar(200) NOT NULL default '', `snmp_priv_protocol` char(6) NOT NULL default '', `snmp_context` varchar(64) default '', `snmp_engine_id` varchar(64) default '', `snmp_port` mediumint(5) unsigned NOT NULL default '161', `snmp_timeout` mediumint(8) unsigned NOT NULL default '0', `rrd_name` varchar(19) NOT NULL default '', `rrd_path` varchar(255) NOT NULL default '', `rrd_num` tinyint(2) unsigned NOT NULL default '0', `rrd_step` mediumint(8) NOT NULL default '300', `rrd_next_step` mediumint(8) NOT NULL default '0', `arg1` TEXT default NULL, `arg2` varchar(255) default NULL, `arg3` varchar(255) default NULL, PRIMARY KEY (`local_data_id`,`rrd_name`), KEY `host_id` (`host_id`), KEY `action` (`action`), KEY `present` (`present`), KEY `poller_id_host_id` (`poller_id`,`host_id`), KEY `poller_id_rrd_next_step` (`poller_id`,`rrd_next_step`), KEY `poller_id_action` (`poller_id`,`action`), KEY `poller_id_last_updated` (`poller_id`, `last_updated`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `poller_output` -- CREATE TABLE poller_output ( local_data_id int(10) unsigned NOT NULL default '0', rrd_name varchar(19) NOT NULL default '', time timestamp NOT NULL default '0000-00-00 00:00:00', output varchar(512) NOT NULL default '', PRIMARY KEY (local_data_id, rrd_name, time) /*!50060 USING BTREE */ ) ENGINE=MEMORY; -- -- Table structure for table `poller_output_boost` -- CREATE TABLE `poller_output_boost` ( `local_data_id` int(10) unsigned NOT NULL default '0', `rrd_name` varchar(19) NOT NULL default '', `time` timestamp NOT NULL default '0000-00-00 00:00:00', `output` varchar(512) NOT NULL, PRIMARY KEY USING BTREE (`local_data_id`, `time`, `rrd_name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `poller_output_boost_local_data_ids` -- CREATE TABLE `poller_output_boost_local_data_ids` ( `local_data_id` int(10) unsigned NOT NULL DEFAULT 0, `process_handler` int(10) unsigned DEFAULT 0, PRIMARY KEY (`local_data_id`), KEY `process_handler` (`process_handler`) ) ENGINE=MEMORY; -- -- Table structure for table `poller_output_boost_processes` -- CREATE TABLE `poller_output_boost_processes` ( `sock_int_value` bigint(20) unsigned NOT NULL auto_increment, `status` varchar(255) default NULL, PRIMARY KEY (`sock_int_value`) ) ENGINE=MEMORY; -- -- Table structure for table `poller_output_realtime` -- CREATE TABLE poller_output_realtime ( local_data_id int(10) unsigned NOT NULL default '0', rrd_name varchar(19) NOT NULL default '', `time` timestamp NOT NULL default '0000-00-00 00:00:00', output text NOT NULL, poller_id varchar(256) NOT NULL default '1', PRIMARY KEY (local_data_id, rrd_name, time, poller_id), KEY poller_id (poller_id(191)), KEY `time` (`time`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `poller_reindex` -- CREATE TABLE poller_reindex ( host_id mediumint(8) unsigned NOT NULL default '0', data_query_id mediumint(8) unsigned NOT NULL default '0', action tinyint(3) unsigned NOT NULL default '0', present tinyint NOT NULL DEFAULT '1', op char(1) NOT NULL default '', assert_value varchar(100) NOT NULL default '', arg1 varchar(255) NOT NULL default '', PRIMARY KEY (host_id, data_query_id, arg1(187)), KEY present (present) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `poller_resource_cache` -- CREATE TABLE poller_resource_cache ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `resource_type` varchar(20) DEFAULT NULL, `md5sum` varchar(32) DEFAULT NULL, `path` varchar(191) DEFAULT NULL, `update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `contents` longblob, `attributes` INT unsigned DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `path` (`path`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Caches all scripts, resources files, and plugins'; -- -- Table structure for table `poller_time` -- CREATE TABLE poller_time ( id bigint(20) unsigned NOT NULL auto_increment, pid int(11) unsigned NOT NULL default '0', poller_id int(10) unsigned NOT NULL default '1', start_time timestamp NOT NULL default '0000-00-00 00:00:00', end_time timestamp NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (id), KEY `poller_id_end_time` (`poller_id`, `end_time`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Table structure for table `processes` -- CREATE TABLE `processes` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `pid` int(10) unsigned NOT NULL DEFAULT 0, `tasktype` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `taskname` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `taskid` int(10) unsigned NOT NULL DEFAULT 0, `timeout` int(11) DEFAULT 300, `started` timestamp NOT NULL DEFAULT current_timestamp(), `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`pid`,`tasktype`,`taskname`,`taskid`), KEY `tasktype` (`tasktype`), KEY `pid` (`pid`), KEY `id` (`id`) ) ENGINE=MEMORY COMMENT='Stores Process Status for Cacti Background Processes'; -- -- Table structure for table `reports` -- CREATE TABLE `reports` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `user_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `name` varchar(100) NOT NULL DEFAULT '', `cformat` char(2) NOT NULL DEFAULT '', `format_file` varchar(255) NOT NULL DEFAULT '', `font_size` smallint(2) unsigned NOT NULL DEFAULT '0', `alignment` smallint(2) unsigned NOT NULL DEFAULT '0', `graph_linked` char(2) NOT NULL DEFAULT '', `intrvl` smallint(2) unsigned NOT NULL DEFAULT '0', `count` smallint(2) unsigned NOT NULL DEFAULT '0', `offset` int(12) unsigned NOT NULL DEFAULT '0', `mailtime` bigint(20) unsigned NOT NULL DEFAULT '0', `subject` varchar(64) NOT NULL DEFAULT '', `from_name` varchar(40) NOT NULL, `from_email` text NOT NULL, `email` text NOT NULL, `bcc` text NOT NULL, `attachment_type` smallint(2) unsigned NOT NULL DEFAULT '1', `graph_height` smallint(2) unsigned NOT NULL DEFAULT '0', `graph_width` smallint(2) unsigned NOT NULL DEFAULT '0', `graph_columns` smallint(2) unsigned NOT NULL DEFAULT '0', `thumbnails` char(2) NOT NULL DEFAULT '', `lastsent` bigint(20) unsigned NOT NULL DEFAULT '0', `enabled` char(2) DEFAULT '', PRIMARY KEY (`id`), KEY `mailtime` (`mailtime`)) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Cacri Reporting Reports'; -- -- Table structure for table `reports_items` -- CREATE TABLE `reports_items` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `report_id` int(10) unsigned NOT NULL DEFAULT '0', `item_type` tinyint(1) unsigned NOT NULL DEFAULT '1', `tree_id` int(10) unsigned NOT NULL DEFAULT '0', `branch_id` int(10) unsigned NOT NULL DEFAULT '0', `tree_cascade` char(2) NOT NULL DEFAULT '', `graph_name_regexp` varchar(128) NOT NULL DEFAULT '', `host_template_id` int(10) unsigned NOT NULL DEFAULT '0', `host_id` int(10) unsigned NOT NULL DEFAULT '0', `graph_template_id` int(10) unsigned NOT NULL DEFAULT '0', `local_graph_id` int(10) unsigned NOT NULL DEFAULT '0', `timespan` int(10) unsigned NOT NULL DEFAULT '0', `align` tinyint(1) unsigned NOT NULL DEFAULT '1', `item_text` text NOT NULL, `font_size` smallint(2) unsigned NOT NULL DEFAULT '10', `sequence` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `report_id` (`report_id`)) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Cacti Reporting Items'; -- -- Table structure for table `settings` -- CREATE TABLE settings ( name varchar(50) NOT NULL default '', value varchar(2048) NOT NULL default '', PRIMARY KEY (name) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `settings` -- INSERT INTO settings VALUES ('auth_method', 1); INSERT INTO settings VALUES ('selected_theme', 'modern'); -- -- Table structure for table `settings_user` -- CREATE TABLE settings_user ( user_id smallint(8) unsigned NOT NULL default '0', name varchar(50) NOT NULL default '', value varchar(2048) NOT NULL default '', PRIMARY KEY (user_id, name) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `settings_user` -- -- -- Table structure for table `settings_user_group` -- CREATE TABLE settings_user_group ( group_id smallint(8) unsigned NOT NULL DEFAULT '0', name varchar(50) NOT NULL DEFAULT '', value varchar(2048) NOT NULL DEFAULT '', PRIMARY KEY (group_id, name) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Stores the Default User Group Graph Settings'; -- -- Table structure for table `settings_tree` -- CREATE TABLE settings_tree ( user_id mediumint(8) unsigned NOT NULL default '0', graph_tree_item_id int(10) unsigned NOT NULL default '0', status tinyint(1) NOT NULL default '0', PRIMARY KEY (user_id, graph_tree_item_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `settings_tree` -- -- -- Table structure for table `snmp_query` -- CREATE TABLE snmp_query ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', xml_path varchar(255) NOT NULL default '', name varchar(100) NOT NULL default '', description varchar(255) default NULL, graph_template_id mediumint(8) unsigned NOT NULL default '0', data_input_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (id), KEY name (name) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `snmp_query` -- -- -- Table structure for table `snmp_query_graph` -- CREATE TABLE snmp_query_graph ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', snmp_query_id mediumint(8) unsigned NOT NULL default '0', name varchar(100) NOT NULL default '', graph_template_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (id), KEY `graph_template_id_name` (`graph_template_id`, `name`), KEY `snmp_query_id_name` (`snmp_query_id`, `name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `snmp_query_graph` -- -- -- Table structure for table `snmp_query_graph_rrd` -- CREATE TABLE snmp_query_graph_rrd ( snmp_query_graph_id mediumint(8) unsigned NOT NULL default '0', data_template_id mediumint(8) unsigned NOT NULL default '0', data_template_rrd_id int(10) unsigned NOT NULL default '0', snmp_field_name varchar(50) NOT NULL default '0', PRIMARY KEY (snmp_query_graph_id,data_template_id,data_template_rrd_id), KEY data_template_rrd_id (data_template_rrd_id), KEY snmp_query_graph_id (snmp_query_graph_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `snmp_query_graph_rrd` -- -- -- Table structure for table `snmp_query_graph_rrd_sv` -- CREATE TABLE snmp_query_graph_rrd_sv ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', snmp_query_graph_id mediumint(8) unsigned NOT NULL default '0', data_template_id mediumint(8) unsigned NOT NULL default '0', sequence mediumint(8) unsigned NOT NULL default '0', field_name varchar(100) NOT NULL default '', text varchar(255) NOT NULL default '', PRIMARY KEY (id), KEY snmp_query_graph_id (snmp_query_graph_id), KEY data_template_id (data_template_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `snmp_query_graph_rrd_sv` -- -- -- Table structure for table `snmp_query_graph_sv` -- CREATE TABLE snmp_query_graph_sv ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', snmp_query_graph_id mediumint(8) unsigned NOT NULL default '0', sequence mediumint(8) unsigned NOT NULL default '0', field_name varchar(100) NOT NULL default '', text varchar(255) NOT NULL default '', PRIMARY KEY (id), KEY snmp_query_graph_id (snmp_query_graph_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `snmp_query_graph_sv` -- -- -- Table structure for table `user_auth` -- CREATE TABLE user_auth ( `id` mediumint(8) unsigned NOT NULL auto_increment, `username` varchar(50) NOT NULL default '0', `password` varchar(256) NOT NULL default '', `realm` mediumint(8) NOT NULL default '0', `full_name` varchar(100) default '0', `email_address` varchar(128) NULL, `must_change_password` char(2) default NULL, `password_change` char(2) default 'on', `show_tree` char(2) default 'on', `show_list` char(2) default 'on', `show_preview` char(2) NOT NULL default 'on', `graph_settings` char(2) default NULL, `login_opts` tinyint(1) NOT NULL default '1', `policy_graphs` tinyint(1) unsigned NOT NULL default '1', `policy_trees` tinyint(1) unsigned NOT NULL default '1', `policy_hosts` tinyint(1) unsigned NOT NULL default '1', `policy_graph_templates` tinyint(1) unsigned NOT NULL default '1', `enabled` char(2) NOT NULL DEFAULT 'on', `lastchange` int(12) NOT NULL DEFAULT '-1', `lastlogin` int(12) NOT NULL DEFAULT '-1', `password_history` varchar(4096) NOT NULL DEFAULT '-1', `locked` varchar(3) NOT NULL DEFAULT '', `failed_attempts` int(5) NOT NULL DEFAULT '0', `lastfail` int(12) NOT NULL DEFAULT '0', `reset_perms` int(12) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `username` (`username`), KEY `realm` (`realm`), KEY `enabled` (`enabled`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `user_auth` -- INSERT INTO user_auth VALUES (1,'admin','21232f297a57a5a743894a0e4a801fc3',0,'Administrator','','on','on','on','on','on','on',2,1,1,1,1,'on',-1,-1,'-1','',0,0,0); INSERT INTO user_auth VALUES (3,'guest','43e9a4ab75570f5b',0,'Guest Account','','on','on','on','on','on',3,1,1,1,1,1,'',-1,-1,'-1','',0,0,0); -- -- Table structure for table `user_auth_cache` -- CREATE TABLE `user_auth_cache` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned NOT NULL DEFAULT '0', `hostname` varchar(100) NOT NULL DEFAULT '', `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `token` varchar(191) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `tokenkey` (`token`), KEY `hostname` (`hostname`), KEY `user_id` (`user_id`), KEY `last_update` (`last_update`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Caches Remember Me Details'; -- -- Dumping data for table `user_auth` -- -- -- Table structure for table `user_auth_group` -- CREATE TABLE `user_auth_group` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `description` varchar(255) NOT NULL DEFAULT '', `graph_settings` varchar(2) DEFAULT NULL, `login_opts` tinyint(1) NOT NULL DEFAULT '1', `show_tree` varchar(2) DEFAULT 'on', `show_list` varchar(2) DEFAULT 'on', `show_preview` varchar(2) NOT NULL DEFAULT 'on', `policy_graphs` tinyint(1) unsigned NOT NULL DEFAULT '1', `policy_trees` tinyint(1) unsigned NOT NULL DEFAULT '1', `policy_hosts` tinyint(1) unsigned NOT NULL DEFAULT '1', `policy_graph_templates` tinyint(1) unsigned NOT NULL DEFAULT '1', `enabled` char(2) NOT NULL DEFAULT 'on', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table that Contains User Groups'; -- -- Dumping data for table `user_auth_group` -- -- -- Table structure for table `user_auth_group_members` -- CREATE TABLE `user_auth_group_members` ( `group_id` int(10) unsigned NOT NULL, `user_id` int(10) unsigned NOT NULL, PRIMARY KEY (`group_id`,`user_id`), KEY `realm_id` (`user_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table that Contains User Group Members'; -- -- Dumping data for table `user_auth_group_members` -- -- -- Table structure for table `user_auth_group_perms` -- CREATE TABLE `user_auth_group_perms` ( `group_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `item_id` mediumint(8) unsigned NOT NULL DEFAULT '0', `type` tinyint(2) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`group_id`,`item_id`,`type`), KEY `group_id` (`group_id`,`type`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table that Contains User Group Permissions'; -- -- Dumping data for table `user_auth_group_perms` -- -- -- Table structure for table `user_auth_group_realm` -- CREATE TABLE `user_auth_group_realm` ( `group_id` int(10) unsigned NOT NULL, `realm_id` int(10) unsigned NOT NULL, PRIMARY KEY (`group_id`,`realm_id`), KEY `realm_id` (`realm_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table that Contains User Group Realm Permissions'; -- -- Dumping data for table `user_auth_group_realm` -- -- -- Table structure for table `user_auth_perms` -- CREATE TABLE user_auth_perms ( user_id mediumint(8) unsigned NOT NULL default '0', item_id mediumint(8) unsigned NOT NULL default '0', type tinyint(2) unsigned NOT NULL default '0', PRIMARY KEY (user_id,item_id,type), KEY user_id (user_id,type) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `user_auth_perms` -- -- -- Table structure for table `user_auth_realm` -- CREATE TABLE user_auth_realm ( realm_id mediumint(8) unsigned NOT NULL default '0', user_id mediumint(8) unsigned NOT NULL default '0', PRIMARY KEY (realm_id,user_id), KEY user_id (user_id) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `user_auth_realm` -- INSERT INTO user_auth_realm VALUES (1,1); INSERT INTO user_auth_realm VALUES (2,1); INSERT INTO user_auth_realm VALUES (3,1); INSERT INTO user_auth_realm VALUES (4,1); INSERT INTO user_auth_realm VALUES (5,1); INSERT INTO user_auth_realm VALUES (7,1); INSERT INTO user_auth_realm VALUES (7,3); INSERT INTO user_auth_realm VALUES (8,1); INSERT INTO user_auth_realm VALUES (9,1); INSERT INTO user_auth_realm VALUES (10,1); INSERT INTO user_auth_realm VALUES (11,1); INSERT INTO user_auth_realm VALUES (12,1); INSERT INTO user_auth_realm VALUES (13,1); INSERT INTO user_auth_realm VALUES (14,1); INSERT INTO user_auth_realm VALUES (15,1); INSERT INTO user_auth_realm VALUES (16,1); INSERT INTO user_auth_realm VALUES (17,1); INSERT INTO user_auth_realm VALUES (18,1); INSERT INTO user_auth_realm VALUES (19,1); INSERT INTO user_auth_realm VALUES (20,1); INSERT INTO user_auth_realm VALUES (21,1); INSERT INTO user_auth_realm VALUES (22,1); INSERT INTO user_auth_realm VALUES (23,1); INSERT INTO user_auth_realm VALUES (24,1); INSERT INTO user_auth_realm VALUES (25,1); INSERT INTO user_auth_realm VALUES (26,1); INSERT INTO user_auth_realm VALUES (101,1); INSERT INTO user_auth_realm VALUES (1043,1); -- -- Table structure for table `user_log` -- CREATE TABLE user_log ( `username` varchar(50) NOT NULL default '0', `user_id` mediumint(8) NOT NULL default '0', `time` timestamp NOT NULL default '0000-00-00 00:00:00', `result` tinyint(1) NOT NULL default '0', `ip` varchar(40) NOT NULL default '', PRIMARY KEY (`username`,`user_id`,`time`), KEY user_id (`user_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `user_log` -- -- -- Table structure for table `user_domains` -- CREATE TABLE `user_domains` ( `domain_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `domain_name` varchar(20) NOT NULL, `type` int(10) unsigned NOT NULL DEFAULT '0', `enabled` char(2) NOT NULL DEFAULT 'on', `defdomain` tinyint(3) NOT NULL DEFAULT '0', `user_id` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`domain_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table to Hold Login Domains'; -- -- Dumping data for table `user_domains` -- -- -- Table structure for table `user_domains_ldap` -- CREATE TABLE `user_domains_ldap` ( `domain_id` int(10) unsigned NOT NULL, `server` varchar(128) NOT NULL, `port` int(10) unsigned NOT NULL, `port_ssl` int(10) unsigned NOT NULL, `proto_version` tinyint(3) unsigned NOT NULL, `encryption` tinyint(3) unsigned NOT NULL, `referrals` tinyint(3) unsigned NOT NULL, `mode` tinyint(3) unsigned NOT NULL, `dn` varchar(128) NOT NULL, `group_require` char(2) NOT NULL, `group_dn` varchar(128) NOT NULL, `group_attrib` varchar(128) NOT NULL, `group_member_type` tinyint(3) unsigned NOT NULL, `search_base` varchar(128) NOT NULL, `search_filter` varchar(512) NOT NULL, `specific_dn` varchar(128) NOT NULL, `specific_password` varchar(128) NOT NULL, `cn_full_name` varchar(50) NULL DEFAULT '', `cn_email` varchar (50) NULL DEFAULT '', PRIMARY KEY (`domain_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Table to Hold Login Domains for LDAP'; -- -- Dumping data for table `user_domains_ldap` -- -- -- Table structure for table `sessions` -- CREATE TABLE `sessions` ( `id` varchar(32) NOT NULL, `remote_addr` varchar(25) NOT NULL DEFAULT '', `access` int(10) unsigned DEFAULT NULL, `data` mediumblob, `user_id` int(10) unsigned NOT NULL DEFAULT '0', `user_agent` varchar(128) NOT NULL DEFAULT '', `start_time` timestamp NOT NULL DEFAULT current_timestamp, `transactions` int(10) unsigned NOT NULL DEFAULT '1', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Used for Database based Session Storage'; -- -- Dumping data for table `sessions` -- -- -- Table structure for table `sites` -- CREATE TABLE `sites` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(100) NOT NULL DEFAULT '', `address1` varchar(100) DEFAULT '', `address2` varchar(100) DEFAULT '', `city` varchar(50) DEFAULT '', `state` varchar(20) DEFAULT NULL, `postal_code` varchar(20) DEFAULT '', `country` varchar(30) DEFAULT '', `timezone` varchar(40) DEFAULT '', `latitude` decimal(13,10) NOT NULL DEFAULT '0.0000000000', `longitude` decimal(13,10) NOT NULL DEFAULT '0.0000000000', `zoom` tinyint unsigned default NULL, `alternate_id` varchar(30) DEFAULT '', `notes` varchar(1024), PRIMARY KEY (`id`), KEY `name` (`name`), KEY `city` (`city`), KEY `state` (`state`), KEY `postal_code` (`postal_code`), KEY `country` (`country`), KEY `alternate_id` (`alternate_id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Contains information about customer sites'; -- -- Dumping data for table `sites` -- INSERT INTO `sites` VALUES (1,'Edge','','','','','','','',0.0000000000,0.0000000000,'','',''); INSERT INTO `sites` VALUES (2,'Core','','','','','','','',0.0000000000,0.0000000000,'','',''); -- -- Table structure for table `snmpagent_cache` -- CREATE TABLE `snmpagent_cache` ( `oid` varchar(50) NOT NULL, `name` varchar(50) NOT NULL, `mib` varchar(50) NOT NULL, `type` varchar(50) NOT NULL DEFAULT '', `otype` varchar(50) NOT NULL DEFAULT '', `kind` varchar(50) NOT NULL DEFAULT '', `max-access` varchar(50) NOT NULL DEFAULT 'not-accessible', `value` varchar(255) NOT NULL DEFAULT '', `description` varchar(5000) NOT NULL DEFAULT '', PRIMARY KEY (`oid`), KEY `name` (`name`), KEY `mib_name` (`mib`,`name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='SNMP MIB CACHE'; -- -- Dumping data for table `snmpagent_cache` -- -- -- Table structure for table `snmpagent_mibs` -- CREATE TABLE `snmpagent_mibs` ( `id` int(8) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL DEFAULT '', `file` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Registered MIB files'; -- -- Dumping data for table `snmpagent_mibs` -- -- -- Table structure for table `snmpagent_cache_notifications` -- CREATE TABLE `snmpagent_cache_notifications` ( `name` varchar(50) NOT NULL, `mib` varchar(50) NOT NULL, `attribute` varchar(50) NOT NULL, `sequence_id` smallint(6) NOT NULL, PRIMARY KEY (`name`,`mib`,`attribute`,`sequence_id`), KEY `name` (`name`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Notifcations and related attributes'; -- -- Dumping data for table `snmpagent_cache_notifications` -- -- -- Table structure for table `snmpagent_cache_textual_conventions` -- CREATE TABLE `snmpagent_cache_textual_conventions` ( `name` varchar(50) NOT NULL, `mib` varchar(50) NOT NULL, `type` varchar(50) NOT NULL DEFAULT '', `description` varchar(5000) NOT NULL DEFAULT '', PRIMARY KEY (`name`,`mib`,`type`), KEY `name` (`name`), KEY `mib` (`mib`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='Textual conventions'; -- -- Dumping data for table `snmpagent_cache_textual_conventions` -- -- -- Table structure for table `snmpagent_managers` -- CREATE TABLE `snmpagent_managers` ( `id` int(8) NOT NULL AUTO_INCREMENT, `hostname` varchar(100) NOT NULL, `description` varchar(255) NOT NULL, `disabled` char(2) DEFAULT NULL, `max_log_size` tinyint(1) NOT NULL, `snmp_version` tinyint(1) unsigned NOT NULL DEFAULT '1', `snmp_community` varchar(100) NOT NULL DEFAULT '', `snmp_username` varchar(50) NOT NULL, `snmp_password` varchar(50) NOT NULL, `snmp_auth_protocol` char(6) NOT NULL, `snmp_priv_passphrase` varchar(200) NOT NULL, `snmp_priv_protocol` char(6) NOT NULL, `snmp_engine_id` varchar(64) DEFAULT NULL, `snmp_port` mediumint(5) unsigned NOT NULL DEFAULT '161', `snmp_message_type` tinyint(1) NOT NULL, `notes` text, PRIMARY KEY (`id`), KEY `hostname` (`hostname`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='snmp notification receivers'; -- -- Dumping data for table `snmpagent_managers` -- -- -- Table structure for table `snmpagent_managers_notifications` -- CREATE TABLE `snmpagent_managers_notifications` ( `manager_id` int(8) NOT NULL, `notification` varchar(50) NOT NULL, `mib` varchar(50) NOT NULL, PRIMARY KEY(`manager_id`,`notification`,`mib`), KEY `mib` (`mib`), KEY `manager_id_notification` (`manager_id`,`notification`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='snmp notifications to receivers'; -- -- Dumping data for table `snmpagent_managers_notifications` -- -- -- Table structure for table `snmpagent_notifications_log` -- CREATE TABLE `snmpagent_notifications_log` ( `id` int(12) NOT NULL AUTO_INCREMENT, `time` int(24) NOT NULL, `severity` tinyint(1) NOT NULL, `manager_id` int(8) NOT NULL, `notification` varchar(190) NOT NULL, `mib` varchar(50) NOT NULL, `varbinds` varchar(5000) NOT NULL, PRIMARY KEY (`id`), KEY `time` (`time`), KEY `severity` (`severity`), KEY `manager_id_notification` (`manager_id`,`notification`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='logs snmp notifications to receivers'; -- -- Dumping data for table `snmpagent_notifications_log` -- -- -- Table structure for table `vdef` -- CREATE TABLE vdef ( id mediumint(8) unsigned NOT NULL auto_increment, hash varchar(32) NOT NULL default '', name varchar(255) NOT NULL default '', PRIMARY KEY (id), KEY `hash` (`hash`), KEY `name` (`name`(171)) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='vdef'; -- -- Dumping data for table `vdef` -- INSERT INTO vdef VALUES(1, 'e06ed529238448773038601afb3cf278', 'Maximum'); INSERT INTO vdef VALUES(2, 'e4872dda82092393d6459c831a50dc3b', 'Minimum'); INSERT INTO vdef VALUES(3, '5ce1061a46bb62f36840c80412d2e629', 'Average'); INSERT INTO vdef VALUES(4, '06bd3cbe802da6a0745ea5ba93af554a', 'Last (Current)'); INSERT INTO vdef VALUES(5, '631c1b9086f3979d6dcf5c7a6946f104', 'First'); INSERT INTO vdef VALUES(6, '6b5335843630b66f858ce6b7c61fc493', 'Total: Current Data Source'); INSERT INTO vdef VALUES(7, 'c80d12b0f030af3574da68b28826cd39', '95th Percentage: Current Data Source'); -- -- Table structure for table `vdef_items` -- CREATE TABLE vdef_items ( `id` mediumint(8) unsigned NOT NULL auto_increment, `hash` varchar(32) NOT NULL default '', `vdef_id` mediumint(8) unsigned NOT NULL default '0', `sequence` mediumint(8) unsigned NOT NULL default '0', `type` tinyint(2) NOT NULL default '0', `value` varchar(150) NOT NULL default '', PRIMARY KEY (id), KEY `vdef_id_sequence` (`vdef_id`,`sequence`) ) ENGINE=InnoDB ROW_FORMAT=Dynamic COMMENT='vdef items'; -- -- Dumping data for table `vdef_items` -- INSERT INTO vdef_items VALUES(1, '88d33bf9271ac2bdf490cf1784a342c1', 1, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(2, 'a307afab0c9b1779580039e3f7c4f6e5', 1, 2, 1, '1'); INSERT INTO vdef_items VALUES(3, '0945a96068bb57c80bfbd726cf1afa02', 2, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(4, '95a8df2eac60a89e8a8ca3ea3d019c44', 2, 2, 1, '2'); INSERT INTO vdef_items VALUES(5, 'cc2e1c47ec0b4f02eb13708cf6dac585', 3, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(6, 'a2fd796335b87d9ba54af6a855689507', 3, 2, 1, '3'); INSERT INTO vdef_items VALUES(7, 'a1d7974ee6018083a2053e0d0f7cb901', 4, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(8, '26fccba1c215439616bc1b83637ae7f3', 4, 2, 1, '5'); INSERT INTO vdef_items VALUES(9, 'a8993b265f4c5398f4a47c44b5b37a07', 5, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(10, '5a380d469d611719057c3695ce1e4eee', 5, 2, 1, '6'); INSERT INTO vdef_items VALUES(11, '65cfe546b17175fad41fcca98c057feb', 6, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(12, 'f330b5633c3517d7c62762cef091cc9e', 6, 2, 1, '7'); INSERT INTO vdef_items VALUES(13, 'f1bf2ecf54ca0565cf39c9c3f7e5394b', 7, 1, 4, 'CURRENT_DATA_SOURCE'); INSERT INTO vdef_items VALUES(14, '11a26f18feba3919be3af426670cba95', 7, 2, 6, '95'); INSERT INTO vdef_items VALUES(15, 'e7ae90275bc1efada07c19ca3472d9db', 7, 3, 1, '8'); -- -- Table structure for table `version` -- CREATE TABLE version ( cacti char(20) default '', PRIMARY KEY (cacti) ) ENGINE=InnoDB ROW_FORMAT=Dynamic; -- -- Dumping data for table `version` -- INSERT INTO version VALUES ('new_install'); cacti-release-1.2.19/cactid.php000077500000000000000000000173431413633772300162710ustar00rootroot00000000000000#!/usr/bin/env php = 2) { print 'The Cacti Daemon is still running' . PHP_EOL; return; } } else { fclose(STDERR); $STDERR = fopen('null', 'wb'); } print 'Starting Cacti Daemon ... '; if (!$foreground) { if (function_exists('pcntl_fork')) { // Close the database connection db_close(); // Fork the current process to daemonize $pid = pcntl_fork(); if ($pid == -1) { // Something went wrong print '[FAILED]' . PHP_EOL; exit(1); } elseif ($pid == 0) { // We are the child } else { cacti_log('NOTE: Cacti Daemon PID[' . getmypid() . '] Started on Device[' . gethostname() . ']'); admin_email(__('Cacti System Notice'), __('Notice: Cacti Daemon PID[' . getmypid() . '] Started on Device[' . gethostname() . ']', true, 'CACTID')); print '[OK]' . PHP_EOL; exit(0); } } else { // On Windows we run in foregroud mode print '[OK]' . PHP_EOL . '[NOTE] This system does not support forking.' . PHP_EOL; } } else { print '[OK]' . PHP_EOL . '[NOTE] The Cacti Daemon is running in foreground mode.' . PHP_EOL; } sleep(2); while (true) { wait_for_start($frequency); db_check_reconnect(); run_poller(); // Force Cacti to check the service start frequency dynamically $frequency = -1; } function wait_for_start($frequency = -1) { $prev_time = -1; $i = 0; while (true) { if ($frequency <= 0) { $frequency = read_config_option('cron_interval', true); if (empty($frequency)) { $frequency = 300; } } $now = time(); $offset = $now % $frequency; if ($i % 5 == 0) { debug('PrevOS: ' . $prev_time . ', CurrOS: ' . $offset . ', Freq: ' . $frequency); } if ($prev_time > 0) { if ($offset < $prev_time) { debug('Time to Run Poller'); break; } } $prev_time = $offset; $i++; sleep(1); } return $frequency; } function run_poller() { global $config, $debug; debug('Cacti Data Collector'); $command = ' -q ' . $config['base_path'] . '/poller.php --force' . ($debug ? ' --debug':''); debug('Command Line is: ' . $command); exec_background(read_config_option('path_php_binary'), $command); } function get_options() { $parms = $_SERVER['argv']; array_shift($parms); $options = array(); if (sizeof($parms)) { $shortopts = 'VvHh'; $longopts = array( 'foreground', 'debug', 'version', 'help' ); $options = getopt($shortopts, $longopts); foreach($options as $arg => $value) { switch($arg) { case 'foreground': case 'debug': break; case 'version': case 'V': case 'v': display_version(); exit(0); case 'help': case 'H': case 'h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)" . PHP_EOL . PHP_EOL; display_help(); exit(1); } } } return $options; } function db_check_reconnect() { chdir(dirname(__FILE__)); include('./include/config.php'); if (!isset($database_ssl_key)) $database_ssl_key = false; if (!isset($database_ssl_cert)) $database_ssl_cert = false; if (!isset($database_ssl_ca)) $database_ssl_ca = false; $version = db_fetch_cell('SELECT cacti FROM version', 'cacti', false); if ($version === false) { debug('Connection went away. Reconnecting...'); db_close(); // Connect to the database server db_connect_real( $database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port, $database_retries, $database_ssl, $database_ssl_key, $database_ssl_cert, $database_ssl_ca ); } } function debug($string) { global $debug; if ($debug) { $output = 'DEBUG: ' . trim($string); print $output . PHP_EOL; } } function display_version() { global $config; print 'The Cacti Daemon (cactid), Version ' . CACTI_VERSION . ', ' . COPYRIGHT_YEARS . PHP_EOL; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print PHP_EOL . 'usage: cactid.php [ --foreground ] [ --debug ]' . PHP_EOL . PHP_EOL; print 'Daemon for Cacti data collection, otherwise known as cactid.' . PHP_EOL; print 'optional:' . PHP_EOL; print ' --foreground Run cactid in foreground mode, otherwise this is a forking daemon.' . PHP_EOL; print ' --debug Used for debugging in --foreground mode.' . PHP_EOL; } cacti-release-1.2.19/cdef.php000066400000000000000000000711241413633772300157350ustar00rootroot00000000000000 __('Delete'), 2 => __('Duplicate') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'item_remove_confirm': cdef_item_remove_confirm(); break; case 'item_remove': cdef_item_remove(); break; case 'item_movedown': get_filter_request_var('cdef_id'); item_movedown(); header('Location: cdef.php?action=edit&id=' . get_request_var('cdef_id')); break; case 'item_moveup': get_filter_request_var('cdef_id'); item_moveup(); header('Location: cdef.php?action=edit&id=' . get_request_var('cdef_id')); break; case 'item_remove': get_filter_request_var('cdef_id'); item_remove(); header('Location: cdef.php?action=edit&id=' . get_request_var('cdef_id')); break; case 'item_edit': top_header(); item_edit(); bottom_footer(); break; case 'edit': top_header(); cdef_edit(); bottom_footer(); break; case 'ajax_dnd': cdef_item_dnd(); break; default: top_header(); cdef(); bottom_footer(); break; } /* -------------------------- Global Form Functions -------------------------- */ function draw_cdef_preview($cdef_id) { ?>
    cdef=
    ', $cdef['name'], $cdef_title); /* create new entry: host_template */ $save['id'] = 0; $save['hash'] = get_hash_cdef(0); foreach ($fields_cdef_edit as $field => $array) { if (!preg_match('/^hidden/', $array['method'])) { $save[$field] = $cdef[$field]; } } $cdef_id = sql_save($save, 'cdef'); /* create new entry(s): cdef_items */ if (cacti_sizeof($cdef_items) > 0) { foreach ($cdef_items as $cdef_item) { unset($save); $save['id'] = 0; $save['hash'] = get_hash_cdef(0, 'cdef_item'); $save['cdef_id'] = $cdef_id; $save['sequence'] = $cdef_item['sequence']; $save['type'] = $cdef_item['type']; $save['value'] = $cdef_item['value']; sql_save($save, 'cdef_items'); } } } /* ------------------------ The 'actions' function ------------------------ */ function form_actions() { global $cdef_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM cdef WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM cdef_items WHERE ' . array_to_sql_or($selected_items, 'cdef_id')); } elseif (get_nfilter_request_var('drp_action') == '2') { /* duplicate */ for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $cdef_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM cdef WHERE id = ?', array($matches[1]))) . '
  • '; $cdef_array[$i] = $matches[1]; $i++; } } top_header(); form_start('cdef.php'); html_start_box($cdef_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($cdef_array) && cacti_sizeof($cdef_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

    " . __n('Click \'Continue\' to delete the following CDEF.', 'Click \'Continue\' to delete all following CDEFs.', cacti_sizeof($cdef_array)) . "

      $cdef_list
    \n"; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '2') { /* duplicate */ print "

    " . __n('Click \'Continue\' to duplicate the following CDEF. You can optionally change the title format for the new CDEF.', 'Click \'Continue\' to duplicate the following CDEFs. You can optionally change the title format for the new CDEFs.', cacti_sizeof($cdef_array)) . "

      $cdef_list

    " . __('Title Format:') . '
    '; form_text_box('title_format', ' (1)', '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } } else { raise_message(40); header('Location: cdef.php?header=false'); exit; } print " $save_html "; html_end_box(); form_end(); bottom_footer(); } /* -------------------------- CDEF Item Functions -------------------------- */ function cdef_item_remove_confirm() { global $cdef_functions, $cdef_item_types, $custom_cdef_data_source_types; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('cdef_id'); /* ==================================================== */ /* sort the cdef functions */ asort($cdef_functions); form_start('cdef.php'); html_start_box('', '100%', '', '3', 'center', ''); $cdef = db_fetch_row_prepared('SELECT * FROM cdef WHERE id = ?', array(get_request_var('id'))); $cdef_item = db_fetch_row_prepared('SELECT * FROM cdef_items WHERE id = ?', array(get_request_var('cdef_id'))); ?>


    :

    ' onClick='$("#cdialog").dialog("close");$(".deleteMarker").blur();' name='cancel'> ' name='continue' title=''> array( 'method' => 'drop_array', 'friendly_name' => __('CDEF Item Type'), 'description' => __('Choose what type of CDEF item this is.'), 'value' => $current_type, 'array' => $cdef_item_types ), 'value' => array( 'method' => 'drop_array', 'friendly_name' => __('CDEF Item Value'), 'description' => __('Enter a value for this CDEF item.'), 'value' => (isset($cdef['value']) ? $cdef['value']:'') ), 'id' => array( 'method' => 'hidden', 'value' => isset_request_var('id') ? get_request_var('id') : '0', ), 'type' => array( 'method' => 'hidden', 'value' => $current_type ), 'cdef_id' => array( 'method' => 'hidden', 'value' => get_request_var('cdef_id') ), 'save_component_item' => array( 'method' => 'hidden', 'value' => '1' ) ); switch ($current_type) { case '1': $form_cdef['value']['array'] = $cdef_functions; break; case '2': $form_cdef['value']['array'] = $cdef_operators; break; case '4': $form_cdef['value']['array'] = $custom_data_source_types; break; case '5': $form_cdef['value']['method'] = 'drop_sql'; $form_cdef['value']['sql'] = 'SELECT name, id FROM cdef WHERE `system` = 0 ORDER BY name'; break; case '6': $form_cdef['value']['method'] = 'textbox'; $form_cdef['value']['max_length'] = '255'; $form_cdef['value']['size'] = '30'; break; } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($form_cdef, $cdef) ) ); ?> array('no_form_tag' => true), 'fields' => inject_form_variables($fields_cdef_edit, (isset($cdef) ? $cdef : array())) ) ); html_end_box(true, true); if (!isempty_request_var('id')) { html_start_box('', '100%', '', '3', 'center', ''); draw_cdef_preview(get_request_var('id')); html_end_box(); html_start_box(__('CDEF Items'), '100%', '', '3', 'center', 'cdef.php?action=item_edit&cdef_id=' . $cdef['id']); $display_text = array( array('display' => __('Item'), 'align' => 'left'), array('display' => __('Item Value'), 'align' => 'left') ); html_header($display_text, 2); $cdef_items = db_fetch_assoc_prepared('SELECT * FROM cdef_items WHERE cdef_id = ? ORDER BY sequence', array(get_request_var('id'))); $i = 1; $total_items = cacti_sizeof($cdef_items); if (cacti_sizeof($cdef_items)) { foreach ($cdef_items as $cdef_item) { form_alternate_row('line' . $cdef_item['id'], true, true);?> '> : 0) { echo ''; } else { echo ''; } if ($i > 1 && $i <= $total_items) { echo ''; } else { echo ''; } } ?> ' class='delete deleteMarker fa fa-times' title='' href='#'> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_graphs' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_cdef'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('CDEFs'), '100%', '', '3', 'center', 'cdef.php?action=edit'); ?>
    '> > ' title=''> ' title=''>
    0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(`rows`) FROM ( SELECT cd.id AS `rows`, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs FROM cdef AS cd LEFT JOIN ( SELECT DISTINCT cdef_id, local_graph_id, graph_template_id FROM graph_templates_item ) AS gti ON gti.cdef_id=cd.id $sql_where GROUP BY cd.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $cdef_list = db_fetch_assoc("SELECT rs.*, SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs FROM ( SELECT cd.*, gti.local_graph_id FROM cdef AS cd LEFT JOIN ( SELECT DISTINCT cdef_id, local_graph_id, graph_template_id FROM graph_templates_item ) AS gti ON gti.cdef_id=cd.id WHERE `system` = 0 GROUP BY cd.id, gti.graph_template_id, gti.local_graph_id ) AS rs $sql_where GROUP BY rs.id $sql_having $sql_order $sql_limit"); $nav = html_nav_bar('cdef.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('CDEFs'), 'page', 'main'); form_start('cdef.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'name' => array('display' => __('CDEF Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this CDEF.')), 'nosort' => array('display' => __('Deletable'), 'align' => 'right', 'tip' => __('CDEFs that are in use cannot be Deleted. In use is defined as being referenced by a Graph or a Graph Template.')), 'graphs' => array('display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs using this CDEF.')), 'templates' => array('display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs Templates using this CDEF.'))); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($cdef_list)) { foreach ($cdef_list as $cdef) { if ($cdef['graphs'] == 0 && $cdef['templates'] == 0) { $disabled = false; } else { $disabled = true; } form_alternate_row('line' . $cdef['id'], false, $disabled); form_selectable_cell(filter_value($cdef['name'], get_request_var('filter'), 'cdef.php?action=edit&id=' . $cdef['id']), $cdef['id']); form_selectable_cell($disabled ? __('No'):__('Yes'), $cdef['id'], '', 'right'); form_selectable_cell(number_format_i18n($cdef['graphs'], '-1'), $cdef['id'], '', 'right'); form_selectable_cell(number_format_i18n($cdef['templates'], '-1'), $cdef['id'], '', 'right'); form_checkbox_cell($cdef['name'], $cdef['id'], $disabled); form_end_row(); } } else { print "" . __('No CDEFs') . "\n"; } html_end_box(false); if (cacti_sizeof($cdef_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($cdef_actions); form_end(); } cacti-release-1.2.19/cli/000077500000000000000000000000001413633772300150655ustar00rootroot00000000000000cacti-release-1.2.19/cli/.htaccess000066400000000000000000000002521413633772300166620ustar00rootroot00000000000000# Apache 2.4 Require all denied # Apache 2.2 Order Allow,Deny Deny from all cacti-release-1.2.19/cli/add_data_query.php000077500000000000000000000173441413633772300205600ustar00rootroot00000000000000#!/usr/bin/env php = DATA_QUERY_AUTOINDEX_NONE) && ($value <= DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION)) { $reindex_method = $value; } else { switch (strtolower($value)) { case 'none': $reindex_method = DATA_QUERY_AUTOINDEX_NONE; break; case 'uptime': $reindex_method = DATA_QUERY_AUTOINDEX_BACKWARDS_UPTIME; break; case 'index': $reindex_method = DATA_QUERY_AUTOINDEX_INDEX_NUM_CHANGE; break; case 'fields': $reindex_method = DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION; break; default: print "ERROR: You must supply a valid reindex method for all hosts!\n"; exit(1); } } break; case '--version': case '-V': case '-v': display_version(); exit(0); case '--help': case '-H': case '-h': display_help(); exit(0); case '--list-hosts': $displayHosts = true; break; case '--list-data-queries': $displayDataQueries = true; break; case '--quiet': $quietMode = true; break; default: print "ERROR: Invalid Argument: ($arg)\n\n"; display_help(); exit(1); } } /* list options, recognizing $quietMode */ if ($displayHosts) { $hosts = getHosts(); displayHosts($hosts, $quietMode); exit; } if ($displayDataQueries) { $data_queries = getSNMPQueries(); displaySNMPQueries($data_queries, $quietMode); exit; } /* * verify required parameters * for update / insert options */ if (!isset($host_id)) { print "ERROR: You must supply a valid host-id for all hosts!\n"; exit(1); } if (!isset($data_query_id)) { print "ERROR: You must supply a valid data-query-id for all hosts!\n"; exit(1); } if (!isset($reindex_method)) { print "ERROR: You must supply a valid reindex-method for all hosts!\n"; exit(1); } /* * verify valid host id and get a name for it */ $host_name = db_fetch_cell('SELECT hostname FROM host WHERE id = ' . $host_id); if (!isset($host_name)) { print "ERROR: Unknown Host Id ($host_id)\n"; exit(1); } /* * verify valid data query and get a name for it */ $data_query_name = db_fetch_cell('SELECT name FROM snmp_query WHERE id = ' . $data_query_id); if (!isset($data_query_name)) { print "ERROR: Unknown Data Query Id ($data_query_id)\n"; exit(1); } /* * Now, add the data query and run it once to get the cache filled */ $exists_already = db_fetch_cell("SELECT host_id FROM host_snmp_query WHERE host_id=$host_id AND snmp_query_id=$data_query_id AND reindex_method=$reindex_method"); if ((isset($exists_already)) && ($exists_already > 0)) { print "ERROR: Data Query is already associated for host: ($host_id: $host_name) data query ($data_query_id: $data_query_name) reindex method ($reindex_method: " . $reindex_types[$reindex_method] . ")\n"; exit(1); } else { db_execute('REPLACE INTO host_snmp_query (host_id,snmp_query_id,reindex_method) VALUES (' . $host_id . ',' . $data_query_id . ',' . $reindex_method . ')'); /* recache snmp data */ run_data_query($host_id, $data_query_id); } if (is_error_message()) { print "ERROR: Failed to add this data query for host ($host_id: $host_name) data query ($data_query_id: $data_query_name) reindex method ($reindex_method: " . $reindex_types[$reindex_method] . ")\n"; exit(1); } else { print "Success - Host ($host_id: $host_name) data query ($data_query_id: $data_query_name) reindex method ($reindex_method: " . $reindex_types[$reindex_method] . ")\n"; exit; } } else { display_help(); exit; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Data Query Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: add_data_query.php --host-id=[ID] --data-query-id=[dq_id] --reindex-method=[method] [--quiet]\n\n"; print "Required Options:\n"; print " --host-id the numerical ID of the host\n"; print " --data-query-id the numerical ID of the data_query to be added\n"; print " --reindex-method the reindex method to be used for that data query\n"; print " 0|None = no reindexing\n"; print " 1|Uptime = Uptime goes Backwards\n"; print " 2|Index = Index Count Changed\n"; print " 3|Fields = Verify all Fields\n\n"; print "List Options:\n"; print " --list-hosts\n"; print " --list-data-queries\n"; print " --quiet - batch mode value return\n\n"; print "If the data query was already associated, it will be reindexed.\n\n"; } cacti-release-1.2.19/cli/add_datasource.php000077500000000000000000000077561413633772300205620ustar00rootroot00000000000000#!/usr/bin/env php function form_save->save_component_data_source_new $save["id"] = "0"; $save["data_template_id"] = $data_template_id; $save["host_id"] = $host_id; $local_data_id = sql_save($save, "data_local"); change_data_template($local_data_id, $data_template_id); /* update the title cache */ update_data_source_title_cache($local_data_id); /* update host data */ if (!empty($host_id)) { push_out_host($host_id, $local_data_id); } print "DS Added - DS[$local_data_id]\n"; /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Data Source, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } function display_help() { display_version(); print "usage: add_datasource.php --host-id=[ID] --data-template-id=[ID]\n\n"; print "Cacti utility for adding datasources via a command line interface.\n\n"; print "--host-id=id - The host id\n"; print "--data-template-id=id - The numerical ID of the data template to be added\n"; } cacti-release-1.2.19/cli/add_device.php000077500000000000000000000365411413633772300176610ustar00rootroot00000000000000#!/usr/bin/env php 0)) { $ping_port = $value; } else { print "ERROR: Invalid Ping Port: ($value)\n\n"; display_help(); exit(1); } break; case '--ping_retries': if (is_numeric($value) && ($value > 0)) { $ping_retries = $value; } else { print "ERROR: Invalid Ping Retries: ($value)\n\n"; display_help(); exit(1); } break; case '--max_oids': if (is_numeric($value) && ($value > 0)) { $max_oids = $value; } else { print "ERROR: Invalid Max OIDS: ($value)\n\n"; display_help(); exit(1); } break; case '--bulk_walk': if (is_numeric($value) && $value >= -1 && $value != 0) { $bulk_walk_size = $value; } else { print "ERROR: Invalid Bulk Walk Size: ($value)\n\n"; display_help(); exit(1); } case '--version': case '-V': case '-v': display_version(); exit(0); case '--help': case '-H': case '-h': display_help(); exit(0); case '--list-communities': $displayCommunities = true; break; case '--list-host-templates': $displayHostTemplates = true; break; case '--quiet': $quietMode = true; break; default: print "ERROR: Invalid Argument: ($arg)\n\n"; display_help(); exit(1); } } if ($displayCommunities) { displayCommunities($quietMode); exit(0); } if ($displayHostTemplates) { displayHostTemplates(getHostTemplates(), $quietMode); exit(0); } /* process the various lists into validation arrays */ $host_templates = getHostTemplates(); $hosts = getHostsByDescription(); $addresses = getAddresses(); /* process templates */ if (!isset($host_templates[$template_id])) { print "ERROR: Unknown template id ($template_id)\n"; exit(1); } /* process host description */ if (isset($hosts[$description])) { db_execute("UPDATE host SET hostname='$ip' WHERE deleted = '' AND id=" . $hosts[$description]); print "This host already exists in the database ($description) device-id: (" . $hosts[$description] . ")\n"; exit(1); } if ($description == '') { print "ERROR: You must supply a description for all hosts!\n"; exit(1); } if ($ip == '') { print "ERROR: You must supply an IP address for all hosts!\n"; exit(1); } if ($snmp_ver > 3 || $snmp_ver < 0 || !is_numeric($snmp_ver)) { print "ERROR: The snmp version must be between 0 and 3. If you did not specify one, goto Configuration > Settings > Device Defaults and resave your defaults.\n"; exit(1); } /* process ip */ if (isset($addresses[$ip])) { $id = $addresses[$ip]; $phost = db_fetch_row_prepared('SELECT * FROM host WHERE id = ?', array($id)); $fail = false; if ($phost['snmp_version'] < '3' && $snmp_ver < '3') { if ($snmp_ver == 0 && $proxy) { // proxy but for no snmp } elseif ($phost['snmp_community'] != $community || $phost['snmp_port'] != $snmp_port) { if ($proxy) { // assuming an snmp-proxy } else { print "ERROR: This IP ($id) already exists in the database and --proxy was not specified.\n"; exit(1); } } else { $fail = true; } } elseif ($phost['snmp_version'] != $snmp_ver) { // assumeing a proxy } elseif ($phost['snmp_version'] == '3' && $snmp_ver == '3') { $changed = 0; $changed += ($phost['snmp_username'] != $username ? 1:0); $changed += ($phost['snmp_context'] != $snmp_context ? 1:0); $changed += ($phost['snmp_engine_id'] != $snmp_engine_id ? 1:0); $changed += ($phost['snmp_auth_protocol'] != $snmp_auth_protocol ? 1:0); $changed += ($phost['snmp_priv_protocol'] != $snmp_priv_protocol ? 1:0); if ($changed > 0) { if ($proxy) { // assuming a proxy } else { print "ERROR: This IP ($id) already exists in the database and --proxy was not specified.\n"; exit(1); } } else { $fail = true; } } else { $fail = true; } if ($fail) { db_execute("UPDATE host SET description = '$description' WHERE deleted = '' AND id = " . $addresses[$ip]); print "ERROR: This IP already exists in the database ($ip) device-id: (" . $addresses[$ip] . ")\n"; exit(1); } } if (!is_numeric($site_id) || $site_id < 0) { print "ERROR: You have specified an invalid site id!\n"; exit(1); } if (!is_numeric($poller_id) || $poller_id < 0) { print "ERROR: You have specified an invalid poller id!\n"; exit(1); } /* process snmp information */ if ($snmp_ver < 0 || $snmp_ver > 3) { print "ERROR: Invalid snmp version ($snmp_ver)\n"; exit(1); } elseif ($snmp_ver > 0) { if ($snmp_port <= 1 || $snmp_port > 65534) { print "ERROR: Invalid port. Valid values are from 1-65534\n"; exit(1); } if ($snmp_timeout <= 0 || $snmp_timeout > 20000) { print "ERROR: Invalid timeout. Valid values are from 1 to 20000\n"; exit(1); } } /* community/user/password verification */ if ($snmp_ver < 3) { /* snmp community can be blank */ } else { if ($snmp_username == "" || $snmp_password == "") { print "ERROR: When using snmpv3 you must supply an username and password\n"; exit(1); } } /* validate the disable state */ if ($disable != 1 && $disable != 0) { print "ERROR: Invalid disable flag ($disable)\n"; exit(1); } if ($disable == 0) { $disable = ""; } else { $disable = "on"; } print "Adding $description ($ip) as \"" . $host_templates[$template_id] . "\" using SNMP v$snmp_ver with community \"$community\"\n"; $host_id = api_device_save('0', $template_id, $description, $ip, $community, $snmp_ver, $snmp_username, $snmp_password, $snmp_port, $snmp_timeout, $disable, $avail, $ping_method, $ping_port, $ping_timeout, $ping_retries, $notes, $snmp_auth_protocol, $snmp_priv_passphrase, $snmp_priv_protocol, $snmp_context, $snmp_engine_id, $max_oids, $device_threads, $poller_id, $site_id, $external_id, $location, $bulk_walk_size); if (is_error_message()) { print "ERROR: Failed to add this device\n"; exit(1); } else { print "Success - new device-id: ($host_id)\n"; exit(0); } } else { display_help(); exit(0); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Device Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: add_device.php --description=[description] --ip=[IP] --template=[ID] [--notes=\"[]\"] [--disable]\n"; print " [--poller=[id]] [--site=[id] [--external-id=[S]] [--proxy] [--threads=[1]\n"; print " [--avail=[ping]] --ping_method=[icmp] --ping_port=[N/A, 1-65534] --ping_timeout=[N] --ping_retries=[2]\n"; print " [--version=[0|1|2|3]] [--community=] [--port=161] [--timeout=500]\n"; print " [--username= --password=] [--authproto=] [--privpass= --privproto=] [--context=] [--engineid=]\n"; print " [--quiet]\n\n"; print "Required:\n"; print " --description the name that will be displayed by Cacti in the graphs\n"; print " --ip self explanatory (can also be a FQDN)\n\n"; print "Optional:\n"; print " --proxy if specified, allows adding a second host with same ip address\n"; print " --template 0, is a number (read below to get a list of templates)\n"; print " --location '', The physical location of the Device.\n"; print " --notes '', General information about this host. Must be enclosed using double quotes.\n"; print " --external-id '', An external ID to align Cacti devices with devices from other systems.\n"; print " --disable 0, 1 to add this host but to disable checks and 0 to enable it\n"; print " --poller 0, numeric poller id that will perform data collection for the device.\n"; print " --site 0, numeric site id that will be associated with the device.\n"; print " --threads 1, numeric number of threads to poll device with.\n"; print " --avail pingsnmp, [ping][none, snmp, pingsnmp, pingorsnmp]\n"; print " --ping_method tcp, icmp|tcp|udp\n"; print " --ping_port '', 1-65534\n"; print " --ping_retries 2, the number of time to attempt to communicate with a host\n"; print " --ping_timeout N, the ping timeout in milliseconds. Defaults to database setting.\n"; print " --version 1, 0|1|2|3, snmp version. 0 for no snmp\n"; print " --community '', snmp community string for snmpv1 and snmpv2. Leave blank for no community\n"; print " --port 161\n"; print " --timeout 500\n"; print " --username '', snmp username for snmpv3\n"; print " --password '', snmp password for snmpv3\n"; print " --authproto '', snmp authentication protocol for snmpv3\n"; print " --privpass '', snmp privacy passphrase for snmpv3\n"; print " --privproto '', snmp privacy protocol for snmpv3\n"; print " --context '', snmp context for snmpv3\n"; print " --engineid '', snmp engineid for snmpv3\n"; print " --max_oids 10, 1-60, the number of OIDs that can be obtained in a single SNMP Get request\n\n"; print " --bulk_walk -1, 1-60, the bulk walk chunk size that will be used for bulk walks. Use -1 for auto-tune.\n\n"; print "List Options:\n"; print " --list-host-templates\n"; print " --list-communities\n"; print " --quiet - batch mode value return\n\n"; } cacti-release-1.2.19/cli/add_graph_template.php000077500000000000000000000134461413633772300214150ustar00rootroot00000000000000#!/usr/bin/env php 0)) { print "ERROR: Graph Template is already associated for host: ($host_id: $host_name) - graph-template: ($graph_template_id: $graph_template_name)\n"; exit(1); } else { db_execute("replace into host_graph (host_id,graph_template_id) values (" . $host_id . "," . $graph_template_id . ")"); automation_hook_graph_template($host_id, $graph_template_id); api_plugin_hook_function('add_graph_template_to_host', array("host_id" => $host_id, "graph_template_id" => $graph_template_id)); } if (is_error_message()) { print "ERROR: Failed to add this graph template for host: ($host_id: $host_name) - graph-template: ($graph_template_id: $graph_template_name)\n"; exit(1); } else { print "Success: Graph Template associated for host: ($host_id: $host_name) - graph-template: ($graph_template_id: $graph_template_name)\n"; exit(0); } } else { display_help(); exit(0); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Graph Template Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: add_graph_template.php --host-id=[ID] --graph-template-id=[ID]\n"; print " [--quiet]\n\n"; print "Required:\n"; print " --host-id the numerical ID of the host\n"; print " --graph-template-id the numerical ID of the graph template to be added\n\n"; print "List Options:\n"; print " --list-hosts\n"; print " --list-graph-templates\n"; print " --quiet - batch mode value return\n\n"; } cacti-release-1.2.19/cli/add_graphs.php000077500000000000000000000564731413633772300177140ustar00rootroot00000000000000#!/usr/bin/env php $value) { $allow_multi = false; switch($arg) { case 'graph-type': $graph_type = $value; break; case 'graph-title': $graphTitle = $value; break; case 'graph-template-id': $template_id = $value; break; case 'host-template-id': $hostTemplateId = $value; break; case 'host-id': $host_id = $value; break; case 'input-fields': $cgInputFields = $value; break; case 'snmp-query-id': $dsGraph['snmpQueryId'] = $value; break; case 'snmp-query-type-id': $dsGraph['snmpQueryType'] = $value; break; case 'snmp-field': if (!is_array($value)) { $value = array($value); } $dsGraph['snmpField'] = $value; $allow_multi = true; break; case 'snmp-value-regex': if (!is_array($value)) { $value = array($value); } foreach($value as $item) { if (!validate_is_regex($item)) { print "ERROR: Regex specified '$item', is not a valid Regex!\n"; exit(1); } } $dsGraph['snmpValueRegex'] = $value; $allow_multi = true; break; case 'snmp-value': if (!is_array($value)) { $value = array($value); } $dsGraph['snmpValue'] = $value; $allow_multi = true; break; case 'reindex-method': if (is_numeric($value) && ($value >= DATA_QUERY_AUTOINDEX_NONE) && ($value <= DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION)) { $dsGraph['reindex_method'] = $value; } else { switch (strtolower($value)) { case 'none': $dsGraph['reindex_method'] = DATA_QUERY_AUTOINDEX_NONE; break; case 'uptime': $dsGraph['reindex_method'] = DATA_QUERY_AUTOINDEX_BACKWARDS_UPTIME; break; case 'index': $dsGraph['reindex_method'] = DATA_QUERY_AUTOINDEX_INDEX_NUM_CHANGE; break; case 'fields': $dsGraph['reindex_method'] = DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION; break; default: print "ERROR: You must supply a valid reindex method for this graph!\n"; exit(1); } } break; case 'list-hosts': $listHosts = true; break; case 'list-snmp-fields': $listSNMPFields = true; break; case 'list-snmp-values': $listSNMPValues = true; break; case 'list-query-types': $listQueryTypes = true; break; case 'list-snmp-queries': $listSNMPQueries = true; break; case 'force': $force = true; break; case 'quiet': $quietMode = true; break; case 'list-input-fields': $listInputFields = true; break; case 'list-graph-templates': $listGraphTemplates = true; break; case 'version': case 'V': case 'v': display_version(); exit(0); case 'help': case 'H': case 'h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)\n\n"; display_help(); exit(1); } if (!$allow_multi && isset($value) && is_array($value)) { print "ERROR: Multiple values specified for non-multi argument: ($arg)\n\n"; exit(1); } } if ($listGraphTemplates) { /* is a Host Template Id is given, print the related Graph Templates */ if ($hostTemplateId > 0) { $graphTemplates = getGraphTemplatesByHostTemplate($hostTemplateId); if (!cacti_sizeof($graphTemplates)) { print "ERROR: You must supply a valid --host-template-id before you can list its graph templates\n"; print "Try --list-graph-template-id --host-template-id=[ID]\n"; exit(1); } } displayGraphTemplates($graphTemplates, $quietMode); exit(0); } if ($listInputFields) { if ($template_id > 0) { $input_fields = getInputFields($template_id, $quietMode); displayInputFields($input_fields, $quietMode); } else { print "ERROR: You must supply an graph-template-id before you can list its input fields\n"; print "Try --graph-template-id=[ID] --list-input-fields\n"; exit(1); } exit(0); } if ($listHosts) { displayHosts($hosts, $quietMode); exit(0); } /* get the existing snmp queries */ $snmpQueries = getSNMPQueries(); if ($listSNMPQueries) { displaySNMPQueries($snmpQueries, $quietMode); exit(0); } /* Some sanity checking... */ if ($dsGraph['snmpQueryId'] != '') { if (!isset($snmpQueries[$dsGraph['snmpQueryId']])) { print 'ERROR: Unknown snmp-query-id (' . $dsGraph['snmpQueryId'] . ")\n"; print "Try --list-snmp-queries\n"; exit(1); } /* get the snmp query types for comparison */ $snmp_query_types = getSNMPQueryTypes($dsGraph['snmpQueryId']); if ($listQueryTypes) { displayQueryTypes($snmp_query_types, $quietMode); exit(0); } if ($dsGraph['snmpQueryType'] != '') { if (!isset($snmp_query_types[$dsGraph['snmpQueryType']])) { print 'ERROR: Unknown snmp-query-type-id (' . $dsGraph['snmpQueryType'] . ")\n"; print 'Try --snmp-query-id=' . $dsGraph['snmpQueryId'] . " --list-query-types\n"; exit(1); } } if (!($listHosts || # you really want to create a new graph $listSNMPFields || # add this check to avoid reindexing on any list option $listSNMPValues || $listQueryTypes || $listSNMPQueries || $listInputFields)) { /* if data query is not yet associated, * add it and run it once to get the cache filled */ /* is this data query already associated (independent of the reindex method)? */ $exists_already = db_fetch_cell_prepared('SELECT COUNT(host_id) FROM host_snmp_query WHERE host_id = ? AND snmp_query_id = ?', array($host_id, $dsGraph['snmpQueryId'])); if ((isset($exists_already)) && ($exists_already > 0)) { /* yes: do nothing, everything's fine */ } else { db_execute_prepared('REPLACE INTO host_snmp_query (host_id, snmp_query_id, reindex_method) VALUES (?, ?, ?)', array($host_id, $dsGraph['snmpQueryId'], $dsGraph['reindex_method'])); /* recache snmp data, this is time consuming, * but should happen only once even if multiple graphs * are added for the same data query * because we checked above, if dq was already associated */ run_data_query($host_id, $dsGraph['snmpQueryId']); } } } /* Verify the host's existance */ if (!isset($hosts[$host_id]) || $host_id == 0) { print "ERROR: Unknown Host ID ($host_id)\n"; print "Try --list-hosts\n"; exit(1); } /* process the snmp fields */ if ($graph_type == 'dq' || $listSNMPFields || $listSNMPValues) { $snmpFields = getSNMPFields($host_id, $dsGraph['snmpQueryId']); if ($listSNMPFields) { displaySNMPFields($snmpFields, $host_id, $quietMode); exit(0); } $snmpValues = array(); /* More sanity checking */ /* Testing SnmpValues and snmpFields args */ if ($dsGraph['snmpValue'] and $dsGraph['snmpValueRegex'] ) { print "ERROR: You can't supply --snmp-value and --snmp-value-regex at the same time\n"; exit(1); } $nbSnmpFields = cacti_sizeof($dsGraph['snmpField']); $nbSnmpValues = cacti_sizeof($dsGraph['snmpValue']); $nbSnmpValuesRegex = cacti_sizeof($dsGraph['snmpValueRegex']); if ($nbSnmpValues) { if ($nbSnmpFields != $nbSnmpValues) { print "ERROR: number of --snmp-field and --snmp-value does not match\n"; exit(1); } } elseif ($nbSnmpValuesRegex) { if ($nbSnmpFields != $nbSnmpValuesRegex) { print "ERROR: number of --snmp-field ($nbSnmpFields) and --snmp-value-regex ($nbSnmpValuesRegex) does not match\n"; exit(1); } } elseif (!$listSNMPValues) { print "ERROR: You must supply a --snmp-value or --snmp-value-regex option with --snmp-field\n"; exit(1); } $index_filter = 0; foreach($dsGraph['snmpField'] as $snmpField) { if ($snmpField != '') { if (!isset($snmpFields[$snmpField] )) { print 'ERROR: Unknown snmp-field ' . $dsGraph['snmpField'] . " for host $host_id\n"; print "Try --list-snmp-fields\n"; exit(1); } } $snmpValues = getSNMPValues($host_id, $snmpField, $dsGraph['snmpQueryId']); $snmpValue = ''; $snmpValueRegex = ''; if ($dsGraph['snmpValue']) { $snmpValue = $dsGraph['snmpValue'][$index_filter]; } else { $snmpValueRegex = $dsGraph['snmpValueRegex'][$index_filter]; } if ($snmpValue) { $ok = false; foreach ($snmpValues as $snmpValueKnown => $snmpValueSet) { if ($snmpValue == $snmpValueKnown) { $ok = true; break; } } if (!$ok) { print "ERROR: Unknown snmp-value for field $snmpField - $snmpValue\n"; print "Try --snmp-field=$snmpField --list-snmp-values\n"; exit(1); } } elseif ($snmpValueRegex) { $ok = false; foreach ($snmpValues as $snmpValueKnown => $snmpValueSet) { if (preg_match("/$snmpValueRegex/i", $snmpValueKnown)) { $ok = true; break; } } if (!$ok) { print "ERROR: Unknown snmp-value for field $snmpField - $snmpValue\n"; print "Try --snmp-field=$snmpField --list-snmp-values\n"; exit(1); } } $index_filter++; } if ($listSNMPValues) { if (!$dsGraph['snmpField']) { print "ERROR: You must supply an snmp-field before you can list its values\n"; print "Try --list-snmp-fields\n"; exit(1); } if (cacti_sizeof($dsGraph['snmpField'])) { foreach($dsGraph['snmpField'] as $snmpField) { if ($snmpField = "") { print "ERROR: You must supply a valid snmp-field before you can list its values\n"; print "Try --list-snmp-fields\n"; exit(1); } displaySNMPValues($snmpValues, $host_id, $snmpField, $quietMode); } } exit(0); } } if (!isset($graphTemplates[$template_id])) { print 'ERROR: Unknown graph-template-id (' . $template_id . ")\n"; print "Try --list-graph-templates\n"; exit(1); } if ((!isset($template_id)) || (!isset($host_id))) { print "ERROR: Must have at least a host-id and a graph-template-id\n\n"; display_help(); exit(1); } if ($cgInputFields != '') { $fields = explode(' ', $cgInputFields); if ($template_id > 0) { $input_fields = getInputFields($template_id, $quietMode); } if (cacti_sizeof($fields)) { foreach ($fields as $option) { $data_template_id = 0; $option_value = explode('=', $option); if (substr_count($option_value[0], ':')) { $compound = explode(':', $option_value[0]); $data_template_id = $compound[0]; $field_name = $compound[1]; } else { $field_name = $option_value[0]; } /* check for the input fields existance */ $field_found = false; if (cacti_sizeof($input_fields)) { foreach ($input_fields as $key => $row) { if (substr_count($key, $field_name)) { if ($data_template_id == 0) { $data_template_id = $row['data_template_id']; } $field_found = true; break; } } } if (!$field_found) { print 'ERROR: Unknown input-field (' . $field_name . ")\n"; print "Try --list-input-fields\n"; exit(1); } $value = $option_value[1]; $values['cg'][$template_id]['custom_data'][$data_template_id][$input_fields[$data_template_id . ':' . $field_name]['data_input_field_id']] = $value; } } } $returnArray = array(); if ($graph_type == 'cg') { $existsAlready = db_fetch_cell_prepared('SELECT gl.id FROM graph_local AS gl INNER JOIN graph_templates AS gt ON gt.id = gl.graph_template_id WHERE graph_template_id = ? AND host_id = ? AND multiple = \'\'', array($template_id, $host_id)); if ((isset($existsAlready)) && ($existsAlready > 0) && (!$force)) { $dataSourceId = db_fetch_cell_prepared('SELECT dtr.local_data_id FROM graph_templates_item AS gti INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id WHERE gti.local_graph_id = ? LIMIT 1', array($existsAlready)); print "NOTE: Not Adding Graph - this graph already exists - graph-id: ($existsAlready) - data-source-id: ($dataSourceId)\n"; exit(1); } else { $returnArray = create_complete_graph_from_template($template_id, $host_id, null, $values['cg']); $dataSourceId = ''; } if ($graphTitle != '') { if (isset($returnArray['local_graph_id'])) { db_execute_prepared('UPDATE graph_templates_graph SET title = ? WHERE local_graph_id = ?', array($graphTitle, $returnArray['local_graph_id'])); update_graph_title_cache($returnArray['local_graph_id']); } } if (is_array($returnArray) && cacti_sizeof($returnArray)) { if (cacti_sizeof($returnArray['local_data_id'])) { foreach($returnArray['local_data_id'] as $item) { push_out_host($host_id, $item); if ($dataSourceId != '') { $dataSourceId .= ', ' . $item; } else { $dataSourceId = $item; } } } /* add this graph template to the list of associated graph templates for this host */ db_execute_prepared('REPLACE INTO host_graph (host_id, graph_template_id) VALUES (?, ?)', array($host_id , $template_id)); print 'Graph Added - Graph[' . $returnArray['local_graph_id'] . "] - DS[$dataSourceId]\n"; } else { print "Graph Not Added due to whitelist check failure.\n"; } } elseif ($graph_type == 'ds') { if (($dsGraph['snmpQueryId'] == '') || ($dsGraph['snmpQueryType'] == '') || (cacti_sizeof($dsGraph['snmpField']) == 0) ) { print "ERROR: For graph-type of 'ds' you must supply more options\n"; display_help(); exit(1); } $snmp_query_array = array(); $snmp_query_array['snmp_query_id'] = $dsGraph['snmpQueryId']; $snmp_query_array['snmp_index_on'] = get_best_data_query_index_type($host_id, $dsGraph['snmpQueryId']); $snmp_query_array['snmp_query_graph_id'] = $dsGraph['snmpQueryType']; $req = 'SELECT distinct snmp_index FROM host_snmp_cache WHERE host_id=' . $host_id . ' AND snmp_query_id=' . $dsGraph['snmpQueryId']; $index_snmp_filter = 0; if (cacti_sizeof($dsGraph['snmpField'])) { foreach ($dsGraph['snmpField'] as $snmpField) { $req .= ' AND snmp_index IN ( SELECT DISTINCT snmp_index FROM host_snmp_cache WHERE host_id=' . $host_id . ' AND field_name = ' . db_qstr($snmpField); if (isset($dsGraph['snmpValue'][$index_snmp_filter])) { $req .= ' AND field_value = ' . db_qstr($dsGraph['snmpValue'][$index_snmp_filter]). ')'; } elseif (isset($dsGraph['snmpValueRegex'][$index_snmp_filter])) { $req .= ' AND field_value REGEXP "' . addslashes($dsGraph['snmpValueRegex'][$index_snmp_filter]) . '")'; } $index_snmp_filter++; } } $snmp_indexes = db_fetch_assoc($req); if (cacti_sizeof($snmp_indexes)) { foreach ($snmp_indexes as $snmp_index) { $snmp_query_array['snmp_index'] = $snmp_index['snmp_index']; $existsAlready = db_fetch_cell_prepared('SELECT gl.id FROM graph_local AS gl INNER JOIN graph_templates AS gt ON gt.id = gl.graph_template_id WHERE graph_template_id = ? AND host_id = ? AND snmp_query_id = ? AND snmp_index = ? AND multiple = \'\'', array($template_id, $host_id, $dsGraph['snmpQueryId'], $snmp_query_array['snmp_index'])); if (isset($existsAlready) && $existsAlready > 0) { if ($graphTitle != '') { db_execute_prepared('UPDATE graph_templates_graph SET title = ? WHERE local_graph_id = ?', array($graphTitle, $existsAlready)); update_graph_title_cache($existsAlready); } $dataSourceId = db_fetch_cell_prepared('SELECT dtr.local_data_id FROM graph_templates_item AS gti INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id WHERE gti.local_graph_id = ? LIMIT 1', array($existsAlready)); print "NOTE: Not Adding Graph - this graph already exists - graph-id: ($existsAlready) - data-source-id: ($dataSourceId)\n"; continue; } $isempty = array(); /* Suggested Values are not been implemented */ $returnArray = create_complete_graph_from_template($template_id, $host_id, $snmp_query_array, $isempty); if ($returnArray !== false) { if ($graphTitle != '') { db_execute_prepared('UPDATE graph_templates_graph SET title = ? WHERE local_graph_id = ?', array($graphTitle, $returnArray['local_graph_id'])); update_graph_title_cache($returnArray['local_graph_id']); } $dataSourceId = db_fetch_cell_prepared('SELECT dtr.local_data_id FROM graph_templates_item AS gti INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id WHERE gti.local_graph_id = ? LIMIT 1', array($returnArray['local_graph_id'])); foreach($returnArray['local_data_id'] as $item) { push_out_host($host_id, $item); if ($dataSourceId != '') { $dataSourceId .= ', ' . $item; } else { $dataSourceId = $item; } } print 'Graph Added - Graph[' . $returnArray['local_graph_id'] . "] - DS[$dataSourceId]\n"; } else { print "Graph Not Added due to whitelist check failure.\n"; } } } else { $err_msg = 'ERROR: Could not find one of more snmp-fields ' . implode(',', $dsGraph['snmpField']) . ' with values ('; if (cacti_sizeof($dsGraph['snmpValue'])) { $err_msg .= implode(',',$dsGraph['snmpValue']); } else { $err_msg .= implode(',',$dsGraph['snmpValueRegex']); } $err_msg .= ') for host-id ' . $host_id . ' (' . $hosts[$host_id]['hostname'] . ")\n"; print $err_msg; print 'Try --host-id=' . $host_id . " --list-snmp-fields\n"; exit(1); } } else { print "ERROR: Graph Types must be either 'cg' or 'ds'\n"; exit(1); } exit(0); } else { display_help(); exit(1); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Graphs Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: add_graphs.php --graph-type=[cg|ds] --graph-template-id=[ID]\n"; print " --host-id=[ID] [--graph-title=title] [graph options] [--force] [--quiet]\n\n"; print "Cacti utility for creating graphs via a command line interface. This utility can\n"; print "create both Data Query (ds) type Graphs as well as Graph Template (cg) type graphs.\n\n"; print "For Non Data Query (cg) Graphs:\n"; print " [--input-fields=\"[data-template-id:]field-name=value ...\"] [--force]\n\n"; print " --input-fields If your data template allows for custom input data, you may specify that\n"; print " here. The data template id is optional and applies where two input fields\n"; print " have the same name.\n"; print " --force If you set this flag, then new cg graphs will be created, even though they\n"; print " may already exist\n\n"; print "For Data Query (ds) Graphs:\n"; print " --snmp-query-id=[ID] --snmp-query-type-id=[ID] --snmp-field=[SNMP Field] \n"; print " --snmp-value=[SNMP Value] | --snmp-value-regex=[REGEX]\n"; print " [--graph-title=S] Defaults to what ever is in the Graph Template/Data Template.\n"; print " [--reindex-method=N] The reindex method to be used for that data query.\n"; print " NOTE: If Data Query is already associated, the reindex method will NOT be changed.\n\n"; print " Valid --reindex-methos include\n"; print " 0|None = No reindexing\n"; print " 1|Uptime = Uptime goes Backwards (Default)\n"; print " 2|Index = Index Count Changed\n"; print " 3|Fields = Verify all Fields\n\n"; print " NOTE: You may supply multiples of the --snmp-field and --snmp-value | --snmp-value-regex arguments.\n\n"; print "List Options:\n"; print " --list-hosts\n"; print " --list-graph-templates [--host-template-id=[ID]]\n"; print " --list-input-fields --graph-template-id=[ID]\n"; print " --list-snmp-queries\n"; print " --list-query-types --snmp-query-id [ID]\n"; print " --list-snmp-fields --host-id=[ID] [--snmp-query-id=[ID]]\n"; print " --list-snmp-values --host-id=[ID] [--snmp-query-id=[ID]] --snmp-field=[Field]\n\n"; } cacti-release-1.2.19/cli/add_perms.php000077500000000000000000000154551413633772300175510ustar00rootroot00000000000000#!/usr/bin/env php 1, 'tree' => 2, 'host' => 3, 'graph_template' => 4); $itemType = 0; $itemId = 0; $hostId = 0; $quietMode = false; $displayGroups = false; $displayUsers = false; $displayTrees = false; $displayHosts = false; $displayGraphs = false; $displayGraphTemplates = false; foreach($parms as $parameter) { if (strpos($parameter, '=')) { list($arg, $value) = explode('=', $parameter); } else { $arg = $parameter; $value = ''; } switch ($arg) { case '--user-id': $userId = $value; break; case '--item-type': /* TODO replace magic numbers by global constants, treat user_admin as well */ if ( ($value == 'graph') || ($value == 'tree') || ($value == 'host') || ($value == 'graph_template')) { $itemType = $itemTypes[$value]; } else { print "ERROR: Invalid Item Type: ($value)\n\n"; display_help(); exit(1); } break; case '--item-id': $itemId = $value; break; case '--host-id': $hostId = $value; break; case '--list-groups': $displayGroups = true; break; case '--list-users': $displayUsers = true; break; case '--list-trees': $displayTrees = true; break; case '--list-hosts': $displayHosts = true; break; case '--list-graphs': $displayGraphs = true; break; case '--list-graph-templates': $displayGraphTemplates = true; break; case '--quiet': $quietMode = true; break; case '--version': case '-V': case '-v': display_version(); exit(0); case '--help': case '-H': case '-h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)\n\n"; display_help(); exit(1); } } if ($displayGroups) { displayGroups($quietMode); exit(1); } if ($displayUsers) { displayUsers($quietMode); exit(1); } if ($displayTrees) { displayTrees($quietMode); exit(1); } if ($displayHosts) { $hosts = getHosts(); displayHosts($hosts, $quietMode); exit(1); } if ($displayGraphs) { if (!isset($hostId) || ($hostId === 0) || (!db_fetch_cell("SELECT id FROM host WHERE id=$hostId"))) { print "ERROR: You must supply a valid host_id before you can list its graphs\n"; print "Try --list-hosts\n"; display_help(); exit(1); } else { displayHostGraphs($hostId, $quietMode); exit(1); } } if ($displayGraphTemplates) { $graphTemplates = getGraphTemplates(); displayGraphTemplates($graphTemplates, $quietMode); exit(1); } /* verify, that a valid userid is provided */ $userIds = array(); if (isset($userId) && $userId > 0) { /* verify existing user id */ if ( db_fetch_cell("SELECT id FROM user_auth WHERE id=$userId") ) { array_push($userIds, $userId); } else { print "ERROR: Invalid Userid: ($value)\n\n"; display_help(); exit(1); } } /* now, we should have at least one verified userid */ /* verify --item-id */ if ($itemType == 0) { print "ERROR: --item-type missing. Please specify.\n\n"; display_help(); exit(1); } if ($itemId == 0) { print "ERROR: --item-id missing. Please specify.\n\n"; display_help(); exit(1); } /* TODO replace magic numbers by global constants, treat user_admin as well */ switch ($itemType) { case 1: /* graph */ if (!db_fetch_cell("SELECT local_graph_id FROM graph_templates_graph WHERE local_graph_id=$itemId") ) { print "ERROR: Invalid Graph item id: ($itemId)\n\n"; display_help(); exit(1); } break; case 2: /* tree */ if (!db_fetch_cell("SELECT id FROM graph_tree WHERE id=$itemId") ) { print "ERROR: Invalid Tree item id: ($itemId)\n\n"; display_help(); exit(1); } break; case 3: /* host */ if (!db_fetch_cell("SELECT id FROM host WHERE id=$itemId") ) { print "ERROR: Invalid Host item id: ($itemId)\n\n"; display_help(); exit(1); } break; case 4: /* graph_template */ if (!db_fetch_cell("SELECT id FROM graph_templates WHERE id=$itemId") ) { print "ERROR: Invalid Graph Template item id: ($itemId)\n\n"; display_help(); exit(1); } break; } /* verified item-id */ foreach ($userIds as $id) { db_execute("REPLACE INTO user_auth_perms (user_id, item_id, type) VALUES ($id, $itemId, $itemType)"); } } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Permissions Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: add_perms.php [ --user-id=[ID] ]\n"; print " --item-type=[graph|tree|host|graph_template]\n"; print " --item-id [--quiet]\n\n"; print "Where item-id is the id of the object of type item-type\n\n"; print "List Options:\n"; print " --list-users\n"; print " --list-trees\n"; print " --list-graph-templates\n"; print " --list-graphs --host-id=[ID]\n"; } function displayGroups() { /** * Todo implement */ print 'This option has not yet been implemented'; } cacti-release-1.2.19/cli/add_tree.php000077500000000000000000000231231413633772300173510ustar00rootroot00000000000000#!/usr/bin/env php 1, 'alpha' => 2, 'natural' => 4, 'numeric' => 3); $nodeTypes = array('header' => 1, 'graph' => 2, 'host' => 3); $hostId = 0; $hostGroupStyle = 1; # 1 = Graph Template, 2 = Data Query Index $quietMode = false; $displayHosts = false; $displayTrees = false; $displayNodes = false; $displayRRAs = false; $displayGraphs = false; $displaySites = false; $hosts = getHosts(); $sites = getSites(); foreach($parms as $parameter) { if (strpos($parameter, '=')) { list($arg, $value) = explode('=', $parameter); } else { $arg = $parameter; $value = ''; } switch ($arg) { case '--type': $type = trim($value); break; case '--name': $name = trim($value); break; case '--sort-method': $sortMethod = trim($value); break; case '--parent-node': $parentNode = $value; break; case '--tree-id': $treeId = $value; break; case '--node-type': $nodeType = trim($value); break; case '--graph-id': $graphId = $value; break; case '--host-id': $hostId = $value; break; case '--quiet': $quietMode = true; break; case '--list-hosts': $displayHosts = true; break; case '--list-trees': $displayTrees = true; break; case '--list-nodes': $displayNodes = true; break; case '--list-graphs': $displayGraphs = true; break; case '--list-sites': $displaySites = true; break; case '--host-group-style': $hostGroupStyle = trim($value); break; case '--version': case '-V': case '-v': display_version(); exit(0); case '--help': case '-H': case '-h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)\n\n"; display_help(); exit(1); } } if ($displaySites) { displaySites($sites, $quietMode); exit(0); } if ($displayHosts) { displayHosts($hosts, $quietMode); exit(0); } if ($displayTrees) { displayTrees($quietMode); exit(0); } if ($displayNodes) { if (!isset($treeId)) { print "ERROR: You must supply a tree_id before you can list its nodes\n"; print "Try --list-trees\n"; exit(1); } displayTreeNodes($treeId, $nodeType, $parentNode, $quietMode); exit(0); } if ($displayRRAs) { displayRRAs($quietMode); exit(0); } if ($displayGraphs) { if (!isset($hostId) || $hostId == 0) { print "ERROR: You must supply a host_id before you can list its graphs\n"; print "Try --list-hosts\n"; exit(1); } displayHostGraphs($hostId, $quietMode); exit(0); } if ($type == 'tree') { # Add a new tree if (empty($name)) { print "ERROR: You must supply a name with --name\n"; display_help(); exit(1); } $treeOpts = array(); $treeOpts['id'] = 0; # Zero means create a new one rather than save over an existing one $treeOpts['name'] = $name; if ($sortMethod == 'manual'|| $sortMethod == 'alpha' || $sortMethod == 'numeric' || $sortMethod == 'natural') { $treeOpts['sort_type'] = $sortMethods[$sortMethod]; } else { print "ERROR: Invalid sort-method: ($sortMethod)\n"; display_help(); exit(1); } $existsAlready = db_fetch_cell("SELECT id FROM graph_tree WHERE name = '$name'"); if ($existsAlready) { print "ERROR: Not adding tree - it already exists - tree-id: ($existsAlready)\n"; exit(1); } $treeId = sql_save($treeOpts, 'graph_tree'); api_tree_sort_branch(0, $treeId); print "Tree Created - tree-id: ($treeId)\n"; exit(0); } elseif ($type == 'node') { # Add a new node to a tree if ($nodeType == 'header'|| $nodeType == 'graph' || $nodeType == 'site' || $nodeType == 'host') { $itemType = $nodeTypes[$nodeType]; } else { print "ERROR: Invalid node-type: ($nodeType)\n"; display_help(); exit(1); } if (!is_numeric($parentNode)) { print "ERROR: parent-node $parentNode must be numeric > 0\n"; display_help(); exit(1); } elseif ($parentNode > 0 ) { $parentNodeExists = db_fetch_cell("SELECT id FROM graph_tree_items WHERE graph_tree_id=$treeId AND id=$parentNode"); if (!isset($parentNodeExists)) { print "ERROR: parent-node $parentNode does not exist\n"; exit(1); } } if ($nodeType == 'header') { # Header --name must be given if (empty($name)) { print "ERROR: You must supply a name with --name\n"; display_help(); exit(1); } # Blank out the graphId, hostID and host_grouping_style fields $graphId = 0; $hostId = 0; $siteId = 0; $hostGroupStyle = 1; }else if($nodeType == 'graph') { # Blank out name, hostID, host_grouping_style $name = ''; $hostId = 0; $siteId = 0; $hostGroupStyle = 1; $graphs = db_fetch_assoc('SELECT id FROM graph_local WHERE graph_local.id=' . $graphId); if (!cacti_sizeof($graphs)) { print "ERROR: No such graph-id ($graphId) exists. Try --list-graphs\n"; exit(1); } }else if ($nodeType == 'site') { # Blank out graphId, name fields $graphId = 0; $hostId = 0; $name = ''; if (!isset($sites[$siteId])) { print "ERROR: No such site-id ($siteId) exists. Try --list-sites\n"; exit(1); } }else if ($nodeType == 'host') { # Blank out graphId, name fields $graphId = 0; $siteId = 0; $name = ''; if (!isset($hosts[$hostId])) { print "ERROR: No such host-id ($hostId) exists. Try --list-hosts\n"; exit(1); } if ($hostGroupStyle != 1 && $hostGroupStyle != 2) { print "ERROR: Host Group Style must be 1 or 2 (Graph Template or Data Query Index)\n"; display_help(); exit(1); } } # $nodeId could be a Header Node, a Graph Node, or a Host node. $nodeId = api_tree_item_save(0, $treeId, $itemType, $parentNode, $name, $graphId, $hostId, $siteId, $hostGroupStyle, $sortMethods[$sortMethod], false); print "Added Node node-id: ($nodeId)\n"; exit(0); } else { print "ERROR: Unknown type: ($type)\n"; display_help(); exit(1); } } else { display_help(); exit(0); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Add Tree Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: add_tree.php --type=[tree|node] [type-options] [--quiet]\n\n"; print "Tree options:\n"; print " --name=[Tree Name]\n"; print " --sort-method=[manual|alpha|natural|numeric]\n\n"; print "Node options:\n"; print " --node-type=[header|site|host|graph]\n"; print " --tree-id=[ID]\n"; print " [--parent-node=[ID] [Node Type Options]]\n\n"; print "Header node options:\n"; print " --name=[Name]\n\n"; print "Site node options:\n"; print " --site-id=[ID]\n"; print "Host node options:\n"; print " --host-id=[ID]\n"; print " [--host-group-style=[1|2]]\n"; print " (host group styles:\n"; print " 1 = Graph Template,\n"; print " 2 = Data Query Index)\n\n"; print "Graph node options:\n"; print " --graph-id=[ID]\n\n"; print "List Options:\n"; print " --list-sites\n"; print " --list-hosts\n"; print " --list-trees\n"; print " --list-nodes --tree-id=[ID]\n"; print " --list-graphs --host-id=[ID]\n"; } cacti-release-1.2.19/cli/analyze_database.php000077500000000000000000000073171413633772300211000ustar00rootroot00000000000000#!/usr/bin/env php '" . $table['Tables_in_' . $database_default] . "' without writing to the binlog"; $status = db_execute('ANALYZE TABLE NO_WRITE_TO_BINLOG ' . $table['Tables_in_' . $database_default] . $form); } else { print "Analyzing Table -> '" . $table['Tables_in_' . $database_default] . "'"; $status = db_execute('ANALYZE TABLE ' . $table['Tables_in_' . $database_default] . $form); } print ($status == 0 ? ' Failed' : ' Successful') . "\n"; } cacti_log('ANALYSIS STATS: Analyzing Cacti Tables Complete. Total time ' . (time() - $start) . ' seconds.', false, 'SYSTEM'); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Analyze Database Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: analyze_database.php [-d|--debug]\n\n"; print "A utility to recalculate the cardinality of indexes within the Cacti database.\n"; print "It's important to periodically run this utility expecially on larger systems.\n\n"; print "Optional:\n"; print "-d | --debug - Display verbose output during execution\n\n"; } cacti-release-1.2.19/cli/apply_automation_rules.php000077500000000000000000000144161413633772300224060ustar00rootroot00000000000000#!/usr/bin/env php $value) { switch($arg) { case 'create': $create = true; break; case 'load': $load = true; break; case 'report': $report = true; break; case 'repair': $repair = true; break; case 'alters': $alters = true; break; case 'upgrade': $upgrade = true; break; case 'version': case 'V': case 'v': display_version(); exit(0); case 'help': case 'H': case 'h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)" . PHP_EOL . PHP_EOL; display_help(); exit(1); } } $db_version = db_fetch_cell('SELECT cacti FROM version'); if ($db_version != CACTI_VERSION && !isset($options['upgrade'])) { $upgrade_required = true; } else { $upgrade_required = false; } if ($upgrade_required) { print 'WARNING: Cacti must be upgraded first. Use the --upgrade option to perform that upgrade' . PHP_EOL; exit(1); } elseif ($db_version != CACTI_VERSION && isset($options['upgrade'])) { upgrade_database(); } if ($repair) { repair_database(); } elseif ($create) { create_tables(); } elseif ($report) { report_audit_results(); } elseif ($alters) { repair_database(false); } elseif ($load) { load_audit_database(); } exit(0); } else { display_help(); exit(1); } function upgrade_database() { global $config; $start = microtime(true); cacti_log('NOTE: Upgrading Cacti, this will take a few minutes.', true, 'UPGRADE'); $return_var = 0; $output = array(); exec('php ' . $config['base_path'] . '/cli/upgrade_database.php --debug', $output, $return_var); $end = microtime(true); if ($return_var == 0) { cacti_log(sprintf('NOTE: Cacti Upgrade succeeded in %.2f seconds', $end - $start), true, 'UPGRADE'); } else { cacti_log('WARNING: Cacti Upgrade Encountered Errors. Messages below. Details are below, but also in Cacti upgrade log.', true, 'UPGRADE'); print '---------------------------------------------------------------------------------------------' . PHP_EOL; print implode(PHP_EOL, $output) . PHP_EOL; print '---------------------------------------------------------------------------------------------' . PHP_EOL; } $pistart = microtime(true); // Upgrade plugins now $plugins = glob($config['base_path'] . '/plugins/*', GLOB_ONLYDIR); // Do syslog and thold first if found $preorder[] = $config['base_path'] . '/plugins/thold'; $preorder[] = $config['base_path'] . '/plugins/syslog'; foreach($plugins as $p) { if (strpos($p, 'thold') !== false) { // Skip, upgrading this first } elseif (strpos($p, 'syslog') !== false) { // Skip, upgrading this second } else { $preorder[] = $p; } } $plugins = $preorder; if (cacti_sizeof($plugins)) { if (!defined('IN_PLUGIN_INSTALL')) { define('IN_PLUGIN_INSTALL', 1); } foreach($plugins as $plugin) { $parts = explode('/', $plugin); $pname = end($parts); $ufunc1 = 'plugin_' . $pname . '_upgrade'; $ufunc2 = $pname . '_upgrade_database'; $ufunc3 = $pname . '_setup_table_new'; if (!plugin_installed($pname)) { cacti_log("NOTE: Plugin $pname is not installed, skipping.", true, 'UPGRADE'); continue; } if (file_exists($plugin . '/INFO')) { // See if the plugin requires upgrading $info = parse_ini_file($plugin . '/INFO', true); $version = $info['info']['version']; $old = db_fetch_cell_prepared('SELECT version FROM plugin_config WHERE directory = ?', array($pname)); if ($version != $old) { if (file_exists($plugin . '/setup.php')) { include_once($plugin . '/setup.php'); if (file_exists($plugin . '/includes/database.php')) { include_once($plugin . '/includes/database.php'); } // Always run the new function if it's there // Some plugins don't upgrade in the proper way if (function_exists($ufunc3)) { cacti_log("NOTE: Running Plugin $pname install function due to some plugins not upgrading properly.", true, 'UPGRADE'); $ufunc3(true); } if (function_exists($ufunc2)) { cacti_log("NOTE: Upgrading Plugin $pname from $old to $version using alternate upgrade path.", true, 'UPGRADE'); $ufunc2(true); } elseif (function_exists($ufunc1)) { cacti_log("NOTE: Upgrading Plugin $pname from $old to $version using standard upgrade path.", true, 'UPGRADE'); $ufunc1; } else { cacti_log("WARNING: Plugin $pname lacks an upgrade function.", true, 'UPGRADE'); } if (file_exists($plugin . '/database_upgrade.php')) { cacti_log("NOTE: Upgrading Plugin $pname from $old to $version using upgrade script.", true, 'UPGRADE'); $return_var = 0; $output = array(); exec('php ' . $config['base_path'] . '/plugins/' . $pname . '/database_upgrade.php --type=large --force-ver=' . $old, $output, $return_var); if ($return_var == 0) { print implode(PHP_EOL, $output) . PHP_EOL; cacti_log("NOTE: Cacti Plugin $pname Upgrade Succeeded.", true, 'UPGRADE'); print '---------------------------------------------------------------------------------------------' . PHP_EOL; print implode(PHP_EOL, $output) . PHP_EOL; print '---------------------------------------------------------------------------------------------' . PHP_EOL; } else { cacti_log("WARNING: Cacti Plugin $pname Upgrade Encountered Errors.", true, 'UPGRADE'); print '---------------------------------------------------------------------------------------------' . PHP_EOL; print implode(PHP_EOL, $output) . PHP_EOL; print '---------------------------------------------------------------------------------------------' . PHP_EOL; } } } else { cacti_log("WARNING: Plugin $pname lacks a setup file.", true, 'UPGRADE'); } } else { cacti_log("NOTE: Plugin $pname Does not Require Upgrade", true, 'UPGRADE'); } } else { cacti_log("WARNING: Plugin $pname lacks an INFO file. Can not upgrade!", true, 'UPGRADE'); } } } // Unregister plugins that no longer exist // We keep legacy tables due to potential // issues. print '---------------------------------------------------------------------------------------------' . PHP_EOL; cacti_log('NOTE: Pruning invalid and deprecated plugins while preserving tables', true, 'UPGRADE'); $plugins = db_fetch_assoc('SELECT directory FROM plugin_config'); if (cacti_sizeof($plugins)) { foreach($plugins as $p) { $pname = $p['directory']; if (!file_exists($config['base_path'] . '/plugins/' . $pname . '/INFO')) { if (file_exists($config['base_path'] . '/plugins/' . $pname . '/setup.php')) { cacti_log("NOTE: Uninstalling Plugin $pname which is not supported. Preserving tables.", true, 'UPGRADE'); api_plugin_uninstall($pname, false); } else { cacti_log("NOTE: Uninstalling Plugin $pname which is not supported and setup.php not found. Preserving tables.", true, 'UPGRADE'); db_execute_prepared('DELETE FROM plugin_config WHERE directory = ?', array($pname)); db_execute_prepared('DELETE FROM plugin_db_changes WHERE plugin = ?', array($pname)); db_execute_prepared('DELETE FROM plugin_hooks WHERE name = ?', array($pname)); db_execute_prepared('DELETE FROM plugin_realms WHERE plugin = ?', array($pname)); } } } } print '---------------------------------------------------------------------------------------------' . PHP_EOL; $end = microtime(true); cacti_log(sprintf('NOTE: Cacti Plugin Upgrades completed in %.2f seconds', $end - $pistart), true, 'UPGRADE'); cacti_log(sprintf('NOTE: Audit Upgrade completed in %.2f seconds.', $end - $start), true, 'UPGRADE'); } function plugin_installed($plugin) { $installed = db_fetch_cell_prepared('SELECT COUNT(*) FROM plugin_config WHERE directory = ? AND status = 1', array($plugin)); return $installed ? true:false; } function repair_database($run = true) { $alters = report_audit_results(false); $good = 0; $bad = 0; if (cacti_sizeof($alters)) { foreach($alters as $table => $changes) { $engine = db_fetch_cell_prepared('SELECT ENGINE FROM information_schema.tables WHERE TABLE_SCHEMA="cacti" AND TABLE_NAME = ?', array($table)); if ($engine = 'MyISAM') { $suffix = ",\n ENGINE=InnoDB ROW_FORMAT=Dynamic CHARSET=utf8mb4"; } else { $suffix = ",\n ROW_FORMAT=Dynamic CHARSET=utf8mb4"; } $sql = 'ALTER TABLE `' . $table . "`\n " . implode(",\n ", $changes) . $suffix . ';'; if ($run) { print '---------------------------------------------------------------------------------------------' . PHP_EOL; print 'Executing Alter for Table : ' . $table; $result = db_execute($sql); if ($result) { $good++; print ' - Success' . PHP_EOL; } else { $bad++; print ' - Failed' . PHP_EOL; print $sql . PHP_EOL; } } else { print '---------------------------------------------------------------------------------------------' . PHP_EOL; print 'Proposed Alter for Table : ' . $table . PHP_EOL . PHP_EOL; print $sql . PHP_EOL . PHP_EOL; } } } print '---------------------------------------------------------------------------------------------' . PHP_EOL; if ($bad == 0 && $good == 0) { print 'Repair Completed! No changes performed.' . PHP_EOL; } elseif ($bad) { print 'Repair Completed! ' . $good . ' Alters succeeded and ' . $bad . ' failed!' . PHP_EOL; } else { print 'Repair Completed! All ' . $good . ' Alters succeeded!' . PHP_EOL; } } function report_audit_results($output = true) { global $database_default; $db_name = 'Tables_in_' . $database_default; create_tables(); $tables = db_fetch_assoc('SHOW TABLES'); $alters = array(); $cols = array( 'table_type' => 'Type', 'table_null' => 'Null', 'table_key' => 'Key', 'table_default' => 'Default', 'table_extra' => 'Extra' ); $idxs = array( 'idx_non_unique' => 'Non_unique', 'idx_key_name' => 'Key_name', 'idx_seq_in_index' => 'Seq_in_index', 'idx_column_name' => 'Column_name', 'idx_packed' => 'Packed', 'idx_comment' => 'Comment' ); if (cacti_sizeof($tables)) { foreach($tables as $table) { $alter_cmds = array(); $table_name = $table[$db_name]; $status = db_fetch_row('SHOW TABLE STATUS LIKE "' . $table_name . '"'); if ($status['Collation'] == 'utf8mb4_unicode_ci' || $status['Collation'] == 'utf8_general_ci') { $text = 'mediumtext'; } else { $text = 'text'; } if ($output) { print '---------------------------------------------------------------------------------------------' . PHP_EOL; printf('Checking Table: %-45s', '\'' . $table_name . '\''); } else { printf('Scanning Table: %-45s', '\'' . $table_name . '\''); } $table_exists = db_fetch_cell_prepared('SELECT COUNT(*) FROM table_columns WHERE table_name = ?', array($table_name)); if (!$table_exists) { $plugin_table = db_fetch_row_prepared('SELECT * FROM plugin_db_changes WHERE `table` = ? AND method = ?', array($table_name, 'create')); if (!cacti_sizeof($plugin_table)) { if ($output) { print ' - Does not Exist. Possible Plugin' . PHP_EOL; continue; } } if ($output) { print ' - Plugin Detected' . PHP_EOL; continue; } else { print ' - Completed' . PHP_EOL; } } elseif (!$output) { print ' - Completed' . PHP_EOL; } /* Column scanning comes in two parts. In the first part, we * scan the columns in the current database to the saved schema * In the second pass, we look for the columns from the saved * schema to look for missing ones. */ $i = 1; $errors = 0; $warnings = 0; $col_added = array(); $col_alter = array(); $columns = db_fetch_assoc('SHOW COLUMNS IN ' . $table_name); $exists = db_fetch_cell_prepared('SELECT COUNT(*) FROM table_columns WHERE table_name = ?', array($table_name)); if ($exists) { if (cacti_sizeof($columns)) { foreach($columns as $c) { $sequence_off = false; $dbc = db_fetch_row_prepared('SELECT * FROM table_columns WHERE table_name = ? AND table_field = ?', array($table_name, $c['Field'])); if (!cacti_sizeof($dbc)) { $plugin_column = db_fetch_row_prepared('SELECT * FROM plugin_db_changes WHERE `table` = ? AND `column` = ? AND method = ?', array($table_name, $c['Field'], 'addcolumn')); if (!cacti_sizeof($plugin_column)) { if ($output) { print PHP_EOL . 'WARNING Col: \'' . $c['Field'] . '\', does not exist in default Cacti. Plugin possible'; } $warnings++; } } else { foreach($cols as $dbcol => $col) { if ($col == 'Type' && $dbc[$dbcol] == 'text') { if ($text == 'mediumtext') { $dbc[$dbcol] = $text; } } /* work around MariaDB compatibility issue */ $c[$col] = str_replace('current_timestamp()', 'CURRENT_TIMESTAMP', $c[$col]); $dbc[$dbcol] = str_replace('current_timestamp()', 'CURRENT_TIMESTAMP',$dbc[$dbcol]); if ($c[$col] != $dbc[$dbcol] && $text != 'mediumtext') { if ($output) { if ($col != 'Key') { print PHP_EOL . 'ERROR Col: \'' . $c['Field'] . '\', Attribute \'' . $col . '\' invalid. Should be: \'' . $dbc[$dbcol] . '\', Is: \'' . $c[$col] . '\''; } } if (array_search($dbc['table_field'], $col_alter) === false) { $alter_cmds[] = make_column_alter($table_name, $dbc); $col_alter[] = $dbc['table_field']; $errors++; } } } } $i++; } } /* In this pass, we will gather the default schema and look for * missing information. */ $db_columns = db_fetch_assoc_prepared('SELECT * FROM table_columns WHERE table_name = ?', array($table_name)); if (cacti_sizeof($db_columns)) { foreach($db_columns as $dbc) { if (!db_column_exists($table_name, $dbc['table_field'])) { if (array_search($dbc['table_field'], $col_added) === false) { if ($output) { print PHP_EOL . 'WARNING Col: \'' . $dbc['table_field'] . '\' is missing from \'' . $table_name . '\''; } $alter_cmds[] = make_column_add($table_name, $dbc); $col_added[] = $dbc['table_field']; $errors++; } } } } /* Index scanning comes in two parts. In the first part, we * scan the indexes in the current database to the saved schema * In the second pass, we look for the indexes from the saved * schema to look for missing ones. */ $indexes = db_fetch_assoc('SHOW INDEXES IN ' . $table_name); $idx_added = array(); $idx_dropped = array(); if (cacti_sizeof($indexes)) { foreach($indexes as $i) { $key_exists = db_fetch_cell_prepared('SELECT COUNT(*) FROM table_indexes WHERE idx_table_name = ? AND idx_key_name = ?', array($i['Table'], $i['Key_name'])); $dbc = db_fetch_row_prepared('SELECT * FROM table_indexes WHERE idx_table_name = ? AND idx_key_name = ? AND idx_seq_in_index = ? AND idx_column_name = ? ORDER BY idx_seq_in_index', array($i['Table'], $i['Key_name'], $i['Seq_in_index'], $i['Column_name'])); if (!cacti_sizeof($dbc)) { if ($key_exists) { // Ignore till Phase II } elseif (array_search($i['Key_name'], $idx_dropped) === false) { // Primary keys come in Phase II if ($i['Key_name'] != 'PRIMARY') { if ($output) { print PHP_EOL . 'WARNING Index: \'' . $i['Key_name'] . '\', does not exist in default Cacti. Dropping.'; } $alter_cmds[] = 'DROP INDEX ' . $i['Key_name']; $idx_dropped[] = $i['Key_name']; $errors++; } } } else { foreach($idxs as $dbidx => $idx) { if ($i[$idx] != $dbc[$dbidx]) { // Primary keys come in Phase II if ($i['Key_name'] != 'PRIMARY') { if (array_search($i['Key_name'], $idx_added) === false) { if ($output) { print PHP_EOL . 'ERROR Index: \'' . $i['Key_name'] . '\', Attribute \'' . $idx . '\' invalid. Should be: \'' . $dbc[$dbidx] . '\', Is: \'' . $i[$idx] . '\''; } $alter_cmds = array_merge($alter_cmds, make_index_alter($table_name, $i['Key_name'])); $idx_added[] = $i['Key_name']; $errors++; } } } } } } } /* check for missing indexes and add them */ $db_indexes = db_fetch_assoc_prepared('SELECT * FROM table_indexes WHERE idx_table_name = ?', array($table_name)); if (cacti_sizeof($db_indexes)) { foreach($db_indexes as $i) { if (!db_index_exists($table_name, $i['idx_key_name'])) { if (array_search($i['idx_key_name'], $idx_added) === false) { if ($output) { print PHP_EOL . 'ERROR Index: \'' . $i['idx_key_name'] . '\', is missing from \'' . $table_name . '\'';; } $alter_cmds = array_merge($alter_cmds, make_index_alter($table_name, $i['idx_key_name'])); $idx_added[] = $i['idx_key_name']; $errors++; } } else { $prop_seq = db_fetch_cell_prepared('SELECT COUNT(*) FROM table_indexes WHERE idx_table_name = ? AND idx_key_name = ?', array($table_name, $i['idx_key_name'])); $curr_seq = get_sequence_count($table_name, $i['idx_key_name']); $curr_column_seq = get_colunm_sequence_number($table_name, $i['idx_key_name'], $i['idx_column_name']); //print PHP_EOL . "Prop Seq:" . $prop_seq . ", Curr Seq:" . $curr_seq . PHP_EOL; if ($curr_seq != $prop_seq || $curr_column_seq != $i['idx_seq_in_index']) { if (array_search($i['idx_key_name'], $idx_dropped) === false) { if ($output) { if ($curr_seq != $prop_seq) { print PHP_EOL . 'WARNING Index: \'' . $i['idx_key_name'] . '\', has differing number of columns. Dropping.'; } if ($curr_column_seq != $i['idx_seq_in_index']) { print PHP_EOL . 'WARNING Index: \'' . $i['idx_key_name'] . '\', has resequenced columns. Dropping.'; } } $alter_cmds = array_merge($alter_cmds, make_index_alter($table_name, $i['idx_key_name'])); $idx_added[] = $i['idx_key_name']; $idx_dropped[] = $i['idx_key_name']; $errors++; } } } } } if ($output) { if ($errors || $warnings) { print PHP_EOL . PHP_EOL . 'ERRORS: ' . $errors . ', WARNINGS: ' . $warnings . PHP_EOL; } else { print ' - Clean' . PHP_EOL; } } if (cacti_sizeof($alter_cmds)) { $alters[$table_name] = $alter_cmds; } } } } if ($output) { print '---------------------------------------------------------------------------------------------' . PHP_EOL; if (cacti_sizeof($alters)) { print 'ERRORS are fixable using the --repair option. WARNINGS will not be rapaired' . PHP_EOL; print 'due to ambiguous use of the column.' . PHP_EOL; } else { print 'Audit was clean, no errors or warnings' . PHP_EOL; } print '---------------------------------------------------------------------------------------------' . PHP_EOL; } return $alters; } function make_column_props(&$dbc) { $alter_cmd = ''; if ($dbc['table_null'] == 'YES') { if ($dbc['table_default'] == 'NULL') { // Ignore } elseif ($dbc['table_default'] === NULL) { // Ignore } elseif ($dbc['table_default'] === '') { // Ignore } else { $alter_cmd .= ' DEFAULT "' . $dbc['table_default'] . '"'; } } elseif ($dbc['table_default'] !== 'NULL' && $dbc['table_default'] !== NULL) { if ($dbc['table_default'] == 'CURRENT_TIMESTAMP') { $alter_cmd .= ' DEFAULT CURRENT_TIMESTAMP'; } elseif ($dbc['table_extra'] != 'auto_increment') { if (strpos($dbc['table_type'], 'int(') !== false && $dbc['table_default'] == '') { $alter_cmd .= ' DEFAULT "0"'; } else { $alter_cmd .= ' DEFAULT \'' . $dbc['table_default'] . '\''; } } } if ($dbc['table_extra'] != '') { $alter_cmd .= ' ' . $dbc['table_extra']; } return $alter_cmd; } function make_column_alter($table, $dbc) { $alter_cmd = 'MODIFY COLUMN `' . $dbc['table_field'] . '` ' . $dbc['table_type'] . ($dbc['table_null'] == 'NO' ? ' NOT NULL':''); $alter_cmd .= make_column_props($dbc); return $alter_cmd; } function make_column_add($table, $dbc) { $after = get_previous_column($table, $dbc['table_field']); if ($after != 'first') { $after = 'AFTER `' . $after . '`'; } $alter_cmd = 'ADD COLUMN `' . $dbc['table_field'] . '` ' . $dbc['table_type'] . ($dbc['table_null'] == 'NO' ? ' NOT NULL':''); $alter_cmd .= make_column_props($dbc); $alter_cmd .= ' ' . $after; return $alter_cmd; } function get_previous_column($table, $column) { $sequence = db_fetch_cell_prepared('SELECT table_sequence FROM table_columns WHERE table_name = ? AND table_field = ?', array($table, $column)); if (!empty($sequence)) { if ($sequence == 1) { return 'first'; } else { $previous = db_fetch_cell_prepared('SELECT table_field FROM table_columns WHERE table_name = ? AND table_sequence = ?', array($table, $sequence - 1)); return $previous; } } } function make_index_alter($table, $key) { $alter_cmds = array(); $alter_cmd = ''; $primary_dropped = false; $parts = db_fetch_assoc_prepared('SELECT * FROM table_indexes WHERE idx_table_name = ? AND idx_key_name = ? ORDER BY idx_seq_in_index', array($table, $key)); $sequence_cnt = get_sequence_count($table, $key); //print PHP_EOL . "NOTE: INDEX KEY is $key, Baseline Sequence: " . cacti_sizeof($parts) . ", Actual Sequence: $sequence_cnt" . PHP_EOL; if ($sequence_cnt != cacti_sizeof($parts) && $sequence_cnt > 0) { if ($key == 'PRIMARY') { $primary_dropped = true; $alter_cmd .= "DROP PRIMARY KEY,\n "; } else { $alter_cmd .= "DROP INDEX `" . $key . "`,\n "; } } elseif (db_index_exists($table, $key)) { if ($key == 'PRIMARY') { $primary_dropped = true; $alter_cmd .= "DROP PRIMARY KEY,\n "; } else { $alter_cmd .= "DROP INDEX `" . $key . "`,\n "; } } if (cacti_sizeof($parts)) { $i = 0; foreach($parts as $p) { if ($i == 0 && $p['idx_key_name'] == 'PRIMARY') { if ($primary_dropped == false) { $alter_cmd .= "DROP PRIMARY KEY,\n "; } $alter_cmd .= 'ADD PRIMARY KEY ('; } elseif ($i == 0) { if ($p['idx_non_unique'] == 1) { $alter_cmd .= 'ADD INDEX `' . $key . '` ('; } else { $alter_cmd .= 'ADD UNIQUE INDEX `' . $key . '` ('; } } $alter_cmd .= ($i > 0 ? ',':'') . '`' . $p['idx_column_name'] . '`'; $i++; } $alter_cmd .= ') USING ' . $p['idx_index_type']; $alter_cmds[] = $alter_cmd; } return $alter_cmds; } function get_sequence_count($table, $index) { $indexes = db_fetch_assoc("SHOW INDEXES IN $table"); $sequence_cnt = 0; if (cacti_sizeof($indexes)) { foreach($indexes as $i) { if ($index == $i['Key_name']) { $sequence_cnt++; } } } return $sequence_cnt; } function get_colunm_sequence_number($table, $index, $column) { $indexes = db_fetch_assoc("SHOW INDEXES IN $table"); if (cacti_sizeof($indexes)) { foreach($indexes as $i) { $sequence = $i['Seq_in_index']; if ($i['Key_name'] == $index) { if ($i['Column_name'] == $column) { return $sequence; } } } } return -1; } function create_tables($load = true) { global $config, $database_default, $database_username, $database_password, $database_port, $database_hostname; db_execute("CREATE TABLE IF NOT EXISTS table_columns ( table_name varchar(50) NOT NULL, table_sequence int(10) unsigned NOT NULL, table_field varchar(50) NOT NULL, table_type varchar(50) default NULL, table_null varchar(10) default NULL, table_key varchar(4) default NULL, table_default varchar(50) default NULL, table_extra varchar(128) default NULL, PRIMARY KEY (table_name, table_sequence, table_field)) ENGINE=InnoDB COMMENT='Holds Default Cacti Table Definitions'"); $exists_columns = db_table_exists('table_columns'); if (!$exists_columns) { print "Failed to create 'table_coluns'"; exit; } db_execute("CREATE TABLE IF NOT EXISTS table_indexes ( idx_table_name varchar(50) NOT NULL, idx_non_unique int(10) unsigned default NULL, idx_key_name varchar(128) NOT NULL, idx_seq_in_index int(10) unsigned NOT NULL, idx_column_name varchar(50) NOT NULL, idx_collation varchar(10) default NULL, idx_cardinality int(10) unsigned default NULL, idx_sub_part varchar(50) default NULL, idx_packed varchar(128) default NULL, idx_null varchar(10) default NULL, idx_index_type varchar(20) default NULL, idx_comment varchar(128) default NULL, PRIMARY KEY (idx_table_name, idx_key_name, idx_seq_in_index, idx_column_name)) ENGINE=InnoDB COMMENT='Holds Default Cacti Index Definitions'"); $exists_indexes = db_table_exists('table_indexes'); if (!$exists_indexes) { print "Failed to create 'table_indexes'"; exit; } if ($load) { db_execute('TRUNCATE table_columns'); db_execute('TRUNCATE table_indexes'); $output = array(); $error = 0; if (file_exists($config['base_path'] . '/docs/audit_schema.sql')) { exec('mysql' . ' -u' . $database_username . ' -p' . $database_password . ' -h' . $database_hostname . ' -P' . $database_port . ' ' . $database_default . ' < ' . $config['base_path'] . '/docs/audit_schema.sql', $output, $error); if ($error == 0) { print 'SUCCESS: Loaded the Audit Schema' . PHP_EOL; } else { print 'FATAL: Failed Load the Audit Schema' . PHP_EOL; print 'ERROR: ' . implode(",\n ", $output) . PHP_EOL; } } else { print 'FATAL: Failed to find Audit Schema' . PHP_EOL; } } } function load_audit_database() { global $config, $database_default, $database_username, $database_password; $db_name = 'Tables_in_' . $database_default; create_tables(false); db_execute('TRUNCATE table_columns'); db_execute('TRUNCATE table_indexes'); $tables = db_fetch_assoc('SHOW TABLES'); if (cacti_sizeof($tables)) { foreach($tables as $table) { $table_name = $table[$db_name]; $columns = db_fetch_assoc('SHOW COLUMNS IN ' . $table_name); $indexes = db_fetch_assoc('SHOW INDEXES IN ' . $table_name); print 'Importing Table: ' . $table_name; $i = 1; if (cacti_sizeof($columns)) { foreach($columns as $c) { db_execute_prepared('INSERT INTO table_columns (table_name, table_sequence, table_field, table_type, table_null, table_key, table_default, table_extra) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', array( $table_name, $i, $c['Field'], $c['Type'], $c['Null'], $c['Key'], $c['Default'], $c['Extra'] ) ); $i++; } } print ' - Done' . PHP_EOL; if (cacti_sizeof($indexes)) { foreach($indexes as $i) { db_execute_prepared('INSERT INTO table_indexes (idx_table_name, idx_non_unique, idx_key_name, idx_seq_in_index, idx_column_name, idx_collation, idx_cardinality, idx_sub_part, idx_packed, idx_null, idx_index_type, idx_comment) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', array( $i['Table'], $i['Non_unique'], $i['Key_name'], $i['Seq_in_index'], $i['Column_name'], $i['Collation'], $i['Cardinality'], $i['Sub_part'], $i['Packed'], $i['Null'], $i['Index_type'], $i['Comment'] ) ); } } } } if (is_dir($config['base_path'] . '/docs')) { print PHP_EOL . 'Exporting Table Audit Table Creation Logic to ' . $config['base_path'] . '/docs/audit_schema.sql' . PHP_EOL; $retval = db_dump_data($database_default, 'table_columns table_indexes', array(), $config['base_path'] . '/docs/audit_schema.sql'); if ($retval) { print 'Finished Creating Audit Schema with ERROR' . PHP_EOL . PHP_EOL; } else { print 'Finished Creating Audit Schema' . PHP_EOL . PHP_EOL; } } else { print PHP_EOL . 'FATAL: Docs directory does not exist!' . PHP_EOL . PHP_EOL; } } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Database Audit Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } function display_help() { display_version(); print PHP_EOL . 'usage: audit_database.php --report | --repair [ --upgrade ]' . PHP_EOL . PHP_EOL; print 'Cacti utility for auditing and correcting your Cacti database. This utility can' . PHP_EOL; print 'will scan your Cacti database and report any problems in the schema that it finds.' . PHP_EOL . PHP_EOL; print 'Options:' . PHP_EOL; print ' --report - Report on any issues found in the audit of the database' . PHP_EOL; print ' --repair - Repair any issues found during the audit of the database' . PHP_EOL; print ' --upgrade - Upgrade the Cacti database before running' . PHP_EOL . PHP_EOL; print 'Developer Options:' . PHP_EOL; print ' --create - Initialize or Re-initialize the Audit Schema tables.' . PHP_EOL; print ' --load - Take a pristine Cacti install and create Audit Schema and file.' . PHP_EOL; print ' --alters - Print out all the alter commands vs. executing for debugging.' . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/cli/batchgapfix.php000066400000000000000000000335661413633772300200730ustar00rootroot00000000000000#!/usr/bin/env php 40) { print 'FATAL: Invalid --threads value. Threads can be from 1 to 40 inclusive.' . PHP_EOL; exit(1); } if ($host_ids !== false) { $host_ids = explode(',', $host_ids); foreach($host_ids as $id) { if (!is_numeric($id)) { print 'FATAL: The list of --host-ids must be a comma delimited list of numeric Cacti host_ids!' . PHP_EOL; exit(1); } } $sql_where = 'WHERE dtd.data_source_path IS NOT NULL AND gl.host_id IN(' . implode(',', $host_ids) . ')'; } else { $sql_where = 'WHERE dtd.data_source_path IS NOT NULL'; } // Command takes a date $start_date = date('Y-m-d H:i:s', $start_time); $end_date = date('Y-m-d H:i:s', $end_time); // Parent Process, prep table insert records if ($child == 0) { $type = 'master'; if ($force) { printf("NOTE: Looking for and killing running processes." . PHP_EOL); $running = db_fetch_assoc('SELECT * FROM processes WHERE tasktype = "batchgapfix"'); if (cacti_sizeof($running)) { printf("NOTE: Found %s running processes found." . PHP_EOL); foreach($running as $r) { $running = posix_kill($r['pid'], 0); if (posix_get_last_error() == 1) { printf("NOTE: Process with PID: %s being killed." . PHP_EOL, $r['pid']); posix_kill($r['pid'], SIGTERM); } else { printf("NOTE: Process with PID: %s, not found likely crashed." . PHP_EOL, $r['pid']); } } db_execute('DELETE FROM processes WHERE tasktype = "batchgapfix"'); } else { printf("NOTE: No running processes found." . PHP_EOL); } } if (!register_process_start('batchgapfix', 'master', 0, 250000)) { print "FATAL: Detected an already running process. Use --force to override" . PHP_EOL; exit(1); } if (db_table_exists('graph_local_spikekill')) { $running = db_fetch_cell('SELECT COUNT(*) FROM graph_local_spikekill WHERE ended = "0000-00-00"'); if ($running > 0 && !$force) { print "FATAL: You have requested a start run, and a run appears to be already running" . PHP_EOL; print "FATAL: Check that no processes are running and use the --force option to override." . PHP_EOL; exit(1); } else { db_execute('TRUNCATE TABLE graph_local_spikekill'); } } else { db_execute('CREATE TABLE graph_local_spikekill ( id INT(10) unsigned NOT NULL auto_increment, local_graph_id INT(10) unsigned NOT NULL default "0", data_source_path varchar(255) NOT NULL default "0", child INT(10) unsigned NOT NULL default "0", exit_code INT(10) unsigned NOT NULL default "0", started TIMESTAMP NOT NULL default "0000-00-00", ended TIMESTAMP NOT NULL default "0000-00-00", PRIMARY KEY (id), KEY child (child), KEY ended (ended)) ENGINE=MEMORY COMMENT="Holds batch spike fill database"'); } // Insert the local graph ids into the spikekill database db_execute("INSERT INTO graph_local_spikekill (local_graph_id, data_source_path) SELECT DISTINCT gl.id, dtd.data_source_path FROM graph_local AS gl INNER JOIN graph_templates_item AS gti ON gl.id = gti.local_graph_id INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id INNER JOIN data_template_data AS dtd ON dtd.id = dtr.local_data_id $sql_where"); $rrdfiles = db_affected_rows(); db_execute_prepared('UPDATE graph_local_spikekill SET data_source_path = REPLACE(data_source_path, "", ?)', array($config['rra_path'])); print "NOTE: There are $rrdfiles RRDfiles that will be checked for gaps and fixed" . PHP_EOL; $rrds_per_thread = ceil($rrdfiles/$threads); // Distributing RRDfiles into tasks for ($i = 1; $i <= $threads; $i++) { db_execute_prepared("UPDATE graph_local_spikekill SET child = ? WHERE child = 0 LIMIT $rrds_per_thread", array($i)); } $now = date('H:i:s'); printf("NOTE: %s, Database primed for batch gap fill." . PHP_EOL, $now); // Fork Child Binaries for($i = 1; $i <= $threads; $i++) { $command = sprintf("%s/cli/batchgapfix.php --start='%s' --end='%s' --method=%s --avgnan=%s --child=%s" . ($force ? ' --force':'') . ($debug ? ' --debug':''), $config['base_path'], $start_date, $end_date, $method, $avgnan, $i ); $now = date('H:i:s'); printf("NOTE: %s, Exec in Background: %s %s" . PHP_EOL, $now, $php_bin, $command); exec_background($php_bin, $command); } $start = microtime(true); while (true) { sleep(1); $not_finished = db_fetch_cell_prepared('SELECT COUNT(*) FROM graph_local_spikekill WHERE ended = "0000-00-00"'); $end = microtime(true); $rate = ($rrdfiles - $not_finished) / ($end - $start); if ($rate > 0) { $estimate = round($rrdfiles / $rate, 0); $complate = ($end - $start) - $estimate; } else { $estimate = 'unknown'; } $now = date('H:i:s'); if ($not_finished > 0) { printf("NOTE: %s, Status %s of %s RRDfiles processed. Total Time is %.0f." . PHP_EOL, $now, number_format($rrdfiles - $not_finished), number_format($rrdfiles), $end - $start); printf("NOTE: %s, Processing Rate: %s RRDfiles per/second, Estimated Complete in: %s seconds, Sleeping 1 seconds." . PHP_EOL, $now, round($rate, 2), $estimate); } else { printf("NOTE: All RRDfiles processed. Total Time was %.2f seconds." . PHP_EOL, $end - $start); break; } } $succeeded = db_fetch_cell('SELECT COUNT(*) FROM graph_local_spikekill WHERE exit_code = 0'); $failed = db_fetch_cell('SELECT COUNT(*) FROM graph_local_spikekill WHERE exit_code != 0'); cacti_log(sprintf('BATCHFIX STATS: Time:%s, RRDfiles:%s, Threads:%s, Rate:%s, Succeeded:%s, Failed:%s', round($end - $start, 2), $rrdfiles, $threads, round($rate,2), $succeeded, $failed), false, 'SYSTEM'); unregister_process('batchgapfix', $type, $child); db_execute('TRUNCATE TABLE graph_local_spikekill'); exit(0); } else { $type = 'child'; if (!register_process_start('batchgapfix', 'child', $child, 250000)) { print "FATAL: Detected an already running process. Use --force to override" . PHP_EOL; exit(1); } // Child Process, remediate spikes $rrdfiles = db_fetch_assoc_prepared('SELECT * FROM graph_local_spikekill WHERE child = ?', array($child)); $start = microtime(true); $succeeded = 0; $failed = 0; foreach($rrdfiles as $rrdfile) { $output = array(); $return_var = 0; // Format the command $command = sprintf("%s -q %s/cli/removespikes.php --rrdfile='%s' --outlier-start='%s' --outlier-end='%s' --method=%s --avgnan=%s", $php_bin, $config['base_path'], $rrdfile['data_source_path'], $start_date, $end_date, $method, $avgnan ); db_execute_prepared('UPDATE graph_local_spikekill SET started = NOW() WHERE id = ?', array($rrdfile['id'])); // Run the command debug("NOTE: Running command: $command"); exec($command, $output, $return_var); db_execute_prepared('UPDATE graph_local_spikekill SET ended = NOW(), exit_code = ? WHERE id = ?', array($return_var, $rrdfile['id'])); if ($return_var == 0) { printf("SUCCESS: Gap Fills for RRDfile:%s" . PHP_EOL, $rrdfile['data_source_path']); $succeeded++; } else { printf("FAILED: Gap Fills faild for RRDfile:%s" . PHP_EOL, $graph['data_source_path']); $failed++; } } $end = microtime(true); printf("NOTE: Batch Fill Process Ended in %s seconds. Succeeded:%s, Failed:%s" . PHP_EOL, round($end - $start, 2), $succeeded, $failed); cacti_log(sprintf('BATCHFIX CHILD STATS: Time:%s, Thread:%s, RRDfiles:%s, Succeeded:%s, Failed:%s', round($end - $start, 2), $child, cacti_sizeof($rrdfiles), $succeeded, $failed), false, 'SYSTEM'); unregister_process('batchgapfix', $type, $child); } exit(0); /** sig_handler - provides a generic means to catch exceptions to the Cacti log. * @arg $signo - (int) the signal that was thrown by the interface. * @return - null */ function sig_handler($signo) { global $child, $type; switch ($signo) { case SIGTERM: case SIGINT: unregister_process('batchgapfix', $type, $child); if ($child == 0) { db_execute('TRUNCATE TABLE graph_local_spikekill'); } exit(1); break; default: /* ignore all other signals */ } } function debug($string) { global $debug; if ($debug) { print 'DEBUG: ' . trim($string) . PHP_EOL; } } function display_version() { $version = get_cacti_cli_version(); print "Cacti Batch Graph Gap Fill Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } function display_help() { display_version(); print PHP_EOL . 'This utility will fill gaps in graphs based upon a time range.' . PHP_EOL; print 'It will perform this process in parallel to increase performance based upon the number of threads ' . PHP_EOL; print 'selected by the user.' . PHP_EOL . PHP_EOL; print 'usage: batchgapfix.php --start=\'YYYY-MM-DD HH:MM:SS\' --end=\'YYYY-MM-DD HH:MM:SS\' [--threads=N]' . PHP_EOL; print ' [--method=fill|float] [--avgnan=last|avg] [--host-ids=N,N,N,...]' . PHP_EOL; print ' [-f|--force] [-d|--debug]' . PHP_EOL . PHP_EOL; print 'Required:' . PHP_EOL; print ' --start=\'YYYY-MM-DD HH:MM:SS\' - The start date to check and remove gaps.' . PHP_EOL; print ' --end=\'YYYY-MM-DD HH:MM:SS\' - The end date to check and remove gaps.' . PHP_EOL . PHP_EOL; print 'Optional:' . PHP_EOL; print ' --threads=N - Default is 5. The number of parallel threads [1..40]' . PHP_EOL; print ' --method=fill|float - Default is \'fill\'. The method to fill gaps.' . PHP_EOL; print ' --avgnan=last|avg - Default is \'last\'. The number to use to fill gaps.' . PHP_EOL; print ' --host-ids=N,N,N,... - A comma delimted list of Cacti Device ID\'s to process.' . PHP_EOL; print ' --force - Kill the current running batch gap fill and start over.' . PHP_EOL; print ' --debug - Higher tracing level for select utilities.' . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/cli/convert_tables.php000077500000000000000000000156711413633772300206250ustar00rootroot00000000000000#!/usr/bin/env php '" . $table['Name'] . "'"; $sql = ''; if ($utf8) { $sql .= ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci'; } if ($innodb && $canInnoDB) { $sql .= (strlen($sql) ? ',' : '') . ' ENGINE=Innodb'; } $status = db_execute('ALTER TABLE `' . $table['Name'] . '`' . ($dynamic ? ' ROW_FORMAT=Dynamic, ':'') . $sql); if ($status === false) { print ' Failed' . PHP_EOL; cacti_log("FATAL: Conversion of Table '" . $table['Name'] . "' Failed. Command: 'ALTER TABLE `" . $table['Name'] . "` $sql'", false, 'CONVERT'); } else { print ' Successful' . PHP_EOL; } } else { print "Skipping Table -> '" . $table['Name'] . " too many rows '" . $table['Rows'] . "'" . PHP_EOL; } } else { print "Skipping Table -> '" . $table['Name'] . "'" . PHP_EOL; } } } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Database Conversion Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: convert_tables.php [--debug] [--innodb] [--utf8] [--table=N] [--size=N] [--rebuild] [--dynamic]\n\n"; print "A utility to convert a Cacti Database from MyISAM to the InnoDB table format.\n"; print "MEMORY tables are not converted to InnoDB in this process.\n\n"; print "Required (one or more):\n"; print "-i | --innodb - Convert any MyISAM tables to InnoDB\n"; print "-u | --utf8 - Convert any non-UTF8 tables to utf8mb4_unicode_ci\n\n"; print "Optional:\n"; print "-t | --table=S - The name of a single table to change\n"; print "-n | --skip-innodb=\"table1 table2 ...\" - Skip converting tables to InnoDB\n"; print "-s | --size=N - The largest table size in records to convert. Default is 1,000,000 rows.\n"; print "-r | --rebuild - Will compress/optimize existing InnoDB tables if found\n"; print " --dynamic - Convert a table to Dynamic row format if available\n"; print "-f | --force - Proceed with conversion regardless of table size\n\n"; print "-d | --debug - Display verbose output during execution\n\n"; } cacti-release-1.2.19/cli/copy_user.php000077500000000000000000000063211413633772300176130ustar00rootroot00000000000000#!/usr/bin/env php ' . PHP_EOL . PHP_EOL; print 'A utility to copy on local Cacti user and their settings to a new one.' . PHP_EOL . PHP_EOL; print 'NOTE: It is highly recommended that you use the web interface to copy users as' . PHP_EOL; print 'this script will only copy Local Cacti users.' . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/cli/fix_mediumint.php000066400000000000000000000171221413633772300204420ustar00rootroot00000000000000#!/usr/bin/env php 'data_template_data_id', 'data_template_data' => 'id, local_data_template_data_id, local_data_id', 'data_template_rrd' => 'id, local_data_template_rrd_id, local_data_id', 'graph_local' => 'id', 'data_local' => 'id', 'data_source_purge_action' => 'local_data_id', 'data_source_purge_temp' => 'local_data_id', 'data_source_stats_daily' => 'local_data_id', 'data_source_stats_hourly' => 'local_data_id', 'data_source_stats_hourly_cache' => 'local_data_id', 'data_source_stats_hourly_last' => 'local_data_id', 'data_source_stats_monthly' => 'local_data_id', 'data_source_stats_weekly' => 'local_data_id', 'data_source_stats_yearly' => 'local_data_id', 'graph_templates_graph' => 'id, local_graph_id, local_graph_template_graph_id', 'graph_template_input_defs' => 'graph_template_item_id', 'graph_templates_item' => 'id, local_graph_template_item_id, local_graph_id, task_item_id', 'graph_tree_items' => 'local_graph_id', 'poller_item' => 'local_data_id', 'poller_output' => 'local_data_id', 'poller_output_boost' => 'local_data_id', 'poller_output_realtime' => 'local_data_id', 'settings_tree' => 'graph_tree_item_id', 'snmp_query_graph_rrd' => 'data_template_rrd_id' ); $known_columns['graph_id'] = 'graph_id'; $known_columns['data_id'] = 'data_id'; foreach($tables as $table => $columns) { $columns = explode(',', $columns); $sql = 'ALTER TABLE ' . $table; $i = 0; foreach($columns as $c) { $c = trim($c); $attribs = database_get_column_attribs($table, $c); if (cacti_sizeof($attribs)) { if (strpos($attribs['Type'], 'mediumint') === false) { if (strpos($attribs['Type'], 'int(10) unsigned') !== false) { debug("Column $c in Table $table already converted."); continue; } } if (strtolower($attribs['Extra']) == 'auto_increment') { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $c . ' int(10) unsigned NOT NULL AUTO_INCREMENT'; } else { if ($c != 'id') { $known_columns[$c] = $c; } if ($attribs['Default'] != '') { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $c . ' int(10) unsigned NOT NULL default "' . $attribs['Default'] . '"'; } elseif ($attribs['Null'] == 'NO') { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $c . ' int(10) unsigned NOT NULL'; } else { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $c . ' int(10) unsigned DEFAULT NULL'; } } $i++; } else { debug("ERROR: Attributes missing for $table and column $c."); } } if ($i > 0) { debug("Updating Table $table."); db_execute($sql); $total++; } } $other_tables = db_fetch_assoc('SHOW TABLES'); foreach($other_tables as $t) { $table = $t['Tables_in_' . $database_default]; $columns = array(); //print "Checking $table" . PHP_EOL; if (!array_key_exists($table, $tables)) { $columns = array_rekey( db_fetch_assoc("SHOW COLUMNS FROM " . $table), 'Field', array('Type', 'Null', 'Key', 'Default', 'Extra') ); foreach($columns as $field => $attribs) { if (array_key_exists($field, $known_columns)) { if (strpos($attribs['Type'], 'mediumint') === false) { if (strpos($attribs['Type'], 'int(10) unsigned') !== false) { debug("Column $field in Table $table already converted."); continue; } } if (strtolower($attribs['Extra']) == 'auto_increment') { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $field . ' int(10) unsigned NOT NULL AUTO_INCREMENT'; } else { if ($attribs['Default'] != '') { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $field . ' int(10) unsigned NOT NULL default "' . $attribs['Default'] . '"'; } elseif ($attribs['Null'] == 'NO') { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $field . ' int(10) unsigned NOT NULL'; } else { $sql .= ($i == 0 ? '':', ') . ' MODIFY COLUMN ' . $field . ' int(10) unsigned DEFAULT NULL'; } } debug("Updating Table $table."); db_execute($sql); $total++; } } } } return $total; } function database_get_column_attribs($table, $column) { return db_fetch_row("SHOW COLUMNS FROM $table LIKE '$column'"); } function debug($string) { global $debug; if ($debug) { print 'DEBUG: ' . trim($string) . PHP_EOL; } } function display_version() { $version = get_cacti_cli_version(); print "Cacti Fix Database Range Issue, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print 'usage: fix_mediumint.php [--debug]' . PHP_EOL . PHP_EOL; print 'Options:' . PHP_EOL; print '--debug - Display verbose output during execution' . PHP_EOL . PHP_EOL; print 'This utility is used to increase the size of key Cacti columns to accomodate' . PHP_EOL; print 'systems with over a million graphs and that have been in service for years.' . PHP_EOL; print 'After some long amount of time, Cacti can run out of auto_increment fields.' . PHP_EOL; } cacti-release-1.2.19/cli/host_update_template.php000077500000000000000000000152771413633772300220270ustar00rootroot00000000000000#!/usr/bin/env php 0) { $hosts = db_fetch_assoc("SELECT * FROM host $sql_where"); if (cacti_sizeof($hosts)) { foreach($hosts as $host) { print "NOTE: Updating Host '" . $host['description'] . "'\n"; $snmp_queries = db_fetch_assoc('SELECT snmp_query_id FROM host_template_snmp_query WHERE host_template_id=' . $host['host_template_id']); if (cacti_sizeof($snmp_queries) > 0) { print "NOTE: Updating Data Queries. There were '" . cacti_sizeof($snmp_queries) . "' Found\n"; foreach ($snmp_queries as $snmp_query) { print "NOTE: Updating Data Query ID '" . $snmp_query['snmp_query_id'] . "'\n"; db_execute('REPLACE INTO host_snmp_query (host_id,snmp_query_id,reindex_method) VALUES (' . $host['id'] . ', ' . $snmp_query['snmp_query_id'] . ',' . DATA_QUERY_AUTOINDEX_BACKWARDS_UPTIME . ')'); /* recache snmp data */ run_data_query($host['id'], $snmp_query['snmp_query_id']); } } $graph_templates = db_fetch_assoc('SELECT graph_template_id FROM host_template_graph WHERE host_template_id=' . $host['host_template_id']); if (cacti_sizeof($graph_templates) > 0) { print "NOTE: Updating Graph Templates. There were '" . cacti_sizeof($graph_templates) . "' Found\n"; foreach ($graph_templates as $graph_template) { db_execute('REPLACE INTO host_graph (host_id, graph_template_id) VALUES (' . $host['id'] . ', ' . $graph_template['graph_template_id'] . ')'); automation_hook_graph_template($host['id'], $graph_template['graph_template_id']); api_plugin_hook_function('add_graph_template_to_host', array('host_id' => $host['id'], 'graph_template_id' => $graph_template['graph_template_id'])); } } } } } else { print "ERROR: The selected Host Template does not exist, try --list-host-templates\n\n"; exit(1); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Retemplate Host Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: host_update_template.php --host-id=[host-id|all] [--host-template=[ID]] [--debug]\n\n"; print "A utility to update Cacti devices with the latest Device Template\n\n"; print "Required:\n"; print " --host-id=host_id|all - The host_id to have templates reapplied 'all' to do all hosts\n"; print " --host-template=ID - Which Host Template to Refresh\n\n"; print "Optional:\n"; print " --debug - Display verbose output during execution\n\n"; print "List Options:\n"; print " --list-host-templates - Lists all available Host Templates\n\n"; } function debug($message) { global $debug; if ($debug) { print("DEBUG: " . $message . "\n"); } } cacti-release-1.2.19/cli/import_package.php000077500000000000000000000132311413633772300205660ustar00rootroot00000000000000#!/usr/bin/env php 0) { if ($with_profile) { print "WARNING: '--with-profile' and '--profile-id=N' are exclusive. Ignoring '--with-profile'\n"; } else { $id = db_fetch_cell_prepared('SELECT id FROM data_source_profiles WHERE id = ?', array($profile_id)); if (empty($id)) { print "WARNING: Data Source Profile ID $profile_id not found. Using System Default\n"; $id = db_fetch_cell_prepared('SELECT id FROM data_source_profiles ORDER BY `default` DESC LIMIT 1'); } } } else { $id = db_fetch_cell_prepared('SELECT id FROM data_source_profiles ORDER BY `default` DESC LIMIT 1'); } if (empty($id)) { print "FATAL: No valid Data Source Profiles found on the system. Exiting!\n"; exit(1); } if ($filename != '') { if(file_exists($filename) && is_readable($filename)) { $fp = fopen($filename,'r'); $xml_data = fread($fp,filesize($filename)); fclose($fp); print 'Read ' . strlen($xml_data) . " bytes of XML data\n"; $debug_data = import_xml_data($xml_data, false, $id, $remove_orphans); import_display_results($debug_data, array(), $preview_only); } else { print "ERROR: file $filename is not readable, or does not exist\n\n"; exit(1); } } else { print "ERROR: no filename specified\n\n"; display_help(); exit(1); } } else { print "ERROR: no parameters given\n\n"; display_help(); exit(1); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Import Template Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: import_template.php --filename=[filename] [--with-profile | --profile-id=N]\n\n"; print "A utility to allow Cacti Templates to be imported from the command line.\n\n"; print "Required:\n"; print " --filename The name of the XML file to import\n\n"; print "Optional:\n"; print " --preview Preview the Template Import, do not import\n"; print " --with-profile Use the default system Data Source Profile\n"; print " --profile-id=N Use the specific profile id when importing\n"; print " --remove-orphans If importing a new version of the template, old\n"; print " elements will be removed, if they do not exist\n"; print " in the new version of the template.\n\n"; } cacti-release-1.2.19/cli/index.php000066400000000000000000000000501413633772300167000ustar00rootroot00000000000000 $input_string) { $aud = verify_data_input($hash, $input_string); if ($aud['status'] == true) { print 'ID: ' . $aud['id'] . ', Name: ' . $aud['name'] . ', Status: ' . 'Success' . PHP_EOL; print '------------------------------------------------------------------------------------------------------------' . PHP_EOL; print 'Command: ' . $aud['input_string'] . PHP_EOL . 'Whitelist: ' . $input_string . PHP_EOL; } else { print 'ID: ' . $aud['id'] . ', Name: ' . $aud['name'] . ', Status: ' . 'Failed' . PHP_EOL; print '------------------------------------------------------------------------------------------------------------' . PHP_EOL; print 'Command: ' . $aud['input_string'] . PHP_EOL . 'Whitelist: ' . $input_string . PHP_EOL; $totals++; } print '------------------------------------------------------------------------------------------------------------' . PHP_EOL . PHP_EOL; } if ($totals) { print 'ERROR: ' . $totals . ' audits failed out of a total of ' . $items . ' Data Input Methods' . PHP_EOL; } else { print 'SUCCESS: Audits successfull for total of ' . $items . ' Data Input Methods' . PHP_EOL; } } } elseif ($update) { if (!is_writable(dirname($config['input_whitelist']))) { print 'ERROR: Data Input whitelist file \'' . $config['input_whitelist'] . '\' not writeable.' . PHP_EOL; exit(1); } $input_db = db_fetch_assoc('SELECT id, name, hash, input_string FROM data_input WHERE input_string != ""'); if (file_exists($config['input_whitelist'])) { $input_ws = json_decode(file_get_contents($config['input_whitelist']), true); } else { $input_ws = array(); } $pushes = array(); if (cacti_sizeof($input_db)) { // format data for easier consumption $input = array(); foreach ($input_db as $value) { if ($push && isset($input_ws[$value['hash']])) { if ($value['input_string'] != $input_ws[$value['hash']]) { $pushes[$value['id']] = $value['name']; } } $input[$value['hash']] = $value['input_string']; } file_put_contents($config['input_whitelist'], json_encode($input)); print 'SUCCESS: Data Input Whitelist file \'' . $config['input_whitelist'] . '\' successfully updated.' . PHP_EOL; if (cacti_sizeof($pushes)) { foreach($pushes as $data_input_method => $name) { print 'NOTE: Pushing Out Data Input Method: ' . $name . ' (' . $data_input_method . ')' . PHP_EOL; push_out_data_input_method($data_input_method); } } } else { print 'ERROR: No Data Input records found.' . PHP_EOL; exit(1); } } else { display_help(); } exit(0); /* * display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Data Input Whitelist Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /* * display_help - displays the usage of the function */ function display_help () { display_version(); print PHP_EOL . "usage: input_whitelist.php [--audit | --update [--push]]" . PHP_EOL . PHP_EOL; print "A utility audit and update the Data Input whitelist status and" . PHP_EOL; print "Data Input protection file." . PHP_EOL . PHP_EOL; print "Optional:" . PHP_EOL; print " --audit Audit but do not update the whitelist file." . PHP_EOL; print " --update Update the whitelist file with latest information." . PHP_EOL; print " --push If any input strings are being updated to new values," . PHP_EOL; print " push out the Data Input Methods with new input strings." . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/cli/install_cacti.php000077500000000000000000000340461413633772300204210ustar00rootroot00000000000000#!/usr/bin/env php 'Cli'); $should_install = false; $force_install = false; display_version(); error_reporting(E_ALL); db_execute("DELETE FROM settings WHERE name like 'log_install%' or name = 'install_eula'"); define('log_install_echo', 'on'); if (cacti_sizeof($parms)) { foreach($parms as $parameter) { if (strpos($parameter, '=')) { list($arg, $value) = explode('=', $parameter); } else { $arg = $parameter; $value = ''; } switch ($arg) { /* Standard parameters */ case '-d': case '--debug': $logname = 'log_install'; $tmplevel = false; if (!empty($value)) { $pos = strpos($value,':'); if ($pos !== false) { $tmplevel = substr($value,$pos+1); $value = substr($value,0,$pos); } if (!empty($value)) { $logname .= '_' . $value; } } if ($tmplevel !== false) { $level = $tmplevel; } else { $level = log_install_level($logname, POLLER_VERBOSITY_NONE) + 1; } $level = log_install_level_sanitize($level); set_config_option($logname, $level); break; case '--version': case '-V': case '-v': exit(0); case '--help': case '-H': case '-h': display_help(); exit(0); /* Script specific parameters */ case '--accept-eula': set_install_option($options, 'Eula', 'End User License Agreement', 'Accepted'); break; case '--automationmode': case '-am': set_install_option($options, 'AutomationMode', 'Automation Enabled', $value); break; case '--automationrange': case '-ar': set_install_option($options, 'AutomationRange', 'Automation Range', $value); break; case '--cron': case '-c': set_install_option($options, 'CronInterval', 'Cron Interval', $value); break; case '--force': case '-f': $force_install = true; break; case '--ini': case '-i': get_install_option($options, $value, false); break; case '--json': case '-j': get_install_option($options, $value, true); break; case '--install': $should_install = true; break; case '--language': case '--lang': case '-l': set_install_option($options, 'Language', 'Language', $value); break; case '--mode': case '-m': set_install_option($options, 'Mode', 'Mode', $value); break; case '--profile': case '-p': set_install_option($options, 'Profile', 'Collection Profile', $value); break; case '--path': set_install_multioption($options, 'Paths', 'Path Option', $value, 'path_'); break; case '--rrdtool': case '-r': set_install_option($options, 'RRDVersion', 'RRDTool Version', $value); break; case '--snmp': set_install_multioption($options, 'SnmpOptions', 'Snmp Option', $value, 'Snmp'); break; case '--table': set_install_multioption($options, 'Tables', 'Table', $value, ''); break; case '--template': set_install_multioption($options, 'Templates', 'Template', $value, 'chk_template_', true); break; case '--theme': case '-t': set_install_option($options, 'Theme', 'Theme', $value); break; /* Bad or unexpected parameter! */ default: print 'ERROR: Invalid Parameter ' . $parameter . PHP_EOL . PHP_EOL; exit(1); } } } include_once($config['base_path'] . '/lib/api_automation.php'); include_once($config['base_path'] . '/lib/api_automation_tools.php'); include_once($config['base_path'] . '/lib/api_data_source.php'); include_once($config['base_path'] . '/lib/api_device.php'); include_once($config['base_path'] . '/lib/data_query.php'); include_once($config['base_path'] . '/lib/import.php'); include_once($config['base_path'] . '/lib/installer.php'); require_once($config['base_path'] . '/lib/poller.php'); include_once($config['base_path'] . '/lib/utility.php'); $options['Step'] = Installer::STEP_INSTALL_CONFIRM; $results = array('Step' => $options['Step']); $update_char = 'o'; debug_install_array('Options', $options); $installer = new Installer($options); $results = $installer->jsonSerialize(); debug_install_array('Result', $results); process_install_errors($results); $install_mode = 'no'; switch ($installer->getMode()) { case Installer::MODE_INSTALL: $install_mode = 'INSTALL CORE'; break; case Installer::MODE_POLLER: $install_mode = 'INSTALL POLLER'; break; case Installer::MODE_UPGRADE: $install_mode = 'UPGRADE'; break; case Installer::MODE_DOWNGRADE: $install_mode = 'DOWNGRADE'; break; } log_install_always('cli', 'Installer prepared for ' . $install_mode . ' action'); $message = ''; if ($installer->getStep() == Installer::STEP_INSTALL_CONFIRM && $should_install) { $time = ''; if ($force_install) { $time = '-b'; } log_install_always('cli', 'Starting installation...'); Installer::beginInstall($time, $installer); log_install_always('cli', 'Finished installation...'); } $step = $installer->getStep(); log_install_high('cli','getStep(): ' . $step); switch ($installer->getStep()) { case Installer::STEP_INSTALL: log_install_always('cli', 'An Installation was already in progress'); break; case Installer::STEP_INSTALL_CONFIRM: log_install_always('cli', 'No errors were detected. Install not performed as --install not specified'); break; case Installer::STEP_ERROR: log_install_always('cli', 'One or more errors occurred during install, please refer to log files'); process_install_errors(array('Errors'=>$installer->getErrors())); break; case Installer::STEP_COMPLETE: log_install_always('cli', 'Installation has now completed, you may launch the web console'); break; default: log_install_always('cli', 'Unexpected step (' . $installer->getStep() . ')'); break; } print PHP_EOL; /* get_install_option - gets the install options from a json file */ function get_install_option(&$options, $file, $json = true) { if (empty($file)) { print 'ERROR: Invalid file specified, unable to import options'; exit(1); } if ($json) { $contents = @file_get_contents($file); if (empty($contents)) { print 'ERROR: Unable to import options from file ' . $file; exit(1); } $options = @json_decode($contents, true); if (empty($options)) { print 'ERROR: Failed to decode options in file ' . $file; exit(1); } } else { $options = @parse_ini_file($file); if (empty($options)) { print 'ERROR: Unable to import options from file ' . $file; exit(1); } } } /* set_install_option - sets and optional displays debug line of action */ function set_install_option(&$options, $key, $display_name, $value) { global $debug; $options[$key] = $value; log_install_high('cli',sprintf('Setting %s to \'%s\'', $display_name, $value)); } /* set_install_multioption - sets sub-options that have mutiple key/value combinations with optional prefix */ function set_install_multioption(&$options, $key, $display_name, $value, $prefix, $replace_dots = false) { $option_pos = strpos($value, ':'); if ($option_pos !== false) { $option_name = trim(substr($value, 0, $option_pos)); if ($replace_dots) { $option_name = str_replace('.', '_', $option_name); } $prefix_len = strlen($prefix); if ($prefix_len > 0 && substr($option_name, 0, $prefix_len) == $prefix) { $option_key = $option_name; $option_name = substr($option_key, $prefix_len); } else { $option_key = $prefix . $option_name; } $option_value = trim(substr($value, $option_pos + 1)); set_install_option($options[$key], $option_key, $display_name . ' \'' . $option_name . '\'', $option_value); } else { echo 'ERROR: Invalid ' . $display_name . ' value ' . $value . PHP_EOL . PHP_EOL; exit(1); } } function debug_install_array($parent, $contents, $indent = 0) { $hasContents = false; foreach ($contents as $key => $value) { if (is_array($value) || is_object($value)) { debug_install_array($parent . '.' . $key, $value, $indent + 1); } else { $hasContents = true; log_install_debug('cli',$parent . '.' . $key . ': ' . $value); } } if (!$hasContents) { log_install_debug('cli',$parent . ' (no items)'); } } function process_install_errors($results) { if (isset($results['Errors']) && cacti_sizeof($results['Errors']) > 0) { $errors = $results['Errors']; $count = 0; $sections = 0; foreach ($errors as $error_section => $error_array) { $sections++; print $error_section . PHP_EOL; foreach ($error_array as $error_key => $error) { $count++; print $error_key . ' Error #' . $count . ' - ' . $error . PHP_EOL; } } print PHP_EOL . 'Unable to continue as ' . $count . ' issue' . ($count == 1?'':'s') . ' in ' . $sections . ' section' . ($sections == 1?'':'s') . ' were found.' . PHP_EOL; exit(1); } } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Install Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /* display_help - displays the usage of the function */ function display_help () { print PHP_EOL . 'usage: install_cacti.php [--debug] --accept-eula ' . PHP_EOL; print ' [--automationmode=] [--automationrange=] [--cron=]' . PHP_EOL; print ' [--language=] [--mode=] [--profile=] [--path=]' . PHP_EOL; print ' [--rrdtool=] [--snmp=] [--table=] [--template=]' . PHP_EOL; print ' [--theme=]' . PHP_EOL; print PHP_EOL . 'A utility to install/upgrade Cacti to the currently sourced version' . PHP_EOL; print PHP_EOL . 'Flags:' . PHP_EOL; print ' -d | --debug - Display verbose output during execution' . PHP_EOL; print ' -h | --help - Display this help' . PHP_EOL; print ' -v | --version - Display version' . PHP_EOL; print ' -f | --force - Override certain safety checks' . PHP_EOL; print PHP_EOL . 'Required:' . PHP_EOL; print ' --accept-eula - Accept the End User License Agreement' . PHP_EOL; print ' --install - Perform the installation' . PHP_EOL; print PHP_EOL . 'Optional:' . PHP_EOL; print ' -am | --automationmode - Enable/Disable automatic network discovery' . PHP_EOL; print ' -ar | --automationrange - Set automatic network discovery subnet' . PHP_EOL; print ' -c | --cron - Set the cron interval' . PHP_EOL; print ' -l | --lang[uage] - Set system language' . PHP_EOL; print ' -m | --mode - Set the installation mode' . PHP_EOL; print ' -p | --profile - Set the default Data Collector profile' . PHP_EOL; print ' -r | --rrdtool - Set the RRD Tool version' . PHP_EOL; print ' -t | --theme - Set system theme' . PHP_EOL; print ' -i | --ini - Load settings from ini file' . PHP_EOL; print ' -j | --json - Load settings from json file' . PHP_EOL; print PHP_EOL . 'Mutli-value optional:' . PHP_EOL; print ' These options may be used more than once to apply multiple values. All' . PHP_EOL; print ' values should be in "option_key:option_value" format (see below). If an' . PHP_EOL; print ' option has a prefix, this is optional and is automatically added to the' . PHP_EOL; print ' the option_key specified if it does not start with that prefix' . PHP_EOL . PHP_EOL; print ' Note: reusing an option_key will replace its value with the last one' . PHP_EOL; print ' specified.' .PHP_EOL . PHP_EOL; print ' --path - Sets path locations. Example: ' . PHP_EOL; print ' --path=cactilog:/usr/share/cacti/log/cacti.log' . PHP_EOL; print ' --path=cactilog:c:\cacti\log\cacti.log' . PHP_EOL; print ' Prefix: path_' . PHP_EOL; print PHP_EOL; print ' --snmp - Sets default snmp options. Example:' . PHP_EOL; print ' --snmp=SnmpCommunity:public' . PHP_EOL; print ' --snmp=Community:public' . PHP_EOL; print ' Prefix: Snmp' . PHP_EOL; print PHP_EOL; print ' Note: the following two options expect a value of either 1 (Action) or' . PHP_EOL; print ' 0 (Skip)' . PHP_EOL; print PHP_EOL; print ' --template - Sets templates to be installed. Example:' . PHP_EOL; print ' --template=Cisco_Router.xml.gz:1' . PHP_EOL; print PHP_EOL; print ' --table - Selects a table to be converted to UTF8. Example:' . PHP_EOL; print ' --table=plugin_config:1' . PHP_EOL; print PHP_EOL; } cacti-release-1.2.19/cli/md5sum.php000077500000000000000000000224061413633772300170170ustar00rootroot00000000000000#!/usr/bin/env php $md5) { $output .= "$md5 $filename\n"; } if (!$quiet) { print 'Writing '.cacti_sizeof($file_array)." entries to $md5_file\n"; } if (!$confirm && file_exists($md5_file)) { fail(EXIT_MD5OVR,$md5_file); } if (file_put_contents($md5_file,$output) === false) { fail(EXIT_MD5WRI,$md5_file); } } else { if (!file_exists($md5_file)) { fail(EXIT_MD5MIS,$md5_file); } $contents = file_get_contents($md5_file, false); if ($contents === false) { fail(EXIT_MD5CON,$md5_file); } $contents = explode("\n",$contents); $line = 0; $verify_array = array(); foreach ($contents as $md5) { $line++; if (strlen($md5)) { if ($md5[32] != ' ') { fail(EXIT_MD5LIN,array($line,$md5)); } $filename = trim(substr($md5,33)); $verify_array[$filename] = substr($md5,0,32); } } $all_keys = array_unique(array_merge(array_keys($file_array),array_keys($verify_array))); foreach ($all_keys as $filename) { $hash_read = sprintf("%32s","Missing"); if (array_key_exists($filename, $file_array)) { $hash_read = $file_array[$filename]; } $hash_file = sprintf("%32s","Missing"); if (array_key_exists($filename, $verify_array)) { $hash_file = $verify_array[$filename]; } if ($hash_read != $hash_file) { if ($quiet) { fail(EXIT_MD5ERR); } print "$filename: FAILED\n"; if ($debug || $show_hash) { print " Read: [$hash_read]\n"; print " File: [$hash_file]\n"; } } } } function dirToArray($dir,$base,$ignore) { global $debug,$quiet; $result = array(); $fulldir = $base; if (isset($dir) && strlen($dir)) { $fulldir .= DIRECTORY_SEPARATOR.$dir; } $fulldir = realpath($fulldir); if (strpos($fulldir,$base) !== false) { if (is_dir($fulldir)) { $cdir = scandir($fulldir); } else { $cdir = array(); } if (!$quiet && $debug) { print "\nSearching '$fulldir' ... \n"; } $dir_list = array(); foreach ($cdir as $key => $value) { $fullpath = $fulldir.DIRECTORY_SEPARATOR.$value; $partpath = substr($fullpath,strlen($base)); if (preg_match($ignore,$partpath)==0) { if (is_dir($fullpath)) { $dir_list[] = $partpath; } else { $md5_sum = @md5_file($fullpath); if (!$quiet && $debug) { print "[$md5_sum] $value\n"; } $result[substr($partpath,1)] = $md5_sum; } } else { if (!$quiet && $debug) { print "[ Ignored] $value\n"; } } } foreach ($dir_list as $partpath) { $result = array_merge($result,dirToArray($partpath, $base, $ignore)); } } else if (!$quiet && ($debug || !strlen($dir))) { $value = substr($dir,strlen(dirname($dir))+1); print "[ Outside Base, Ignored] $value\n"; } return $result; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti md5sum Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: md5sum.php [option] [filename]\n"; print "\nOptions:\n"; print " -c When specified used creates a file containing the md5 hash\n"; print " --create followed by the name. Otherwise, the file is verified\n\n"; print " -d logs additional ouptut to the screen to aid in dignosising\n"; print " --debug potential issues\n\n"; print " -b When specified, sets the base directory to search from. If\n"; print " --basedir not specified, defaults to the directory above this script\n\n"; print " -q When specified, quiet mode only returns an exit value that\n"; print " --quiet corresponds to the point of exit. Suppresess debug option\n\n"; print " -s When specified, adds extra output to the verify mode which\n"; print " --show shows both the stored and computed hash value that failed\n"; print " --show_hash to match\n\n"; print "\nWhen no filename is passed, .md5sum is assumed. Only one filename allowed\n"; } function fail($exit_value,$args = array(),$display_help = 0) { global $quiet,$fail_msg; if (!$quiet) { if (!isset($args)) { $args = array(); } else if (!is_array($args)) { $args = array($args); } if (!array_key_exists($exit_value,$fail_msg)) { $format = $fail_msg[EXIT_UNKNOWN]; } else { $format = $fail_msg[$exit_value]; } call_user_func_array('printf', array_merge((array)$format, $args)); if ($display_help) { display_help(); } } exit($exit_value); } function define_exit($name, $value, $text) { global $fail_msg; if (!isset($fail_msg)) { $fail_msg = array(); } define($name,$value); $fail_msg[$name] = $text; $fail_msg[$value] = $text; } cacti-release-1.2.19/cli/poller_data_sources_reapply_names.php000077500000000000000000000142501413633772300245530ustar00rootroot00000000000000#!/usr/bin/env php 0) { $host_str .= ($host_str != '' ? ', ':'') . $host; } } $sql_where .= " AND data_local.host_id IN ($host_str)"; } elseif ($host_id == '0') { $sql_where .= ' AND data_local.host_id=0'; } elseif (!empty($host_id) && $host_id > 0) { $sql_where .= ' AND data_local.host_id=' . $host_id; } else { print "ERROR: You must specify either a host_id or 'all' to proceed.\n"; display_help(); exit; } $data_source_list_sql = "SELECT data_template_data.local_data_id, data_template_data.name_cache, data_template_data.active, data_input.name as data_input_name, data_template.name as data_template_name, data_local.host_id FROM (data_local,data_template_data) LEFT JOIN data_input ON (data_input.id=data_template_data.data_input_id) LEFT JOIN data_template ON (data_local.data_template_id=data_template.id) WHERE data_local.id=data_template_data.local_data_id $sql_where"; $data_source_list = db_fetch_assoc($data_source_list_sql); /* issue warnings and start message if applicable */ if (cacti_sizeof($data_source_list) > 0) { print "WARNING: Do not interrupt this script. Interrupting during rename can cause issues\n"; debug("There are '" . cacti_sizeof($data_source_list) . "' Data Sources to rename"); $i = 1; foreach ($data_source_list as $data_source) { if (!$debug) print "."; debug("Data Source Name '" . $data_source['name_cache'] . "' starting"); api_reapply_suggested_data_source_data($data_source['local_data_id']); update_data_source_title_cache($data_source['local_data_id']); debug("Data Source Rename Done for Data Source '" . addslashes(get_data_source_title($data_source['local_data_id'])) . "'"); $i++; } } else { if ($debug) { print " -------------------------- Data Source Selection SQL: -------------------------- $data_source_list_sql --------------------------\n\n"; } print "WARNING: No Data Sources where found matching the selected criteria."; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Reapply Data Source Names Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help() { display_version(); print "\nusage: poller_data_sources_reapply_names.php --host-id=[id|all][N1,N2,...] [--filter=string] [--debug]\n\n"; print "A utility that will recalculate Data Source names for the selected Data Templates.\n\n"; print "Required:\n"; print " --host-id=N|all|N1,N2,... - The deivces id, 'all' or a comma delimited list of id's\n\n"; print "Optional:\n"; print " --filter=search - A Data Template name or Data Source Title to search for\n"; print " --debug - Display verbose output during execution\n\n"; } function debug($message) { global $debug; if ($debug) { print ('DEBUG: ' . $message . "\n"); } } cacti-release-1.2.19/cli/poller_graphs_reapply_names.php000077500000000000000000000125051413633772300233640ustar00rootroot00000000000000#!/usr/bin/env php 0) { $host_str .= ($host_str != '' ? ', ':'') . $host; } } $sql_where .= " AND graph_local.host_id IN ($host_str)"; } elseif ($host_id == '0') { $sql_where .= ' AND graph_local.host_id=0'; } elseif (!empty($host_id) && $host_id > 0) { $sql_where .= ' AND graph_local.host_id=' . $host_id; } else { print "ERROR: You must specify either a host_id or 'all' to proceed.\n"; display_help(); exit; } $graph_list = db_fetch_assoc("SELECT graph_templates_graph.id, graph_templates_graph.local_graph_id, graph_templates_graph.height, graph_templates_graph.width, graph_templates_graph.title_cache, graph_templates.name, graph_local.host_id FROM (graph_local,graph_templates_graph) LEFT JOIN graph_templates ON (graph_local.graph_template_id=graph_templates.id) WHERE graph_local.id=graph_templates_graph.local_graph_id $sql_where"); /* issue warnings and start message if applicable */ print "WARNING: Do not interrupt this script. Interrupting during rename can cause issues\n"; debug("There are '" . cacti_sizeof($graph_list) . "' Graphs to rename"); $i = 1; foreach ($graph_list as $graph) { if (!$debug) print "."; debug("Graph Name '" . $graph["title_cache"] . "' starting"); api_reapply_suggested_graph_title($graph["local_graph_id"]); update_graph_title_cache($graph["local_graph_id"]); debug("Graph Rename Done for Graph '" . $graph["title_cache"] . "'"); $i++; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Reapply graph Names Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: poller_graphs_reapply_names.php --host-id=[id|all][N1,N2,...] [--filter=[string] [--debug]\n\n"; print "A utility to reapply Cacti Graph naming rules to existing Graphs in bulk.\n\n"; print "Required:\n"; print " --host-id=id|all|N1,N2,... - The devices id, 'all' or a comma delimited list of id's\n\n"; print "Optional:\n"; print " --filter=string - A Graph Template name or Graph Title to search for\n"; print " --debug - Display verbose output during execution\n\n"; } function debug($message) { global $debug; if ($debug) { print("DEBUG: " . $message . "\n"); } } cacti-release-1.2.19/cli/poller_output_empty.php000077500000000000000000000064661413633772300217500ustar00rootroot00000000000000#!/usr/bin/env php 0) { $rrds_processed = $rrds_processed + process_poller_output($rrdtool_pipe, false); } print "There were $rrds_processed RRD updates made this pass\n"; rrd_close($rrdtool_pipe); /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Process Poller Output Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: poller_output_empty.php\n\n"; print "A utility to process the poller output table. This tool is deprecated but should work.\n\n"; } cacti-release-1.2.19/cli/poller_reindex_hosts.php000077500000000000000000000156071413633772300220450ustar00rootroot00000000000000#!/usr/bin/env php 0) { $sql_where = 'WHERE host_id = ?'; $params[] = $host_id; } else { print 'ERROR: You must specify either a host_id or \'all\' to proceed.' . PHP_EOL; display_help(); exit; } /* determine data queries to rerun */ if (strtolower($query_id) == 'all') { /* do nothing */ } elseif (is_numeric($query_id) && $query_id > 0) { $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . ' snmp_query_id = ?'; $params[] = $query_id; } else { print 'ERROR: You must specify either a query_id or \'all\' to proceed.' . PHP_EOL; display_help(); exit; } /* allow for additional filtering on host description */ $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . ' disabled = ""'; if ($host_descr != '') { $sql_where .= ($sql_where != '' ? ' AND':'WHERE') . ' description LIKE ?'; $params[] = '%' . $host_descr . '%'; } $data_queries = db_fetch_assoc_prepared("SELECT description, hostname, host_id, snmp_query_id FROM host_snmp_query INNER JOIN host ON host.id = host_snmp_query.host_id $sql_where", $params); /* issue warnings and start message if applicable */ print 'WARNING: Do not interrupt this script. Reindexing can take quite some time' . PHP_EOL; debug("There are '" . cacti_sizeof($data_queries) . "' data queries to run"); $i = 1; $total_start = microtime(true); if (cacti_sizeof($data_queries)) { foreach ($data_queries as $data_query) { if (!$debug) { print '.'; } $start = microtime(true); run_data_query($data_query['host_id'], $data_query['snmp_query_id'], false, $force); $items = db_fetch_cell_prepared('SELECT COUNT(*) FROM host_snmp_cache WHERE host_id = ? AND snmp_query_id = ?', array($data_query['host_id'], $data_query['snmp_query_id'])); $orphans = db_fetch_cell_prepared('SELECT COUNT(*) FROM graph_local WHERE host_id = ? AND snmp_query_id = ? AND snmp_index = ""', array($data_query['host_id'], $data_query['snmp_query_id'])); $end = microtime(true); $message = sprintf( 'Re-Index Complete: Number[%d], TotalTime[%4.2f], QueryTime[%3.2f], Device[%d], Description[%s], DQ[%d], Items[%d], Orphans[%d]', $i, $end - $total_start, $end - $start, $data_query['host_id'], $data_query['description'], $data_query['snmp_query_id'], $items, $orphans ); debug($message); $i++; } } function display_version() { $version = get_cacti_cli_version(); print "Cacti Reindex Host Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print 'usage: poller_reindex_hosts.php --id=[host_id|all] [--qid=[ID|all]]' . PHP_EOL; print ' [--host-descr=[description]] [--debug]' . PHP_EOL . PHP_EOL; print '--id=host_id - The host_id to have data queries reindexed or \'all\' to reindex all hosts\n' . PHP_EOL; print '--qid=query_id - Only index on a specific data query id; defaults to \'all\'' . PHP_EOL; print '--host-descr=description - The host description to filter by (SQL filters acknowledged)' . PHP_EOL; print '--force - Force Graph and Data Source Suggested Name Re-mapping for all items' . PHP_EOL; print '--debug - Display verbose output during execution' . PHP_EOL; } function debug($message) { global $debug; if ($debug) { print 'DEBUG: ' . $message . PHP_EOL; } } cacti-release-1.2.19/cli/poller_replicate.php000077500000000000000000000103771413633772300211360ustar00rootroot00000000000000#!/usr/bin/env php 1 AND disabled=""'); } else { $pollers = db_fetch_assoc_prepared('SELECT id FROM poller WHERE id != 1 AND id = ? AND disabled=""', array($poller_id)); } if (cacti_sizeof($pollers)) { foreach ($pollers as $poller) { db_execute_prepared('UPDATE poller SET last_sync = NOW(), requires_sync="" WHERE id = ?', array($poller['id'])); replicate_out($poller['id'], $class); cacti_log('STATS: Poller ID ' . $poller['id'] . ' fully Replicated', false, 'POLLER'); } } else { print 'FATAL: The poller specified ' . $poller_id . ' is either disabled, or does not exist!' . PHP_EOL; exit(1); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Poller Full Sync Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nA utility to fully Synchronize Remote Data Collectors.\n\n"; print "usage: poller_replicate.php [--poller=N] [--class=all|data|auth|settings]\n\n"; print "Optional:\n"; print " --poller=N The numeric id of the poller to replicate out. Otherwise all\n"; print " pollers. The default is all.\n"; print " --class=S The class of data to replicate. Includes all, data, auth\n"; print " settings. The default is all.\n"; } cacti-release-1.2.19/cli/rebuild_poller_cache.php000077500000000000000000000114241413633772300217310ustar00rootroot00000000000000#!/usr/bin/env php 0) { $poller_data = db_fetch_assoc('SELECT * FROM data_local WHERE host_id=' . $host_id); } else { $poller_data = db_fetch_assoc('SELECT * FROM data_local'); } /* initialize some variables */ $current_ds = 1; $total_ds = cacti_sizeof($poller_data); /* setting local_data_ids to an empty array saves time during updates */ $local_data_ids = array(); $poller_items = array(); /* issue warnings and start message if applicable */ print "WARNING: Do not interrupt this script. Rebuilding the Poller Cache can take quite some time\n"; debug("There are '" . cacti_sizeof($poller_data) . "' data source elements to update."); /* start rebuilding the poller cache */ if (cacti_sizeof($poller_data)) { foreach ($poller_data as $data) { if (!$debug) print '.'; $local_data_ids[] = $data['id']; $poller_items = array_merge($poller_items, update_poller_cache($data)); debug("Data Source Item '$current_ds' of '$total_ds' updated"); $current_ds++; } if (cacti_sizeof($local_data_ids)) { poller_update_poller_cache_from_buffer($local_data_ids, $poller_items); } } if (!$debug) print "\n"; /* poller cache rebuilt, restore runtime parameters */ ini_set('max_execution_time', $max_execution); /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Rebuild Poller Cache Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: rebuild_poller_cache.php [--host-id=ID] [--debug]\n\n"; print "A utility to repopulate Cacti's poller cache for a host or a system. Note: That when performing\n"; print "for an entire Cacti system, expecially a large one, this may take some time.\n\n"; print "Optional:\n"; print " --host-id=ID - Limit the repopulation to a single Cacti Device\n"; print " --debug - Display verbose output during execution\n\n"; } function debug($message) { global $debug; if ($debug) { print 'DEBUG: ' . trim($message) . "\n"; } } cacti-release-1.2.19/cli/refresh_csrf.php000066400000000000000000000075561413633772300202660ustar00rootroot00000000000000#!/usr/bin/env php '') { if ($debug) { print "Searching hosts by description...\n"; } $ids_host = preg_array_key_match("/$description/", $hosts); if (cacti_sizeof($ids_host) == 0) { print "ERROR: Unable to find host in the database matching desciption ($description)\n"; exit(1); } } if ($ip > '') { if ($debug) { print "Searching hosts by IP...\n"; } $ids_ip = preg_array_key_match("/$ip/", $addresses); if (cacti_sizeof($ids_ip) == 0) { print "ERROR: Unable to find host in the database matching IP ($ip)\n"; exit(1); } } if (cacti_sizeof($ids_host) == 0 && cacti_sizeof($ids_ip) == 0) { print "ERROR: No matches found, was IP or Description set properly?\n"; exit(1); } $ids = array_merge($ids_host, $ids_ip); $ids = array_unique($ids, SORT_NUMERIC); $ids_sql = implode(',',$ids); if ($debug) { print "Finding devices with ids $ids_sql\n\n"; } $hosts = db_fetch_assoc("SELECT id, hostname, description FROM host WHERE id IN ($ids_sql) ORDER by description"); $ids_found = array(); if (!$quiet) { printf("%8.s | %30.s | %30.s\n",'id','host','description'); foreach ($hosts as $host) { printf("%8.d | %30.s | %30.s\n",$host['id'],$host['hostname'],$host['description']); $ids_found[] = $host['id']; } print "\n"; } if ($confirm) { $ids_confirm = implode(', ',$ids_found); if (!$quiet) { print "Removing devices with ids: $ids_confirm\n"; } $host_id = api_device_remove_multi($ids); if (is_error_message()) { print "ERROR: Failed to remove devices\n"; exit(1); } else { print "Success - removed device-ids: $ids_confirm\n"; exit(0); } } else { print "Please use --confirm to remove these devices\n"; } } else { display_help(); exit(0); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Remove Device Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: remove_device.php --description=[description] --ip=[IP]\n"; print " [--confirm] [--quiet]\n\n"; print "Required:\n"; print " --description the name that will be displayed by Cacti in the graphs\n"; print " --ip self explanatory (can also be a FQDN)\n"; print " (either one or both fields can be used and may be regex)\n\n"; print "Optional:\n"; print " -confirm confirms that you wish to remove matches\n\n"; print "List Options:\n"; print " --quiet - batch mode value return\n\n"; } function preg_array_key_match($needle, $haystack) { global $debug; $matches = array (); if (isset($haystack)) { if (!is_array($haystack)) { $haystack = array($haystack); } } else { $haystack = array(); } if ($debug) { print "Attempting to match against '$needle' against ".cacti_sizeof($haystack)." entries\n"; } foreach ($haystack as $str => $value) { if ($debug) { print " - Key $str => Value $value\n"; } if (preg_match ($needle, $str, $m)) { if ($debug) { print " + $str: $value\n"; } $matches[] = $value; } } return $matches; } cacti-release-1.2.19/cli/remove_graphs.php000077500000000000000000000230371413633772300204470ustar00rootroot00000000000000#!/usr/bin/env php $value) { switch($arg) { case 'graph-regex': if (!is_array($value)) { $value = array($value); } $regex = $value; foreach($value as $item) { if (!validate_is_regex($item)) { print "ERROR: Regex specified '$item', is not a valid Regex!" . PHP_EOL; exit(1); } } break; case 'graph-template-id': if (!is_array($value)) { $value = array($value); } $graph_template_ids = $value; break; case 'host-template-id': if (!is_array($value)) { $value = array($value); } $host_template_ids = $value; break; case 'host-id': if (!is_array($value)) { $value = array($value); } $host_ids = $value; break; case 'all': $all = true; break; case 'list': $list = true; break; case 'list-hosts': $listHosts = true; break; case 'list-graph-templates': $listGraphTemplates = true; break; case 'list-host-templates': $listHostTemplates = true; break; case 'force': $force = true; break; case 'version': case 'V': case 'v': display_version(); exit(0); case 'help': case 'H': case 'h': display_help(); exit(0); default: print "ERROR: Invalid Argument: ($arg)" . PHP_EOL . PHP_EOL; } } } else { display_help(); exit(0); } if ($list && $force) { print "The --list and --force options are mutually exclusive. Pick on or the other." . PHP_EOL; exit(1); } if (cacti_sizeof($host_template_ids)) { foreach($host_template_ids as $id) { if (!is_numeric($id) || $id <= 0) { print "FATAL: Host Template ID $id is invalid" . PHP_EOL; exit(1); } } } if (cacti_sizeof($graph_template_ids)) { foreach($graph_template_ids as $id) { if (!is_numeric($id) || $id <= 0) { print "FATAL: Graph Template ID $id is invalid" . PHP_EOL; exit(1); } } } if (cacti_sizeof($host_ids)) { foreach($host_ids as $id) { if (!is_numeric($id) || $id <= 0) { print "FATAL: Host ID $id is invalid" . PHP_EOL; exit(1); } } } if ($listHosts) { $hosts = getHosts($host_template_ids); displayHosts($hosts, $quietMode); exit(0); } elseif ($listHostTemplates) { $hostTemplates = getHostTemplates(); displayHostTemplates($hostTemplates, $quietMode); exit(0); } elseif ($listGraphTemplates) { $graphTemplates = getGraphTemplatesByHostTemplate($host_template_ids); displayGraphTemplates($graphTemplates, $quietMode); exit(0); } else { $sql_where = 'WHERE gl.id > 0'; $all_option = true; if (cacti_sizeof($host_ids) && $all === false) { $sql_where .= ' AND gl.host_id IN (' . implode(',', $host_ids). ')'; $all_option = false; } if (cacti_sizeof($host_template_ids) && $all === false) { $sql_where .= ' AND h.host_template_id IN (' . implode(',', $host_template_ids). ')'; $all_option = false; } if (cacti_sizeof($graph_template_ids) && $all === false) { $sql_where .= ' AND gl.graph_template_id IN (' . implode(',', $graph_template_ids). ')'; $all_option = false; } if (cacti_sizeof($regex) && $all === false) { $sql_where .= ' AND ('; $sql_cwhere = ''; foreach($regex as $r) { $sql_cwhere .= ($sql_cwhere == '' ? '':' OR ') . 'title_cache RLIKE "' . $r . '"'; } $sql_where .= $sql_cwhere . ')'; $all_option = false; } if ($all_option && $all === false && $list === false) { print 'ERROR: The options specified will remove all graphs. To do this you must use the --all option. Exiting' . PHP_EOL; exit(1); } $graphs = db_fetch_assoc("SELECT gl.id, gtg.title_cache FROM graph_local AS gl INNER JOIN graph_templates_graph AS gtg ON gl.id=gtg.local_graph_id INNER JOIN host AS h ON h.id = gl.host_id $sql_where"); if ($graphs != false && cacti_sizeof($graphs)) { print 'There are ' . cacti_sizeof($graphs) . ' Graphs to Remove.' . (!$force ? ' Use the --force option to remove these Graphs.':''); if ($list) { print PHP_EOL . "ID\tGraphName" . PHP_EOL; foreach($graphs as $graph) { print $graph['id'] . "\t" . $graph['title_cache'] . PHP_EOL; } } elseif ($force) { $local_graph_ids = array_rekey($graphs, 'id', 'id'); if ($preserve) { print ' Data Sources will be preserved.' . PHP_EOL; $delete_type = 1; } else { print ' Data Sources will be removed if possible.' . PHP_EOL; $delete_type = 2; } api_delete_graphs($local_graph_ids, $delete_type); print 'Delete Operation Completed' . PHP_EOL; } else { print PHP_EOL . ' Use the --list option to view the list of Graphs' . PHP_EOL;; } } else { print 'No matching Graphs found.' . PHP_EOL; exit(1); } } exit(0); /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Remove Graphs Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } function display_help() { display_version(); print PHP_EOL . "usage: remove_graphs.php --graph-template-id=ID [--host-template-id=ID" . PHP_EOL; print " [--host-id=ID] [--graph-regex=R]" . PHP_EOL; print " [--force] [--preserve]" . PHP_EOL . PHP_EOL; print "Cacti utility for removing Graphs through the command line." . PHP_EOL . PHP_EOL; print "Options:" . PHP_EOL; print " --graph-template-id=ID Mandatory list of Graph Templates." . PHP_EOL; print " --host-template-id=ID Optional list of Device Templates." . PHP_EOL; print " --host-id=ID Optional list of Device IDs." . PHP_EOL; print " --graph-regex=R Optional Graph name regular expression." . PHP_EOL; print " --all Remove all Graphs. Ignore other settings." . PHP_EOL; print " --force Actually remove the Graphs, dont just list." . PHP_EOL; print " --preserve Preserve the Data Sources. Default is to remove." . PHP_EOL . PHP_EOL; print "By default, you must provide from one to many graph-template-id. Device Template IDs" . PHP_EOL; print "Device IDs and the regular expression are optional. If you wish to specify multiple" . PHP_EOL; print "IDs, just repeat the parameter ex: --host-template-id=X --host-template-id=Y" . PHP_EOL . PHP_EOL; print "By default, this utility will only report on the number of Graphs that will be removed. If you" . PHP_EOL; print "provide the --force option, the Graphs will actually be removed. If you use the --list option" . PHP_EOL; print "each of the Graphs to be removed, will be listed. Options --list and --force are" . PHP_EOL; print "mutulally exclusive." . PHP_EOL . PHP_EOL; print "List Options:" . PHP_EOL; print " --list" . PHP_EOL; print " --list-hosts [--host-template-id=ID]" . PHP_EOL; print " --list-graph-templates [--host-template-id=ID]" . PHP_EOL; print " --list-host-templates" . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/cli/removespikes.php000077500000000000000000000156321413633772300203240ustar00rootroot00000000000000#!/usr/bin/env php debug = true; } if ($html) { $spiker->html = true; } else { $spiker->html = false; } if ($dryrun) { $spiker->dryrun = true; } else { $spiker->dryrun = false; } $result = $spiker->remove_spikes(); if (!$result) { print "ERROR: Remove Spikes experienced errors\n"; print $spiker->get_errors(); exit(-1); } else { print $spiker->get_output(); exit(0); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Spike Remover Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: removespikes.php -R|--rrdfile=rrdfile [-M|--method=stddev] [-A|--avgnan] [-S|--stddev=N]\n"; print " [-O|--outliers=N | --outlier-start=YYYY-MM-DD HH:MM --outlier-end=YYYY-MM-DD HH:MM]\n"; print " [-P|--percent=N] [-N|--number=N] [-D|--dryrun] [-d|--debug]\n"; print " [--html]\n\n"; print "A utility to programatically remove spikes from Cacti graphs. If no optional input parameters\n"; print "are specified the defaults are taken from the Cacti database.\n\n"; print "Required:\n"; print " --rrdfile=F - The path to the RRDfile that will be de-spiked.\n\n"; print "Optional:\n"; print " --method - The spike removal method to use. Options are stddev|variance|fill|float\n"; print " --avgnan - The spike replacement method to use. Options are last|avg|nan\n"; print " --stddev - The number of standard deviations +/- allowed\n"; print " --percent - The sample to sample percentage variation allowed\n"; print " --number - The maximum number of spikes to remove from the RRDfile\n"; print " --outlier-start - A start date of an incident where all data should be considered\n"; print " invalid data and should be excluded from average calculations.\n"; print " --outlier-end - An end date of an incident where all data should be considered\n"; print " invalid data and should be excluded from average calculations.\n"; print " --outliers - The number of outliers to ignore when calculating average.\n"; print " --dryrun - If specified, the RRDfile will not be changed. Instead a summary of\n"; print " changes that would have been performed will be issued.\n"; print " --backup - Backup the original RRDfile to preserve prior values.\n\n"; print "The remainder of arguments are informational\n"; print " --html - Format the output for a web browser\n"; print " --debug - Display verbose output during execution\n"; } cacti-release-1.2.19/cli/reorder_data_query.php000077500000000000000000000137151413633772300214700ustar00rootroot00000000000000#!/usr/bin/env php '" . $table['Tables_in_' . $database_default] . "'"; $status = db_execute('REPAIR TABLE ' . $table['Tables_in_' . $database_default] . $form); print ($status == 0 ? ' Failed' : ' Successful') . "\n"; if ($dynamic) { print "Changing Table Row Format to Dynamic -> '" . $table['Tables_in_' . $database_default] . "'"; $status = db_execute('ALTER TABLE ' . $table['Tables_in_' . $database_default] . ' ROW_FORMAT=DYNAMIC'); print ($status == 0 ? ' Failed' : ' Successful') . "\n"; } } } } print "\nNOTE: Running some Data Query repair scripts\n"; db_execute("UPDATE graph_local AS gl INNER JOIN graph_templates_item AS gti ON gti.local_graph_id = gl.id INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id INNER JOIN data_local AS dl ON dl.id = dtr.local_data_id SET gl.snmp_query_id = dl.snmp_query_id, gl.snmp_index = dl.snmp_index WHERE gl.graph_template_id IN (SELECT graph_template_id FROM snmp_query_graph) AND gl.snmp_query_id = 0"); db_execute("UPDATE graph_local AS gl INNER JOIN ( SELECT DISTINCT local_graph_id, task_item_id FROM graph_templates_item ) AS gti ON gl.id = gti.local_graph_id INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id INNER JOIN data_template_data AS dtd ON dtr.local_data_id = dtd.local_data_id INNER JOIN data_input_fields AS dif ON dif.data_input_id = dtd.data_input_id INNER JOIN data_input_data AS did ON did.data_template_data_id = dtd.id AND did.data_input_field_id = dif.id INNER JOIN snmp_query_graph_rrd AS sqgr ON sqgr.snmp_query_graph_id = did.value SET gl.snmp_query_graph_id = did.value WHERE input_output = 'in' AND type_code = 'output_type' AND gl.graph_template_id IN (SELECT graph_template_id FROM snmp_query_graph)"); print "NOTE: Checking for Invalid Cacti Templates\n"; /* keep track of total rows */ $total_rows = 0; /* remove invalid GPrint Presets from the Database, validated */ $rows = db_fetch_cell('SELECT count(*) FROM graph_templates_item LEFT JOIN graph_templates_gprint ON graph_templates_item.gprint_id = graph_templates_gprint.id WHERE graph_templates_gprint.id IS NULL AND graph_templates_item.gprint_id > 0'); $total_rows += $rows; if ($rows > 0) { if ($force) { db_execute('DELETE FROM graph_templates_item WHERE gprint_id NOT IN (SELECT id FROM graph_templates_gprint) AND gprint_id>0'); } print "NOTE: $rows Invalid GPrint Preset Rows " . ($force ? 'removed from':'found in') . " Graph Templates\n"; } /* remove invalid CDEF Items from the Database, validated */ $rows = db_fetch_cell("SELECT count(*) FROM cdef_items LEFT JOIN cdef ON cdef_items.cdef_id=cdef.id WHERE cdef.id IS NULL"); $total_rows += $rows; if ($rows > 0) { if ($force) { db_execute('DELETE FROM cdef_items WHERE cdef_id NOT IN (SELECT id FROM cdef)'); } print "NOTE: $rows Invalid CDEF Item Rows " . ($force ? 'removed from':'found in') . " Graph Templates\n"; } /* remove invalid Data Templates from the Database, validated */ $rows = db_fetch_cell('SELECT count(*) FROM data_template_data LEFT JOIN data_input ON data_template_data.data_input_id=data_input.id WHERE data_input.id IS NULL'); $total_rows += $rows; if ($rows > 0) { if ($force) { db_execute('DELETE FROM data_template_data WHERE data_input_id NOT IN (SELECT id FROM data_input)'); } print "NOTE: $rows Invalid Data Input Rows " . ($force ? 'removed from':'found in') . " Data Templates\n"; } /* remove invalid Data Input Fields from the Database, validated */ $rows = db_fetch_cell('SELECT count(*) FROM data_input_fields LEFT JOIN data_input ON data_input_fields.data_input_id=data_input.id WHERE data_input.id IS NULL'); $total_rows += $rows; if ($rows > 0) { if ($force) { db_execute('DELETE FROM data_input_fields WHERE data_input_fields.data_input_id NOT IN (SELECT id FROM data_input)'); update_replication_crc(0, 'poller_replicate_data_input_fields_crc'); } print "NOTE: $rows Invalid Data Input Field Rows " . ($force ? 'removed from':'found in') . " Data Templates\n"; } /* --------------------------------------------------------------------*/ /* remove invalid Data Input Data Rows from the Database in two passes */ $rows = db_fetch_cell('SELECT count(*) FROM data_input_data LEFT JOIN data_template_data ON data_input_data.data_template_data_id=data_template_data.id WHERE data_template_data.id IS NULL'); $total_rows += $rows; if ($rows > 0) { if ($force) { db_execute('DELETE FROM data_input_data WHERE data_input_data.data_template_data_id NOT IN (SELECT id FROM data_template_data)'); } print "NOTE: $rows Invalid Data Input Data Rows based upon template mappings " . ($force ? 'removed from':'found in') . " Data Templates\n"; } $rows = db_fetch_cell('SELECT count(*) FROM data_input_data LEFT JOIN data_input_fields ON data_input_fields.id=data_input_data.data_input_field_id WHERE data_input_fields.id IS NULL'); $total_rows += $rows; if ($rows > 0) { if ($force) { db_execute('DELETE FROM data_input_data WHERE data_input_data.data_input_field_id NOT IN (SELECT id FROM data_input_fields)'); } print "NOTE: $rows Invalid Data Input Data rows based upon field mappings " . ($force ? 'removed from':'found in') . " Data Templates\n"; } if ($total_rows > 0 && !$force) { print "\nWARNING: Cacti Template Problems found in your Database. Using the '--force' option will remove\n"; print "the invalid records. However, these changes can be catastrophic to existing data sources. Therefore, you \n"; print "should contact your support organization prior to proceeding with that repair.\n\n"; } elseif ($total_rows == 0) { print "NOTE: No Invalid Cacti Template Records found in your Database\n\n"; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Database Repair Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print "\nusage: repair_database.php [--dynamic] [--debug] [--force] [--form]\n\n"; print "A utility designed to repair the Cacti database if damaged, and optionally repair any\n"; print "corruption found in the Cacti databases various Templates.\n\n"; print "Optional:\n"; print " --dynamic - Convert a table to Dynamic row format if available\n"; print " --form - Force rebuilding the indexes from the database creation syntax.\n"; print " --tables - Repair Tables as well as possible database corruptions.\n"; print " --force - Remove Invalid Template records from the database.\n"; print " --debug - Display verbose output during execution.\n\n"; } cacti-release-1.2.19/cli/repair_graphs.php000077500000000000000000000165561413633772300204440ustar00rootroot00000000000000#!/usr/bin/env php rrd association select id from graph_templates_item where local_graph_template_item_id=0 and local_graph_id=0 and task_item_id= // Get graph associations which corresponds to supplied data template select id from graph_templates_item where local_graph_id=$g["id"] and local_graph_template_item_id in // But I'm too lazy to write such a lot of code, so let's better make one long query below */ $graph_templates_items_wrong = db_fetch_assoc("select id, task_item_id from graph_templates_item WHERE task_item_id!=" . $rrd_data[0]["id"] . " and graph_template_id=" . $graph_template_id . " and local_graph_id=" . $g["id"] . " and local_graph_template_item_id in (select id from graph_templates_item where local_graph_template_item_id=0 and local_graph_id=0 and task_item_id=(select id from data_template_rrd where local_data_template_rrd_id=0 and local_data_id=0 and data_template_id=" . $data_template_id . "))"); if (!cacti_sizeof($graph_templates_items_wrong)) { // Everything correct here. continue; } else { foreach($graph_templates_items_wrong as $graph_templates_item_wrong) { // Here is a list of graph_templates_item ids to be fixed and their wrong task_item_id $graph_templates_item[] = $graph_templates_item_wrong["id"]; $task_item_id[] = $graph_templates_item_wrong["task_item_id"]; } } print "Host " . $g["host_id"] . ", graph " . $g["id"] . ", graph item " . implode(",",$graph_templates_item) . ", task_item_id " . implode(",",$task_item_id) . "->" . $rrd_data[0]["id"] . "\n"; $query = "UPDATE graph_templates_item SET task_item_id=" . $rrd_data[0]["id"] . " WHERE task_item_id!=" . $rrd_data[0]["id"] . " and graph_template_id=" . $graph_template_id . " and local_graph_id=" . $g["id"] . " and id in (" . implode(",",$graph_templates_item) . ")"; if ($show_sql) { print $query . ";\n"; } if ($execute) { db_execute($query); } unset($graph_templates_item); unset($task_item_id); } } function display_version() { $version = get_cacti_cli_version(); print "Cacti Graph Repair Tool, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /* display_help - displays the usage of the function */ function display_help() { print "usage: repair_graphs.php [--host-id=ID] --data-template-id=[ID]\n"; print " --graph-template-id=[ID] [--show-sql] [--execute]\n\n"; print "Cacti utility for repairing graph<->datasource relationship via a command line interface.\n\n"; print "--execute - Perform the repair\n"; print "--show-sql - Show SQL lines for the repair (optional)\n"; print "--host-id=id - The host_id to repair or leave empty to process all hosts\n"; print "--data-template-id=id - The numerical ID of the data template to be fixed\n"; print "--graph-template-id=id - The numerical ID of the graph template to be fixed\n"; } cacti-release-1.2.19/cli/repair_templates.php000077500000000000000000000126131413633772300211440ustar00rootroot00000000000000#!/usr/bin/env php This script is only meant to run at the command line.'); } $no_http_headers = true; require(__DIR__ . '/../include/global.php'); } else { print "FATAL: Can not initialize the Cacti API" . PHP_EOL; exit(1); } // For legacy Cacti behavior if (!function_exists('cacti_sizeof')) { function cacti_sizeof($object) { return cacti_sizeof($object); } } if (!function_exists('get_cacti_cli_version')) { function get_cacti_cli_version() { return db_fetch_cell('SELECT cacti FROM version'); } } if (!function_exists('is_resource_writable')) { function is_resource_writable($path) { if ($path[strlen($path)-1]=='/') { return is_resource_writable($path.uniqid(mt_rand()).'.tmp'); } if (file_exists($path)) { if (($f = @fopen($path, 'a'))) { fclose($f); return true; } return false; } if (($f = @fopen($path, 'w'))) { fclose($f); unlink($path); return true; } return false; } } ini_set('max_execution_time', '0'); ini_set('display_errors', 'On'); /* setup defaults */ $debug = false; $dryrun = false; $backup = false; $overwrite = false; $user = get_current_user(); $owner = 'apache'; $ownerset = false; $oldrrd = ''; $newrrd = ''; $finrrd = ''; $time = microtime(true); global $debug; /* process calling arguments */ $parms = $_SERVER['argv']; array_shift($parms); if (cacti_sizeof($parms)) { foreach($parms as $parameter) { if (strpos($parameter, '=')) { list($arg, $value) = explode('=', $parameter); } else { $arg = $parameter; $value = ''; } switch ($arg) { case '--oldrrd': $oldrrd = $value; if (!file_exists($oldrrd)) { print 'FATAL: File \'' . $oldrrd . '\' does not exist.' . PHP_EOL; exit(-9); } if (!is_resource_writable($oldrrd)) { print 'FATAL: File \'' . $oldrrd . '\' is not writable by this account.' . PHP_EOL; exit(-8); } break; case '--newrrd': $newrrd = $value; if (!file_exists($newrrd)) { print 'FATAL: File \'' . $newrrd . '\' does not exist.' . PHP_EOL; exit(-9); } if (!is_resource_writable($newrrd)) { print 'FATAL: File \'' . $newrrd . '\' is not writable by this account.' . PHP_EOL; exit(-8); } break; case '--finrrd': $finrrd = $value; if (!is_resource_writable(dirname($finrrd) . '/') || (file_exists($finrrd) && !is_resource_writable($finrrd))) { print 'FATAL: File \'' . $finrrd . '\' is not writable by this account.' . PHP_EOL; exit(-8); } break; case '-R': case '--owner': $owner = $value; $ownerset = true; break; case '-B': case '--backup': $backup = true; break; case '-O': case '--overwrite': $overwrite = true; break; case '-d': case '--debug': $debug = true; break; case '-D': case '--dryrun': $dryrun = true; break; case '-V': case '--version': display_version(); exit(0); case '-H': case '--help': display_help(); exit(0); default: print 'ERROR: Invalid Parameter ' . $parameter . PHP_EOL . PHP_EOL; display_help(); exit(-3); } } } /* additional error check */ if ($oldrrd == '') { print 'FATAL: You must specify a old RRDfile!' . PHP_EOL . PHP_EOL; display_help(); exit(-2); } if ($newrrd == '') { print 'FATAL: You must specify a New RRDfile!' . PHP_EOL . PHP_EOL; display_help(); exit(-2); } if ($overwrite && $finrrd == '') { $finrrd = $newrrd; } if ($finrrd == '') { print 'FATAL: You must specify a New RRDfile or use the overwrite option!' . PHP_EOL . PHP_EOL; display_help(); exit(-2); } debug('Entering Mainline'); /* let's see if we can find rrdtool */ global $rrdtool, $use_db, $db; /* see if sqlLite is available */ if (class_exists('SQLite3')) { print 'NOTE: Using SQLite Database for performance.' . PHP_EOL; $use_db = true; } else { print 'NOTE: Using Native Arrays due to lack of SQLite.' . PHP_EOL; $use_db = false; } /* verify the location of rrdtool */ $rrdtool = read_config_option('path_rrdtool'); if (!file_exists($rrdtool)) { if (substr_count(PHP_OS, 'WIN')) { $rrdtool = 'rrdtool.exe'; } else { $rrdtool = 'rrdtool'; } } $response = shell_exec($rrdtool); if (strlen($response)) { $response_array = explode(' ', $response); print 'NOTE: Using ' . $response_array[0] . ' Version ' . $response_array[1] . PHP_EOL; } else { print 'FATAL: RRDTool not found in configuation or path.' . PHP_EOL . 'Please insure RRDTool can be found using one of these methods!' . PHP_EOL; exit(-1); } /* determine the temporary file name */ $seed = mt_rand(); if (substr_count(PHP_OS, 'WIN')) { $tempdir = getenv('TEMP'); $oldxmlfile = $tempdir . '/' . str_replace('.rrd', '', basename($oldrrd)) . '.dump.' . $seed; $seed++; $newxmlfile = $tempdir . '/' . str_replace('.rrd', '', basename($newrrd)) . '.dump.' . $seed; } else { $tempdir = '/tmp'; $oldxmlfile = '/tmp/' . str_replace('.rrd', '', basename($oldrrd)) . '.dump.' . $seed; $seed++; $newxmlfile = '/tmp/' . str_replace('.rrd', '', basename($newrrd)) . '.dump.' . $seed; } if ($finrrd == '') { $finrrd = dirname($newrrd) . '/' . basename($newrrd) . '.new'; } /* execute the dump commands */ debug("Creating XML file '$oldxmlfile' from '$oldrrd'"); shell_exec("$rrdtool dump $oldrrd > $oldxmlfile"); debug("Creating XML file '$newxmlfile' from '$newrrd'"); shell_exec("$rrdtool dump $newrrd > $newxmlfile"); /* read the xml files into arrays */ if (file_exists($oldxmlfile)) { $old_output = file($oldxmlfile); /* remove the temp file */ unlink($oldxmlfile); } else { print 'FATAL: RRDtool Command Failed on \'' . $oldrrd . '\'. Please insure your RRDtool install is valid!' . PHP_EOL; exit(-12); } if (file_exists($newxmlfile)) { $new_output = file($newxmlfile); /* remove the temp file */ unlink($newxmlfile); } else { print 'FATAL: RRDtool Command Failed on \'' . $newrrd . '\'. Please insure your RRDtool install is valid!' . PHP_EOL; exit(-12); } print 'NOTE: RRDfile will be written to \'' . $finrrd . '\'' . PHP_EOL; // Read the old RRDfile into an array, flatten and remove gaps debug("Reading XML From '$oldrrd'"); $old_output = preProcessXML($old_output); $old_rrd = processXML($old_output); $old_flat = flattenXML($old_rrd); if ($use_db) { $db = createTable(); loadTable($db, $old_flat); } // Read the new RRDfile into an array debug("Reading XML From '$newrrd'"); $new_output = preProcessXML($new_output); $new_rrd = processXML($new_output); // Splice new RRDfiles array with the flattened data debug('Splicing RRDfiles'); spliceRRDs($new_rrd, $old_flat, $old_rrd['dsnames'], $db); debug('Re-Creating XML File'); $new_xml = recreateXML($new_rrd); debug('Writing XML File to Disk'); file_put_contents($newxmlfile, $new_xml); /* finally update the file XML file and Reprocess the RRDfile */ if (!$dryrun) { debug('Creating New RRDfile'); createRRDFileFromXML($newxmlfile, $finrrd); } /* remove the temp file */ unlink($newxmlfile); /* change ownership */ if ($ownerset) { if ($user == 'root') { chown($finrrd, $owner); } else { print "ERROR: Unable to change owner. You must run as root to change owner" . PHP_EOL; } } memoryUsage(); /** spliceRRDs - This function walks through the structure of the newrrd * XML file array and for each value, if it's either '0' or 'NaN' the * script will search the flattenedXML or SQLite table for the closest * match and save that into the final array, that will then be written * back out to an XML file and re-loaded into an RRDfile. */ function spliceRRDs(&$new_rrd, &$old_flat, &$old_dsnames) { if (cacti_sizeof($new_rrd) && cacti_sizeof($old_flat)) { if (isset($new_rrd['rra'])) { foreach($new_rrd['rra'] as $rra_num => $rra) { $cf = $new_rrd['rra'][$rra_num]['cf']; $pdp = $new_rrd['rra'][$rra_num]['pdp_per_row']; if (isset($rra['database'])) { foreach($rra['database'] as $cdp_ds_num => $value) { $dsname = $new_rrd['ds'][$cdp_ds_num]['name']; $olddsnum = $old_dsnames[$dsname]; $last_good = 'NaN'; debug("Splicing DSName $dsname NewId $cdp_ds_num OldId $olddsnum"); foreach($value as $time => $v) { if ($v == 'NaN' || $v == 0) { if ($time < $old_flat['mintime']) { continue; } $old_value = getOldRRDValue($old_flat, $olddsnum, $cf, $time); if ($old_value != 'NaN') { $last_good = $old_value; $new_rrd['rra'][$rra_num]['database'][$cdp_ds_num][$time] = $old_value; } elseif ($last_good != 'NaN') { $new_rrd['rra'][$rra_num]['database'][$cdp_ds_num][$time] = $last_good; } } else { $last_good = $v; } $new_value = $new_rrd['rra'][$rra_num]['database'][$cdp_ds_num][$time]; //print "DSName: $dsname, NewVAlue: $new_value, OrigValue: $v, OldValue: $old_value\n"; } } } else { print 'FATAL: RRA database is Invalid' . PHP_EOL; } } } else { print 'FATAL: One of RRA\'s is Invalid' . PHP_EOL; } } else { print 'FATAL: One of RRD\'s is Invalid' . PHP_EOL; } } /** getOldRRDValue - scan the flattened array for a good timestamp * and return the nearest value for that timestamp. * * The flattened array is sorted by timestamp in reverse order. * If the SQLite table is available, this function will prefer * that table over traversing the array. */ function getOldRRDValue(&$old_flat, $dsnum, $cf, $time) { global $use_db, $db; if ($use_db) { $stmt = $db->prepare("SELECT * FROM dsData WHERE dsid = $dsnum AND cf = '$cf' AND timestamp <= $time ORDER BY timestamp DESC LIMIT 1"); $result = $stmt->execute(); while($row = $result->fetchArray()) { return $row['value']; } return 'NaN'; } else { if (!isset($old_flat[$dsnum][$cf])) { debug("CF $cf Not found in flattened data."); return 'NaN'; } else { $first = true; foreach($old_flat[$dsnum][$cf] as $timestamp => $data) { if ($first && $time > $timestamp) { // The time is before any good data in the RRDfile debug("No Good data found. Timestamp $time newer than the newest timestamp $timestamp"); return 'NaN'; } elseif ($time >= $timestamp) { debug("Good for $time offset is " . number_format(abs($time - $timestamp), 0)); return $data; } $first = false; } debug("No Good data found. Timestamp $time"); return 'NaN'; } } } /** recreateXML - Take the data from the modified XML and re-create the XML file that * will then be turned back into an RRDfile. * * The array structure is documented below. * * $rrd['version']; * $rrd['step']; * $rrd['lastupdate']; * $rrd['ds'][$ds_num]['name']; * $rrd['ds'][$ds_num]['type']; * $rrd['ds'][$ds_num]['minimal_heartbeat']; * $rrd['ds'][$ds_num]['min']; * $rrd['ds'][$ds_num]['max']; * $rrd['ds'][$ds_num]['last_ds']; * $rrd['ds'][$ds_num]['value']; * $rrd['ds'][$ds_num]['unknown_sec']; * $rrd['rra'][$rra_num]['cf']; * $rrd['rra'][$rra_num]['pdp_per_row']; * $rrd['rra'][$rra_num]['params']['xff']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['primary_value']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['secondary_value']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['value']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['unknown_datapoints']; * $rrd['rra'][$rra_num]['database'][$cdp_ds_num]['time']; */ function recreateXML($new_rrd) { $rrd = "\n"; $rrd .= "\t " . $new_rrd['version'] . " \n"; $rrd .= "\t " . $new_rrd['step'] . " \n"; $rrd .= "\t " . $new_rrd['lastupdate'] . " \n"; foreach($new_rrd['ds'] as $dsnum => $ds) { $rrd .= "\t\n"; $rrd .= "\t\t " . $ds['name'] . " \n";; $rrd .= "\t\t " . $ds['type'] . " \n";; $rrd .= "\t\t " . $ds['minimal_heartbeat'] . " \n";; $rrd .= "\t\t " . $ds['min'] . " \n";; $rrd .= "\t\t " . $ds['max'] . " \n";; $rrd .= "\t\t " . $ds['last_ds'] . " \n";; $rrd .= "\t\t " . $ds['value'] . " \n";; $rrd .= "\t\t " . $ds['unknown_sec'] . " \n";; $rrd .= "\t\n"; } foreach($new_rrd['rra'] as $rra_num => $rra) { $rrd .= "\t\n"; $rrd .= "\t\t " . $rra['cf'] . " \n"; $rrd .= "\t\t " . $rra['pdp_per_row'] . " \n"; $rrd .= "\t\t\n"; $rrd .= "\t\t\t " . $rra['params']['xff'] . " \n"; $rrd .= "\t\t\n"; $rrd .= "\t\t\n"; foreach($new_rrd['rra'][$rra_num]['cdp_prep'] as $cdp_ds_num => $pdp) { $rrd .= "\t\t\t\n"; $rrd .= "\t\t\t\t " . $pdp['primary_value'] . " \n"; $rrd .= "\t\t\t\t " . $pdp['secondary_value'] . " \n"; $rrd .= "\t\t\t\t " . $pdp['value'] . " \n"; $rrd .= "\t\t\t\t " . $pdp['unknown_datapoints'] . " \n"; $rrd .= "\t\t\t\n"; $output = array(); foreach($new_rrd['rra'][$rra_num]['database'] as $dsnum => $v) { foreach($v as $time => $value) { $output[$time][$dsnum] = $value; } } } $rrd .= "\t\t\n"; $rrd .= "\t\t\n"; foreach($output as $time => $v) { $rrd .= "\t\t\t"; foreach($v as $dsnum => $value) { $rrd .= " " . $value . " "; } $rrd .= "\n"; } $rrd .= "\t\t\n"; $rrd .= "\t\n"; } $rrd .= ""; return $rrd; } /* memoryUsage - Report the peak memory usage of the php script */ function memoryUsage() { global $time; $mem_usage = memory_get_usage(true); if ($mem_usage < 1024) $memstr = $mem_usage . ' B'; elseif ($mem_usage < 1048576) $memstr = round($mem_usage/1024,2) . ' KB'; else $memstr = round($mem_usage/1048576,2) . ' MB'; print 'NOTE: Time:' . round(microtime(true)-$time, 2) . ', RUsage:' . $memstr . PHP_EOL; } /** flattenXML - Take all the data from the various data sources and * by Consolidation Function, sort the values by timestamp so that * the new RRDfile can pull values that make sense to fill in the * time where there may be no data. * * Additionally, remove any NaN values and replace with the last * good known value to fill gaps in the graphs. * * The form of the output array will be as follows: * * $newxml[$datasourceid][$cf][$timestamp] = value * $newxml['mintime'] = value * * The data will only go back as far as the source RRDfile. * */ function flattenXML(&$xml) { global $debug; $newxml = array(); $maxarray = array(); $mintime = 'NaN'; if (cacti_sizeof($xml['rra'])) { foreach($xml['rra'] as $rraid => $data) { $cf = $data['cf']; foreach($data['database'] as $dsid => $timedata) { $i = 0; // Don't load data from less granular RRA's if (isset($maxarray[$dsid][$cf])) { $maxtoload = $maxarray[$dsid][$cf]; } else { $maxtoload = 9999999999999; } foreach($timedata as $timestamp => $value) { if ($i == 0 && $value != 'NaN') { $maxarray[$dsid][$cf] = $timestamp; $i++; } if ($timestamp <= $maxtoload) { $newxml[$dsid][$cf][$timestamp] = $value; if ($mintime == 'NaN') { $mintime = $timestamp; } elseif ($timestamp < $mintime) { $mintime = $timestamp; } } } } } foreach($newxml as $dsid => $data) { foreach($data as $cf => $timedata) { // Sort the data ksort($timedata); // Get rid of NaN $last_data = 0; foreach($timedata as $timestamp => $data) { if ($data == 'NaN') { $timedata[$timestamp] = $last_data; } else { $last_data = $data; } } krsort($timedata); $newxml[$dsid][$cf] = $timedata; if ($debug) { $stats = sprintf("DS:%2d, CF:%8s, Vals:%10s, Max:%10s, Avg:%10s", $dsid, $cf, number_format(cacti_sizeof($timedata)), number_format(getMaxValue($timedata), 4), number_format(getAvgValue($timedata), 4)); debug($stats); } } } } $newxml['mintime'] = $mintime; return $newxml; } /** getMaxValue - Obtains tha max value from the timestamp array * for use in debug output. */ function getMaxValue(&$data) { $max = 0; foreach($data as $timestamp => $value) { if ($value != 'NaN' && $value > $max) { $max = $value; } } return $max; } /** getAvgValue - Obtains tha average value from the timestamp array * for use in debug output. */ function getAvgValue(&$data) { $entries = cacti_sizeof($data); $total = array_sum($data); if ($entries) { return $total / $entries; } else { return 0; } } /** processXML - Read all the XML into an array. The format of the array * will be as show below. This way it can be processed reverted back * to array format at the end of the merge process. * * $rrd['version']; * $rrd['step']; * $rrd['lastupdate']; * $rrd['ds'][$ds_num]['name']; * $rrd['ds'][$ds_num]['type']; * $rrd['ds'][$ds_num]['minimal_heartbeat']; * $rrd['ds'][$ds_num]['min']; * $rrd['ds'][$ds_num]['max']; * $rrd['ds'][$ds_num]['last_ds']; * $rrd['ds'][$ds_num]['value']; * $rrd['ds'][$ds_num]['unknown_sec']; * $rrd['rra'][$rra_num]['cf']; * $rrd['rra'][$rra_num]['pdp_per_row']; * $rrd['rra'][$rra_num]['params']['xff']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['primary_value']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['secondary_value']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['value']; * $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['unknown_datapoints']; * $rrd['rra'][$rra_num]['database'][$cdp_ds_num]['time']; */ function processXML(&$output) { $rrd = array(); $dsnames = array(); $rra_num = 0; $ds_num = 0; $cdp_ds_num = 0; $in_ds = false; $in_rra = false; $in_db = false; $in_parm = false; $in_cdp = false; $in_cdp_ds = false; if (cacti_sizeof($output)) { foreach($output as $line) { if (substr_count($line, '')) { $line = trim(str_replace('', '', str_replace('', '', $line))); $larray = explode('', $line); $time = trim(str_replace('', '', str_replace('', '', $larray[0]))); array_shift($larray); $tdsno = 0; foreach($larray as $l) { $value = trim(str_replace('', '', $l)); $rrd['rra'][$rra_num]['database'][$tdsno][$time] = $value; $tdsno++; } } elseif (substr_count($line, '')) { $rrd['lastupdate'] = XMLrip('lastupdate', $line); } elseif (substr_count($line, '')) { $line = trim(str_replace('', '', $line)); $rrd['version'] = XMLrip('version', $line); } elseif (substr_count($line, '')) { $rrd['step'] = XMLrip('step', $line); } elseif (substr_count($line, '')) { $in_rra = true; } elseif (substr_count($line, '')) { $in_rra = false; $cdp_ds_num = 0; $rra_num++; } elseif (substr_count($line, '')) { if (!$in_cdp) { $in_ds = true; } } elseif (substr_count($line, '')) { if ($in_ds) { $in_ds = false; $ds_num++; } else { $in_cdp_ds = false; $cdp_ds_num++; } } elseif (substr_count($line, '')) { $in_cdp = true; } elseif (substr_count($line, '')) { $in_cdp = false; } elseif (substr_count($line, '')) { $in_parm = true; } elseif (substr_count($line, '')) { $in_parm = false; } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['name'] = XMLrip('name', $line); $dsnames[] = XMLrip('name', $line); } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['type'] = XMLrip('type', $line); } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['minimal_heartbeat'] = XMLrip('minimal_heartbeat', $line); } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['max'] = XMLrip('max', $line); } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['min'] = XMLrip('min', $line); } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['last_ds'] = XMLrip('last_ds', $line); } elseif (substr_count($line, '')) { if ($in_rra) { $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['value'] = XMLrip('value', $line); } else { $rrd['ds'][$ds_num]['value'] = XMLrip('value', $line); } } elseif (substr_count($line, '')) { $rrd['ds'][$ds_num]['unknown_sec'] = XMLrip('unknown_sec', $line); } elseif (substr_count($line, '')) { $rrd['rra'][$rra_num]['cf'] = XMLrip('cf', $line); } elseif (substr_count($line, '')) { $rrd['rra'][$rra_num]['pdp_per_row'] = XMLrip('pdp_per_row', $line); } elseif (substr_count($line, '')) { $rrd['rra'][$rra_num]['params']['xff'] = XMLrip('xff', $line); } elseif (substr_count($line, '')) { $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['primary_value'] = XMLrip('primary_value', $line); } elseif (substr_count($line, '')) { $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['secondary_value'] = XMLrip('secondary_value', $line); } elseif (substr_count($line, '')) { $rrd['rra'][$rra_num]['cdp_prep'][$cdp_ds_num]['unknown_datapoints'] = XMLrip('unknown_datapoints', $line); } } } if (cacti_sizeof($dsnames)) { foreach($dsnames as $index => $name) { $rrd['dsnames'][$name] = $index; } } return $rrd; } /* All Functions */ function createRRDFileFromXML($xmlfile, $rrdfile) { global $rrdtool; /* execute the dump command */ print 'NOTE: Re-Importing \'' . $xmlfile . '\' to \'' . $rrdfile . '\'' . PHP_EOL; $response = shell_exec("$rrdtool restore -f -r $xmlfile $rrdfile"); if (strlen($response)) print $response . PHP_EOL; } function XMLrip($tag, $line) { return trim(str_replace("<$tag>", '', str_replace("", '', $line))); } function writeXMLFile($output, $xmlfile) { return file_put_contents($xmlfile, $output); } function backupRRDFile($rrdfile) { global $tempdir, $seed, $html; $backupdir = $tempdir; if (file_exists($backupdir . '/' . basename($rrdfile))) { $newfile = basename($rrdfile) . '.' . $seed; } else { $newfile = basename($rrdfile); } print 'NOTE: Backing Up \'' . $rrdfile . '\' to \'' . $backupdir . '/' . $newfile . '\'' . PHP_EOL; return copy($rrdfile, $backupdir . '/' . $newfile); } /** preProcessXML - This function strips the timestamps off the XML dump * and loads that data into an array along with the remainder of the * XML data for future processing. */ function preProcessXML(&$output) { if (cacti_sizeof($output)) { foreach($output as $line) { $line = trim($line); $date = ''; if ($line == '') { continue; } else { /* is there a comment, remove it */ $comment_start = strpos($line, ''); $row = strpos($line, ''); if ($row > 0) { $date = trim(substr($line,$comment_start+30,11)); } if ($comment_start == 0) { $line = trim(substr($line, $comment_end+3)); } else { $line = trim(substr($line,0,$comment_start-1) . substr($line,$comment_end+3)); } if (!empty($date)) { $line = str_replace('', " $date ", $line); } } if ($line != '') { $new_array[] = $line; } } } /* transfer the new array back to the original array */ return $new_array; } } function debug($string) { global $debug; if ($debug) { print 'DEBUG: ' . trim($string) . PHP_EOL; } } /** createTable - This function creates a SQLite memory table * to hold the flattened XML file in for replay. */ function createTable() { /* table in memory */ $db = new SQLite3(':memory:'); /* create the table */ $db->exec('CREATE TABLE dsData ( dsid int, cf char(10) NOT NULL, timestamp int, value real NOT NULL, PRIMARY KEY (dsid, cf, timestamp))'); $db->exec('CREATE INDEX dsid_cf_timestamp ON dsData (dsid, cf, timestamp)'); $db->exec('CREATE INDEX timestamp ON dsData (timestamp)'); return $db; } /** loadTable - This function loads the flattened XML file into * the SQLite database for replaying the RRDfile dump data * into the new XML file. */ function loadTable($db, &$records) { $db->exec("BEGIN TRANSACTION"); $sql = ''; foreach($records as $dsid => $cfdata) { if (is_numeric($dsid)) { foreach($cfdata as $cf => $timedata) { $i = 0; foreach($timedata as $timestamp => $value) { $sql .= ($sql != '' ? ', ':'') . '(' . $dsid . ',"' . $cf . '",' . $timestamp . ', ' . $value . ')'; $i++; if ($i > 50) { if ($sql != '') { $db->exec("INSERT INTO dsData (dsid, cf, timestamp, value) VALUES $sql"); } $sql = ''; $i = 0; } } if ($sql != '') { $db->exec("INSERT INTO dsData (dsid, cf, timestamp, value) VALUES $sql"); } $sql = ''; } } } $db->exec("COMMIT TRANSACTION"); } function display_version() { if (!defined('COPYRIGHT_YEARS')) { define('COPYRIGHT_YEARS', '2004-2021'); } $version = get_cacti_cli_version(); print 'Cacti RRDfile Splicer Utility, Version ' . $version . ', ' . COPYRIGHT_YEARS . PHP_EOL; } /** display_help - Displays usage information about how to utilize * this program. */ function display_help () { display_version(); print PHP_EOL . 'usage: splice_rrd.php --oldrrd=file --newrrd=file [--finrrd=file]' . PHP_EOL; print ' [--owner=apache] [--debug] [--dryrun]' . PHP_EOL . PHP_EOL; print 'The splice_rrd.php file is designed to allow two RRDfiles to be merged.' . PHP_EOL . PHP_EOL; print 'This utility can effectively change the resolution/step of an RRDfile' . PHP_EOL; print 'so long as the new RRDfile already has the correct step.' . PHP_EOL . PHP_EOL; print 'The Old and New input parameters are mandatory. If the finrrd option is' . PHP_EOL; print 'not specified, it will be the newrrd plus a timestamp.' . PHP_EOL . PHP_EOL; print '--oldrrd=file - The old RRDfile that contains old data.' . PHP_EOL; print '--newrrd=file - The new RRDfile that contains more recent data.' . PHP_EOL; print '--finrrd=file - The final RRDfile that contains data from both rrdfiles.' . PHP_EOL . PHP_EOL; print '--owner=apache - Change the owner of the resulting file. Note requires root.' . PHP_EOL; print '--dryrun - Simply test the splicing of the RRDfiles, don\'t write.' . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/cli/sqltable_to_php.php000077500000000000000000000167251413633772300207740ustar00rootroot00000000000000#!/usr/bin/env php $arr) { foreach ($arr as $t) { $tables[] = $t; } } } else { print "ERROR: Obtaining list of tables from $database_default\n"; exit; } if (in_array($table, $tables)) { $result = db_fetch_assoc("SHOW FULL columns FROM $table"); $cols = array(); $pri = array(); $keys = array(); $text = "\n\$data = array();\n"; if (cacti_sizeof($result)) { foreach ($result as $r) { $text .= "\$data['columns'][] = array("; $text .= "'name' => '" . $r['Field'] . "'"; if (strpos(strtolower($r['Type']), ' unsigned') !== false) { $r['Type'] = str_ireplace(' unsigned', '', $r['Type']); $text .= ", 'unsigned' => true"; } $text .= ", 'type' => " . db_qstr($r['Type']); $text .= ", 'NULL' => " . (strtolower($r['Null']) == 'no' ? 'false' : 'true'); if (trim($r['Default']) != '') { $text .= ", 'default' => '" . $r['Default'] . "'"; } elseif (stripos($r['Type'], 'char') !== false) { $text .= ", 'default' => ''"; } if (trim($r['Extra']) != '') { if (strtolower($r['Extra']) == 'on update current_timestamp') { $text .= ", 'on_update' => 'CURRENT_TIMESTAMP'"; } if (strtolower($r['Extra']) == 'auto_increment') { $text .= ", 'auto_increment' => true"; } } if (trim($r['Comment']) != '') { $text .= ", 'comment' => '" . $r['Comment'] . "'"; } $text .= ");\n"; } } else { print "ERROR: Obtaining list of columns from $table\n"; exit; } $result = db_fetch_assoc("SHOW INDEX FROM $table"); if (cacti_sizeof($result)) { foreach ($result as $r) { if ($r['Key_name'] == 'PRIMARY') { $pri[] = $r['Column_name']; } else { $keys[$r['Key_name']][$r['Seq_in_index']] = $r['Column_name']; } } if (!empty($pri)) { if ($plugin != '' || $create) { $text .= "\$data['primary'] = '" . implode("`,`", $pri) . "';\n"; } else { $text .= "\$data['primary'] = array('" . implode("','", $pri) . "');\n"; } } if (!empty($keys)) { foreach ($keys as $n => $k) { if ($plugin != '') { $text .= "\$data['keys'][] = array('name' => '$n', 'columns' => '" . implode("`,`", $k) . "');\n"; } else { $text .= "\$data['keys'][] = array('name' => '$n', 'columns' => array('" . implode("','", $k) . "'));\n"; } } } } else { //print "ERROR: Obtaining list of indexes from $table\n"; //exit; } $result = db_fetch_row_prepared('SELECT ENGINE, TABLE_COMMENT, ROW_FORMAT, CHARACTER_SET_NAME FROM information_schema.TABLES tbl JOIN information_schema.COLLATIONS coll ON tbl.TABLE_COLLATION=coll.COLLATION_NAME WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME = ?', array($table)); if (cacti_sizeof($result)) { $text .= "\$data['type'] = '" . $result['ENGINE'] . "';\n"; $text .= "\$data['charset'] = '" . $result['CHARACTER_SET_NAME'] . "';\n"; if (!empty($result['TABLE_COMMENT'])) { $text .= "\$data['comment'] = '" . $result['TABLE_COMMENT'] . "';\n"; } $text .= "\$data['row_format'] = '" . $result['ROW_FORMAT'] . "';\n"; if ($create) { if ($plugin != '') { $text .= "api_plugin_db_table_create ('$plugin', '$table', \$data);\n"; } else { $text .= "db_table_create ('$table', \$data);\n"; } } else { $text .= "db_update_table ('$table', \$data, false);\n"; } } else { print "ERROR: Unable to get tables details from Information Schema\n"; exit; } } return $text; } function sql_clean($text) { $text = str_replace(array("\\", '/', "'", '"', '|'), '', $text); return $text; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti SQL to PHP Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: sqltable_to_php.php --table=table_name [--plugin=name] [--update]\n\n"; print "A simple developers utility to create a save schema for a newly created or\n"; print "modified database table in a format that is consumable by Cacti.\n\n"; print "These save schema's can be placed into a plugins setup.php file in order\n"; print "to create the tables inside of a plugin as a part of it's install function.\n"; print "The plugin parameter is optional, but if you want the table(s) automatically\n"; print "removed from Cacti when uninstalling the plugin, specify it's name.\n\n"; print "Required:\n"; print "--table=table_name - The table that you want exportred\n\n"; print "Optional:\n"; print "--plugin=name - The name of the plugin that will manage tables\n"; print "--update - The utility provides create syntax. If the update flag is\n"; print " specified, the utility will provide update syntax\n\n"; } cacti-release-1.2.19/cli/structure_rra_paths.php000077500000000000000000000202411413633772300217030ustar00rootroot00000000000000#!/usr/bin/env php /', host_id, '/', local_data_id, '.rrd') AS new_data_source_path, REPLACE(data_source_path, '', '$base_rra_path') AS rrd_path, REPLACE(CONCAT('/', host_id, '/', local_data_id, '.rrd'), '', '$base_rra_path') AS new_rrd_path FROM data_template_data INNER JOIN data_local ON data_local.id=data_template_data.local_data_id INNER JOIN host ON host.id=data_local.host_id WHERE data_source_path != CONCAT('/', host_id, '/', local_data_id, '.rrd')" . ($hostId === NULL ? '' : " AND host_id=$hostId")); /* setup some counters */ $done_count = 0; $warn_count = 0; /* scan all data sources */ foreach ($data_sources as $info) { $new_base_path = $base_rra_path . '/' . $info['host_id']; $new_rrd_path = $info['new_rrd_path']; $old_rrd_path = $info['rrd_path']; /* create one subfolder for every host */ if (!is_dir($new_base_path)) { /* see if we can create the dirctory for the new file */ if (mkdir($new_base_path, 0775)) { print "NOTE: New Directory '$new_base_path' Created for RRD Files\n"; if ($config['cacti_server_os'] != 'win32') { if (chown($new_base_path, $owner_id) && chgrp($new_base_path, $group_id)) { print "NOTE: New Directory '$new_base_path' Permissions Set\n"; } else { /* turn on the poller */ enable_poller(); print "FATAL: Could not Set Permissions for Directory '$new_base_path'\n"; exit -5; } } } else { /* turn on the poller */ enable_poller(); print "FATAL: Could NOT Make New Directory '$new_base_path'\n"; exit -1; } } /* copy the file, update the database and remove the old file */ if (!file_exists($old_rrd_path)) { $warn_count++; print "WARNING: Legacy RRA Path '$old_rrd_path' Does not exist, Skipping\n"; /* alter database */ update_database($info); } elseif (link($old_rrd_path, $new_rrd_path)) { $done_count++; print "NOTE: HardLink Complete:'" . $old_rrd_path . "' -> '" . $new_rrd_path . "'\n"; if ($config['cacti_server_os'] != 'win32') { if (chown($new_rrd_path, $owner_id) && chgrp($new_rrd_path, $group_id)) { print "NOTE: Permissions set for '$new_rrd_path'\n"; } else { /* turn on the poller */ enable_poller(); print "FATAL: Could not Set Permissions for File '$new_rrd_path'\n"; exit -6; } } /* alter database */ update_database($info); if (unlink($old_rrd_path)) { print "NOTE: Old File '$old_rrd_path' Removed\n"; } else { /* turn on the poller */ enable_poller(); print "FATAL: Old File '$old_rrd_path' Could not be removed\n"; exit -2; } } else { /* turn on the poller */ enable_poller(); print "FATAL: Could not Copy RRD File '$old_rrd_path' to '$new_rrd_path'\n"; exit -3; } } /* finally re-enable the poller */ enable_poller(); print "NOTE: Process Complete, '$done_count' Completed, '$warn_count' Skipped\n"; /* update database */ function update_database($info) { /* upate table poller_item */ db_execute("UPDATE poller_item SET rrd_path = '" . $info['new_rrd_path'] . "' WHERE local_data_id=" . $info['local_data_id']); /* update table data_template_data */ db_execute("UPDATE data_template_data SET data_source_path='" . $info['new_data_source_path'] . "' WHERE local_data_id=" . $info['local_data_id']); print "NOTE: Database Changes Complete for File '" . $info['new_rrd_path'] . "'\n"; } /* turn on the poller */ function enable_poller() { set_config_option('poller_enabled', 'on'); } /* turn off the poller */ function disable_poller() { set_config_option('poller_enabled', ''); } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Structured Paths Creation Utility, Version $version, " . COPYRIGHT_YEARS . "\n"; } function display_help() { display_version(); print "\nusage: structure_rra_paths.php [--host-id=N] [--proceed] [--version|-V|-v] [--help|-H|-h]\n\n"; print "A simple interactive command line utility that converts a Cacti system from using\n"; print "legacy RRA paths to using structured RRA paths with the following\n"; print "naming convention: /host_id/local_data_id.rrd\n\n"; print "This utility is designed for very large Cacti systems.\n\n"; print "On Linux OS, superuser is required to apply file ownership.\n\n"; print "The utility follows the process below:\n"; print " 1) Disables the Cacti Poller\n"; print " 2) Checks for a Running Poller.\n\n"; print "If it Finds a Running Poller, it will:\n"; print " 1) Re-enable the Poller\n"; print " 2) Exit\n\n"; print "Else, it will:\n"; print " 1) Enable Structured Paths in the Console (Settings->Paths)\n\n"; print "Then, for Each File, it will:\n"; print " 1) Create the Structured Path, if Necessary\n"; print " 2) Copy the File to the Strucured Path Using the New Name\n"; print " 3) Alter the two Database Tables Required\n"; print " 4) Remove the Old File\n\n"; print "Once all Files are Complete, it will\n"; print " 1) Re-enable the Cacti Poller\n\n"; print "If the utility encounters a problem along the way, it will:\n"; print " 1) Re-enable the poller\n"; print " 2) Exit\n\n"; } cacti-release-1.2.19/cli/upgrade_database.php000077500000000000000000000172641413633772300210660ustar00rootroot00000000000000#!/usr/bin/env php $hash_code) { // skip versions old than the database version if (cacti_version_compare($old_cacti_version, $cacti_upgrade_version, '>=')) { continue; } // construct version upgrade include path $upgrade_file = $config['base_path'] . '/install/upgrades/' . str_replace('.', '_', $cacti_upgrade_version) . '.php'; $upgrade_function = 'upgrade_to_' . str_replace('.', '_', $cacti_upgrade_version); // check for upgrade version file, then include, check for function and execute if (file_exists($upgrade_file)) { print 'Upgrading from v' . $prev_cacti_version .' (DB ' . $orig_cacti_version . ') to v' . $cacti_upgrade_version . PHP_EOL; include($upgrade_file); if (function_exists($upgrade_function)) { call_user_func($upgrade_function); $status = db_install_errors($cacti_upgrade_version); } else { $status = DB_STATUS_ERROR; print 'Error: upgrade function (' . $upgrade_function . ') not found' . PHP_EOL; } if ($status == DB_STATUS_ERROR) { break; } if (cacti_version_compare($orig_cacti_version, $cacti_upgrade_version, '<')) { db_execute("UPDATE version SET cacti = '" . $cacti_upgrade_version . "'"); $orig_cacti_version = $cacti_upgrade_version; } $prev_cacti_version = $cacti_upgrade_version; } db_execute("UPDATE version SET cacti = '" . $cacti_upgrade_version . "'"); if (CACTI_VERSION == $cacti_upgrade_version) { break; } } function db_install_errors($cacti_version) { global $database_upgrade_status, $debug, $database_statuses; $error_status = DB_STATUS_SKIPPED; if (!isset($database_upgrade_status)) { $database_upgrade_status = array(); } if (cacti_sizeof($database_upgrade_status)) { if (isset($database_upgrade_status[$cacti_version])) { foreach ($database_upgrade_status[$cacti_version] as $cache_item) { $status = $cache_item['status']; $error = empty($cache_item['error']) ? '' : $cache_item['error']; $sql = $cache_item['sql']; if ($error_status > $status) { $error_status = $status; } if ($debug || $status < DB_STATUS_SUCCESS) { $db_status = "[Unknown]"; if (isset($database_statuses[$status])) { $db_status = $database_statuses[$status]; } $sep1 = '################################'; $sep2 = '+------------------------------+'; printf("%s%s%s%-10s - %s%s%s%s%s%s%s%s", PHP_EOL, $sep1, PHP_EOL, $db_status, $error, PHP_EOL, $sep2, PHP_EOL, clean_up_lines($sql), PHP_EOL, $sep1, PHP_EOL); } } } } return $error_status; } /* display_version - displays version information */ function display_version() { $version = get_cacti_cli_version(); print "Cacti Database Upgrade Utility, Version $version, " . COPYRIGHT_YEARS . PHP_EOL; } /* display_help - displays the usage of the function */ function display_help () { display_version(); print PHP_EOL . "usage: upgrade_database.php [--debug] [--forcever=VERSION]" . PHP_EOL . PHP_EOL; print "A command line version of the Cacti database upgrade tool. You must execute" . PHP_EOL; print "this command as a super user, or someone who can write a PHP session file." . PHP_EOL; print "Typically, this user account will be apache, www-run, or root." . PHP_EOL . PHP_EOL; print "If you are running a beta or alpha version of Cacti and need to rerun" . PHP_EOL; print "the upgrade script, simply set the forcever to the previous release." . PHP_EOL . PHP_EOL; print "--forcever - Force the starting version, say " . CACTI_VERSION . PHP_EOL; print "--debug - Display verbose output during execution" . PHP_EOL . PHP_EOL; } cacti-release-1.2.19/clog.php000066400000000000000000000036161413633772300157610ustar00rootroot00000000000000 1 && $config['connection'] == 'online') { $poller_db_cnn_id = $remote_db_cnn_id; } else { $poller_db_cnn_id = false; } if ($first == NULL && $last == NULL) { // This is valid } elseif (!is_numeric($first) || $first < 0) { cacti_log('FATAL: The first host in the host range is invalid!', true, 'POLLER'); exit(-1); } elseif (!is_numeric($last) || $last < 0) { cacti_log('FATAL: The last host in the host range is invalid!', true, 'POLLER'); exit(-1); } elseif ($last < $first) { cacti_log('FATAL: The first host must always be less or equal to the last host!', true, 'POLLER'); exit(-1); } // verify the poller_id if (!is_numeric($poller_id) || $poller_id < 1) { cacti_log('FATAL: The poller needs to be a positive numeric value', true, 'POLLER'); exit(-1); } // notify cacti processes that a poller is running record_cmdphp_started(); $exists = db_fetch_cell_prepared('SELECT COUNT(*) FROM host WHERE poller_id = ?', array($poller_id)); if (empty($exists)) { record_cmdphp_done(); db_close(); exit(-1); } // install signal handlers for UNIX only if (function_exists('pcntl_signal')) { pcntl_signal(SIGTERM, 'sig_handler'); pcntl_signal(SIGINT, 'sig_handler'); } // record the start time $start = microtime(true); $poller_interval = read_config_option('poller_interval'); $active_profiles = read_config_option('active_profiles'); // check arguments if ($allhost) { $sql_where1 = ''; $sql_where2 = ''; $sql_where3 = ''; $params1 = array($poller_id); $params2 = array($poller_id, POLLER_ACTION_SCRIPT_PHP, POLLER_ACTION_SCRIPT_PHP_COUNT); $params3 = array($poller_interval, $poller_interval, $poller_interval, $poller_id); } else { $sql_where0 = 'WHERE poller_id > ?'; $sql_where1 = ' AND h.id >= ? AND h.id <= ?'; $sql_where2 = ' AND pi.host_id >= ? AND pi.host_id <= ?'; $sql_where3 = ' AND pi.host_id >= ? AND pi.host_id <= ?'; $params1 = array($poller_id, $first, $last); $params2 = array($poller_id, POLLER_ACTION_SCRIPT_PHP, POLLER_ACTION_SCRIPT_PHP_COUNT, $first, $last); $params3 = array($poller_interval, $poller_interval, $poller_interval, $poller_id, $first, $last); } if ($debug) { $print_data_to_stdout = true; $medium = POLLER_VERBOSITY_LOW; $hmedium = POLLER_VERBOSITY_LOW; } elseif ($allhost) { $print_data_to_stdout = true; $medium = POLLER_VERBOSITY_LOW; $hmedium = POLLER_VERBOSITY_MEDIUM; } else { $print_data_to_stdout = false; $medium = POLLER_VERBOSITY_MEDIUM; $hmedium = POLLER_VERBOSITY_MEDIUM; } // address potential exploits input_validate_input_number($first); input_validate_input_number($last); if ($active_profiles != 1) { $poller_items = db_fetch_assoc_prepared("SELECT " . SQL_NO_CACHE . " * FROM poller_item AS pi LEFT JOIN host AS h ON h.id = pi.host_id WHERE pi.poller_id = ? AND (h.disabled = '' OR h.disabled IS NULL) $sql_where1 AND pi.rrd_next_step <= 0 ORDER by pi.host_id", $params1); $script_server_calls = db_fetch_cell_prepared("SELECT " . SQL_NO_CACHE . " COUNT(*) FROM poller_item AS pi LEFT JOIN host AS h ON h.id = pi.host_id WHERE pi.poller_id = ? AND (h.disabled = '' OR h.disabled IS NULL) AND pi.action IN(?, ?) $sql_where2 AND pi.rrd_next_step <= 0", $params2); // setup next polling interval db_execute_prepared("UPDATE poller_item AS pi SET rrd_next_step = IF(rrd_step = ?, 0, IF(rrd_next_step - ? < 0, rrd_step, rrd_next_step - ?)) WHERE poller_id = ? $sql_where3", $params3); } else { $poller_items = db_fetch_assoc_prepared("SELECT " . SQL_NO_CACHE . " * FROM poller_item AS pi LEFT JOIN host AS h ON h.id = pi.host_id WHERE pi.poller_id = ? AND (h.disabled = '' OR h.disabled IS NULL) $sql_where1 ORDER by pi.host_id", $params1); $script_server_calls = db_fetch_cell_prepared("SELECT " . SQL_NO_CACHE . " COUNT(*) FROM poller_item AS pi LEFT JOIN host AS h ON h.id = pi.host_id WHERE pi.poller_id = ? AND (h.disabled = '' OR h.disabled IS NULL) AND pi.action IN(?, ?) $sql_where2", $params2); } if (cacti_sizeof($poller_items) && read_config_option('poller_enabled') == 'on') { $host_down = false; $new_host = true; $last_host = ''; $output_array = array(); $output_count = 0; $error_ds = array(); $width_dses = array(); /* startup Cacti php polling server and include the * include file for script processing */ if ($script_server_calls > 0) { $cactides = array( 0 => array('pipe', 'r'), // stdin is a pipe that the child will read from 1 => array('pipe', 'w'), // stdout is a pipe that the child will write to 2 => array('pipe', 'w') // stderr is a pipe to write to ); $cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php cmd', $cactides, $pipes); $output = fgets($pipes[1], 1024); if (substr_count($output, 'Started') != 0) { cacti_log('PHP Script Server Started Properly', $print_data_to_stdout, 'POLLER', POLLER_VERBOSITY_HIGH); } $using_proc_function = true; } else { $using_proc_function = false; $cactiphp = false; } foreach ($poller_items as $item) { $ds = $item['local_data_id']; $host_id = $item['host_id']; // check for host change if ($host_id != $last_host) { $new_host = true; $host_down = false; $set_spike_kill = false; if ($last_host != '') { $host_end = microtime(true); db_execute_prepared('UPDATE host SET polling_time = ? WHERE id = ? AND deleted = ""', array(($host_end - $host_start), $last_host)); $errors = cacti_sizeof($error_ds); cacti_log(sprintf('Device[%d] Time[%3.2f] Items[%d] Errors[%d]', $last_host, $host_end - $host_start, $itemcnt, $errors), $print_data_to_stdout, 'POLLER', $hmedium); if ($errors > 0) { if (read_config_option('spine_log_level') == 1) { cacti_log('WARNING: Invalid Response(s), Errors[' . $errors . '] Device[' . $last_host . '] Thread[1] DS[' . implode(', ', $error_ds) . ']', false, 'POLLER'); } $tot_errors += $errors; } } $error_ds = array(); $itemcnt = 0; $host_start = microtime(true); $host_count++; } // ping host, find out if there are re-index checks required if ($new_host && !empty($host_id)) { $host_down = ping_and_reindex_check($item, $mibs); } $new_host = false; $last_host = $host_id; if (!$host_down) { $output = collect_device_data($item, $error_ds); $itemcnt++; if (read_config_option('poller_debug') == 'on' && strlen($output) > $maxwidth) { $width_dses[] = $ds; $width_errors++; } if ($set_spike_kill && !substr_count($output, ':')) { // insert a U in place of the actual value if the snmp agent restarts $output_array[] = sprintf('(%d, %s, CURRENT_TIMESTAMP(), "U")', $item['local_data_id'], db_qstr($item['rrd_name'])); } else { // otherwise, just insert the value received from the poller $output_array[] = sprintf('(%d, %s, CURRENT_TIMESTAMP(), %s)', $item['local_data_id'], db_qstr($item['rrd_name']), db_qstr($output)); } if ($output_count > 1000) { db_execute('INSERT IGNORE INTO poller_output (local_data_id, rrd_name, time, output) VALUES ' . implode(', ', $output_array), true, $poller_db_cnn_id); if (read_config_option('boost_redirect') == 'on' && read_config_option('boost_rrd_update_enable') == 'on') { db_execute('INSERT IGNORE INTO poller_output_boost (local_data_id, rrd_name, time, output) VALUES ' . implode(', ', $output_array), true, $poller_db_cnn_id); } $output_array = array(); $output_count = 0; } else { $output_count++; } } // check for an over running poller $now = microtime(true); if ($now - $start > $poller_interval) { cacti_log('WARNING: cmd.php poller has run over its polling interval and therefore is ending'); break; } } // Record the last hosts polling time $host_end = microtime(true); db_execute_prepared('UPDATE host SET polling_time = ? WHERE id = ? AND deleted = ""', array(($host_end - $host_start), $host_id)); $errors = cacti_sizeof($error_ds); cacti_log(sprintf('Device[%d] Time[%3.2f] Items[%d] Errors[%d]', $last_host, $host_end - $host_start, $itemcnt, $errors), $print_data_to_stdout, 'POLLER', $hmedium); if ($errors > 0) { if (read_config_option('spine_log_level') == 1) { cacti_log('WARNING: Invalid Response(s), Errors[' . $errors . '] Device[' . $host_id . '] Thread[1] DS[' . implode(', ', $error_ds) . ']', false, 'POLLER'); } $tot_errors += $errors; } if (cacti_sizeof($width_dses)) { cacti_log('WARNING: Long Responses Errors[' . cacti_sizeof($width_dses) . '] DS[' . implode(', ', $width_dses) . ']', false, 'POLLER'); } if ($output_count > 0) { db_execute('INSERT IGNORE INTO poller_output (local_data_id, rrd_name, time, output) VALUES ' . implode(', ', $output_array), true, $poller_db_cnn_id); if (read_config_option('boost_redirect') == 'on' && read_config_option('boost_rrd_update_enable') == 'on') { db_execute('INSERT IGNORE INTO poller_output_boost (local_data_id, rrd_name, time, output) VALUES ' . implode(', ', $output_array), true, $poller_db_cnn_id); } } if ($using_proc_function && $script_server_calls > 0) { // close php server process fwrite($pipes[0], "quit\r\n"); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); $return_value = proc_close($cactiphp); } // take time and log performance data $end = microtime(true); cacti_log(sprintf( 'Time: %01.4f s, ' . 'Poller: %s, ' . 'Threads: N/A, ' . 'Devices: %d, ' . 'Items: %d, ' . 'Errors: %d', round($end-$start,4), $poller_id, $host_count, cacti_sizeof($poller_items), $tot_errors), $print_data_to_stdout, 'POLLER', $medium); } else { cacti_log('NOTE: There are no items in your poller for this polling cycle!', true, 'POLLER', $medium); } // record the process as having completed record_cmdphp_done(); // close the database connection db_close(); exit(0); // function to assist in logging function debug_level($host_id, $level) { global $debug; static $debug_enabled = array(); if (!isset($debug_enabled[$host_id])) { if ($debug) { $debug_enabled[$host_id] = true; } else { $debug_enabled[$host_id] = is_device_debug_enabled($host_id); } } $level = $debug_enabled[$host_id] ? POLLER_VERBOSITY_NONE : $level; return $level; } // let the poller server know about cmd.php being finished function record_cmdphp_done($pid = '') { global $poller_id, $poller_db_cnn_id; if ($pid == '') $pid = getmypid(); db_execute_prepared('UPDATE poller_time SET end_time=NOW() WHERE poller_id = ? AND pid = ?', array($poller_id, $pid), true, $poller_db_cnn_id); } // let cacti processes know that a poller has started function record_cmdphp_started() { global $poller_id, $poller_db_cnn_id; db_execute_prepared("INSERT INTO poller_time (poller_id, pid, start_time, end_time) VALUES (?, ?, NOW(), '0000-00-00 00:00:00')", array($poller_id, getmypid()), true, $poller_db_cnn_id); } function open_snmp_session($host_id, &$item) { global $sessions, $downhosts; if (!isset($item['max_oids'])) { $item['max_oids'] = read_config_option('max_get_size'); } if (!isset($sessions[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']]) && !isset($downhosts[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']])) { $sessions[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']] = cacti_snmp_session($item['hostname'], $item['snmp_community'], $item['snmp_version'], $item['snmp_username'], $item['snmp_password'], $item['snmp_auth_protocol'], $item['snmp_priv_passphrase'], $item['snmp_priv_protocol'], $item['snmp_context'], $item['snmp_engine_id'], $item['snmp_port'], $item['snmp_timeout'], read_config_option('snmp_retries'), $item['max_oids']); if ($sessions[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']] === false) { unset($sessions[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']]); $downhosts[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']] = true; return false; } } return $sessions[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']]; } function snmp_mark_host_down($host_id, &$item) { global $sessions, $downhosts; unset($sessions[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']]); $downhosts[$host_id . '_' . $item['snmp_version'] . '_' . $item['snmp_port']] = true; } function update_system_mibs($host_id) { $system_mibs = array( 'snmp_sysDescr' => '.1.3.6.1.2.1.1.1.0', 'snmp_sysObjectID' => '.1.3.6.1.2.1.1.2.0', 'snmp_sysUpTimeInstanceAlt' => '.1.3.6.1.6.3.10.2.1.3.0', 'snmp_sysUpTimeInstance' => '.1.3.6.1.2.1.1.3.0', 'snmp_sysContact' => '.1.3.6.1.2.1.1.4.0', 'snmp_sysName' => '.1.3.6.1.2.1.1.5.0', 'snmp_sysLocation' => '.1.3.6.1.2.1.1.6.0' ); $h = db_fetch_row_prepared('SELECT * FROM host WHERE id = ?', array($host_id)); if (cacti_sizeof($h)) { $session = open_snmp_session($host_id, $h); $uptimeAltFound = false; $uptime = false; if ($session !== false) { foreach($system_mibs as $name => $oid) { $value = cacti_snmp_session_get($session, $oid); if ($name == 'snmp_sysUpTimeInstanceAlt' && $value > 0) { $uptime = $value * 100; $uptimeAltFound = true; } elseif ($name == 'snmp_sysUpTimeInstance' && !$uptimeAltFound) { $uptime = $value; } elseif (!empty($value)) { db_execute_prepared("UPDATE host SET $name = ? WHERE deleted = '' AND id = ?", array($value, $host_id)); } } if ($uptime !== false) { db_execute_prepared("UPDATE host SET snmp_sysUpTimeInstance = ? WHERE deleted = '' AND id = ?", array($uptime, $host_id)); } } else { cacti_log("WARNING: Unable to open session for System Mib collection for Device[$host_id]", false, 'POLLER'); } } } function collect_device_data(&$item, &$error_ds) { global $print_data_to_stdout, $using_proc_function, $sessions, $pipes, $cactiphp; $thread_start = microtime(true); $ds = $item['local_data_id']; $host_id = $item['host_id']; $output = 'U'; switch ($item['action']) { case POLLER_ACTION_SNMP: if (($item['snmp_version'] == 0) || (($item['snmp_community'] == '') && ($item['snmp_version'] != 3))) { cacti_log("Device[$host_id] DS[$ds] ERROR: Invalid SNMP Data Source. Please either delete it from the database, or correct it.", $print_data_to_stdout, 'POLLER'); $output = 'U'; } else { $session = open_snmp_session($host_id, $item); if ($session !== false) { $output = cacti_snmp_session_get($session, $item['arg1'], true); if (!is_numeric($output)) { if (prepare_validate_result($output) == false) { $error_ds[$ds] = $ds; if (read_config_option('spine_log_level') == 2) { cacti_log("WARNING: Invalid Response, Device[$host_id] DS[$ds] OID:". $item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER'); } $output = 'U'; } } } else { snmp_mark_host_down($host_id, $item); $output = 'U'; $error_ds[$ds] = $ds; if (read_config_option('spine_log_level') == 2) { cacti_log("WARNING: Invalid Response, Device[$host_id] DS[$ds] OID:" . $item['arg1']. ", output: U", $print_data_to_stdout, 'POLLER'); } } } $total_time = (microtime(true) - $thread_start) * 1000; cacti_log("Device[$host_id] DS[$ds] TT[" . round($total_time, 2) . "] SNMP: v" . $item['snmp_version'] . ': ' . $item['hostname'] . ', dsname: ' . $item['rrd_name'] . ', oid: ' . $item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SCRIPT: $output = trim(exec_poll($item['arg1'])); if ($output == 'U') { $error_ds[$ds] = $ds; if (read_config_option('spine_log_level') == 2) { cacti_log("WARNING: Invalid Response, Device[$host_id] DS[$ds] SCRIPT: " . $item['arg1'] . ", output: U", $print_data_to_stdout, 'POLLER'); } } elseif (!is_numeric($output)) { if (prepare_validate_result($output) == false) { $error_ds[$ds] = $ds; if (read_config_option('spine_log_level') == 2) { cacti_log("WARNING: Invalid Response, Device[$host_id] DS[$ds] SCRIPT: " . $item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER'); } } } $total_time = (microtime(true) - $thread_start) * 1000; cacti_log("Device[$host_id] DS[$ds] TT[" . round($total_time, 2) . "] SCRIPT: " . $item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SCRIPT_PHP: $output = trim(str_replace("\n", '', exec_poll_php($item['arg1'], $using_proc_function, $pipes, $cactiphp))); if ($output == 'U') { $error_ds[$ds] = $ds; if (read_config_option('spine_log_level') == 2) { cacti_log("WARNING: Invalid Response, Device[$host_id] DS[$ds] SERVER: " . $item['arg1'] . ", output: U", $print_data_to_stdout, 'POLLER'); } } elseif (!is_numeric($output)) { if (prepare_validate_result($output) == false) { $error_ds[$ds] = $ds; if (read_config_option('spine_log_level') == 2) { cacti_log("WARNING: Invalid Response, Device[$host_id] DS[$ds] SERVER: " . $item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER'); } } } $total_time = (microtime(true) - $thread_start) * 1000; cacti_log("Device[$host_id] DS[$ds] TT[" . round($total_time, 2) . "] SERVER: " . $item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; default: $error_ds[$ds] = $ds; cacti_log("Device[$host_id] DS[$ds] ERROR: Invalid polling option: " . $item['action'], $stdout, 'POLLER'); } return $output; } function ping_and_reindex_check(&$item, $mibs) { global $print_data_to_stdout, $sessions, $set_spike_kill, $poller_db_cnn_id, $cactiphp, $using_proc_function; $ping = new Net_Ping; $host_id = $item['host_id']; $host = db_fetch_row_prepared('SELECT hostname, ping_port, ping_method, ping_retries, ping_timeout, availability_method FROM host WHERE id = ?', array($host_id)); $ping->host = $item; $ping->port = $host['ping_port']; // perform the appropriate ping check of the host if ($ping->ping($host['availability_method'], $host['ping_method'], $host['ping_timeout'], $host['ping_retries'])) { $host_down = false; update_host_status(HOST_UP, $host_id, $ping, $host['availability_method'], $print_data_to_stdout); cacti_log("Device[$host_id] STATUS: Device '" . $item['hostname'] . "' is UP.", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_DEBUG)); if ($mibs && $host['availability_method'] != 0 && $host['availability_method'] != 3) { update_system_mibs($host_id); } } else { $host_down = true; update_host_status(HOST_DOWN, $host_id, $ping, $host['availability_method'], $print_data_to_stdout); cacti_log("Device[$host_id] STATUS: Device '" . $item['hostname'] . "' is Down.", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_DEBUG)); } if (!$host_down) { // do the reindex check for this host $reindex = db_fetch_assoc_prepared('SELECT ' . SQL_NO_CACHE . ' pr.data_query_id, pr.action, pr.op, pr.assert_value, pr.arg1 FROM poller_reindex AS pr WHERE pr.host_id=?', array($item['host_id'])); if (cacti_sizeof($reindex)) { cacti_log("Device[$host_id] RECACHE: Processing " . cacti_sizeof($reindex) . " items in the auto reindex cache for '" . $item['hostname'] . "'.", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_DEBUG)); foreach ($reindex as $index_item) { $assert_fail = false; switch ($index_item['action']) { case POLLER_ACTION_SNMP: $session = open_snmp_session($host_id, $item); if ($session !== false) { if (trim($index_item['arg1']) == '.1.3.6.1.2.1.1.3.0') { $output = cacti_snmp_session_get($session, '.1.3.6.1.6.3.10.2.1.3.0'); if ($output > 0) { $output *= 100; } else { $output = cacti_snmp_session_get($session, $index_item['arg1']); } } else { $output = cacti_snmp_session_get($session, $index_item['arg1']); } } else { $output = 'U'; } cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE OID: ' . $index_item['arg1'] . ', (assert:' . $index_item['assert_value'] . ' ' . $index_item['op'] . ' output:' . $output . ')', $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SCRIPT: $output = trim(exec_poll($index_item['arg1'])); if (!is_numeric($output)) { if (prepare_validate_result($output) == false) { if (strlen($output) > 20) { $strout = 20; } else { $strout = strlen($output); } cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE Warning: Result from Script not valid. Partial Result: ' . substr($output, 0, $strout), $print_data_to_stdout, 'POLLER'); } } cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE SCRIPT: ' . $index_item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SCRIPT_PHP: $output = trim(str_replace("\n", '', exec_poll_php($index_item['arg1'], $using_proc_function, $pipes, $cactiphp))); if (!is_numeric($output)) { if (prepare_validate_result($output) == false) { if (strlen($output) > 20) { $strout = 20; } else { $strout = strlen($output); } cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE WARNING: Result from Script Server not valid. Partial Result: ' . substr($output, 0, $strout), $print_data_to_stdout, 'POLLER'); } } cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE SERVER: ' . $index_item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SNMP_COUNT: $session = open_snmp_session($host_id, $item); if ($session !== false) { $output = cacti_sizeof(cacti_snmp_session_walk($session, $index_item['arg1'])); } else { $output = 'U'; } cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE OID COUNT: ' . $index_item['arg1'] . ', output: ' . $output, $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SCRIPT_COUNT: // count items found $script_index_array = exec_into_array($index_item['arg1']); $output = cacti_sizeof($script_index_array); cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE CMD COUNT: ' . $index_item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; case POLLER_ACTION_SCRIPT_PHP_COUNT: $output = exec_into_array($index_item['arg1']); $output = cacti_sizeof($output); cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE SERVER COUNT: ' . $index_item['arg1'] . ", output: $output", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_MEDIUM)); break; default: cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . '] RECACHE ERROR: Invalid reindex option: ' . $index_item['action'], $print_data_to_stdout, 'POLLER'); } /* assert the result with the expected value in the * db; recache if the assert fails */ /* TODO: remove magic ":" from poller_command["command"]; this may interfere with scripts */ if (($index_item['op'] == '=') && ($index_item['assert_value'] != trim($output))) { cacti_log("Device[$host_id] HT[1] DQ[" . $index_item['data_query_id'] . "] RECACHE ASSERT FAILED '" . $index_item['assert_value'] . '=' . trim($output), $print_data_to_stdout, 'POLLER'); db_execute_prepared('REPLACE INTO poller_command (poller_id, time, action, command) VALUES (?, NOW(), ?, ?)', array($poller_id, POLLER_COMMAND_REINDEX, $item['host_id'] . ':' . $index_item['data_query_id']), true, $poller_db_cnn_id); $assert_fail = true; } elseif (($index_item['op'] == '>') && ($index_item['assert_value'] < trim($output))) { cacti_log("Device[$host_id] HT[1] DQ[" . $index_item['data_query_id'] . "] RECACHE ASSERT FAILED '" . $index_item['assert_value'] . '>' . trim($output), $print_data_to_stdout, 'POLLER'); db_execute_prepared('REPLACE INTO poller_command (poller_id, time, action, command) VALUES (?, NOW(), ?, ?)', array($poller_id, POLLER_COMMAND_REINDEX, $item['host_id'] . ':' . $index_item['data_query_id']), true, $poller_db_cnn_id); $assert_fail = true; } elseif (($index_item['op'] == '<') && ($index_item['assert_value'] > trim($output))) { cacti_log("Device[$host_id] DQ[" . $index_item['data_query_id'] . "] RECACHE ASSERT FAILED '" . $index_item['assert_value'] . '<' . trim($output), $print_data_to_stdout, 'POLLER'); db_execute_prepared('REPLACE INTO poller_command (poller_id, time, action, command) VALUES (?, NOW(), ?, ?)', array($poller_id, POLLER_COMMAND_REINDEX, $item['host_id'] . ':' . $index_item['data_query_id']), true, $poller_db_cnn_id); $assert_fail = true; } /* update 'poller_reindex' with the correct information if: * 1) the assert fails * 2) the OP code is > or < meaning the current value could have changed without causing * the assert to fail */ if (($assert_fail == true) || ($index_item['op'] == '>') || ($index_item['op'] == '<')) { db_execute_prepared('UPDATE poller_reindex SET assert_value = ? WHERE host_id = ? AND data_query_id = ? AND arg1 = ?', array($output, $host_id, $index_item['data_query_id'], $index_item['arg1'])); // spike kill logic if (($assert_fail) && (($index_item['op'] == '<') || ($index_item['arg1'] == '.1.3.6.1.2.1.1.3.0'))) { // don't spike kill unless we are certain if (!empty($output)) { $set_spike_kill = true; cacti_log("Device[$host_id] NOTICE: Spike Kill in Effect for '" . $item['hostname'] . "'.", $print_data_to_stdout, 'POLLER', debug_level($host_id, POLLER_VERBOSITY_DEBUG)); } } } } } } return $host_down; } function get_max_column_width() { $pcol_data = db_fetch_row("SHOW COLUMNS FROM poller_output WHERE Field='output'"); $bcol_data = db_fetch_row("SHOW COLUMNS FROM poller_output_boost WHERE Field='output'"); if (isset($pcol_data['Type'])) { $pcol = $pcol_data['Type']; $data = explode('(', $pcol); $pmax = trim($data[1], ')'); } if (cacti_sizeof($bcol_data)) { $bcol = $bcol_data['Type']; $data = explode('(', $bcol); $bmax = trim($data[1], ')'); } return min($pmax, $bmax); } function display_version() { $version = get_cacti_version(); print "Cacti Legacy Host Data Collector, Version $version, " . COPYRIGHT_YEARS . "\n"; } // display_help - displays the usage of the function function display_help () { display_version(); print "\nusage: cmd.php --first=ID --last=ID [--poller=ID] [--mibs] [--debug]\n\n"; print "Cacti's legacy data collector. This data collector is called by poller.php\n"; print "every poller interval to gather information from devices. It is recommended\n"; print "that every system deploy spine instead of cmd.php in production due to the built\n"; print "in scalability limits of cmd.php.\n\n"; print "Required\n"; print " --first - First host id in the range to collect from.\n"; print " --last - Last host id in the range to collect from.\n\n"; print "Optional:\n"; print " --poller - The poller to run as. Defaults to the system poller.\n"; print " --mode - The poller mode, either online, offline, or recovery.\n"; print " --mibs - Refresh all system mibs from hosts supporting snmp.\n"; print " --debug - Display verbose output during execution.\n\n"; } cacti-release-1.2.19/cmd_realtime.php000066400000000000000000000212131413633772300174530ustar00rootroot00000000000000 0', array($graph_id)); if (!cacti_count($local_data_ids)) { echo "No local_graph_id found\n\n"; exit(-1); } $ids = array(); $hosts = array(); $idbyhost = array(); foreach ($local_data_ids as $row) { if ($row['local_data_id'] > 0 && $row['host_id'] != '') { $ids[$row['local_data_id']] = $row['local_data_id']; $hosts[$row['host_id']] = $row['host_id']; $idbyhost[$row['host_id']][] = $row['local_data_id']; } } $print_data_to_stdout = true; if (cacti_sizeof($idbyhost)) { $polling_items = db_fetch_assoc('SELECT * FROM poller_item WHERE local_data_id IN (' . implode(',', $ids) . ') AND host_id IN (' . implode(',', $hosts) . ') ORDER BY host_id'); $script_server_calls = db_fetch_cell('SELECT count(*) FROM poller_item WHERE action=2 AND host_id IN (' . implode(',', $hosts) . ') AND local_data_id IN (' . implode(',', $ids) . ')'); /* startup Cacti php polling server and include the include file for script processing */ if ($script_server_calls > 0) { $cactides = array( 0 => array('pipe', 'r'), // stdin is a pipe that the child will read from 1 => array('pipe', 'w'), // stdout is a pipe that the child will write to 2 => array('pipe', 'w') // stderr is a pipe to write to ); if (function_exists('proc_open')) { $cactiphp = proc_open(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/script_server.php realtime ' . $poller_id, $cactides, $pipes); $output = fgets($pipes[1], 1024); $using_proc_function = true; } else { $using_proc_function = false; } } else { $using_proc_function = false; } /* all polled items need the same insert time */ $host_update_time = date('Y-m-d H:i:s'); foreach ($idbyhost as $host_id => $local_data_ids) { $col_poller_id = db_fetch_cell_prepared('SELECT poller_id FROM host WHERE id = ?', array($host_id)); $local_data_ids = array( 'local_data_ids' => $local_data_ids ); if ($col_poller_id > 1) { $hostname = db_fetch_cell_prepared('SELECT hostname FROM poller WHERE id = ?', array($col_poller_id)); $url = get_url_type() . '://' . $hostname . $config['url_path'] . '/remote_agent.php' . '?action=polldata' . '&host_id=' . $host_id . '&' . http_build_query($local_data_ids) . '&poller_id=' . $poller_id; $fgc_contextoption = get_default_contextoption(); $fgc_context = stream_context_create($fgc_contextoption); $output = json_decode(@file_get_contents($url, FALSE, $fgc_context), true); if (cacti_sizeof($output)) { $sql = ''; foreach($output as $item) { $sql .= ($sql != '' ? ', ':'') . '(' . db_qstr($item['local_data_id']) . ', ' . db_qstr($item['rrd_name']) . ', ' . db_qstr($host_update_time) . ', ' . db_qstr($poller_id) . ', ' . db_qstr($item['value']) . ')'; } db_execute("INSERT INTO poller_output_realtime (local_data_id, rrd_name, time, poller_id, output) VALUES $sql"); } } else { $poller_items = db_fetch_assoc_prepared('SELECT * FROM poller_item WHERE host_id = ? AND local_data_id IN(' . implode(',', $local_data_ids['local_data_ids']) . ')', array($host_id)); if (cacti_sizeof($poller_items)) { foreach($poller_items as $item) { switch ($item['action']) { case POLLER_ACTION_SNMP: /* snmp */ if (($item['snmp_version'] == 0) || (($item['snmp_community'] == '') && ($item['snmp_version'] != 3))) { $output = 'U'; } else { $host = db_fetch_row_prepared('SELECT ping_retries, max_oids FROM host WHERE id = ?', array($host_id)); if (!cacti_sizeof($host)) { $host['ping_retries'] = 1; $host['max_oids'] = 1; } $session = cacti_snmp_session($item['hostname'], $item['snmp_community'], $item['snmp_version'], $item['snmp_username'], $item['snmp_password'], $item['snmp_auth_protocol'], $item['snmp_priv_passphrase'], $item['snmp_priv_protocol'], $item['snmp_context'], $item['snmp_engine_id'], $item['snmp_port'], $item['snmp_timeout'], $host['ping_retries'], $host['max_oids']); if ($session === false) { $output = 'U'; } else { $output = cacti_snmp_session_get($session, $item['arg1']); $session->close(); } if (prepare_validate_result($output) === false) { if (strlen($output) > 20) { $strout = 20; } else { $strout = strlen($output); } $output = 'U'; } } break; case POLLER_ACTION_SCRIPT: /* script (popen) */ $output = trim(exec_poll($item['arg1'])); if (prepare_validate_result($output) === false) { if (strlen($output) > 20) { $strout = 20; } else { $strout = strlen($output); } $output = 'U'; } break; case POLLER_ACTION_SCRIPT_PHP: /* script (php script server) */ if ($using_proc_function == true) { $output = trim(str_replace("\n", '', exec_poll_php($item['arg1'], $using_proc_function, $pipes, $cactiphp))); if (prepare_validate_result($output) === false) { if (strlen($output) > 20) { $strout = 20; } else { $strout = strlen($output); } $output = 'U'; } } else { $output = 'U'; } break; } if (isset($output)) { db_execute_prepared('INSERT INTO poller_output_realtime (local_data_id, rrd_name, time, poller_id, output) VALUES (?, ?, ?, ?, ?)', array($item['local_data_id'], $item['rrd_name'], $host_update_time, $poller_id, $output)); } } } } } if (($using_proc_function == true) && ($script_server_calls > 0)) { /* close php server process */ fwrite($pipes[0], "quit\r\n"); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); $return_value = proc_close($cactiphp); } } cacti-release-1.2.19/color.php000066400000000000000000000573421413633772300161600ustar00rootroot00000000000000 __('Delete') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'remove': color_remove(); header ('Location: color.php'); break; case 'edit': top_header(); color_edit(); bottom_footer(); break; case 'export': color_export(); break; case 'import': top_header(); color_import(); bottom_footer(); break; default: top_header(); color(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_color')) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $save['id'] = get_nfilter_request_var('id'); if (get_nfilter_request_var('read_only') == '') { $save['name'] = get_nfilter_request_var('name'); $save['hex'] = form_input_validate(get_nfilter_request_var('hex'), 'hex', '^[a-fA-F0-9]+$' , false, 3); } else { $save['name'] = get_nfilter_request_var('hidden_name'); $save['read_only'] = 'on'; } if (!is_error_message()) { $color_id = sql_save($save, 'colors'); if ($color_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: color.php?header=false&action=edit&id=' . (empty($color_id) ? get_nfilter_request_var('id') : $color_id)); } else { header('Location: color.php?header=false'); } } elseif (isset_request_var('save_component_import')) { if (isset($_FILES['import_file']['tmp_name'])) { if (($_FILES['import_file']['tmp_name'] != 'none') && ($_FILES['import_file']['tmp_name'] != '')) { $csv_data = file($_FILES['import_file']['tmp_name']); $debug_data = color_import_processor($csv_data); if (cacti_sizeof($debug_data)) { $_SESSION['import_debug_info'] = $debug_data; } header('Location: color.php?action=import'); } } else { raise_message(35); header('Location: color.php?action=import'); } } exit; } /* ----------------------- Color Functions ----------------------- */ function form_actions() { global $color_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM colors WHERE ' . array_to_sql_or($selected_items, 'id')); } } header('Location: color.php?header=false'); exit; } /* setup some variables */ $color_list = ''; $i = 0; /* loop through each of the graphs selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $color = db_fetch_row_prepared('SELECT name, hex FROM colors WHERE id = ?', array($matches[1])); $color_list .= '
  • ' . ($color['name'] != '' ? html_escape($color['name']): __('Unnamed Color')) . ' (' . $color['hex'] . ')
  • '; $color_array[$i] = $matches[1]; $i++; } } top_header(); form_start('color.php'); html_start_box($color_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($color_array) && cacti_sizeof($color_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ print "

    " . __n('Click \'Continue\' to delete the following Color', 'Click \'Continue\' to delete the following Colors', cacti_sizeof($color_array)) . "

      $color_list
    \n"; $save_html = " "; } } else { raise_message(40); header('Location: color.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } function color_import_processor(&$colors) { $i = 0; $hexcol = 0; $return_array = array(); if (cacti_sizeof($colors)) { foreach($colors as $color_line) { /* parse line */ $line_array = explode(',', $color_line); /* header row */ if ($i == 0) { $save_order = '('; $j = 0; $first_column = true; $required = 0; $update_suffix = ''; if (cacti_sizeof($line_array)) { foreach($line_array as $line_item) { $line_item = trim(str_replace("'", '', $line_item)); $line_item = trim(str_replace('"', '', $line_item)); switch ($line_item) { case 'hex': $hexcol = $j; case 'name': if (!$first_column) { $save_order .= ', '; } $save_order .= $line_item; $insert_columns[] = $j; $first_column = false; if ($update_suffix != '') { $update_suffix .= ", $line_item=VALUES($line_item)"; } else { $update_suffix .= " ON DUPLICATE KEY UPDATE $line_item=VALUES($line_item)"; } $required++; break; default: /* ignore unknown columns */ } $j++; } } $save_order .= ')'; if ($required >= 2) { array_push($return_array, 'HEADER LINE PROCESSED OK:
    Columns found where: ' . $save_order . '
    '); } else { array_push($return_array, 'HEADER LINE PROCESSING ERROR: Missing required field
    Columns found where:' . $save_order . '
    '); break; } } else { $save_value = '('; $j = 0; $first_column = true; $sql_where = ''; if (cacti_sizeof($line_array)) { foreach($line_array as $line_item) { if (in_array($j, $insert_columns)) { $line_item = trim(str_replace("'", '', $line_item)); $line_item = trim(str_replace('"', '', $line_item)); if (!$first_column) { $save_value .= ','; } else { $first_column = false; } $save_value .= "'" . $line_item . "'"; if ($j == $hexcol) { $sql_where = "WHERE hex='$line_item'"; } } $j++; } } $save_value .= ')'; if ($j > 0) { if (isset_request_var('allow_update')) { $sql_execute = 'INSERT INTO colors ' . $save_order . ' VALUES ' . $save_value . $update_suffix; if (db_execute($sql_execute)) { array_push($return_array,"INSERT SUCCEEDED: $save_value"); } else { array_push($return_array,"INSERT FAILED: $save_value"); } } else { /* perform check to see if the row exists */ $existing_row = db_fetch_row("SELECT * FROM colors $sql_where"); if (cacti_sizeof($existing_row)) { array_push($return_array,"INSERT SKIPPED, EXISTING: $save_value"); } else { $sql_execute = 'INSERT INTO colors ' . $save_order . ' VALUES ' . $save_value; if (db_execute($sql_execute)) { array_push($return_array,"INSERT SUCCEEDED: $save_value"); } else { array_push($return_array,"INSERT FAILED: $save_value"); } } } } } $i++; } } return $return_array; } function color_import() { form_start('color.php?action=import', '', true); if ((isset($_SESSION['import_debug_info'])) && (is_array($_SESSION['import_debug_info']))) { html_start_box('Import Results', '100%', '', '3', 'center', ''); print "

    " . __('Cacti has imported the following items:') . "

    \n"; if (cacti_sizeof($_SESSION['import_debug_info'])) { foreach($_SESSION['import_debug_info'] as $import_result) { print "" . $import_result . "\n"; } } html_end_box(); kill_session_var('import_debug_info'); } html_start_box( __('Import Colors'), '100%', '', '3', 'center', ''); form_alternate_row();?>



    name - The Color Name');?>
    hex - The Hex Value');?>

    array('no_form_tag' => true), 'fields' => inject_form_variables($fields_color_edit, (isset($color) ? $color : array())) ) ); html_end_box(true, true); form_save_button('color.php'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_graphs' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ), 'named' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => 'true' ) ); validate_store_request_vars($filters, 'sess_color'); /* ================= input validation ================= */ } function color() { global $color_actions, $item_rows; process_request_vars(); if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Colors'), '100%', '', '3', 'center', 'color.php?action=edit'); ?>
    '> > > ' title=''> ' title=''> ' title=''> ' title=''>
    0 OR templates>0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(color) FROM ( SELECT c.id AS color, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs, SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates FROM colors AS c LEFT JOIN ( SELECT DISTINCT color_id, graph_template_id, local_graph_id FROM graph_templates_item WHERE color_id>0 ) AS gti ON gti.color_id=c.id $sql_where GROUP BY c.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $colors = db_fetch_assoc("SELECT *, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs, SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates FROM ( SELECT c.*, local_graph_id FROM colors AS c LEFT JOIN ( SELECT DISTINCT color_id, graph_template_id, local_graph_id FROM graph_templates_item WHERE color_id>0 ) AS gti ON c.id=gti.color_id ) AS rs $sql_where GROUP BY rs.id $sql_having $sql_order $sql_limit"); $nav = html_nav_bar('color.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 8, __('Colors'), 'page', 'main'); form_start('color.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'hex' => array('display' => __('Hex'), 'align' => 'left', 'sort' => 'DESC', 'tip' => __('The Hex Value for this Color.')), 'name' => array('display' => __('Color Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Color definition.')), 'read_only' => array('display' => __('Named Color'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('Is this color a named color which are read only.')), 'nosort1' => array('display' => __('Color'), 'align' => 'center', 'sort' => 'DESC', 'tip' => __('The Color as shown on the screen.')), 'nosort' => array('display' => __('Deletable'), 'align' => 'right', 'sort' => '', 'tip' => __('Colors in use cannot be Deleted. In use is defined as being referenced either by a Graph or a Graph Template.')), 'graphs' => array('display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graph using this Color.')), 'templates' => array('display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graph Templates using this Color.')) ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($colors)) { foreach ($colors as $color) { if ($color['graphs'] == 0 && $color['templates'] == 0) { $disabled = false; } else { $disabled = true; } if ($color['name'] == '') { $color['name'] = 'Unnamed #'. $color['hex']; } form_alternate_row('line' . $color['id'], false, $disabled); form_selectable_cell("" . $color['hex'] . '', $color['id']); form_selectable_cell(filter_value($color['name'], get_request_var('filter')), $color['id']); form_selectable_cell($color['read_only'] == 'on' ? __('Yes'):__('No'), $color['id']); form_selectable_cell('', $color['id'], '', 'text-align:right;background-color:#' . $color['hex'] . ';min-width:30%'); form_selectable_cell($disabled ? __('No'):__('Yes'), $color['id'], '', 'text-align:right'); form_selectable_cell(number_format_i18n($color['graphs'], '-1'), $color['id'], '', 'text-align:right'); form_selectable_cell(number_format_i18n($color['templates'], '-1'), $color['id'], '', 'text-align:right'); form_checkbox_cell($color['name'], $color['id'], $disabled); form_end_row(); } } else { print "" . __('No Colors Found') . "\n"; } html_end_box(false); if (cacti_sizeof($colors)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($color_actions, 1); form_end(); } function color_export() { process_request_vars(); /* form the 'where' clause for our main sql query */ if (get_request_var('filter') != '') { $sql_where = 'WHERE (name LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ' OR hex LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ')'; } else { $sql_where = ''; } if (get_request_var('named') == 'true') { $sql_where .= ($sql_where != '' ? ' AND' : 'WHERE') . " read_only='on'"; } if (get_request_var('has_graphs') == 'true') { $sql_having = 'HAVING graphs>0 OR templates>0'; } else { $sql_having = ''; } $colors = db_fetch_assoc("SELECT *, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs, SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates FROM ( SELECT c.*, local_graph_id FROM colors AS c LEFT JOIN ( SELECT color_id, graph_template_id, local_graph_id FROM graph_templates_item WHERE color_id>0 ) AS gti ON c.id=gti.color_id ) AS rs $sql_where GROUP BY rs.id $sql_having"); if (cacti_sizeof($colors)) { header('Content-type: application/csv'); header('Content-Disposition: attachment; filename=colors.csv'); print '"name","hex"' . "\n"; foreach($colors as $color) { print '"' . $color['name'] . '","' . $color['hex'] . '"' . "\n"; } } } cacti-release-1.2.19/color_templates.php000066400000000000000000000604331413633772300202310ustar00rootroot00000000000000 __('Delete'), 2 => __('Duplicate'), 3 => __('Sync Aggregates') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': aggregate_color_form_save(); break; case 'actions': aggregate_color_form_actions(); break; case 'template_edit': top_header(); aggregate_color_template_edit(); bottom_footer(); break; default: top_header(); aggregate_color_template(); bottom_footer(); break; } /** draw_color_template_items_list - draws a nicely formatted list of color items for display * on an edit form * @param array $item_list - an array representing the list of color items. this array should * come directly from the output of db_fetch_assoc() * @param string $filename - the filename to use when referencing any external url * @param string $url_data - any extra GET url information to pass on when referencing any * external url * @param bool $disable_controls - whether to hide all edit/delete functionality on this form */ function draw_color_template_items_list($item_list, $filename, $url_data, $disable_controls) { global $config; global $struct_color_template_item; $display_text = array( array('display' => __('Color Item'), 'align' => 'left', 'nohide' => true), array('display' => __('Color'), 'align' => 'left', 'nohide' => true), array('display' => __('Hex'), 'align' => 'left', 'nohide' => true), ); html_header($display_text, 2); $i = 1; $total_items = cacti_sizeof($item_list); if (cacti_sizeof($item_list)) { foreach ($item_list as $item) { /* alternating row color */ form_alternate_row('line' . $item['color_template_item_id'], true, true); print ''; if ($disable_controls == false) { print ""; } print __('Item # %d', $i); if ($disable_controls == false) { print ''; } print "\n"; print "\n"; print "" . $item['hex'] . "\n"; if ($disable_controls == false) { print ""; if (read_config_option('drag_and_drop') == '') { if ($i < $total_items && $total_items > 1) { echo ''; } else { echo ''; } if ($i > 1 && $i <= $total_items) { echo ''; } else { echo ''; } } print ""; print "\n"; } form_end_row(); $i++; } } else { print "" . __('No Items') . ""; } } /* -------------------------- The Save Function -------------------------- */ /** * aggregate_color_form_save the save function */ function aggregate_color_form_save() { if (isset_request_var('save_component_color')) { if (isset_request_var('color_template_id')) { $save1['color_template_id'] = get_nfilter_request_var('color_template_id'); } else { $save1['color_template_id'] = 0; } $save1['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); cacti_log('Saved ID: ' . $save1['color_template_id'] . ' Name: ' . $save1['name'], false, 'AGGREGATE', POLLER_VERBOSITY_DEBUG); if (!is_error_message()) { $color_template_id = sql_save($save1, 'color_templates', 'color_template_id'); cacti_log('Saved ID: ' . $color_template_id, false, 'AGGREGATE', POLLER_VERBOSITY_DEBUG); if ($color_template_id) { raise_message(1); } else { raise_message(2); } } } header('Location: color_templates.php?header=false&action=template_edit&color_template_id=' . (empty($color_template_id) ? get_nfilter_request_var('color_template_id') : $color_template_id)); } /* ------------------------ The 'actions' function ------------------------ */ /** * aggregate_color_form_actions the action function */ function aggregate_color_form_actions() { global $aggregate_actions, $config; include_once($config['base_path'] . '/lib/api_aggregate.php'); /* ================= input validation ================= */ get_filter_request_var('drp_action'); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM color_templates WHERE ' . array_to_sql_or($selected_items, 'color_template_id')); db_execute('DELETE FROM color_template_items WHERE ' . array_to_sql_or($selected_items, 'color_template_id')); } elseif (get_nfilter_request_var('drp_action') == '2') { // duplicate for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $name = db_fetch_cell_prepared('SELECT name FROM color_templates WHERE color_template_id = ?', array($matches[1])); $color_list .= '
  • ' . html_escape($name) . '
  • '; $color_array[] = $matches[1]; } } top_header(); form_start('color_templates.php'); html_start_box($aggregate_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($color_array) && cacti_sizeof($color_array)) { if (get_request_var('drp_action') == '1') { /* delete */ print "

    " . __n('Click \'Continue\' to delete the following Color Template', 'Click \'Continue\' to delete following Color Templates', cacti_sizeof($color_array)) . "

      $color_list
    "; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // duplicate print "

    " . __n('Click \'Continue\' to duplicate the following Color Template. You can optionally change the title format for the new color template.', 'Click \'Continue\' to duplicate following Color Templates. You can optionally change the title format for the new color templates.', cacti_sizeof($color_array)) . "

      $color_list

    " . __('Title Format:') . '
    '; form_text_box('title_format', ' (1)', '', '255', '30', 'text'); print "

    "; $save_html = " "; } elseif (get_request_var('drp_action') == '3') { // sync print "

    " . __n('Click \'Continue\' to Synchronize all Aggregate Graphs with the selected Color Template.', 'Click \'Continue\' to Syncrhonize all Aggregate Graphs with the selected Color Templates.', cacti_sizeof($color_array)) . "

      $color_list

    "; $save_html = " "; } } else { raise_message(40); header('Location: color_templates.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /** * aggregate_color_item show all color template items */ function aggregate_color_item() { global $config; /* ================= input validation ================= */ get_filter_request_var('color_template_id'); /* ==================================================== */ if (isempty_request_var('color_template_id')) { $template_item_list = array(); $header_label = __('Color Template Items [new]'); } else { $template_item_list = db_fetch_assoc_prepared('SELECT cti.color_template_id, cti.color_template_item_id, cti.sequence, colors.hex FROM color_template_items AS cti LEFT JOIN colors ON cti.color_id=colors.id WHERE cti.color_template_id = ? ORDER BY cti.sequence ASC', array(get_request_var('color_template_id'))); $name = db_fetch_cell_prepared('SELECT name FROM color_templates WHERE color_template_id = ?', array(get_request_var('color_template_id'))); $header_label = __esc('Color Template Items [edit: %s]', $name); } html_start_box($header_label, '100%', '', '3', 'center', 'color_templates_items.php?action=item_edit&color_template_id=' . html_escape_request_var('color_template_id')); draw_color_template_items_list($template_item_list, 'color_templates_items.php', 'color_template_id=' . html_escape_request_var('color_template_id'), false); html_end_box(); ?> array('no_form_tag' => true), 'fields' => inject_form_variables($fields_color_template_template_edit, (isset($template) ? $template : array())) ) ); html_end_box(true, true); form_hidden_box('color_template_id', (isset($template['color_template_id']) ? $template['color_template_id'] : '0'), ''); form_hidden_box('save_component_color', '1', ''); /* color item list goes here */ if (!isempty_request_var('color_template_id')) { aggregate_color_item(); } form_save_button('color_templates.php', 'return', 'color_template_id'); } function sync_color_templates($color_template) { global $config; include_once($config['base_path'] . '/lib/api_aggregate.php'); $name = db_fetch_cell_prepared('SELECT name FROM color_templates WHERE color_template_id = ?', array($color_template)); $aggregate_templates = array_rekey( db_fetch_assoc_prepared('SELECT DISTINCT aggregate_template_id FROM aggregate_graph_templates_item WHERE color_template = ?', array($color_template)), 'aggregate_template_id', 'aggregate_template_id' ); $found = false; $templates = 0; $graphs = 0; if (cacti_sizeof($aggregate_templates)) { $found = true; $templates = cacti_sizeof($aggregate_templates); foreach($aggregate_templates as $id) { push_out_aggregates($id); } } $aggregate_graphs = db_fetch_assoc_prepared('SELECT DISTINCT ag.aggregate_template_id, ag.local_graph_id FROM aggregate_graphs_graph_item AS agi LEFT JOIN aggregate_graphs AS ag ON ag.id=agi.aggregate_graph_id WHERE (ag.aggregate_template_id > 0 AND ag.template_propogation = "") OR ag.aggregate_template_id = 0 AND agi.color_template = ?', array($color_template)); if (cacti_sizeof($aggregate_graphs)) { $found = true; $graphs = cacti_sizeof($aggregate_graphs); foreach($aggregate_templates as $id) { push_out_aggregates($id['aggregate_template_id'], $id['local_graph_id']); } } if ($found) { raise_message('color_template_sync', __('Color Template \'%s\' had %d Aggregate Templates pushed out and %d Non-Templated Aggregates pushed out', $name, $templates, $graphs), MESSAGE_LEVEL_INFO); } else { raise_message('color_template_sync', __('Color Template \'%s\' had no Aggregate Templates or Graphs using this Color Template.', $name, $templates, $graphs), MESSAGE_LEVEL_INFO); } } /** * aggregate_color_template maintain color templates */ function aggregate_color_template() { global $aggregate_actions, $item_rows, $config; include_once($config['base_path'] . '/lib/api_aggregate.php'); /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_graphs' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_ct'); /* ================= input validation ================= */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } form_start('color_templates.php', 'form_template'); html_start_box(__('Color Templates'), '100%', '', '3', 'center', 'color_templates.php?action=template_edit'); $filter_html = '
    ' . __('Search') . ' ' . __('Color Templates') . '
    '; print $filter_html; html_end_box(); form_end(); /* form the 'where' clause for our main sql query */ $sql_where = ''; if (get_request_var('filter') != '') { $sql_where = 'WHERE (ct.name LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ')'; } if (get_request_var('has_graphs') == 'true') { $sql_where .= ($sql_where != '' ? ' AND ' : 'WHERE ') . ' (templates>0 OR graphs>0)'; } $total_rows = db_fetch_cell("SELECT COUNT(ct.color_template_id) FROM color_templates AS ct LEFT JOIN ( SELECT color_template, COUNT(*) AS templates FROM aggregate_graph_templates_item GROUP BY color_template ) AS templates ON ct.color_template_id=templates.color_template LEFT JOIN ( SELECT color_template, COUNT(*) AS graphs FROM aggregate_graphs_graph_item GROUP BY color_template ) AS graphs ON ct.color_template_id=graphs.color_template $sql_where"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $template_list = db_fetch_assoc("SELECT ct.color_template_id, ct.name, templates.templates, graphs.graphs FROM color_templates AS ct LEFT JOIN ( SELECT color_template, COUNT(*) AS templates FROM aggregate_graph_templates_item GROUP BY color_template ) AS templates ON ct.color_template_id=templates.color_template LEFT JOIN ( SELECT color_template, COUNT(*) AS graphs FROM aggregate_graphs_graph_item GROUP BY color_template ) AS graphs ON ct.color_template_id=graphs.color_template $sql_where $sql_order $sql_limit"); $nav = html_nav_bar('color_templates.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('Color Templates'), 'page', 'main'); form_start('color_templates.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'name' => array(__('Template Title'), 'ASC'), 'nosort' => array('display' => __('Deletable'), 'align' => 'right', 'tip' => __('Color Templates that are in use cannot be Deleted. In use is defined as being referenced by an Aggregate Template.')), 'graphs' => array('display' => __('Graphs'), 'align' => 'right', 'sort' => 'DESC'), 'templates' => array('display' => __('Templates'), 'align' => 'right', 'sort' => 'DESC') ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($template_list)) { foreach ($template_list as $template) { if ($template['templates'] > 0) { $disabled = true; } else { $disabled = false; } form_alternate_row('line' . $template['color_template_id'], true); form_selectable_cell(filter_value($template['name'], get_request_var('filter'), 'color_templates.php?action=template_edit&color_template_id=' . $template['color_template_id'] . '&page=1'), $template['color_template_id']); form_selectable_cell($disabled ? __('No'):__('Yes'), $template['color_template_id'], '', 'right'); form_selectable_cell(number_format_i18n($template['graphs']), $template['color_template_id'], '', 'right'); form_selectable_cell(number_format_i18n($template['templates']), $template['color_template_id'], '', 'right'); form_checkbox_cell($template['name'], $template['color_template_id'], $disabled); form_end_row(); } } else { print "" . __('No Color Templates Found') ."\n"; } html_end_box(false); if (cacti_sizeof($template_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($aggregate_actions); form_end(); ?> ? AND color_template_id = ? ORDER BY sequence ASC limit 1', array($current_sequence['sequence'], get_request_var('color_template_id'))); cacti_log('movedown Id: ' . $next_sequence['color_template_item_id'] . ' Seq:' . $next_sequence['sequence'], false, POLLER_VERBOSITY_DEBUG); db_execute_prepared('UPDATE color_template_items SET sequence = ? WHERE color_template_id = ? AND color_template_item_id = ?', array($next_sequence['sequence'], get_request_var('color_template_id'), $current_sequence['color_template_item_id'])); db_execute_prepared('UPDATE color_template_items SET sequence = ? WHERE color_template_id = ? AND color_template_item_id = ?', array($current_sequence['sequence'], get_request_var('color_template_id'), $next_sequence['color_template_item_id'])); } /** * aggregate_color_item_moveup move item up */ function aggregate_color_item_moveup() { /* ================= input validation ================= */ get_filter_request_var('color_template_item_id'); get_filter_request_var('color_template_id'); /* ==================================================== */ $current_sequence = db_fetch_row_prepared('SELECT color_template_item_id, sequence FROM color_template_items WHERE color_template_item_id = ?', array(get_request_var('color_template_item_id'))); cacti_log('moveup Id: ' . $current_sequence['color_template_item_id'] . ' Seq:' . $current_sequence['sequence'], false, 'AGGREGATE', POLLER_VERBOSITY_DEBUG); $previous_sequence = db_fetch_row_prepared('SELECT color_template_item_id, sequence FROM color_template_items WHERE sequence < ? AND color_template_id = ? ORDER BY sequence DESC limit 1', array($current_sequence['sequence'], get_request_var('color_template_id'))); cacti_log('moveup Id: ' . $previous_sequence['color_template_item_id'] . ' Seq:' . $previous_sequence['sequence'], false, 'AGGREGATE', POLLER_VERBOSITY_DEBUG); db_execute_prepared('UPDATE color_template_items SET sequence = ? WHERE color_template_id = ? AND color_template_item_id = ?', array($previous_sequence['sequence'], get_request_var('color_template_id'), $current_sequence['color_template_item_id'])); db_execute_prepared('UPDATE color_template_items SET sequence = ? WHERE color_template_id = ? AND color_template_item_id = ?', array($current_sequence['sequence'], get_request_var('color_template_id'), $previous_sequence['color_template_item_id'])); } function aggregate_color_item_remove_confirm() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('color_id'); /* ==================================================== */ form_start('color_templates.php'); html_start_box('', '100%', '', '3', 'center', ''); $template = db_fetch_row_prepared('SELECT * FROM color_templates WHERE color_template_id = ?', array(get_request_var('id'))); $color_item = db_fetch_row_prepared('SELECT * FROM color_template_items WHERE color_template_item_id = ?', array(get_request_var('color_id'))); $color_hex = db_fetch_cell_prepared('SELECT hex FROM colors WHERE id = ?', array($color_item['color_id'])); ?>

    ''

    ' onClick='$("#cdialog").dialog("close");' name='cancel'> ' name='continue' title=''> 0)) { $template_item = db_fetch_row_prepared('SELECT * FROM color_template_items WHERE color_template_item_id = ?', array(get_request_var('color_template_item_id'))); $header_label = __esc('Color Template Items [edit Report Item: %s]', $template['name']); } else { $template_item = array(); $header_label = __esc('Color Template Items [new Report Item: %s]', $template['name']); } form_start('color_templates_items.php', 'aggregate_color_item_edit'); html_start_box($header_label, '100%', true, '3', 'center', ''); draw_edit_form(array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($struct_color_template_item, (isset($template_item) ? $template_item : array())) )); html_end_box(true, true); form_hidden_box('color_template_item_id', (array_key_exists('color_template_item_id', $template_item) ? $template_item['color_template_item_id'] : '0'), ''); form_hidden_box('color_template_id', get_request_var('color_template_id'), '0'); form_hidden_box('sequence', (array_key_exists('sequence', $template_item) ? $template_item['sequence'] : '0'), ''); form_hidden_box('save_component_item', '1', ''); form_save_button('color_templates.php?header=false&action=template_edit&color_template_id=' . get_request_var('color_template_id'), '', 'color_template_item_id'); } cacti-release-1.2.19/data_debug.php000066400000000000000000001031261413633772300171110ustar00rootroot00000000000000 __('Run Check'), 2 => __('Delete Check') ); ini_set('memory_limit', '-1'); set_default_action(); validate_request_vars(); switch (get_request_var('action')) { case 'actions': form_actions(); break; case 'run_debug': $id = get_filter_request_var('id'); if ($id > 0) { $selected_items = array($id); debug_delete($selected_items); debug_rerun($selected_items); raise_message('rerun', __('Data Source debug started.'), MESSAGE_LEVEL_INFO); header('Location: data_debug.php?action=view&id=' . get_filter_request_var('id')); } else { raise_message('repair_error', __('Data Source debug received an invalid Data Source ID.'), MESSAGE_LEVEL_ERROR); } break; case 'run_repair': $id = get_filter_request_var('id'); if ($id > 0) { if (dsdebug_run_repair($id)) { raise_message('repair', __('All RRDfile repairs succeeded.'), MESSAGE_LEVEL_INFO); } else { raise_message('repair', __('One or more RRDfile repairs failed. See Cacti log for errors.'), MESSAGE_LEVEL_ERROR); } $selected_items = array($id); debug_delete($selected_items); debug_rerun($selected_items); raise_message('rerun', __('Automatic Data Source debug being rerun after repair.'), MESSAGE_LEVEL_INFO); header('Location: data_debug.php?action=view&id=' . get_filter_request_var('id')); } else { raise_message('repair_error', __('Data Source repair received an invalid Data Source ID.'), MESSAGE_LEVEL_ERROR); } break; case 'view': $id = get_filter_request_var('id'); $debug_status = debug_process_status($id); if ($debug_status == 'notset') { $selected_items = array($id); debug_delete($selected_items); debug_rerun($selected_items); $debug_status = 'waiting'; } if ($debug_status == 'waiting' || $debug_status == 'analysis') { $refresh = array( 'seconds' => 30, 'page' => 'data_debug.php?action=view&id=' . $id . '&header=false', 'logout' => 'false' ); set_page_refresh($refresh); } top_header(); debug_view(); bottom_footer(); break; case 'ajax_hosts': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(true, 'applyFilter', $sql_where); break; case 'ajax_hosts_noany': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(false, 'applyFilter', $sql_where); break; default: $refresh = array( 'seconds' => get_request_var('refresh'), 'page' => 'data_debug.php?header=false', 'logout' => 'false' ); set_page_refresh($refresh); top_header(); debug_wizard(); bottom_footer(); break; } function debug_process_status($id) { $status = db_fetch_row_prepared('SELECT done, IFNULL(issue, "waiting") AS issue FROM data_debug WHERE datasource = ?', array($id)); if (cacti_sizeof($status) == 0) { return 'notset'; } elseif ($status['issue'] == 'waiting') { return 'waiting'; } elseif ($status['done'] == 1) { return 'complete'; } else { return 'analysis'; } } function form_actions() { global $actions, $assoc_actions; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ================= input validation ================= */ $selected_items = array(); if (isset_request_var('save_list')) { /* loop through each of the lists selected on the previous page and get more info about them */ foreach ($_POST as $var=>$val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $selected_items[] = $matches[1]; } } /* if we are to save this form, instead of display it */ if (isset_request_var('save_list')) { if (get_request_var('drp_action') == '2') { /* delete */ debug_delete($selected_items); header('Location: data_debug.php?header=false&debug=-1'); } elseif (get_request_var('drp_action') == '1') { /* Rerun */ debug_rerun($selected_items); header('Location: data_debug.php?header=false&debug=1'); } exit; } } } function debug_rerun($selected_items) { $info = array( 'rrd_folder_writable' => '', 'rrd_exists' => '', 'rrd_writable' => '', 'active' => '', 'owner' => '', 'runas_poller' => '', 'runas_website' => get_running_user(), 'last_result' => '', 'valid_data' => '', 'rra_timestamp' => '', 'rra_timestamp2' => '', 'rrd_match' => '' ); $info = serialize($info); if (!empty($selected_items)) { foreach($selected_items as $id) { $exists = db_fetch_cell_prepared('SELECT id FROM data_debug WHERE datasource = ?', array($id)); if (!$exists) { $save = array(); $save['id'] = 0; $save['datasource'] = $id; $save['info'] = $info; $save['started'] = time(); $save['user'] = intval($_SESSION['sess_user_id']); $id = sql_save($save, 'data_debug'); } else { $stime = time(); db_execute_prepared('UPDATE data_debug SET started = ?, done = 0, info = ?, issue = "" WHERE id = ?', array($stime, $info, $exists)); } } } } function debug_delete($selected_items) { if (!empty($selected_items)) { foreach($selected_items as $id) { db_execute_prepared('DELETE FROM data_debug WHERE datasource = ?', array($id)); } } } function validate_request_vars() { /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'refresh' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '60' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'rfilter' => array( 'filter' => FILTER_VALIDATE_IS_REGEX, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'site_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '-1', 'pageset' => true, ), 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '-1', 'pageset' => true, ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '-1', 'pageset' => true, ), 'status' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'profile' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'debug' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '-1', 'pageset' => true, ) ); validate_store_request_vars($filters, 'sess_dd'); /* ================= input validation ================= */ } function debug_wizard() { global $actions; $display_text = array( 'name_cache' => array( 'display' => __('Data Source'), 'sort' => 'ASC', 'tip' => __('The Data Source to Debug'), ), 'username' => array( 'display' => __('User'), 'sort' => 'ASC', 'tip' => __('The User who requested the Debug.'), ), 'started' => array( 'display' => __('Started'), 'sort' => 'DESC', 'align' => 'right', 'tip' => __('The Date that the Debug was Started.'), ), 'local_data_id' => array( 'display' => __('ID'), 'sort' => 'ASC', 'align' => 'right', 'tip' => __('The Data Source internal ID.'), ), 'nosort1' => array( 'display' => __('Status'), 'sort' => 'ASC', 'align' => 'center', 'tip' => __('The Status of the Data Source Debug Check.'), ), 'nosort2' => array( 'display' => __('Writable'), 'align' => 'center', 'sort' => '', 'tip' => __('Determines if the Data Collector or the Web Site have Write access.'), ), 'nosort3' => array( 'display' => __('Exists'), 'align' => 'center', 'sort' => '', 'tip' => __('Determines if the Data Source is located in the Poller Cache.'), ), 'nosort4' => array( 'display' => __('Active'), 'align' => 'center', 'sort' => '', 'tip' => __('Determines if the Data Source is Enabled.'), ), 'nosort5' => array( 'display' => __('RRD Match'), 'align' => 'center', 'sort' => '', 'tip' => __('Determines if the RRDfile matches the Data Source Template.'), ), 'nosort6' => array( 'display' => __('Valid Data'), 'align' => 'center', 'sort' => '', 'tip' => __('Determines if the RRDfile has been getting good recent Data.'), ), 'nosort7' => array( 'display' => __('RRD Updated'), 'align' => 'center', 'sort' => '', 'tip' => __('Determines if the RRDfile has been writted to properly.'), ), 'nosort8' => array( 'display' => __('Issues'), 'align' => 'right', 'sort' => '', 'tip' => __('Summary of issues found for the Data Source.'), ) ); if (isset_request_var('purge')) { db_execute('TRUNCATE TABLE data_debug'); } /* fill in the current date for printing in the log */ if (defined('CACTI_DATE_TIME_FORMAT')) { $datefmt = CACTI_DATE_TIME_FORMAT; } else { $datefmt = 'Y-m-d H:i:s'; } data_debug_filter(); $total_rows = 0; $checks = array(); if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } /* form the 'where' clause for our main sql query */ if (get_request_var('rfilter') != '') { $sql_where1 = "WHERE (dtd.name_cache RLIKE '" . get_request_var('rfilter') . "'" . " OR dtd.local_data_id RLIKE '" . get_request_var('rfilter') . "'" . " OR dt.name RLIKE '" . get_request_var('rfilter') . "')"; } else { $sql_where1 = ''; } if (get_request_var('host_id') == '-1') { /* Show all items */ } elseif (isempty_request_var('host_id')) { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' (dl.host_id=0 OR dl.host_id IS NULL)'; } elseif (!isempty_request_var('host_id')) { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dl.host_id=' . get_request_var('host_id'); } if (get_request_var('site_id') == '-1') { /* Show all items */ } elseif (isempty_request_var('site_id')) { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' (h.site_id=0 OR h.site_id IS NULL)'; } elseif (!isempty_request_var('site_id')) { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' h.site_id=' . get_request_var('site_id'); } if (get_request_var('template_id') == '-1') { /* Show all items */ } elseif (get_request_var('template_id') == '0') { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dtd.data_template_id=0'; } elseif (!isempty_request_var('template_id')) { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dtd.data_template_id=' . get_request_var('template_id'); } if (get_request_var('profile') == '-1') { /* Show all items */ } else { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dtd.data_source_profile_id=' . get_request_var('profile'); } if (get_request_var('status') == '-1') { /* Show all items */ } elseif (get_request_var('status') == '0') { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dd.issue != ""'; } elseif (get_request_var('status') == '1') { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dtd.active="on"'; } else { $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dtd.active=""'; } if (get_request_var('debug') == '-1') { $dd_join = 'LEFT'; } elseif (get_request_var('debug') == 0) { $dd_join = 'LEFT'; $sql_where1 .= ($sql_where1 != '' ? ' AND':'WHERE') . ' dd.datasource IS NULL'; } else { $dd_join = 'INNER'; } $total_rows = db_fetch_cell("SELECT COUNT(*) FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id INNER JOIN data_template AS dt ON dt.id=dl.data_template_id INNER JOIN host AS h ON h.id = dl.host_id $dd_join JOIN data_debug AS dd ON dl.id = dd.datasource $sql_where1"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $checks = db_fetch_assoc("SELECT dd.*, dtd.local_data_id, dtd.name_cache, u.username FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id INNER JOIN data_template AS dt ON dt.id=dl.data_template_id INNER JOIN host AS h ON h.id = dl.host_id $dd_join JOIN data_debug AS dd ON dl.id = dd.datasource LEFT JOIN user_auth AS u ON u.id = dd.user $sql_where1 $sql_order $sql_limit"); $nav = html_nav_bar('data_debug.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Data Sources'), 'page', 'main'); form_start('data_debug.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($checks)) { foreach ($checks as $check) { $info = unserialize($check['info']); $issues = explode("\n", $check['issue']); $issue_line = ''; if (cacti_sizeof($issues)) { $issue_line = $issues[0]; } $issue_title = implode('
    ',$issues); form_alternate_row('line' . $check['local_data_id']); form_selectable_cell(filter_value(title_trim($check['name_cache'], read_config_option('max_title_length')), get_request_var('rfilter'), 'data_debug.php?action=view&id=' . $check['local_data_id']), $check['local_data_id']); if (!empty($check['datasource'])) { form_selectable_ecell($check['username'], $check['local_data_id']); form_selectable_cell(date($datefmt, $check['started']), $check['local_data_id'], '', 'right'); form_selectable_cell($check['local_data_id'], $check['local_data_id'], '', 'right'); form_selectable_cell(debug_icon(($check['done'] ? (strlen($issue_line) ? 'off' : 'on'):'')), $check['local_data_id'], '', 'center'); form_selectable_cell(debug_icon($info['rrd_writable']), $check['local_data_id'], '', 'center'); form_selectable_cell(debug_icon($info['rrd_exists']), $check['local_data_id'], '', 'center'); form_selectable_cell(debug_icon($info['active']), $check['local_data_id'], '', 'center'); form_selectable_cell(debug_icon($info['rrd_match']), $check['local_data_id'], '', 'center'); form_selectable_cell(debug_icon($info['valid_data']), $check['local_data_id'], '', 'center'); if ($check['done'] && $info['rrd_writable'] == '') { form_selectable_cell(debug_icon('blah'), $check['local_data_id'], '', 'center'); } else { form_selectable_cell(debug_icon(($info['rra_timestamp2'] != '' ? 1 : '')), $check['local_data_id'], '', 'center'); } form_selectable_cell('' . ($issue_line != '' ? __esc('Issues') : __esc('N/A')) . '', $check['local_data_id'], '', 'right'); } else { form_selectable_cell('-', $check['local_data_id']); form_selectable_cell(__('Not Debugging'), $check['local_data_id'], '', 'right'); form_selectable_cell($check['local_data_id'], $check['local_data_id'], '', 'right'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'center'); form_selectable_cell('-', $check['local_data_id'], '', 'right'); } form_checkbox_cell($check['local_data_id'], $check['local_data_id']); form_end_row(); } } else { print "" . __('No Checks') . ""; } html_end_box(false); if (cacti_sizeof($checks)) { print $nav; } form_hidden_box('save_list', '1', ''); /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($actions); form_end(); } function debug_view() { global $config, $refresh; $refresh = 60; $id = get_filter_request_var('id'); $check = db_fetch_row_prepared('SELECT * FROM data_debug WHERE datasource = ?', array($id)); $check_exists = cacti_sizeof($check); if (isset($check) && is_array($check)) { $check['info'] = unserialize($check['info']); } $dtd = db_fetch_row_prepared('SELECT * FROM data_template_data WHERE local_data_id = ?', array($id)); if (cacti_sizeof($dtd)) { $real_path = str_replace('', $config['rra_path'], $dtd['data_source_path']); } else { $real_path = __('Not Found'); } $poller_data = array(); if (!empty($check['info']['last_result'])) { foreach ($check['info']['last_result'] as $a => $l) { $poller_data[] = "$a = $l"; } } $poller_data = implode('
    ', $poller_data); $rra_updated = ''; if (isset($check['info']['rra_timestamp2'])) { $rra_updated = $check['info']['rra_timestamp2'] != '' ? __('Yes') : ''; } $rrd_exists = ''; if (isset($check['info']['rrd_exists'])) { $rrd_exists = $check['info']['rrd_exists'] == '1' ? __('Yes') : __('Not Checked Yet'); } $active = ''; if (isset($check['info']['active'])) { $active = $check['info']['active'] == 'on' ? __('Yes') : __('Not Checked Yet'); } $issue = ''; if (isset($check['issue'])) { $issue = $check['issue']; } if ($check['done'] == 1) { if ($issue != '') { $issue_icon = debug_icon(0); } else { $issue_icon = debug_icon(1); } } else { if (isset($check['info']['rrd_match_array']['ds'])) { if ($check['info']['rrd_match'] == 0) { $issue_icon = debug_icon('blah'); $issue = __('Issues found! Waiting on RRDfile update'); } else { $issue_icon = debug_icon(''); $issue = __('No Initial found! Waiting on RRDfile update'); } } else { $issue_icon = debug_icon(''); $issue = __('Waiting on analysis and RRDfile update'); } } $fields = array( array( 'name' => 'owner', 'title' => __('RRDfile Owner'), 'icon' => '-' ), array( 'name' => 'runas_website', 'title' => __('Website runs as'), 'icon' => '-' ), array( 'name' => 'runas_poller', 'title' => __('Poller runs as'), 'icon' => '-' ), array( 'name' => 'rrd_folder_writable', 'title' => __('Is RRA Folder writeable by poller?'), 'value' => dirname($real_path) ), array( 'name' => 'rrd_writable', 'title' => __('Is RRDfile writeable by poller?'), 'value' => $real_path ), array( 'name' => 'rrd_exists', 'title' => __('Does the RRDfile Exist?'), 'value' => $rrd_exists ), array( 'name' => 'active', 'title' => __('Is the Data Source set as Active?'), 'value' => $active ), array( 'name' => 'last_result', 'title' => __('Did the poller receive valid data?'), 'value' => $poller_data ), array( 'name' => 'rra_updated', 'title' => __('Was the RRDfile updated?'), 'value' => '', 'icon' => $rra_updated ), array( 'name' => 'rra_timestamp', 'title' => __('First Check TimeStamp'), 'icon' => '-' ), array( 'name' => 'rra_timestamp2', 'title' => __('Second Check TimeStamp'), 'icon' => '-' ), array( 'name' => 'convert_name', 'title' => __('Were we able to convert the title?'), 'value' => html_escape(get_data_source_title($check['datasource'])) ), array( 'name' => 'rrd_match', 'title' => __('Data Source matches the RRDfile?'), 'value' => '' ), array( 'name' => 'issue', 'title' => __('Issues'), 'value' => $issue, 'icon' => $issue_icon ), ); $debug_status = debug_process_status($id); if ($debug_status == 'waiting') { html_start_box(__('Data Source Troubleshooter [ Auto Refreshing till Complete ] %s', ''), '100%', '', '3', 'center', ''); } elseif ($debug_status == 'analysis') { html_start_box(__('Data Source Troubleshooter [ Auto Refreshing till RRDfile Update ] %s', ''), '100%', '', '3', 'center', ''); } else { html_start_box(__('Data Source Troubleshooter [ Analysis Complete! %s ]', '' . __('Rerun Analysis') . ''), '100%', '', '3', 'center', ''); } html_header( array( __('Check'), __('Value'), __('Results') ) ); $i = 1; foreach ($fields as $field) { $field_name = $field['name']; form_alternate_row('line' . $i); form_selectable_ecell($field['title'], $i); $value = __(''); $icon = ''; if (array_key_exists($field_name, $check['info'])) { $value = $check['info'][$field_name]; if ($field_name == 'last_result') { $icon = debug_icon_valid_result($value); } else { $icon = debug_icon($value); } } if (array_key_exists('value', $field)) { $value = $field['value']; } if (array_key_exists('icon', $field)) { $icon = $field['icon']; } $value_title = $value; if (strlen($value) > 100) { $value = substr($value, 0, 100); } form_selectable_cell($value, $i, '', '', $value_title); form_selectable_cell($icon, $i); form_end_row(); $i++; } html_end_box(); if ($check_exists > 0 && isset($check['info']['rrd_match_array']['ds']) && $check['info']['rrd_match'] == 0) { html_start_box(__('Data Source Repair Recommendations'), '', '', '2', 'center', ''); html_header( array( __('Data Source'), __('Issue') ) ); if (isset($check['info']['rrd_match_array']['ds'])) { $i = 0; foreach($check['info']['rrd_match_array']['ds'] AS $data_source => $details) { form_alternate_row('line2_' . $i, true); form_selectable_cell($data_source, $i); $output = ''; foreach($details as $attribute => $recommendation) { $output .= __('For attrbitute \'%s\', issue found \'%s\'', $attribute, $recommendation); } form_selectable_cell($output, 'line_2' . $i); form_end_row(); $i++; } } html_end_box(); if (isset($check['info']['rrd_match_array']['tune'])) { $path = get_data_source_path($id, true); if (is_writeable($path)) { html_start_box(__('Repair Steps [ %s ]', '' . __('Apply Suggested Fixes') . ''), '', '', '2', 'center', ''); } else { html_start_box(__('Repair Steps [ Run Fix from Command Line ]', $path), '', '', '2', 'center', ''); } html_header(array(__('Command'))); $rrdtool_path = read_config_option('path_rrdtool'); $i = 0; foreach($check['info']['rrd_match_array']['tune'] AS $options) { form_alternate_row('line3_' . $i, true); form_selectable_cell($rrdtool_path . ' tune ' . $options, 'line3_' . $i); form_end_row(); $i++; } html_end_box(); } } else { html_start_box(__('Data Source Repair Recommendations'), '', '', '2', 'center', ''); form_alternate_row('line3_0', true); form_selectable_cell(__('Waiting on Data Source Check to Complete'), 'line3_0'); form_end_row(); html_end_box(); } ?> '; } if ($result === '-') { return ''; } if (is_array($result)) { foreach($result as $variable => $value) { if (!prepare_validate_result($value)) { return ''; } } return ''; } elseif (prepare_validate_result($result)) { return ''; } else { return ''; } } function debug_icon($result) { if ($result === '' || $result === false) { return ''; } if ($result === '-') { return ''; } if ($result === 1 || $result === 'on') { return ''; } if ($result === 0 || $result === 'off') { return ''; } return ''; } function data_debug_filter() { global $item_rows, $page_refresh_interval; if (get_request_var('site_id') > 0) { $host_where = 'site_id = ' . get_request_var('site_id'); } else { $host_where = ''; } if (get_request_var('host_id') > 0) { $hostname = db_fetch_cell_prepared('SELECT CONCAT(description, " ( ", hostname, " )") FROM host WHERE id = ?', array(get_request_var('host_id'))); } else { $hostname = ''; } html_start_box(__('Data Source Troubleshooter [ %s ]', (empty($hostname) ? (get_request_var('host_id') == -1 ? __('All Devices') :__('No Device')) : html_escape($hostname))), '100%', '', '3', 'center', ''); ?>
    ' title=''> ' title=''> ' title=''>
    ' onChange='applyFilter()'>
    __('Delete'), 2 => __('Duplicate') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'field_remove_confirm': field_remove_confirm(); break; case 'field_remove': field_remove(); header('Location: data_input.php?header=false&action=edit&id=' . get_filter_request_var('data_input_id')); break; case 'field_edit': top_header(); field_edit(); bottom_footer(); break; case 'edit': top_header(); data_edit(); bottom_footer(); break; default: top_header(); data(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function duplicate_data_input($_data_input_id, $input_title) { $orig_input = db_fetch_row_prepared('SELECT * FROM data_input WHERE id = ?', array($_data_input_id)); if (cacti_sizeof($orig_input)) { unset($save); $save['id'] = 0; $save['hash'] = get_hash_data_input(0); $save['name'] = str_replace('', $orig_input['name'], $input_title); $save['input_string'] = $orig_input['input_string']; $save['type_id'] = $orig_input['type_id']; $data_input_id = sql_save($save, 'data_input'); if (!empty($data_input_id)) { $data_input_fields = db_fetch_assoc_prepared('SELECT * FROM data_input_fields WHERE data_input_id = ?', array($_data_input_id)); if (cacti_sizeof($data_input_fields)) { foreach($data_input_fields as $dif) { unset($save); $save['id'] = 0; $save['hash'] = get_hash_data_input(0, 'data_input_field'); $save['data_input_id'] = $data_input_id; $save['name'] = $dif['name']; $save['data_name'] = $dif['data_name']; $save['input_output'] = $dif['input_output']; $save['update_rra'] = $dif['update_rra']; $save['sequence'] = $dif['sequence']; $save['type_code'] = $dif['type_code']; $save['regexp_match'] = $dif['regexp_match']; $save['allow_nulls'] = $dif['allow_nulls']; $data_input_field_id = sql_save($save, 'data_input_fields'); } } } } } function form_save() { global $registered_cacti_names; if (isset_request_var('save_component_data_input')) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $save['id'] = get_nfilter_request_var('id'); $save['hash'] = get_hash_data_input(get_nfilter_request_var('id')); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['input_string'] = form_input_validate(get_nfilter_request_var('input_string'), 'input_string', '', true, 3); $save['type_id'] = form_input_validate(get_nfilter_request_var('type_id'), 'type_id', '^[0-9]+$', true, 3); if (!is_error_message()) { $data_input_id = sql_save($save, 'data_input'); if ($data_input_id) { data_input_save_message($data_input_id); /* get a list of each field so we can note their sequence of occurrence in the database */ if (!isempty_request_var('id')) { db_execute_prepared('UPDATE data_input_fields SET sequence = 0 WHERE data_input_id = ?', array(get_nfilter_request_var('id'))); generate_data_input_field_sequences(get_nfilter_request_var('input_string'), get_nfilter_request_var('id')); update_replication_crc(0, 'poller_replicate_data_input_fields_crc'); } push_out_data_input_method($data_input_id); } else { raise_message(2); } } header('Location: data_input.php?header=false&action=edit&id=' . (empty($data_input_id) ? get_nfilter_request_var('id') : $data_input_id)); } elseif (isset_request_var('save_component_field')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('data_input_id'); get_filter_request_var('sequence'); get_filter_request_var('input_output', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^(in|out)$/'))); /* ==================================================== */ $save['id'] = get_request_var('id'); $save['hash'] = get_hash_data_input(get_nfilter_request_var('id'), 'data_input_field'); $save['data_input_id'] = get_request_var('data_input_id'); $save['name'] = form_input_validate(get_nfilter_request_var('fname'), 'fname', '', false, 3); $save['data_name'] = form_input_validate(get_nfilter_request_var('data_name'), 'data_name', '', false, 3); $save['input_output'] = get_nfilter_request_var('input_output'); $save['update_rra'] = form_input_validate((isset_request_var('update_rra') ? get_nfilter_request_var('update_rra') : ''), 'update_rra', '', true, 3); $save['sequence'] = get_request_var('sequence'); $save['type_code'] = form_input_validate((isset_request_var('type_code') ? get_nfilter_request_var('type_code') : ''), 'type_code', '', true, 3); $save['regexp_match'] = form_input_validate((isset_request_var('regexp_match') ? get_nfilter_request_var('regexp_match') : ''), 'regexp_match', '', true, 3); $save['allow_nulls'] = form_input_validate((isset_request_var('allow_nulls') ? get_nfilter_request_var('allow_nulls') : ''), 'allow_nulls', '', true, 3); if (!is_error_message()) { $data_input_field_id = sql_save($save, 'data_input_fields'); if ($data_input_field_id) { data_input_save_message(get_request_var('data_input_id'), 'field'); if ((!empty($data_input_field_id)) && (get_request_var('input_output') == 'in')) { generate_data_input_field_sequences(db_fetch_cell_prepared('SELECT input_string FROM data_input WHERE id = ?', array(get_request_var('data_input_id'))), get_request_var('data_input_id')); } update_replication_crc(0, 'poller_replicate_data_input_fields_crc'); } else { raise_message(2); } } if (is_error_message()) { header('Location: data_input.php?header=false&action=field_edit&data_input_id=' . get_request_var('data_input_id') . '&id=' . (empty($data_input_field_id) ? get_request_var('id') : $data_input_field_id) . (!isempty_request_var('input_output') ? '&type=' . get_request_var('input_output') : '')); } else { header('Location: data_input.php?header=false&action=edit&id=' . get_request_var('data_input_id')); } } } function data_input_save_message($data_input_id, $type = 'input') { $counts = db_fetch_row_prepared("SELECT SUM(CASE WHEN dtd.local_data_id=0 THEN 1 ELSE 0 END) AS templates, SUM(CASE WHEN dtd.local_data_id>0 THEN 1 ELSE 0 END) AS data_sources FROM data_input AS di LEFT JOIN data_template_data AS dtd ON di.id=dtd.data_input_id WHERE di.id = ?", array($data_input_id)); if ($counts['templates'] == 0 && $counts['data_sources'] == 0) { raise_message(1); } elseif ($counts['templates'] > 0 && $counts['data_sources'] == 0) { if ($type == 'input') { raise_message('input_save_wo_ds'); } else { raise_message('input_field_save_wo_ds'); } } else { if ($type == 'input') { raise_message('input_save_w_ds'); } else { raise_message('input_field_save_w_ds'); } } } function form_actions() { global $di_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { // delete for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $di_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM data_input WHERE id = ?', array($matches[1]))) . '
  • '; $di_array[$i] = $matches[1]; $i++; } } top_header(); form_start('data_input.php'); html_start_box($di_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($di_array) && cacti_sizeof($di_array)) { if (get_request_var('drp_action') == '1') { // delete $graphs = array(); print "

    " . __n('Click \'Continue\' to delete the following Data Input Method', 'Click \'Continue\' to delete the following Data Input Method', cacti_sizeof($di_array)) . "

      $di_list
    \n"; } elseif (get_request_var('drp_action') == '2') { // duplicate print "

    " . __('Click \'Continue\' to duplicate the following Data Input Method(s). You can optionally change the title format for the new Data Input Method(s).') . "

      $di_list

    " . __('Input Name:'). "
    "; form_text_box('input_title', ' (1)', '', '255', '30', 'text'); print "

    \n"; } $save_html = " "; } else { raise_message(40); header('Location: data_input.php?header=none'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* -------------------------- CDEF Item Functions -------------------------- */ function field_remove_confirm() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('data_input_id'); /* ==================================================== */ form_start('data_intput.php?action=edit&id' . get_request_var('data_input_id')); html_start_box('', '100%', '', '3', 'center', ''); $field = db_fetch_row_prepared('SELECT * FROM data_input_fields WHERE id = ?', array(get_request_var('id'))); ?>



    ' name='cancel'> ' name='continue' title=''> /', db_fetch_cell_prepared('SELECT input_string FROM data_input WHERE id = ?', array($field['data_input_id'])), $matches))) { $j = 0; for ($i=0; ($i < cacti_count($matches[1])); $i++) { if (in_array($matches[1][$i], $registered_cacti_names) == false) { $j++; db_execute_prepared("UPDATE data_input_fields SET sequence = ? WHERE data_input_id = ? AND input_output = 'in' AND data_name = ?", array($j, $field['data_input_id'], $matches[1][$i])); } } } update_replication_crc(0, 'poller_replicate_data_input_fields_crc'); } function field_edit() { global $registered_cacti_names, $fields_data_input_field_edit_1, $fields_data_input_field_edit_2, $fields_data_input_field_edit; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('data_input_id'); get_filter_request_var('type', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^(in|out)$/'))); /* ==================================================== */ $array_field_names = array(); if (!isempty_request_var('id')) { $field = db_fetch_row_prepared('SELECT * FROM data_input_fields WHERE id = ?', array(get_request_var('id'))); } if (!isempty_request_var('type')) { $current_field_type = get_request_var('type'); } else { $current_field_type = $field['input_output']; } $data_input = db_fetch_row_prepared('SELECT type_id, name FROM data_input WHERE id = ?', array(get_request_var('data_input_id'))); /* obtain a list of available fields for this given field type (input/output) */ if (($current_field_type == 'in') && (preg_match_all('/<([_a-zA-Z0-9]+)>/', db_fetch_cell_prepared('SELECT input_string FROM data_input WHERE id = ?', array(!isempty_request_var('data_input_id') ? get_request_var('data_input_id') : $field['data_input_id'])), $matches))) { for ($i=0; ($i < cacti_count($matches[1])); $i++) { if (in_array($matches[1][$i], $registered_cacti_names) == false) { $current_field_name = $matches[1][$i]; $array_field_names[$current_field_name] = $current_field_name; if (!isset($field)) { $field_id = db_fetch_cell_prepared('SELECT id FROM data_input_fields WHERE data_name = ? AND data_input_id = ?', array($current_field_name, get_filter_request_var('data_input_id'))); if (!$field_id > 0) { $field = array(); $field['name'] = ucwords($current_field_name); $field['data_name'] = $current_field_name; } } } } } /* if there are no input fields to choose from, complain */ if ((!isset($array_field_names)) && (isset_request_var('type') ? get_request_var('type') == 'in' : false) && ($data_input['type_id'] == '1')) { display_custom_error_message(__('This script appears to have no input values, therefore there is nothing to add.')); header('Location: data_input.php?header=false&action=edit&id=' . get_filter_request_var('data_input_id')); exit; } if ($current_field_type == 'out') { $header_name = __esc('Output Fields [edit: %s]', $data_input['name']); $dfield = __('Output Field'); } elseif ($current_field_type == 'in') { $header_name = __esc('Input Fields [edit: %s]', $data_input['name']); $dfield = __('Input Field'); } if (isset($field)) { $dfield .= ' ' . html_escape($field['data_name']); } form_start('data_input.php', 'data_input'); html_start_box($header_name, '100%', true, '3', 'center', ''); $form_array = array(); /* field name */ if ((($data_input['type_id'] == '1') || ($data_input['type_id'] == '5')) && ($current_field_type == 'in')) { /* script */ $form_array = inject_form_variables($fields_data_input_field_edit_1, $dfield, $array_field_names, (isset($field) ? $field : array())); } elseif ($current_field_type == 'out' || ($data_input['type_id'] != 1 && $data_input['type_id'] != 5)) { $form_array = inject_form_variables($fields_data_input_field_edit_2, $dfield, (isset($field) ? $field : array())); } /* ONLY if the field is an input */ if ($current_field_type == 'in') { unset($fields_data_input_field_edit['update_rra']); } elseif ($current_field_type == 'out') { unset($fields_data_input_field_edit['regexp_match']); unset($fields_data_input_field_edit['allow_nulls']); unset($fields_data_input_field_edit['type_code']); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array + inject_form_variables($fields_data_input_field_edit, (isset($field) ? $field : array()), $current_field_type, $_REQUEST) ) ); html_end_box(true, true); form_save_button('data_input.php?action=edit&id=' . get_request_var('data_input_id')); } /* ----------------------- Data Input Functions ----------------------- */ function data_remove($id) { $data_input_fields = db_fetch_assoc_prepared('SELECT id FROM data_input_fields WHERE data_input_id = ?', array($id)); if (is_array($data_input_fields)) { foreach ($data_input_fields as $data_input_field) { db_execute_prepared('DELETE FROM data_input_data WHERE data_input_field_id = ?', array($data_input_field['id'])); } } db_execute_prepared('DELETE FROM data_input WHERE id = ?', array($id)); db_execute_prepared('DELETE FROM data_input_fields WHERE data_input_id = ?', array($id)); update_replication_crc(0, 'poller_replicate_data_input_fields_crc'); update_replication_crc(0, 'poller_replicate_data_input_crc'); } function data_input_more_inputs($id, $input_string) { $input_string = str_replace('', '', $input_string); $inputs = substr_count($input_string, '<'); $existing = db_fetch_cell_prepared('SELECT COUNT(*) FROM data_input_fields WHERE data_input_id = ? AND input_output = "in"', array($id)); if ($inputs > $existing) { return true; } else { return false; } } function data_edit() { global $config, $fields_data_input_edit; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (!isempty_request_var('id')) { $data_id = get_nonsystem_data_input(get_request_var('id')); if ($data_id == 0 || $data_id == NULL) { header('Location: data_input.php'); return; } $data_input = db_fetch_row_prepared('SELECT * FROM data_input WHERE id = ?', array(get_request_var('id'))); $header_label = __esc('Data Input Method [edit: %s]', $data_input['name']); } else { $data_input = array(); $header_label = __('Data Input Method [new]'); } if (!isset($config['input_whitelist'])) { unset($fields_data_input_edit['whitelist_verification']); } form_start('data_input.php', 'data_input'); html_start_box($header_label, '100%', true, '3', 'center', ''); if (cacti_sizeof($data_input)) { switch ($data_input['type_id']) { case DATA_INPUT_TYPE_SNMP: $fields_data_input_edit['type_id']['array'][DATA_INPUT_TYPE_SNMP] = __('SNMP Get'); break; case DATA_INPUT_TYPE_SNMP_QUERY: $fields_data_input_edit['type_id']['array'][DATA_INPUT_TYPE_SNMP_QUERY] = __('SNMP Query'); break; case DATA_INPUT_TYPE_SCRIPT_QUERY: $fields_data_input_edit['type_id']['array'][DATA_INPUT_TYPE_SCRIPT_QUERY] = __('Script Query'); break; case DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER: $fields_data_input_edit['type_id']['array'][DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER] = __('Script Server Query'); break; } if (isset($config['input_whitelist']) && isset($data_input['hash'])) { $aud = verify_data_input_whitelist($data_input['hash'], $data_input['input_string']); if ($aud === true) { $fields_data_input_edit['whitelist_verification']['value'] = __('White List Verification Succeeded.'); } elseif ($aud == false) { $fields_data_input_edit['whitelist_verification']['value'] = __('White List Verification Failed. Run CLI script input_whitelist.php to correct.'); } elseif ($aud == '-1') { $fields_data_input_edit['whitelist_verification']['value'] = __('Input String does not exist in White List. Run CLI script input_whitelist.php to correct.'); } } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_data_input_edit, $data_input) ) ); html_end_box(true, true); if (!isempty_request_var('id')) { if (data_input_more_inputs(get_request_var('id'), $data_input['input_string'])) { $url = 'data_input.php?action=field_edit&type=in&data_input_id=' . get_request_var('id'); } else { $url = ''; } html_start_box(__('Input Fields'), '100%', '', '3', 'center', $url); print ""; DrawMatrixHeaderItem(__('Name'), '', 1); DrawMatrixHeaderItem(__('Friendly Name'), '', 1); DrawMatrixHeaderItem(__('Field Order'), '', 2); print ''; $fields = db_fetch_assoc_prepared("SELECT id, data_name, name, sequence FROM data_input_fields WHERE data_input_id = ? AND input_output = 'in' ORDER BY sequence, data_name", array(get_request_var('id'))); $counts = db_fetch_row_prepared("SELECT SUM(CASE WHEN dtd.local_data_id=0 THEN 1 ELSE 0 END) AS templates, SUM(CASE WHEN dtd.local_data_id>0 THEN 1 ELSE 0 END) AS data_sources FROM data_input AS di LEFT JOIN data_template_data AS dtd ON di.id=dtd.data_input_id WHERE di.id = ?", array(get_request_var('id'))); $output_disabled = false; $save_alt_message = false; if (!cacti_sizeof($counts)) { $output_disabled = false; $save_alt_message = false; } elseif ($counts['data_sources'] > 0) { $output_disabled = true; $save_alt_message = true; } elseif ($counts['templates'] > 0) { $output_disabled = false; $save_alt_message = true; } $i = 0; if (cacti_sizeof($fields)) { foreach ($fields as $field) { form_alternate_row('', true); ?> ' title=''> ' . __('No Input Fields') . ''; } html_end_box(); html_start_box(__('Output Fields'), '100%', '', '3', 'center', 'data_input.php?action=field_edit&type=out&data_input_id=' . get_request_var('id')); print ""; DrawMatrixHeaderItem(__('Name'),'',1); DrawMatrixHeaderItem(__('Friendly Name'),'',1); DrawMatrixHeaderItem(__('Update RRA'),'',2); print ''; $fields = db_fetch_assoc_prepared("SELECT id, name, data_name, update_rra, sequence FROM data_input_fields WHERE data_input_id = ? AND input_output = 'out' ORDER BY sequence, data_name", array(get_request_var('id'))); $i = 0; if (cacti_sizeof($fields)) { foreach ($fields as $field) { form_alternate_row('', true); ?> '> '> ' title=''> ' . __('No Output Fields') . ''; } html_end_box(); } form_save_button('data_input.php', 'return'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_data_input'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Data Input Methods'), '100%', '', '3', 'center', 'data_input.php?action=edit'); ?>

    '> ' title=''> ' title=''>
    0 THEN 1 ELSE 0 END) AS data_sources FROM data_input AS di LEFT JOIN data_template_data AS dtd ON di.id=dtd.data_input_id $sql_where GROUP BY di.id $sql_order $sql_limit"); $nav = html_nav_bar('data_input.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 6, __('Input Methods'), 'page', 'main'); form_start('data_input.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'name' => array('display' => __('Data Input Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Data Input Method.')), 'id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Data Input Method. Useful when performing automation or debugging.') ), 'nosort' => array( 'display' => __('Deletable'), 'align' => 'right', 'tip' => __('Data Inputs that are in use cannot be Deleted. In use is defined as being referenced either by a Data Source or a Data Template.') ), 'data_sources' => array( 'display' => __('Data Sources Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Data Sources that use this Data Input Method.') ), 'templates' => array( 'display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Data Templates that use this Data Input Method.') ), 'type_id' => array( 'display' => __('Data Input Method'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The method used to gather information for this Data Input Method.') ) ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($data_inputs)) { foreach ($data_inputs as $data_input) { /* hide system types */ if ($data_input['templates'] > 0 || $data_input['data_sources'] > 0) { $disabled = true; } else { $disabled = false; } form_alternate_row('line' . $data_input['id'], true, $disabled); form_selectable_cell(filter_value($data_input['name'], get_request_var('filter'), 'data_input.php?action=edit&id=' . $data_input['id']), $data_input['id']); form_selectable_cell($data_input['id'], $data_input['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $data_input['id'], '', 'right'); form_selectable_cell(number_format_i18n($data_input['data_sources'], '-1'), $data_input['id'],'', 'right'); form_selectable_cell(number_format_i18n($data_input['templates'], '-1'), $data_input['id'],'', 'right'); form_selectable_cell($input_types[$data_input['type_id']], $data_input['id'], '', 'right'); form_checkbox_cell($data_input['name'], $data_input['id'], $disabled); form_end_row(); } } else { print '' . __('No Data Input Methods Found') . ''; } html_end_box(false); if (cacti_sizeof($data_inputs)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($di_actions); form_end(); } cacti-release-1.2.19/data_queries.php000066400000000000000000001411731413633772300175040ustar00rootroot00000000000000 __('Delete') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'item_moveup_dssv': data_query_item_moveup_dssv(); header('Location: data_queries.php?header=false&action=item_edit&id=' . get_filter_request_var('snmp_query_graph_id') . '&snmp_query_id=' . get_filter_request_var('snmp_query_id')); break; case 'item_movedown_dssv': data_query_item_movedown_dssv(); header('Location: data_queries.php?header=false&action=item_edit&id=' . get_filter_request_var('snmp_query_graph_id') . '&snmp_query_id=' . get_filter_request_var('snmp_query_id')); break; case 'item_remove_dssv': data_query_item_remove_dssv(); header('Location: data_queries.php?header=false&action=item_edit&id=' . get_filter_request_var('snmp_query_graph_id') . '&snmp_query_id=' . get_filter_request_var('snmp_query_id')); break; case 'item_moveup_gsv': data_query_item_moveup_gsv(); header('Location: data_queries.php?header=false&action=item_edit&id=' . get_filter_request_var('snmp_query_graph_id') . '&snmp_query_id=' . get_filter_request_var('snmp_query_id')); break; case 'item_movedown_gsv': data_query_item_movedown_gsv(); header('Location: data_queries.php?header=false&action=item_edit&id=' . get_filter_request_var('snmp_query_graph_id') . '&snmp_query_id=' . get_filter_request_var('snmp_query_id')); break; case 'item_remove_gsv': data_query_item_remove_gsv(); header('Location: data_queries.php?header=false&action=item_edit&id=' . get_filter_request_var('snmp_query_graph_id') . '&snmp_query_id=' . get_filter_request_var('snmp_query_id')); break; case 'item_remove_confirm': data_query_item_remove_confirm(); break; case 'item_remove': data_query_item_remove(); header('Location: data_queries.php?header=false&action=edit&id=' . get_filter_request_var('snmp_query_id')); break; case 'item_edit': top_header(); data_query_item_edit(); bottom_footer(); break; case 'remove': data_query_remove(); header ('Location: data_queries.php'); break; case 'edit': top_header(); data_query_edit(); bottom_footer(); break; default: top_header(); data_query(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_snmp_query')) { get_filter_request_var('id'); get_filter_request_var('data_input_id'); $save['id'] = get_request_var('id'); $save['hash'] = get_hash_data_query(get_nfilter_request_var('id')); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['description'] = form_input_validate(get_nfilter_request_var('description'), 'description', '', true, 3); $save['xml_path'] = form_input_validate(get_nfilter_request_var('xml_path'), 'xml_path', '', false, 3); $save['data_input_id'] = get_request_var('data_input_id'); // Detect changing input id if (!empty($save['id'])) { $previous_input_id = db_fetch_cell_prepared('SELECT data_input_id FROM snmp_query WHERE id = ?', array($save['id'])); } if (!is_error_message()) { $snmp_query_id = sql_save($save, 'snmp_query'); if ($snmp_query_id) { raise_message(1); if (isset($previous_input_id) && $previous_input_id > 0) { data_query_update_input_method($snmp_query_id, $previous_input_id, $save['data_input_id']); } update_replication_crc(0, 'poller_replicate_snmp_query_crc'); } else { raise_message(2); } } header('Location: data_queries.php?header=false&action=edit&id=' . (empty($snmp_query_id) ? get_request_var('id') : $snmp_query_id)); } elseif (isset_request_var('save_component_snmp_query_item')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('snmp_query_id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ $save['id'] = get_request_var('id'); $save['hash'] = get_hash_data_query(get_nfilter_request_var('id'), 'data_query_graph'); $save['snmp_query_id'] = get_request_var('snmp_query_id'); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['graph_template_id'] = get_request_var('graph_template_id'); $header = ''; $errors = false; if (!is_error_message()) { if ($save['id'] > 0) { $errors = api_data_query_errors($save['id'], $_POST); } if ($errors === false) { $snmp_query_graph_id = sql_save($save, 'snmp_query_graph'); if ($snmp_query_graph_id) { raise_message(1); /* if the user changed the graph template, go through and delete everything that was associated with the old graph template */ if (get_nfilter_request_var('graph_template_id') != get_nfilter_request_var('graph_template_id_prev')) { db_execute_prepared('DELETE FROM snmp_query_graph_rrd_sv WHERE snmp_query_graph_id = ?', array($snmp_query_graph_id)); db_execute_prepared('DELETE FROM snmp_query_graph_sv WHERE snmp_query_graph_id = ?', array($snmp_query_graph_id)); } db_execute_prepared('DELETE FROM snmp_query_graph_rrd WHERE snmp_query_graph_id = ?', array($snmp_query_graph_id)); foreach ($_POST as $var => $val) { if (preg_match('/^dsdt_([0-9]+)_([0-9]+)_check/i', $var)) { $data_template_id = preg_replace('/^dsdt_([0-9]+)_([0-9]+).+/', "\\1", $var); $data_template_rrd_id = preg_replace('/^dsdt_([0-9]+)_([0-9]+).+/', "\\2", $var); /* ================= input validation ================= */ input_validate_input_number($data_template_id); input_validate_input_number($data_template_rrd_id); /* ==================================================== */ db_execute_prepared('REPLACE INTO snmp_query_graph_rrd (snmp_query_graph_id, data_template_id, data_template_rrd_id, snmp_field_name) VALUES (?, ?, ?, ?)', array( $snmp_query_graph_id, $data_template_id, $data_template_rrd_id, get_nfilter_request_var('dsdt_' . $data_template_id . '_' . $data_template_rrd_id . '_snmp_field_output') ) ); } } if (isset_request_var('header') && get_nfilter_request_var('header') == 'false') { $header = '&header=false'; } else { $header = '&header=fasle'; } } else { raise_message(2); $header = '&header=false'; } } else { $header = '&header=false'; } } header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . (empty($snmp_query_graph_id) ? get_request_var('id') : $snmp_query_graph_id) . '&snmp_query_id=' . get_request_var('snmp_query_id')); } elseif (isset_request_var('save_component_svg')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('snmp_query_id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ if (isset_request_var('header') && get_nfilter_request_var('header') == 'false') { $header = '&header=false'; } else { $header = ''; } if (isempty_request_var('svg_text')) { raise_message(39); header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . get_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); return; } elseif (isempty_request_var('svg_field')) { raise_message(38); header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . get_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); return; } /* suggested values -- graph templates */ $sequence = get_sequence(0, 'sequence', 'snmp_query_graph_sv', 'snmp_query_graph_id = ' . get_filter_request_var('id') . ' AND field_name = ' . db_qstr(get_nfilter_request_var('svg_field'))); $hash = get_hash_data_query(0, 'data_query_sv_graph'); $header = ''; db_execute_prepared('INSERT INTO snmp_query_graph_sv (hash, snmp_query_graph_id, sequence, field_name, text) VALUES (?, ?, ?, ?, ?)', array( $hash, get_request_var('id'), $sequence, get_nfilter_request_var('svg_field'), get_nfilter_request_var('svg_text') ) ); clear_messages(); if (isset_request_var('header') && get_nfilter_request_var('header') == 'false') { $header = '&header=false'; } else { $header = ''; } header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . get_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); } elseif (isset_request_var('save_component_svds')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('svds_id'); get_filter_request_var('snmp_query_id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ if (isset_request_var('header') && get_nfilter_request_var('header') == 'false') { $header = '&header=false'; } else { $header = ''; } if (isset_request_var('svds_id')) { $svds_id = get_request_var('svds_id'); if (isempty_request_var('svds_text')) { raise_message(39); header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . get_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); return; } elseif (isempty_request_var('svds_field')) { raise_message(38); header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . get_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); return; } $sequence = get_sequence(0, 'sequence', 'snmp_query_graph_rrd_sv', 'snmp_query_graph_id = ' . get_request_var('id') . ' AND data_template_id = ' . $svds_id . " AND field_name = " . db_qstr(get_nfilter_request_var('svds_field'))); $hash = get_hash_data_query(0, 'data_query_sv_data_source'); db_execute_prepared('INSERT INTO snmp_query_graph_rrd_sv (hash, snmp_query_graph_id, data_template_id, sequence, field_name, text) VALUES (?, ?, ?, ?, ?, ?)', array( $hash, get_request_var('id'), $svds_id, $sequence, get_nfilter_request_var('svds_field'), get_nfilter_request_var('svds_text') ) ); clear_messages(); if (isset_request_var('header') && get_nfilter_request_var('header') == 'false') { $header = '&header=false'; } else { $header = ''; } header('Location: data_queries.php?header=false&action=item_edit' . $header . '&id=' . get_request_var('id') . '&snmp_query_id=' . get_request_var('snmp_query_id')); } } } function form_actions() { global $dq_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $name = db_fetch_cell_prepared('SELECT name FROM snmp_query WHERE id = ?', array($matches[1])); $dq_list .= '
  • ' . html_escape($name) . '
  • '; $dq_array[$i] = $matches[1]; $i++; } } top_header(); form_start('data_queries.php'); html_start_box($dq_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($dq_array) && cacti_sizeof($dq_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ $graphs = array(); print "

    " . __n('Click \'Continue\' to delete the following Data Query.', 'Click \'Continue\' to delete following Data Queries.', cacti_sizeof($dq_array)) . "

      $dq_list
    \n"; } $save_html = " "; } else { raise_message(40); header('Location: data_queries.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* ---------------------------- Data Query Graph Functions ---------------------------- */ function data_query_item_movedown_gsv() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('snmp_query_graph_id'); /* ==================================================== */ move_item_down('snmp_query_graph_sv', get_request_var('id'), 'snmp_query_graph_id=' . get_request_var('snmp_query_graph_id') . " AND field_name = " . db_qstr(get_nfilter_request_var('field_name'))); } function data_query_item_moveup_gsv() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('snmp_query_graph_id'); /* ==================================================== */ move_item_up('snmp_query_graph_sv', get_request_var('id'), 'snmp_query_graph_id=' . get_request_var('snmp_query_graph_id') . " AND field_name = " . db_qstr(get_nfilter_request_var('field_name'))); } function data_query_item_remove_gsv() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ db_execute_prepared('DELETE FROM snmp_query_graph_sv WHERE id = ?', array(get_request_var('id'))); } function data_query_item_movedown_dssv() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('data_template_id'); get_filter_request_var('snmp_query_graph_id'); /* ==================================================== */ move_item_down('snmp_query_graph_rrd_sv', get_request_var('id'), 'data_template_id=' . get_request_var('data_template_id') . ' AND snmp_query_graph_id=' . get_request_var('snmp_query_graph_id') . " AND field_name = " . db_qstr(get_nfilter_request_var('field_name'))); } function data_query_item_moveup_dssv() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('data_template_id'); get_filter_request_var('snmp_query_graph_id'); /* ==================================================== */ move_item_up('snmp_query_graph_rrd_sv', get_request_var('id'), 'data_template_id=' . get_request_var('data_template_id') . ' AND snmp_query_graph_id=' . get_request_var('snmp_query_graph_id') . " AND field_name = " . db_qstr(get_nfilter_request_var('field_name'))); } function data_query_sv_check_sequences($type, $snmp_query_graph_id, $field_name) { if ($type == 'ds' || $type == 'gr') { if ($type == 'ds') { $table = 'snmp_query_graph_rrd_sv'; } else { $table = 'snmp_query_graph_sv'; } } else { return false; } $bad_seq = db_fetch_cell_prepared("SELECT COUNT(sequence) FROM $table WHERE sequence <= 0 AND field_name = ? AND snmp_query_graph_id = ?", array($field_name, $snmp_query_graph_id)); $dup_seq = db_fetch_cell_prepared("SELECT SUM(count) FROM ( SELECT sequence, COUNT(sequence) AS count FROM $table WHERE field_name = ? AND snmp_query_graph_id = ? GROUP BY sequence ) AS t WHERE t.count > 1", array($field_name, $snmp_query_graph_id)); // report any bad or duplicate sequencs to the log for reporting purposes if ($bad_seq > 0) { cacti_log('WARN: Found ' . $bad_seq . " Bad Sequences in $table Table", false, 'WEBUI', POLLER_VERBOSITY_HIGH); } if ($dup_seq > 0) { cacti_log('WARN: Found ' . $dup_seq . " Duplicated Sequences in $table Table", false, 'WEBUI', POLLER_VERBOSITY_HIGH); } if ($bad_seq > 0 || $dup_seq > 0) { // resequence the list so it has no gaps, and 0 values will appear at the top // since thats where they would have been displayed db_execute_prepared("SET @seq = 0; UPDATE $table SET sequence = (@seq:=@seq+1) WHERE field_name = ? AND snmp_query_graph_id = ? ORDER BY sequence, id;", array($field_name, $snmp_query_graph_id)); } } function data_query_item_remove_dssv() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ db_execute_prepared('DELETE FROM snmp_query_graph_rrd_sv WHERE id = ?', array(get_request_var('id'))); } function data_query_item_remove_confirm() { global $vdef_functions, $vdef_item_types, $custom_vdef_data_source_types; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('snmp_query_id'); /* ==================================================== */ form_start('data_queries.php?action=edit&id' . get_request_var('snmp_query_id')); html_start_box('', '100%', '', '3', 'center', ''); $graph_template = db_fetch_row_prepared('SELECT * FROM snmp_query_graph WHERE id = ?', array(get_request_var('id'))); ?>


    ' onClick='$("#cdialog").dialog("close");' name='cancel'> ' name='continue' title=''> '> array('no_form_tag' => true), 'fields' => inject_form_variables($fields_data_query_item_edit, (isset($snmp_query_item) ? $snmp_query_item : array()), $_REQUEST) ) ); html_end_box(true, true); ?> " . __esc('Data Template - %s', $data_template['name']) . ' '; $data_template_rrds = db_fetch_assoc_prepared('SELECT dtr.id, dtr.data_source_name, sqgr.snmp_field_name, sqgr.snmp_query_graph_id FROM data_template_rrd AS dtr LEFT JOIN snmp_query_graph_rrd AS sqgr ON sqgr.data_template_rrd_id = dtr.id AND sqgr.snmp_query_graph_id = ? AND sqgr.data_template_id = ? WHERE dtr.data_template_id = ? AND dtr.local_data_id = 0 ORDER BY dtr.data_source_name', array(get_request_var('id'), $data_template['id'], $data_template['id'])); $i = 0; if (cacti_sizeof($data_template_rrds)) { foreach ($data_template_rrds as $data_template_rrd) { if (empty($data_template_rrd['snmp_query_graph_id'])) { $old_value = ''; } else { $old_value = 'on'; } form_alternate_row(); ?>
    $field_array) { if ($field_array['direction'] == 'output' || $field_array['direction'] == 'input-output') { $xml_outputs[$field_name] = $field_name . ' (' . $field_array['name'] . ')'; } } } form_dropdown('dsdt_' . $data_template['id'] . '_' . $data_template_rrd['id'] . '_snmp_field_output',$xml_outputs,'','',empty($data_template_rrd['snmp_field_name'])?$data_template_rrd['data_source_name']:$data_template_rrd['snmp_field_name'],'','');?> ';?>
    __('Name'), 'align' => 'left'), array('display' => __('Order'), 'align' => 'center'), array('display' => __('Equation'), 'align' => 'left') ), 2); $i = 0; $total_values = cacti_sizeof($suggested_values); if ($total_values) { foreach ($suggested_values as $suggested_value) { data_query_sv_check_sequences('gr', $suggested_value['snmp_query_graph_id'], $suggested_value['field_name']); form_alternate_row(); $show_up = false; $show_down = false; // Handle up true if ($i != 0) { $show_up = true; } // Handle down true if ($total_values > 1 && $i < $total_values-1) { $show_down = true; } ?> ' href=''> ' href=''> ' href=''> " . __('No Suggested Values Found') . ""; } form_alternate_row(); ?>
    ' title=''>
    " . html_escape($name) . ''; html_header(array( array('display' => __('Name'), 'align' => 'left'), array('display' => __('Order'), 'align' => 'center'), array('display' => __('Equation'), 'align' => 'left') ), 2); $i = 0; $total_values = cacti_sizeof($suggested_values); if ($total_values) { $prev_name = ''; foreach ($suggested_values as $suggested_value) { data_query_sv_check_sequences('ds', $suggested_value['snmp_query_graph_id'], $suggested_value['field_name']); form_alternate_row(); $show_up = false; $show_down = false; // Handle up true if ($i != 0) { $show_up = true; } // Handle down true if ($total_values > 1 && $i < $total_values-1) { $show_down = true; } ?> ' href=''> ' href=''> ' href=''> " . __('No Suggested Values Found') . ""; } form_alternate_row(); ?>
    _field' size='15'> _text' size='60'> _x' value='' title=''>
    array('no_form_tag' => true), 'fields' => inject_form_variables($fields_data_query_edit, (isset($snmp_query) ? $snmp_query : array())) ) ); html_end_box(false, true); if (!empty($snmp_query['id'])) { $search = array('', '', ''); $replace = array($config['base_path'], read_config_option('path_snmpget'), read_config_option('path_php_binary')); $xml_filename = str_replace($search, $replace, $snmp_query['xml_path']); if ((file_exists($xml_filename)) && (is_file($xml_filename))) { $text = "" . __('Successfully located XML file') . ""; $xml_file_exists = true; } else { $text = "" . __('Could not locate XML file.') . ""; $xml_file_exists = false; } html_start_box('', '100%', '', '3', 'center', ''); print "$text"; html_end_box(false); html_start_box( __('Associated Graph Templates'), '100%', '', '3', 'center', 'data_queries.php?action=item_edit&snmp_query_id=' . $snmp_query['id']); print " " . __('Name') . " " . __('Graph Template Name') . " " . __('Graphs Using') . " " . __('Mapping ID') . " " . __('Action') . " "; $snmp_query_graphs = db_fetch_assoc_prepared('SELECT sqg.id, gt.name AS graph_template_name, sqg.name, COUNT(gl.id) AS graphs FROM snmp_query_graph AS sqg LEFT JOIN graph_templates AS gt ON sqg.graph_template_id = gt.id LEFT JOIN graph_local AS gl ON gl.snmp_query_graph_id = sqg.id AND gl.graph_template_id = sqg.graph_template_id WHERE sqg.snmp_query_id = ? GROUP BY sqg.id ORDER BY sqg.name', array($snmp_query['id'])); if (cacti_sizeof($snmp_query_graphs)) { foreach ($snmp_query_graphs as $snmp_query_graph) { form_alternate_row(); ?> '> ' href=''> ' href='#'> " . __('No Graph Templates Defined.') . ""; } html_end_box(); } form_save_button('data_queries.php', 'return'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_dq'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box( __('Data Queries'), '100%', '', '3', 'center', 'data_queries.php?action=edit'); ?>

    '> ' title=''> ' title=''>
    array( 'display' => __('Data Query Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Data Query.') ), 'id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal ID for this Graph Template. Useful when performing automation or debugging.') ), 'nosort' => array( 'display' => __('Deletable'), 'align' => 'right', 'tip' => __('Data Queries that are in use cannot be Deleted. In use is defined as being referenced by either a Graph or a Graph Template.') ), 'graphs' => array( 'display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs using this Data Query.') ), 'templates' => array( 'display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs Templates using this Data Query.') ), 'data_input_method' => array( 'display' => __('Data Input Method'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The Data Input Method used to collect data for Data Sources associated with this Data Query.') ) ); $nav = html_nav_bar('data_queries.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Data Queries'), 'page', 'main'); form_start('data_queries.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($snmp_queries)) { foreach ($snmp_queries as $snmp_query) { if ($snmp_query['graphs'] == 0 && $snmp_query['templates'] == 0) { $disabled = false; } else { $disabled = true; } form_alternate_row('line' . $snmp_query['id'], true, $disabled); form_selectable_cell(filter_value($snmp_query['name'], get_request_var('filter'), 'data_queries.php?action=edit&id=' . $snmp_query['id']), $snmp_query['id']); form_selectable_cell($snmp_query['id'], $snmp_query['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $snmp_query['id'], '', 'right'); form_selectable_cell(number_format_i18n($snmp_query['graphs'], '-1'), $snmp_query['id'], '', 'right'); form_selectable_cell(number_format_i18n($snmp_query['templates'], '-1'), $snmp_query['id'], '', 'right'); form_selectable_cell(filter_value($snmp_query['data_input_method'], get_request_var('filter')), $snmp_query['id'], '', 'right'); form_checkbox_cell($snmp_query['name'], $snmp_query['id'], $disabled); form_end_row(); } } else { print "" . __('No Data Queries Found') . ""; } html_end_box(false); if (cacti_sizeof($snmp_queries)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($dq_actions); form_end(); } cacti-release-1.2.19/data_source_profiles.php000066400000000000000000001066141413633772300212330ustar00rootroot00000000000000 __('Delete'), 2 => __('Duplicate') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'item_remove_confirm': profile_item_remove_confirm(); break; case 'item_remove': profile_item_remove(); break; case 'ajax_span': get_filter_request_var('profile_id'); get_filter_request_var('span'); if (is_numeric(get_nfilter_request_var('rows'))) { get_filter_request_var('rows'); $sampling_interval = db_fetch_cell_prepared('SELECT step FROM data_source_profiles WHERE id = ?', array(get_request_var('profile_id'))); if (get_request_var('span') == 1) { print get_span(get_request_var('rows') * $sampling_interval); } else { print get_span(get_request_var('rows') * get_request_var('span')); } } else { print __('N/A'); } break; case 'ajax_size': get_filter_request_var('id'); get_filter_request_var('cfs'); print get_size(get_request_var('id'), get_nfilter_request_var('type'), get_request_var('cfs')); break; case 'item_edit': top_header(); item_edit(); bottom_footer(); break; case 'edit': top_header(); profile_edit(); bottom_footer(); break; default: top_header(); profile(); bottom_footer(); break; } /* -------------------------- Global Form Functions -------------------------- */ /* -------------------------- The Save Function -------------------------- */ function form_save() { // make sure ids are numeric if (isset_request_var('id') && ! is_numeric(get_filter_request_var('id'))) { set_request_var('id', 0); } if (isset_request_var('profile_id') && ! is_numeric(get_filter_request_var('profile_id'))) { set_request_var('profile_id', 0); } if (isset_request_var('save_component_profile')) { $save['id'] = form_input_validate(get_request_var('id'), 'id', '^[0-9]+$', false, 3); $save['hash'] = get_hash_data_source_profile(get_request_var('id')); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); if (isset_request_var('step')) { $save['step'] = form_input_validate(get_nfilter_request_var('step'), 'step', '', false, 3); $save['heartbeat'] = form_input_validate(get_nfilter_request_var('heartbeat'), 'heartbeat', '', false, 3); $save['x_files_factor'] = form_input_validate(get_nfilter_request_var('x_files_factor'), 'x_files_factor', '', false, 3); } if (isset_request_var('default')) { $save['default'] = (isset_request_var('default') ? 'on':''); db_execute('UPDATE data_source_profiles SET `default`=""'); } if (!is_error_message()) { $profile_id = sql_save($save, 'data_source_profiles'); if ($profile_id) { if (isset_request_var('step')) { // Validate consolidation functions $cfs = get_nfilter_request_var('consolidation_function_id'); if (cacti_sizeof($cfs) && !empty($cfs)) { foreach($cfs as $cf) { input_validate_input_number($cf); } db_execute_prepared('DELETE FROM data_source_profiles_cf WHERE data_source_profile_id = ? AND consolidation_function_id NOT IN (' . implode(',', $cfs) . ')', array($profile_id)); } // Validate consolidation functions $cfs = get_nfilter_request_var('consolidation_function_id'); if (cacti_sizeof($cfs) && !empty($cfs)) { foreach($cfs as $cf) { db_execute_prepared('REPLACE INTO data_source_profiles_cf (data_source_profile_id, consolidation_function_id) VALUES (?, ?)', array($profile_id, $cf)); } } } raise_message(1); } else { raise_message(2); } } header('Location: data_source_profiles.php?header=false&action=edit&id=' . (empty($profile_id) ? get_request_var('id') : $profile_id)); } elseif (isset_request_var('save_component_rra')) { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('profile_id'); /* ==================================================== */ $sampling_interval = db_fetch_cell_prepared('SELECT step FROM data_source_profiles WHERE id = ?', array(get_request_var('profile_id'))); $save['id'] = form_input_validate(get_request_var('id'), 'id', '^[0-9]+$', false, 3); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', true, 3); $save['data_source_profile_id'] = form_input_validate(get_request_var('profile_id'), 'profile_id', '^[0-9]+$', false, 3); $save['timespan'] = form_input_validate(get_nfilter_request_var('timespan'), 'timespan', '^[0-9]+$', false, 3); if (isset_request_var('steps')) { $save['steps'] = form_input_validate(get_nfilter_request_var('steps'), 'steps', '^[0-9]+$', false, 3); if ($save['steps'] != '1') { $save['steps'] /= $sampling_interval; } } if (isset_request_var('rows')) { $save['rows'] = form_input_validate(get_nfilter_request_var('rows'), 'rows', '^[0-9]+$', false, 3); } if (!is_error_message()) { $profile_rra_id = sql_save($save, 'data_source_profiles_rra'); if ($profile_rra_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: data_source_profiles.php?header=false&action=item_edit&profile_id=' . get_request_var('profile_id') . '&id=' . (empty($profile_rra_id) ? get_request_var('id') : $profile_rra_id)); } else { header('Location: data_source_profiles.php?header=false&action=edit&id=' . get_request_var('profile_id')); } } } /* ------------------------ The 'actions' function ------------------------ */ function form_actions() { global $profile_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { // delete db_execute('DELETE FROM data_source_profiles WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM data_source_profiles_rra WHERE ' . array_to_sql_or($selected_items, 'data_source_profile_id')); db_execute('DELETE FROM data_source_profiles_cf WHERE ' . array_to_sql_or($selected_items, 'data_source_profile_id')); } elseif (get_request_var('drp_action') == '2') { // duplicate duplicate_data_source_profile($selected_items, get_nfilter_request_var('title_format')); } } header('Location: data_source_profiles.php?header=false'); exit; } /* setup some variables */ $profile_list = ''; $i = 0; /* loop through each of the graphs selected on the previous page and get more info about them */ foreach ($_POST AS $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $profile_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM data_source_profiles WHERE id = ?', array($matches[1]))) . '
  • '; $profile_array[$i] = $matches[1]; $i++; } } top_header(); form_start('data_source_profiles.php'); html_start_box($profile_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($profile_array) && cacti_sizeof($profile_array)) { if (get_request_var('drp_action') == '1') { // delete print "

    " . __n('Click \'Continue\' to delete the following Data Source Profile', 'Click \'Continue\' to delete following Data Source Profiles', cacti_sizeof($profile_array)) . "

      $profile_list
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // duplicate print "

    " . __n('Click \'Continue\' to duplicate the following Data Source Profile. You can optionally change the title format for the new Data Source Profile', 'Click \'Continue\' to duplicate following Data Source Profiles. You can optionally change the title format for the new Data Source Profiles.', cacti_sizeof($profile_array)) . "

      $profile_list

    " . __('Title Format:') . "
    "; form_text_box('title_format', ' (1)', '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } } else { raise_message(40); header('Location: data_source_profiles.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* -------------------------- CDEF Item Functions -------------------------- */ function duplicate_data_source_profile($source_profile, $title_format) { if (!is_array($source_profile)) { $source_profile = array($source_profile); } foreach($source_profile as $id) { $profile = db_fetch_row_prepared('SELECT * FROM data_source_profiles WHERE id = ?', array($id)); if (cacti_sizeof($profile)) { $save = array(); $save['id'] = 0; foreach($profile as $column => $value) { if ($column == 'id') { continue; } elseif ($column == 'hash') { $save['hash'] = get_hash_data_source_profile(0); } elseif ($column == 'name') { $save['name'] = str_replace('', $value, $title_format); } elseif ($column == 'default') { $save['default'] = ''; } else { $save[$column] = $value; } } $newid = sql_save($save, 'data_source_profiles'); if ($newid > 0) { db_execute_prepared("INSERT INTO data_source_profiles_cf SELECT '$newid' AS data_source_profile_id, consolidation_function_id FROM data_source_profiles_cf WHERE data_source_profile_id = ?", array($id)); db_execute_prepared("INSERT INTO data_source_profiles_rra (`data_source_profile_id`, `name`, `steps`, `rows`, `timespan`) SELECT '$newid', `name`, `steps`, `rows`, `timespan` FROM data_source_profiles_rra WHERE data_source_profile_id = ?", array($id)); raise_message(1); } else { raise_message(2); } } else { raise_message('profile_error', __('Unable to duplicate Data Source Profile. Check Cacti Log for errors.'), MESSAGE_LEVEL_ERROR); } } } function profile_item_remove_confirm() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('profile_id'); /* ==================================================== */ form_start('data_source_profiles.php'); html_start_box('', '100%', '', '3', 'center', ''); $profile = db_fetch_row_prepared('SELECT * FROM data_source_profiles_rra WHERE id = ?', array(get_request_var('id'))); ?>


    ' onClick='$("#cdialog").dialog("close");' name='cancel'> ' title=''> '> '> 0', array(get_request_var('profile_id'))); if (!isempty_request_var('id')) { $rra = db_fetch_row_prepared('SELECT * FROM data_source_profiles_rra WHERE id = ?', array(get_request_var('id'))); if ($rra['steps'] == '1') { $fields_profile_rra_edit['steps']['array'] = array('1' => __('Each Insert is New Row')); } else { foreach($aggregation_levels as $interval => $name) { if ($interval <= $sampling_interval) { unset($aggregation_levels[$interval]); } } $fields_profile_rra_edit['steps']['array'] = $aggregation_levels; } $fields_profile_rra_edit['steps']['value'] = $rra['steps'] * $sampling_interval; } else { $oneguy = db_fetch_cell_prepared('SELECT id FROM data_source_profiles_rra WHERE data_source_profile_id = ? AND steps=1', array(get_request_var('profile_id'))); if (empty($oneguy)) { $fields_profile_rra_edit['steps']['array'] = array('1' => __('Each Insert is New Row')); } else { foreach($aggregation_levels as $interval => $name) { if ($interval <= $sampling_interval) { unset($aggregation_levels[$interval]); } } $fields_profile_rra_edit['steps']['array'] = $aggregation_levels; } } form_start('data_source_profiles.php', 'form_rra'); $name = db_fetch_cell_prepared('SELECT name FROM data_source_profiles_rra WHERE id = ?', array(get_request_var('id'))); html_start_box(__esc('RRA [edit: %s %s]', $name, ($readonly ? __('(Some Elements Read Only)'):'')), '100%', true, '3', 'center', ''); draw_edit_form(array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_profile_rra_edit, (isset($rra) ? $rra : array())) ) ); html_end_box(true, true); form_hidden_box('profile_id', get_request_var('profile_id'), ''); form_save_button('data_source_profiles.php?action=edit&id=' . get_request_var('profile_id')); ?> 0', array(get_request_var('id'))); $header_label = __esc('Data Source Profile [edit: %s]', $profile['name'] . ($readonly ? ' (Read Only)':'')); } else { $header_label = __('Data Source Profile [new]'); $readonly = false; } form_start('data_source_profiles.php', 'profile'); html_start_box($header_label, '100%', true, '3', 'center', ''); draw_edit_form(array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_profile_edit, (isset($profile) ? $profile : array())) ) ); html_end_box(true, true); if (!isempty_request_var('id')) { if (!$readonly) { html_start_box( __('Data Source Profile RRAs (press save to update timespans)'), '100%', '', '3', 'center', 'data_source_profiles.php?action=item_edit&profile_id=' . $profile['id']); } else { html_start_box( __('Data Source Profile RRAs (Read Only)'), '100%', '', '3', 'center', ''); } $display_text = array( array('display' => __('Name'), 'align' => 'left'), array('display' => __('Data Retention'), 'align' => 'left'), array('display' => __('Graph Timespan'), 'align' => 'left'), array('display' => __('Steps'), 'align' => 'left'), array('display' => __('Rows'), 'align' => 'left'), ); html_header($display_text, 2); $profile_rras = db_fetch_assoc_prepared('SELECT * FROM data_source_profiles_rra WHERE data_source_profile_id = ? ORDER BY steps', array(get_request_var('id'))); $i = 0; if (cacti_sizeof($profile_rras)) { foreach ($profile_rras as $rra) { form_alternate_row('line' . $rra['id']);$i++;?> " . html_escape($rra['name']) . '';?> ":"");?> 31536000) { if (floor($duration/31536000) > 0) { $years = floor($duration/31536000); $years = ( $years == 1 ) ? __('1 Year') : __('%d Years', $years); $duration %= 31536000; $output = $years; } } if ($duration > 2592000) { if (floor($duration/2592000)) { $months = floor($duration/2592000); $months = ( $months == 1 ) ? __('%d Month', 1) : __('%d Months', $months); $duration %= 2592000; $output .= ($output != '' ? ', ' : '') . $months; } } if ($duration > 604800) { if (floor($duration/604800) > 0) { $weeks = floor($duration/604800); $weeks = ( $weeks == 1 ) ? __('%d Week', 1) : __('%d Weeks', $weeks); $duration %= 604800; $output .= ($output != '' ? ', ' : '') . $weeks; } } if ($duration > 86400) { if (floor($duration/86400) > 0) { $days = floor($duration/86400); $days = ( $days == 1 ) ? __('%d Day', 1) : __('%d Days', $days); $duration %= 86400; $output .= ($output != '' ? ', ' : '') . $days; } } if (floor($duration/3600) > 0) { $hours = floor($duration/3600); $hours = ( $hours == 1 ) ? __('1 Hour') : __('%d Hours', $hours); $output .= ($output != '' ? ', ' : '') . $hours; } return $output; } function profile() { global $profile_actions, $item_rows, $sampling_intervals, $heartbeats, $config; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'step', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_data' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_dsp'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box( __('Data Source Profiles'), '100%', '', '3', 'center', 'data_source_profiles.php?action=edit'); ?>

    '> > ' title=''> ' title=''>
    0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(`rows`) FROM ( SELECT dsp.id AS `rows`, SUM(CASE WHEN local_data_id>0 THEN 1 ELSE 0 END) AS data_sources FROM data_source_profiles AS dsp LEFT JOIN data_template_data AS dtd ON dsp.id=dtd.data_source_profile_id $sql_where GROUP BY dsp.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $profile_list = db_fetch_assoc("SELECT rs.*, SUM(CASE WHEN local_data_id=0 THEN 1 ELSE 0 END) AS templates, SUM(CASE WHEN local_data_id>0 THEN 1 ELSE 0 END) AS data_sources FROM ( SELECT dsp.*, dtd.local_data_id FROM data_source_profiles AS dsp LEFT JOIN data_template_data AS dtd ON dsp.id=dtd.data_source_profile_id $sql_where GROUP BY dsp.id, dtd.data_template_id, dtd.local_data_id ) AS rs GROUP BY rs.id $sql_having $sql_order $sql_limit"); $display_text = array( 'name' => array( 'display' => __('Data Source Profile Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this CDEF.') ), 'nosort00' => array( 'display' => __('Default'), 'align' => 'right', 'tip' => __('Is this the default Profile for all new Data Templates?') ), 'nosort01' => array( 'display' => __('Deletable'), 'align' => 'right', 'tip' => __('Profiles that are in use cannot be Deleted. In use is defined as being referenced by a Data Source or a Data Template.') ), 'nosort02' => array( 'display' => __('Read Only'), 'align' => 'right', 'tip' => __('Profiles that are in use by Data Sources become read only for now.') ), 'step' => array( 'display' => __('Poller Interval'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The Polling Frequency for the Profile') ), 'heartbeat' => array( 'display' => __('Heartbeat'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The Amount of Time, in seconds, without good data before Data is stored as Unknown') ), 'data_sources' => array( 'display' => __('Data Sources Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Data Sources using this Profile.') ), 'templates' => array( 'display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Data Templates using this Profile.') ) ); $nav = html_nav_bar('data_source_profiles.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Profiles'), 'page', 'main'); form_start('data_source_profiles.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($profile_list)) { foreach ($profile_list as $profile) { if ($profile['data_sources'] == 0 && $profile['templates'] == 0) { $disabled = false; } else { $disabled = true; } if ($profile['data_sources']) { $readonly = true; } else { $readonly = false; } if ($profile['data_sources'] > 0) { $ds = '' . number_format_i18n($profile['data_sources'], '-1') . ''; } else { $ds = number_format_i18n($profile['data_sources'], '-1'); } if ($profile['templates'] > 0) { $dt = '' . number_format_i18n($profile['templates'], '-1') . ''; } else { $dt = number_format_i18n($profile['templates'], '-1'); } form_alternate_row('line' . $profile['id'], false, $disabled); form_selectable_cell(filter_value($profile['name'], get_request_var('filter'), 'data_source_profiles.php?action=edit&id=' . $profile['id']), $profile['id']); form_selectable_cell($profile['default'] == 'on' ? __('Yes'):'', $profile['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $profile['id'], '', 'right'); form_selectable_cell($readonly ? __('Yes'):__('No'), $profile['id'], '', 'right'); form_selectable_cell($sampling_intervals[$profile['step']], $profile['id'], '', 'right'); form_selectable_cell($heartbeats[$profile['heartbeat']], $profile['id'], '', 'right'); form_selectable_cell($ds, $profile['id'], '', 'right'); form_selectable_cell($dt, $profile['id'], '', 'right'); form_checkbox_cell($profile['name'], $profile['id'], $disabled); form_end_row(); } } else { print "" . __('No Data Source Profiles Found') . "\n"; } html_end_box(false); if (cacti_sizeof($profile_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($profile_actions); form_end(); } cacti-release-1.2.19/data_sources.php000066400000000000000000002032361413633772300175110ustar00rootroot00000000000000 __('Delete'), 3 => __('Change Device'), 8 => __('Reapply Suggested Names'), 6 => __('Enable'), 7 => __('Disable') ); $ds_actions = api_plugin_hook_function('data_source_action_array', $ds_actions); /* set default action */ set_default_action(); validate_data_source_vars(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'rrd_add': ds_rrd_add(); break; case 'rrd_remove': ds_rrd_remove(); break; case 'data_edit': top_header(); data_edit(); bottom_footer(); break; case 'ds_disable': ds_disable(); break; case 'ds_enable': ds_enable(); break; case 'ds_remove': ds_remove(); header ('Location: data_sources.php'); break; case 'ds_edit': ds_edit(); break; case 'ajax_hosts': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(true, 'applyFilter', $sql_where); break; case 'ajax_hosts_noany': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(false, 'applyFilter', $sql_where); break; default: top_header(); ds(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { if ((isset_request_var('save_component_data_source_new')) && (!isempty_request_var('data_template_id'))) { $save['id'] = get_filter_request_var('local_data_id'); $save['host_id'] = get_filter_request_var('host_id'); $save['data_template_id'] = get_filter_request_var('data_template_id'); $local_data_id = sql_save($save, 'data_local'); change_data_template($local_data_id, get_request_var('data_template_id')); /* update the title cache */ update_data_source_title_cache($local_data_id); /* update host data */ if (!isempty_request_var('host_id')) { push_out_host(get_request_var('host_id'), $local_data_id); } } if ((isset_request_var('save_component_data')) && (!is_error_message())) { /* ================= input validation ================= */ get_filter_request_var('data_template_data_id'); /* ==================================================== */ /* ok, first pull out all 'input' values so we know how much to save */ $input_fields = db_fetch_assoc_prepared("SELECT dtd.data_input_id, dl.host_id, dif.id, dif.input_output, dif.data_name, dif.regexp_match, dif.allow_nulls, dif.type_code FROM data_template_data AS dtd LEFT JOIN data_input_fields AS dif ON dif.data_input_id = dtd.data_input_id LEFT JOIN data_local AS dl ON dtd.local_data_id = dl.id WHERE dtd.id = ? AND dif.input_output='in'", array(get_request_var('data_template_data_id'))); if (cacti_sizeof($input_fields)) { foreach ($input_fields as $input_field) { if (isset_request_var('value_' . $input_field['id'])) { /* save the data into the 'data_input_data' table */ $form_value = get_nfilter_request_var('value_' . $input_field['id']); /* we shouldn't enforce rules on fields the user cannot see (ie. templated ones) */ $data_template_id = db_fetch_cell_prepared('SELECT local_data_template_data_id FROM data_template_data WHERE id = ?', array(get_request_var('data_template_data_id')) ); $is_templated = db_fetch_cell_prepared('SELECT t_value FROM data_input_data WHERE data_input_field_id = ? AND data_template_data_id = ?', array($input_field['id'], $data_template_id) ); if ($is_templated == '') { $allow_nulls = true; } elseif ($input_field['allow_nulls'] == 'on') { $allow_nulls = true; } elseif (empty($input_field['allow_nulls'])) { $allow_nulls = false; } /* run regexp match on input string */ $form_value = form_input_validate($form_value, 'value_' . $input_field['id'], $input_field['regexp_match'], $allow_nulls, 3); if (!is_error_message()) { db_execute_prepared("REPLACE INTO data_input_data (data_input_field_id, data_template_data_id, t_value, value) VALUES (?, ?, '', ?)", array($input_field['id'], get_request_var('data_template_data_id'), $form_value) ); } } } } } if ((isset_request_var('save_component_data_source')) && (!is_error_message())) { /* ================= input validation ================= */ get_filter_request_var('current_rrd'); get_filter_request_var('rrd_step'); get_filter_request_var('data_input_id'); get_filter_request_var('data_source_profile_id'); get_filter_request_var('host_id'); get_filter_request_var('_host_id'); get_filter_request_var('_data_template_id'); /* ==================================================== */ $save1['id'] = get_filter_request_var('local_data_id'); $save1['data_template_id'] = get_filter_request_var('data_template_id'); $save1['host_id'] = get_filter_request_var('host_id'); $save2['id'] = get_filter_request_var('data_template_data_id'); $save2['local_data_template_data_id'] = get_filter_request_var('local_data_template_data_id'); $save2['data_template_id'] = get_filter_request_var('data_template_id'); $save2['data_input_id'] = form_input_validate(get_request_var('data_input_id'), 'data_input_id', '^[0-9]+$', true, 3); $save2['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save2['data_source_path'] = form_input_validate(get_nfilter_request_var('data_source_path'), 'data_source_path', '', true, 3); $save2['active'] = form_input_validate((isset_request_var('active') ? get_nfilter_request_var('active') : ''), 'active', '', true, 3); $save2['data_source_profile_id'] = form_input_validate(get_request_var('data_source_profile_id'), 'data_source_profile_id', '^[0-9]+$', false, 3); $save2['rrd_step'] = form_input_validate(get_request_var('rrd_step'), 'rrd_step', '^[0-9]+$', false, 3); if (!is_error_message()) { $local_data_id = sql_save($save1, 'data_local'); $save2['local_data_id'] = $local_data_id; $data_template_data_id = sql_save($save2, 'data_template_data'); if ($data_template_data_id) { raise_message(1); } else { raise_message(2); } } if (!is_error_message()) { /* if this is a new data source and a template has been selected, skip item creation this time otherwise it throws off the templatate creation because of the NULL data */ if (!isempty_request_var('local_data_id') || isempty_request_var('data_template_id')) { /* if no template was set before the save, there will be only one data source item to save; otherwise there might be >1 */ if (isempty_request_var('_data_template_id')) { $rrds[0]['id'] = get_nfilter_request_var('current_rrd'); } else { $rrds = db_fetch_assoc_prepared('SELECT id FROM data_template_rrd WHERE local_data_id = ?', array(get_filter_request_var('local_data_id'))); } if (cacti_sizeof($rrds)) { foreach ($rrds as $rrd) { if (isempty_request_var('_data_template_id')) { $name_modifier = ''; } else { $name_modifier = '_' . $rrd['id']; } $save3['id'] = $rrd['id']; $save3['local_data_id'] = $local_data_id; $save3['local_data_template_rrd_id'] = db_fetch_cell_prepared('SELECT local_data_template_rrd_id FROM data_template_rrd WHERE id = ?', array($rrd['id'])); $save3['data_template_id'] = get_filter_request_var('data_template_id'); $save3['rrd_maximum'] = form_input_validate(get_nfilter_request_var("rrd_maximum$name_modifier"), "rrd_maximum$name_modifier", "^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$|\|query_ifSpeed\||\|query_ifHighSpeed\|", false, 3); $save3['rrd_minimum'] = form_input_validate(get_nfilter_request_var("rrd_minimum$name_modifier"), "rrd_minimum$name_modifier", "^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$|\|query_ifSpeed\||\|query_ifHighSpeed\|", false, 3); $save3['rrd_heartbeat'] = form_input_validate(get_nfilter_request_var("rrd_heartbeat$name_modifier"), "rrd_heartbeat$name_modifier", '^[0-9]+$', false, 3); $save3['data_source_type_id'] = form_input_validate(get_nfilter_request_var("data_source_type_id$name_modifier"), "data_source_type_id$name_modifier", '^[0-9]+$', false, 3); $save3['data_source_name'] = form_input_validate(get_nfilter_request_var("data_source_name$name_modifier"), "data_source_name$name_modifier", '^[a-zA-Z0-9_-]{1,19}$', false, 3); $save3['data_input_field_id'] = form_input_validate((isset_request_var("data_input_field_id$name_modifier") ? get_nfilter_request_var("data_input_field_id$name_modifier") : '0'), "data_input_field_id$name_modifier", '', true, 3); if ($save3['rrd_minimum'] != 'U' && $save3['rrd_maximum'] != 'U') { if ($save3['rrd_minimum'] >= $save3['rrd_maximum']) { raise_message(43); $_SESSION['sess_error_fields']['rrd_maximum'] = 'rrd_maximum'; header('Location: data_sources.php?header=false&action=ds_edit&id=' . (empty($local_data_id) ? get_filter_request_var('local_data_id') : $local_data_id) . '&host_id=' . get_request_var('host_id') . '&view_rrd=' . (isset_request_var('current_rrd') ? get_nfilter_request_var('current_rrd') : '0')); exit; } } $data_template_rrd_id = sql_save($save3, 'data_template_rrd'); if ($data_template_rrd_id) { raise_message(1); } else { raise_message(2); } } } } } if (!is_error_message()) { if (get_request_var('data_template_id') != get_request_var('_data_template_id')) { /* update all necessary template information */ change_data_template($local_data_id, get_request_var('data_template_id')); } elseif (!isempty_request_var('data_template_id')) { update_data_source_data_query_cache($local_data_id); } if (get_request_var('host_id') != get_request_var('_host_id')) { /* push out all necessary host information */ push_out_host(get_request_var('host_id'), $local_data_id); /* reset current host for display purposes */ $_SESSION['sess_data_source_current_host_id'] = get_request_var('host_id'); } /* if no data source path has been entered, generate one */ if (isempty_request_var('data_source_path')) { generate_data_source_path($local_data_id); } /* update the title cache */ update_data_source_title_cache($local_data_id); } } /* update the poller cache last to make sure everything is fresh */ if ((!is_error_message()) && (!empty($local_data_id))) { update_poller_cache($local_data_id, true); } if (isset_request_var('save_component_data_source_new') && isempty_request_var('data_template_id')) { header('Location: data_sources.php?header=false&action=ds_edit&host_id=' . get_request_var('host_id') . '&new=1'); } elseif ((is_error_message()) || (get_filter_request_var('data_template_id') != get_filter_request_var('_data_template_id')) || (get_filter_request_var('data_input_id') != get_filter_request_var('_data_input_id')) || (get_filter_request_var('host_id') != get_filter_request_var('_host_id'))) { header('Location: data_sources.php?header=false&action=ds_edit&id=' . (empty($local_data_id) ? get_filter_request_var('local_data_id') : $local_data_id) . '&host_id=' . get_request_var('host_id') . '&view_rrd=' . (isset_request_var('current_rrd') ? get_nfilter_request_var('current_rrd') : '0')); } else { header('Location: data_sources.php?header=false'); } } /* ------------------------ The "actions" function ------------------------ */ function form_actions() { global $ds_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ if (!isset_request_var('delete_type')) { set_request_var('delete_type', 1); } else { get_filter_request_var('delete_type'); } switch (get_request_var('delete_type')) { case '2': /* delete all graph items tied to this data source */ $data_template_rrds = array_rekey(db_fetch_assoc('SELECT id FROM data_template_rrd WHERE ' . array_to_sql_or($selected_items, 'local_data_id')), 'id', 'id'); $poller_ids = db_fetch_assoc('SELECT DISTINCT poller_id FROM host AS h INNER JOIN data_local AS dl ON dl.host_id=h.id WHERE poller_id > 1 AND id IN (' . implode(', ', $selected_items) . ')'); api_plugin_hook_function('graph_items_remove', $data_template_rrds); /* loop through each data source item */ if (cacti_sizeof($data_template_rrds) > 0) { db_execute('DELETE FROM graph_templates_item WHERE task_item_id IN (' . implode(',', $data_template_rrds) . ') AND local_graph_id > 0'); if (cacti_sizeof($poller_ids)) { foreach($poller_ids as $poller_id) { if (($rcnn_id = poller_push_to_remote_db_connect($poller_id, true)) !== false) { db_execute('DELETE FROM graph_templates_item WHERE task_item_id IN (' . implode(',', $data_template_rrds) . ') AND local_graph_id > 0', true, $rcnn_id); } } } } break; case '3': /* delete all graphs tied to this data source */ $graphs = array_rekey(db_fetch_assoc('SELECT graph_templates_graph.local_graph_id FROM (data_template_rrd,graph_templates_item,graph_templates_graph) WHERE graph_templates_item.task_item_id=data_template_rrd.id AND graph_templates_item.local_graph_id=graph_templates_graph.local_graph_id AND ' . array_to_sql_or($selected_items, 'data_template_rrd.local_data_id') . ' AND graph_templates_graph.local_graph_id > 0 GROUP BY graph_templates_graph.local_graph_id'), 'local_graph_id', 'local_graph_id'); if (cacti_sizeof($graphs) > 0) { api_graph_remove_multi($graphs); } break; } api_data_source_remove_multi($selected_items); } elseif (get_nfilter_request_var('drp_action') == '3') { // change host get_filter_request_var('host_id'); api_data_source_change_host($selected_items, get_request_var('host_id')); } elseif (get_nfilter_request_var('drp_action') == '6') { // data source enable for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $ds_list .= '
  • ' . html_escape(get_data_source_title($matches[1])) . '
  • '; $ds_array[$i] = $matches[1]; $i++; } } top_header(); form_start('data_sources.php'); html_start_box($ds_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($ds_array) && cacti_sizeof($ds_array)) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ $graphs = array(); /* find out which (if any) graphs are using this data source, so we can tell the user */ if (isset($ds_array)) { $graphs = db_fetch_assoc('SELECT graph_templates_graph.local_graph_id, graph_templates_graph.title_cache FROM (data_template_rrd,graph_templates_item,graph_templates_graph) WHERE graph_templates_item.task_item_id=data_template_rrd.id AND graph_templates_item.local_graph_id=graph_templates_graph.local_graph_id AND ' . array_to_sql_or($ds_array, 'data_template_rrd.local_data_id') . ' AND graph_templates_graph.local_graph_id > 0 GROUP BY graph_templates_graph.local_graph_id ORDER BY graph_templates_graph.title_cache'); } print "

    " . __n('Click \'Continue\' to delete the following Data Source', 'Click \'Continue\' to delete following Data Sources', cacti_sizeof($ds_array)) . "

      $ds_list
    "; if (cacti_sizeof($graphs)) { print "

    " . __n('The following graph is using these data sources:', 'The following graphs are using these data sources:', cacti_sizeof($graphs)) . "

    "; print '
      '; foreach ($graphs as $graph) { print '
    • ' . html_escape($graph['title_cache']) . "
    • "; } print '
    '; print '
    '; form_radio_button('delete_type', '3', '1', __n('Leave the Graph untouched.', 'Leave all Graphs untouched.', cacti_sizeof($graphs)), '1'); print '
    '; form_radio_button('delete_type', '3', '2', __n('Delete all Graph Items that reference this Data Source.', 'Delete all Graph Items that reference these Data Sources.', cacti_sizeof($ds_array)), '1'); print '
    '; form_radio_button('delete_type', '3', '3', __n('Delete all Graphs that reference this Data Source.', 'Delete all Graphs that reference these Data Sources.', cacti_sizeof($ds_array)), '1'); print '
    '; print ''; } print " "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '3') { // change host print "

    " . __n('Choose a new Device for this Data Source and click \'Continue\'.', 'Choose a new Device for these Data Sources and click \'Continue\'', cacti_sizeof($ds_array)) . "

      $ds_list

    " . __('New Device:') . "
    "; form_dropdown('host_id', db_fetch_assoc("SELECT id, CONCAT_WS('',description,' (',hostname,')') AS name FROM host ORDER BY description, hostname"),'name','id','','','0'); print "

    "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '6') { // data source enable print "

    " . __n('Click \'Continue\' to enable the following Data Source.', 'Click \'Continue\' to enable all following Data Sources.', cacti_sizeof($ds_array)) . "

      $ds_list
    "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '7') { // data source disable print "

    " . __n('Click \'Continue\' to disable the following Data Source.', 'Click \'Continue\' to disable all following Data Sources.', cacti_sizeof($ds_array)) . "

      $ds_list
    "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '8') { // reapply suggested data source naming print "

    " . __n('Click \'Continue\' to re-apply the suggested name to the following Data Source.', 'Click \'Continue\' to re-apply the suggested names to all following Data Sources.', cacti_sizeof($ds_array)) . "

      $ds_list
    "; $save_html = " "; } else { $save['drp_action'] = get_nfilter_request_var('drp_action'); $save['ds_list'] = $ds_list; $save['ds_array'] = (isset($ds_array)? $ds_array : array()); api_plugin_hook_function('data_source_action_prepare', $save); $save_html = " "; } } else { raise_message(40); header('Location: data_sources.php?header=false'); exit; } print " $save_html "; html_end_box(); form_end(); bottom_footer(); } /* ---------------------------- data - Custom Data ---------------------------- */ function data_edit($incform = true) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (!isempty_request_var('id')) { $data = db_fetch_row_prepared('SELECT id, data_input_id, data_template_id, name, local_data_id FROM data_template_data WHERE local_data_id = ?', array(get_request_var('id'))); $template_data = db_fetch_row_prepared('SELECT id, data_input_id FROM data_template_data WHERE data_template_id = ? AND local_data_id = 0', array($data['data_template_id'])); $host = db_fetch_row_prepared('SELECT host.id, host.hostname FROM (data_local, host) WHERE data_local.host_id = host.id AND data_local.id = ?', array(get_request_var('id'))); } if ($incform) { form_start('data_sources.php', 'data_source_edit'); } $i = 0; if (!empty($data['data_input_id'])) { /* get each INPUT field for this data input source */ $fields = db_fetch_assoc_prepared('SELECT * FROM data_input_fields WHERE data_input_id = ? AND input_output = "in" ORDER BY name', array($data['data_input_id']) ); $data_input_name = db_fetch_cell_prepared('SELECT name FROM data_input WHERE id = ?', array($data['data_input_id'])); html_start_box(__('Custom Data [data input: %s]', html_escape($data_input_name)), '100%', '', '3', 'center', ''); /* loop through each field found */ if (cacti_sizeof($fields) > 0) { foreach ($fields as $field) { $data_input_data = db_fetch_row_prepared('SELECT * FROM data_input_data WHERE data_template_data_id = ? AND data_input_field_id = ?', array($data['id'], $field['id']) ); if (cacti_sizeof($data_input_data) > 0) { $old_value = $data_input_data['value']; } else { $old_value = ''; } /* if data template then get t_value FROM template, else always allow user input */ if (empty($data['data_template_id'])) { $can_template = 'on'; } else { $can_template = db_fetch_cell_prepared('SELECT t_value FROM data_input_data WHERE data_template_data_id = ? AND data_input_field_id = ?', array($template_data['id'], $field['id']) ); } form_alternate_row(); if ((!empty($host['id'])) && (preg_match('/^' . VALID_HOST_FIELDS . '$/i', $field['type_code']))) { print "" . html_escape($field['name']) . ' ' . __('(From Device: %s)', html_escape($host['hostname'])) . ""; print "" . html_escape($old_value) . ""; } elseif (empty($can_template)) { print "" . html_escape($field['name']) . ' ' . __('(From Data Template)') . ""; print '' . (empty($old_value) ? __('Nothing Entered') : html_escape($old_value)) . ""; } else { print "" . html_escape($field['name']) . ""; print ''; draw_custom_data_row('value_' . $field['id'], $field['id'], $data['id'], $old_value); print ''; } print ""; $i++; } } else { print '' . __('No Input Fields for the Selected Data Input Source') . ''; } html_end_box(); } if ($incform) { form_hidden_box('local_data_id', (isset($data) ? $data['local_data_id'] : '0'), ''); form_hidden_box('data_template_data_id', (isset($data) ? $data['id'] : '0'), ''); } form_hidden_box('save_component_data', '1', ''); } /* ------------------------ Data Source Functions ------------------------ */ function ds_rrd_remove() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ db_execute_prepared('DELETE FROM data_template_rrd WHERE id = ?', array(get_request_var('id'))); db_execute_prepared('UPDATE graph_templates_item SET task_item_id = 0 WHERE task_item_id = ?', array(get_request_var('id'))); header('Location: data_sources.php?header=false&action=ds_edit&id=' . get_request_var('local_data_id')); } function ds_rrd_add() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ db_execute_prepared("INSERT INTO data_template_rrd (local_data_id, rrd_maximum, rrd_minimum, rrd_heartbeat, data_source_type_id, data_source_name) VALUES (?, 100, 0, 600, 1, 'ds')", array(get_request_var('id'))); $data_template_rrd_id = db_fetch_insert_id(); header('Location: data_sources.php?header=false&action=ds_edit&id=' . get_request_var('id') . "&view_rrd=$data_template_rrd_id"); } function ds_disable() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ api_data_source_disable(get_request_var('id')); header('Location: data_sources.php?header=false&action=ds_edit&id=' . get_request_var('id')); } function ds_enable() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ api_data_source_enable(get_request_var('id')); header('Location: data_sources.php?header=false&action=ds_edit&id=' . get_request_var('id')); } function ds_edit() { global $struct_data_source, $struct_data_source_item; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); /* ==================================================== */ api_plugin_hook('data_source_edit_top'); $use_data_template = true; $data_template = array(); if (!isempty_request_var('id')) { $data_local = db_fetch_row_prepared('SELECT host_id, data_template_id FROM data_local WHERE id = ?', array(get_request_var('id'))); $data = db_fetch_row_prepared('SELECT * FROM data_template_data WHERE local_data_id = ?', array(get_request_var('id'))); if (isset($data_local['data_template_id']) && $data_local['data_template_id'] >= 0) { $data_template = db_fetch_row_prepared('SELECT id, name FROM data_template WHERE id = ?', array($data_local['data_template_id'])); $data_template_data = db_fetch_row_prepared('SELECT * FROM data_template_data WHERE data_template_id = ? AND local_data_id = 0', array($data_local['data_template_id'])); } else { raise_message(11); header ('Location: data_sources.php'); exit; } $header_label = __esc('Data Template Selection [edit: %s]', get_data_source_title(get_request_var('id'))); if (empty($data_local['data_template_id'])) { $use_data_template = false; } } else { $header_label = __('Data Template Selection [new]'); $use_data_template = false; } /* handle debug mode */ if (isset_request_var('debug')) { if (get_nfilter_request_var('debug') == '0') { kill_session_var('ds_debug_mode'); } elseif (get_nfilter_request_var('debug') == '1') { $_SESSION['ds_debug_mode'] = true; } } /* handle debug mode */ if (isset_request_var('info')) { if (get_nfilter_request_var('info') == '0') { kill_session_var('ds_info_mode'); } elseif (get_nfilter_request_var('info') == '1') { $_SESSION['ds_info_mode'] = true; } } top_header(); if (!isempty_request_var('id')) { $local_graph_ids = db_fetch_assoc_prepared('SELECT DISTINCT local_graph_id FROM graph_templates_item AS gti INNER JOIN data_template_rrd AS dtr ON dtr.id = gti.task_item_id WHERE local_data_id = ?', array(get_request_var('id'))); ?>
    *'>
    *'>
    *'>
    *'>
    *'>
    0) { ?>*'>

    0) { $hostDescription = db_fetch_cell_prepared('SELECT description FROM host WHERE id = ?', array(get_request_var('host_id')) ); } elseif (isset($data_local['host_id'])) { $hostDescription = db_fetch_cell_prepared('SELECT description FROM host WHERE id = ?', array($data_local['host_id']) ); } else { $hostDescription = ''; } $form_array = array( 'data_template_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Selected Data Template'), 'description' => __('The name given to this data template. Please note that you may only change Graph Templates to a 100%$ compatible Graph Template, which means that it includes identical Data Sources.'), 'value' => (cacti_sizeof($data_template) ? $data_template['id'] : '0'), 'none_value' => (cacti_sizeof($data_template) ? '' : 'None'), 'sql' => $dtsql ), 'host_id' => array( 'method' => 'drop_callback', 'friendly_name' => __('Device'), 'description' => __('Choose the Device that this Data Source belongs to.'), 'none_value' => __('None'), 'sql' => 'SELECT id, description AS name FROM host ORDER BY name', 'action' => 'ajax_hosts_noany', 'id' => (isset($data_local['host_id']) ? $data_local['host_id'] : 0), 'value' => $hostDescription ), '_data_template_id' => array( 'method' => 'hidden', 'value' => (isset($data_template['id']) ? $data_template['id'] : '0') ), '_host_id' => array( 'method' => 'hidden', 'value' => (isset($data_local['host_id']) ? $data_local['host_id'] : '0') ), '_data_input_id' => array( 'method' => 'hidden', 'value' => (isset($data['data_input_id']) ? $data['data_input_id'] : '0') ), 'data_template_data_id' => array( 'method' => 'hidden', 'value' => (isset($data['id']) ? $data['id'] : '0') ), 'local_data_template_data_id' => array( 'method' => 'hidden', 'value' => (isset($data['local_data_template_data_id']) ? $data['local_data_template_data_id'] : '0') ), 'local_data_id' => array( 'method' => 'hidden', 'value' => (isset($data['local_data_id']) ? $data['local_data_id'] : '0') ), ); draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(true, true); /* only display the "inputs" area if we are using a data template for this data source */ if (!empty($data['data_template_id'])) { $template_data_rrds = db_fetch_assoc_prepared('SELECT * FROM data_template_rrd WHERE local_data_id = ? ORDER BY data_source_name', array(get_request_var('id'))); html_start_box(__('Supplemental Data Template Data'), '100%', true, '3', 'center', ''); draw_nontemplated_fields_data_source($data['data_template_id'], $data['local_data_id'], $data, '|field|', __('Data Source Fields'), true, true, 0); draw_nontemplated_fields_data_source_item($data['data_template_id'], $template_data_rrds, '|field|_|id|', __('Data Source Item Fields'), true, true, true, 0); draw_nontemplated_fields_custom_data($data['id'], 'value_|id|', __('Custom Data'), true, true, 0); form_hidden_box('save_component_data','1',''); html_end_box(true, true); } if (((isset_request_var('id')) || (isset_request_var('new'))) && (empty($data['data_template_id']))) { html_start_box( __('Data Source'), '100%', true, '3', 'center', ''); $form_array = array(); foreach ($struct_data_source as $field_name => $field_array) { $form_array += array($field_name => $struct_data_source[$field_name]); if (($field_array['method'] != 'header') && ($field_array['method'] != 'spacer' )){ if (!(($use_data_template == false) || (!empty($data_template_data['t_' . $field_name])) || ($field_array['flags'] == 'NOTEMPLATE'))) { $form_array[$field_name]['description'] = ''; } $form_array[$field_name]['value'] = (isset($data[$field_name]) ? $data[$field_name] : ''); $form_array[$field_name]['form_id'] = (empty($data['id']) ? '0' : $data['id']); if (!(($use_data_template == false) || (!empty($data_template_data['t_' . $field_name])) || ($field_array['flags'] == 'NOTEMPLATE'))) { $form_array[$field_name]['method'] = 'template_' . $form_array[$field_name]['method']; } } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($form_array, (isset($data) ? $data : array())) ) ); html_end_box(true, true); /* fetch ALL rrd's for this data source */ if (!isempty_request_var('id')) { $template_data_rrds = db_fetch_assoc_prepared('SELECT id, data_source_name FROM data_template_rrd WHERE local_data_id = ? ORDER BY data_source_name', array(get_request_var('id'))); } /* select the first "rrd" of this data source by default */ if (isempty_request_var('view_rrd')) { set_request_var('view_rrd', (isset($template_data_rrds[0]['id']) ? $template_data_rrds[0]['id'] : '0')); } /* get more information about the rrd we chose */ if (!isempty_request_var('view_rrd')) { $local_data_template_rrd_id = db_fetch_cell_prepared('SELECT local_data_template_rrd_id FROM data_template_rrd WHERE id = ?', array(get_request_var('view_rrd'))); $rrd = db_fetch_row_prepared('SELECT * FROM data_template_rrd WHERE id = ?', array(get_request_var('view_rrd'))); $rrd_template = db_fetch_row_prepared('SELECT * FROM data_template_rrd WHERE id = ?', array($local_data_template_rrd_id)); $header_label = __('[edit: %s]', $rrd['data_source_name']); } else { $header_label = ''; } $i = 0; if (isset($template_data_rrds)) { if (cacti_sizeof($template_data_rrds) > 1) { /* draw the data source tabs on the top of the page */ print " "; foreach ($template_data_rrds as $template_data_rrd) { $i++; print " "; print ""; } print "
    $i: " . html_escape($template_data_rrd['data_source_name']) . '' . (($use_data_template == false) ? " " : '') . "
    "; } elseif (cacti_sizeof($template_data_rrds) == 1) { set_request_var('view_rrd', $template_data_rrds[0]['id']); } } html_start_box('', '100%', true, '3', 'center', ''); print "
    " . __esc('Data Source Item %s', $header_label) . "
    " . ((!isempty_request_var('id') && (empty($data_template['id']))) ? "" . __('New') . " " : '') . "
    "; /* data input fields list */ if ((empty($data['data_input_id'])) || (db_fetch_cell_prepared('SELECT type_id FROM data_input WHERE id = ?', array($data['data_input_id'])) > '1')) { unset($struct_data_source_item['data_input_field_id']); } else { $struct_data_source_item['data_input_field_id']['sql'] = "SELECT id,CONCAT(data_name,' - ',name) as name FROM data_input_fields WHERE data_input_id=" . $data['data_input_id'] . " and input_output='out' and update_rra='on' order by data_name,name"; } $form_array = array(); foreach ($struct_data_source_item as $field_name => $field_array) { $form_array += array($field_name => $struct_data_source_item[$field_name]); if (($field_array['method'] != 'header') && ($field_array['method'] != 'spacer' )){ if (!(($use_data_template == false) || ($rrd_template['t_' . $field_name] == 'on'))) { $form_array[$field_name]['description'] = ''; } $form_array[$field_name]['value'] = (isset($rrd) ? $rrd[$field_name] : ''); if (!(($use_data_template == false) || ($rrd_template['t_' . $field_name] == 'on'))) { $form_array[$field_name]['method'] = 'template_' . $form_array[$field_name]['method']; } } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => array( 'data_template_rrd_id' => array( 'method' => 'hidden', 'value' => (isset($rrd) ? $rrd['id'] : '0') ), 'local_data_template_rrd_id' => array( 'method' => 'hidden', 'value' => (isset($rrd) ? $rrd['local_data_template_rrd_id'] : '0') ) ) + $form_array ) ); html_end_box(true, true); /* data source data goes here */ data_edit(false); form_hidden_box('current_rrd', get_request_var('view_rrd'), '0'); } /* display the debug mode box if the user wants it */ if ((isset($_SESSION['ds_debug_mode'])) && (isset_request_var('id'))) { ?>

    '; html_end_box(); } } ?>
    '; rrdtool_tune($rrd_info['filename'], $diff, true); print '
    ' . __('External') . ''; }else if ($seconds < 60) { return '' . __('%d Seconds', $seconds) . ''; }else if ($seconds == 60) { return __('1 Minute'); } else { return '' . __('%d Minutes', ($seconds / 60)) . ''; } } function validate_data_source_vars() { /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'rfilter' => array( 'filter' => FILTER_VALIDATE_IS_REGEX, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'site_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'status' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'profile' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'orphans' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ) ); validate_store_request_vars($filters, 'sess_ds'); /* ================= input validation ================= */ } function ds() { global $ds_actions, $item_rows, $sampling_intervals; if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } if (get_request_var('host_id') > 0) { $host = db_fetch_row_prepared('SELECT hostname FROM host WHERE id = ?', array(get_request_var('host_id'))); } else { $host = array(); } ?> 0) { $host_where = 'site_id = ' . get_request_var('site_id'); } else { $host_where = ''; } if (get_request_var('host_id') == -1) { $header = __('Data Sources [ All Devices ]'); } elseif (get_request_var('host_id') == 0) { $header = __('Data Sources [ Non Device Based ]'); } else { $description = db_fetch_cell_prepared('SELECT description FROM host WHERE id = ?', array(get_request_var('host_id'))); $header = __esc('Data Sources [ %s ]', $description); } html_start_box($header, '100%', '', '3', 'center', $add_url); ?>
    ' title=''> ' title=''>
    >
    ' onChange='applyFilter()'>
    0)'; } $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; if (get_request_var('orphans') == 'true') { $sql_where1 .= ($sql_where1 != '' ? ' AND ':'WHERE ') . '((dl.snmp_index = "" AND dl.snmp_query_id > 0) OR dtr.local_graph_id IS NULL)'; $orphan_join = "INNER JOIN ( SELECT DISTINCT dtr.local_data_id, task_item_id, local_graph_id FROM graph_templates_item AS gti INNER JOIN graph_local AS gl ON gl.id = gti.local_graph_id LEFT JOIN data_template_rrd AS dtr ON dtr.id = gti.task_item_id LEFT JOIN host AS h ON h.id = gl.host_id WHERE graph_type_id IN (4,5,6,7,8,20) AND task_item_id IS NULL AND cdef_id NOT IN ( SELECT c.id FROM cdef AS c INNER JOIN cdef_items AS ci ON c.id = ci.cdef_id WHERE (ci.type = 4 OR (ci.type = 6 AND value LIKE '%DATA_SOURCE%')) ) $sql_where2 ) AS dtr ON dl.id = dtr.local_data_id"; $total_rows = db_fetch_cell("SELECT COUNT(*) FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dl.id = dtd.local_data_id INNER JOIN data_template AS dt ON dt.id = dl.data_template_id LEFT JOIN host AS h ON h.id = dl.host_id $orphan_join $sql_where1"); $data_sources = db_fetch_assoc("SELECT dtr.local_graph_id, dtd.local_data_id, dtd.name_cache, dtd.active, dtd.rrd_step, dt.name AS data_template_name, dl.host_id, dtd.data_source_profile_id FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dl.id = dtd.local_data_id INNER JOIN data_template AS dt ON dt.id = dl.data_template_id LEFT JOIN host AS h ON h.id = dl.host_id $orphan_join $sql_where1 $sql_order $sql_limit"); } else { $total_rows = db_fetch_cell("SELECT COUNT(*) FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id LEFT JOIN data_template AS dt ON dt.id=dl.data_template_id LEFT JOIN host AS h ON h.id = dl.host_id $sql_where1"); $data_sources = db_fetch_assoc("SELECT dtd.local_data_id, dtd.name_cache, dtd.active, dtd.rrd_step, dt.name AS data_template_name, dl.host_id, dtd.data_source_profile_id FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id LEFT JOIN data_template AS dt ON dt.id=dl.data_template_id LEFT JOIN host AS h ON h.id = dl.host_id $sql_where1 $sql_order $sql_limit"); } $nav = html_nav_bar('data_sources.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 7, __('Data Sources'), 'page', 'main'); form_start('data_sources.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'name_cache' => array( 'display' => __('Data Source Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Data Source. Generally programtically generated from the Data Template definition.') ), 'local_data_id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Data Source. Useful when performing automation or debugging.') ), 'nosort0' => array( 'display' => __('Graphs'), 'align' => 'center', 'sort' => '', 'tip' => __('The number of Graphs and Aggregate Graphs that are using the Data Source.') ), 'nosort1' => array( 'display' => __('Poller Interval'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The frequency that data is collected for this Data Source.') ), 'nosort2' => array( 'display' => __('Deletable'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('If this Data Source is no long in use by Graphs, it can be Deleted.') ), 'active' => array( 'display' => __('Active'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('Whether or not data will be collected for this Data Source. Controlled at the Data Template level.') ), 'data_template_name' => array( 'display' => __('Template Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Data Template that this Data Source was based upon.') ) ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($data_sources)) { foreach ($data_sources as $data_source) { if (api_data_source_deletable($data_source['local_data_id'])) { $disabled = false; } else { $disabled = true; } $data_source['data_template_name'] = html_escape($data_source['data_template_name']); $data_name_cache = title_trim(html_escape($data_source['name_cache']), read_config_option('max_title_length')); if (get_request_var('rfilter') != '') { $data_name_cache = filter_value($data_name_cache, get_request_var('rfilter')); } /* keep copy of data source for comparison */ $data_source_orig = $data_source; $data_source = api_plugin_hook_function('data_sources_table', $data_source); /* we're escaping strings here, so no need to escape them on form_selectable_cell */ if (empty($data_source['data_template_name'])) { $data_template_name = '' . __('None') . ''; } elseif ($data_source_orig['data_template_name'] != $data_source['data_template_name']) { /* was changed by plugin, plugin has to take care for html-escaping */ $data_template_name = $data_source['data_template_name']; } elseif (get_request_var('rfilter') != '') { $data_template_name = filter_value($data_source['data_template_name'], get_request_var('rfilter')); } else { $data_template_name = html_escape($data_source['data_template_name']); } $graphs_aggregates_url = get_graphs_aggregates_url($data_source['local_data_id']); if ($data_source['name_cache'] == '') { $name = __('Damaged Data Source Name'); } else { $name = $data_source['name_cache']; } form_alternate_row('line' . $data_source['local_data_id'], true, $disabled); form_selectable_cell(filter_value(title_trim($name, read_config_option('max_title_length')), get_request_var('rfilter'), 'data_sources.php?action=ds_edit&id=' . $data_source['local_data_id']), $data_source['local_data_id']); form_selectable_cell($data_source['local_data_id'], $data_source['local_data_id'], '', 'right'); // Show link to Graphs and Aggregates form_selectable_cell($graphs_aggregates_url, $data_source['local_data_id'], '', 'center'); form_selectable_cell(get_poller_interval($data_source['rrd_step'], $data_source['data_source_profile_id']), $data_source['local_data_id']); form_selectable_cell(api_data_source_deletable($data_source['local_data_id']) ? __('Yes') : __('No'), $data_source['local_data_id']); form_selectable_cell(($data_source['active'] == 'on' ? __('Yes'):__('No')), $data_source['local_data_id']); form_selectable_cell($data_template_name, $data_source['local_data_id']); form_checkbox_cell($name, $data_source['local_data_id'], $disabled); form_end_row(); } } else { print "" . __('No Data Sources Found') . ""; } html_end_box(false); if (cacti_sizeof($data_sources)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($ds_actions); form_end(); } function get_graphs_aggregates_url($local_data_id) { $graphs = db_fetch_row_prepared('SELECT GROUP_CONCAT(DISTINCT gl.id) AS graphs, COUNT(DISTINCT gl.id) AS total FROM data_local AS dl INNER JOIN data_template_rrd AS dtr ON dl.id = dtr.local_data_id INNER JOIN graph_templates_item AS gti ON gti.task_item_id = dtr.id INNER JOIN graph_local AS gl ON gl.id = gti.local_graph_id LEFT JOIN aggregate_graphs AS ag ON ag.local_graph_id = gl.id WHERE dl.id = ? AND ag.local_graph_id IS NULL', array($local_data_id)); $aggregates = db_fetch_row_prepared('SELECT GROUP_CONCAT(DISTINCT gl.id) AS graphs, COUNT(DISTINCT gl.id) AS total FROM data_local AS dl INNER JOIN data_template_rrd AS dtr ON dl.id = dtr.local_data_id INNER JOIN graph_templates_item AS gti ON gti.task_item_id = dtr.id INNER JOIN graph_local AS gl ON gl.id = gti.local_graph_id INNER JOIN aggregate_graphs AS ag ON ag.local_graph_id = gl.id WHERE dl.id = ?', array($local_data_id)); $url = ''; if (cacti_sizeof($graphs) && $graphs['total'] > 0) { $url .= '' . $graphs['total'] . ''; } else { $url .= '0'; } if (cacti_sizeof($aggregates) && $aggregates['total'] > 0) { $url .= ' / ' . $aggregates['total'] . ''; } else { $url .= ' / 0'; } return $url; } cacti-release-1.2.19/data_templates.php000066400000000000000000001301571413633772300200250ustar00rootroot00000000000000 __('Delete'), 2 => __('Duplicate'), 3 => __('Change Profile') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'rrd_add': template_rrd_add(); break; case 'rrd_remove': template_rrd_remove(); break; case 'template_remove': template_remove(); header('Location: data_templates.php?header=false'); break; case 'template_edit': top_header(); template_edit(); bottom_footer(); break; default: top_header(); template(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_template')) { /* ================= input validation ================= */ get_filter_request_var('data_input_id'); get_filter_request_var('data_template_id'); get_filter_request_var('data_template_data_id'); get_filter_request_var('data_template_rrd_id'); get_filter_request_var('data_source_type_id'); get_filter_request_var('data_source_profile_id'); get_filter_request_var('rrd_heartbeat'); /* ==================================================== */ /* save: data_template */ $save1['id'] = get_request_var('data_template_id'); $save1['hash'] = get_hash_data_template(get_request_var('data_template_id')); $save1['name'] = form_input_validate(get_nfilter_request_var('template_name'), 'template_name', '', false, 3); /* save: data_template_data */ $save2['id'] = get_request_var('data_template_data_id'); $save2['local_data_template_data_id'] = 0; $save2['local_data_id'] = 0; $save2['data_input_id'] = form_input_validate(get_request_var('data_input_id'), 'data_input_id', '^[0-9]+$', true, 3); $save2['t_name'] = form_input_validate((isset_request_var('t_name') ? get_nfilter_request_var('t_name') : ''), 't_name', '', true, 3); $save2['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', (isset_request_var('t_name') ? true : false), 3); $save2['t_active'] = form_input_validate((isset_request_var('t_active') ? get_nfilter_request_var('t_active') : ''), 't_active', '', true, 3); $save2['active'] = form_input_validate((isset_request_var('active') ? get_nfilter_request_var('active') : ''), 'active', '', true, 3); $rrd_step = db_fetch_cell_prepared('SELECT step FROM data_source_profiles WHERE id = ?', array(get_request_var('data_source_profile_id'))); $rrd_heartbeat = db_fetch_cell_prepared('SELECT heartbeat FROM data_source_profiles WHERE id = ?', array(get_request_var('data_source_profile_id'))); $save2['rrd_step'] = $rrd_step; $save2['t_data_source_profile_id'] = form_input_validate((isset_request_var('t_data_source_profile_id') ? get_nfilter_request_var('t_data_source_profile_id') : ''), 't_data_source_profile_id', '', true, 3); $save2['data_source_profile_id'] = form_input_validate(get_request_var('data_source_profile_id'), 'data_source_profile_id', '^[0-9]+$', (isset_request_var('data_source_profile_id') ? true : false), 3); /* save: data_template_rrd */ $save3['id'] = get_request_var('data_template_rrd_id'); $save3['hash'] = get_hash_data_template(get_request_var('data_template_rrd_id'), 'data_template_item'); $save3['local_data_template_rrd_id'] = 0; $save3['local_data_id'] = 0; $save3['t_rrd_maximum'] = form_input_validate((isset_request_var('t_rrd_maximum') ? get_nfilter_request_var('t_rrd_maximum') : ''), 't_rrd_maximum', '', true, 3); $save3['rrd_maximum'] = form_input_validate(get_nfilter_request_var('rrd_maximum'), 'rrd_maximum', '^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U|\|query_ifSpeed\|$', (isset_request_var('t_rrd_maximum') ? true : false), 3); $save3['t_rrd_minimum'] = form_input_validate((isset_request_var('t_rrd_minimum') ? get_nfilter_request_var('t_rrd_minimum') : ''), 't_rrd_minimum', '', true, 3); $save3['rrd_minimum'] = form_input_validate(get_nfilter_request_var('rrd_minimum'), 'rrd_minimum', '^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$', (isset_request_var('t_rrd_minimum') ? true : false), 3); $save3['rrd_heartbeat'] = $rrd_heartbeat; $save3['t_data_source_type_id'] = form_input_validate((isset_request_var('t_data_source_type_id') ? get_nfilter_request_var('t_data_source_type_id') : ''), 't_data_source_type_id', '', true, 3); $save3['data_source_type_id'] = form_input_validate(get_request_var('data_source_type_id'), 'data_source_type_id', '^[0-9]+$', true, 3); $save3['t_data_source_name'] = form_input_validate((isset_request_var('t_data_source_name') ? get_nfilter_request_var('t_data_source_name') : ''), 't_data_source_name', '', true, 3); $save3['data_source_name'] = form_input_validate(get_nfilter_request_var('data_source_name'), 'data_source_name', '^[a-zA-Z0-9_]{1,19}$', (isset_request_var('t_data_source_name') ? true : false), 3); $save3['t_data_input_field_id'] = form_input_validate((isset_request_var('t_data_input_field_id') ? get_nfilter_request_var('t_data_input_field_id') : ''), 't_data_input_field_id', '', true, 3); $save3['data_input_field_id'] = form_input_validate((isset_request_var('data_input_field_id') ? get_nfilter_request_var('data_input_field_id') : '0'), 'data_input_field_id', '', true, 3); if ($save3['rrd_minimum'] != 'U' && $save3['rrd_maximum'] != 'U') { if ($save3['rrd_minimum'] >= $save3['rrd_maximum']) { raise_message(43); $_SESSION['sess_error_fields']['rrd_maximum'] = 'rrd_maximum'; header('Location: data_templates.php?header=false&action=template_edit&id=' . (empty($data_template_id) ? get_request_var('data_template_id') : $data_template_id) . (isempty_request_var('current_rrd') ? '' : '&view_rrd=' . (get_nfilter_request_var('current_rrd') ? get_nfilter_request_var('current_rrd') : get_request_var('data_template_rrd_id')))); exit; } } /* ok, first pull out all 'input' values so we know how much to save */ $input_fields = db_fetch_assoc_prepared("SELECT id, input_output, regexp_match, allow_nulls, type_code, data_name FROM data_input_fields WHERE data_input_id = ? AND input_output = 'in'", array(get_request_var('data_input_id'))); /* pass 1 for validation */ if (cacti_sizeof($input_fields)) { foreach ($input_fields as $input_field) { $form_value = 'value_' . $input_field['data_name']; if ((isset_request_var($form_value)) && ($input_field['type_code'] == '')) { if ((isset_request_var('t_' . $form_value)) && (get_nfilter_request_var('t_' . $form_value) == 'on')) { $not_required = true; } elseif ($input_field['allow_nulls'] == 'on') { $not_required = true; } else { $not_required = false; } form_input_validate(get_nfilter_request_var($form_value), 'value_' . $input_field['data_name'], $input_field['regexp_match'], $not_required, 3); } } } if (!is_error_message()) { $data_template_id = sql_save($save1, 'data_template'); if ($data_template_id) { raise_message(1); } else { raise_message(2); } } if (!is_error_message()) { $save2['data_template_id'] = $data_template_id; $data_template_data_id = sql_save($save2, 'data_template_data'); if ($data_template_data_id) { raise_message(1); } else { raise_message(2); } } /* update actual host template information for live hosts */ if ((!is_error_message()) && ($save2['id'] > 0)) { db_execute_prepared('UPDATE data_template_data SET data_input_id = ? WHERE data_template_id = ?', array(get_request_var('data_input_id'), get_request_var('data_template_id'))); } if (!is_error_message()) { $save3['data_template_id'] = $data_template_id; $data_template_rrd_id = sql_save($save3, 'data_template_rrd'); if ($data_template_rrd_id) { raise_message(1); } else { raise_message(2); } } if (!is_error_message()) { /* Lets make sure we don't have any fields not set */ $data_template_fields = db_fetch_assoc_prepared('SELECT dt.id, dt.name, dtd.name, di.hash, di.name, di.type_id, dtr.id dtr_id, dtr.data_source_name, dif.id dif_id, dif.name, dif.data_name, dif.input_output, dif.update_rra FROM data_template dt INNER JOIN data_template_data dtd ON dt.id = dtd.data_template_id INNER JOIN data_input di ON dtd.data_input_id = di.id INNER JOIN data_template_rrd dtr ON dt.id = dtr.data_template_id LEFT OUTER JOIN data_input_fields dif ON dtr.data_input_field_id = dif.id WHERE di.type_id in (1,5) AND dt.id = ? AND dif.id IS NULL', array($data_template_id)); if (cacti_sizeof($data_template_fields)) { foreach ($data_template_fields as $data_template_field) { raise_message('data_template_rrd_' . $data_template_field['dtr_id'], __('Field "%s" is missing an Output Field', $data_template_field['data_source_name']), MESSAGE_LEVEL_WARN); } } } if (!is_error_message()) { if (!isempty_request_var('data_template_id')) { /* push out all data source settings to child data source using this template */ push_out_data_source($data_template_data_id); push_out_data_source_item($data_template_rrd_id); db_execute_prepared('DELETE FROM data_input_data WHERE data_template_data_id = ?', array($data_template_data_id)); if (cacti_sizeof($input_fields)) { foreach ($input_fields as $input_field) { $form_value = 'value_' . $input_field['data_name']; if (isset_request_var($form_value)) { /* save the data into the 'host_template_data' table */ if (isset_request_var('t_value_' . $input_field['data_name'])) { $template_this_item = 'on'; } else { $template_this_item = ''; } if ((!empty($form_value)) || (!isempty_request_var('t_value_' . $input_field['data_name']))) { /* unusual case where a form value comes back as an array * this should be cleaned up in the database repair script. */ $value = get_nfilter_request_var($form_value); if (is_array($value)) { $value = trim($value[0]); } else { $value = trim($value); } db_execute_prepared('INSERT INTO data_input_data (data_input_field_id, data_template_data_id, t_value, value) VALUES (?, ?, ?, ?)', array($input_field['id'], $data_template_data_id, $template_this_item, $value)); } } } } /* push out all "custom data" for this data source template */ push_out_data_source_custom_data($data_template_id); push_out_host(0, 0, $data_template_id); /* push out field mappings for the data collector */ /* its important to delete first due to the possibility that * the field names were changed */ db_execute_prepared('DELETE FROM poller_data_template_field_mappings WHERE data_template_id = ?', array($data_template_id)); db_execute_prepared('REPLACE INTO poller_data_template_field_mappings SELECT dtr.data_template_id, dif.data_name, GROUP_CONCAT(dtr.data_source_name ORDER BY dtr.data_source_name) AS data_source_names, NOW() AS last_updated FROM data_template_rrd AS dtr INNER JOIN data_input_fields AS dif ON dtr.data_input_field_id = dif.id WHERE dtr.local_data_id = 0 AND dtr.data_template_id = ? GROUP BY dtr.data_template_id, dif.data_name', array($data_template_id)); } } header('Location: data_templates.php?header=false&action=template_edit&id=' . (empty($data_template_id) ? get_request_var('data_template_id') : $data_template_id) . (isempty_request_var('current_rrd') ? '' : '&view_rrd=' . (get_nfilter_request_var('current_rrd') ? get_nfilter_request_var('current_rrd') : $data_template_rrd_id))); } } /* ------------------------ The "actions" function ------------------------ */ function form_actions() { global $ds_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { // delete db_execute('DELETE FROM data_template_data WHERE ' . array_to_sql_or($selected_items, 'data_template_id') . ' AND local_data_id=0'); db_execute('DELETE FROM data_template_rrd WHERE ' . array_to_sql_or($selected_items, 'data_template_id') . ' AND local_data_id=0'); db_execute('DELETE FROM snmp_query_graph_rrd WHERE ' . array_to_sql_or($selected_items, 'data_template_id')); db_execute('DELETE FROM snmp_query_graph_rrd_sv WHERE ' . array_to_sql_or($selected_items, 'data_template_id')); db_execute('DELETE FROM data_template WHERE ' . array_to_sql_or($selected_items, 'id')); /* "undo" any graph that is currently using this template */ db_execute('UPDATE data_template_data set local_data_template_data_id=0,data_template_id=0 WHERE ' . array_to_sql_or($selected_items, 'data_template_id')); db_execute('UPDATE data_template_rrd set local_data_template_rrd_id=0,data_template_id=0 WHERE ' . array_to_sql_or($selected_items, 'data_template_id')); db_execute('UPDATE data_local set data_template_id=0 WHERE ' . array_to_sql_or($selected_items, 'data_template_id')); } elseif (get_nfilter_request_var('drp_action') == '2') { // duplicate for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $ds_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM data_template WHERE id = ?', array($matches[1]))) . '
  • '; $ds_array[$i] = $matches[1]; $i++; } } top_header(); form_start('data_templates.php'); html_start_box($ds_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($ds_array) && cacti_sizeof($ds_array)) { if (get_request_var('drp_action') == '1') { // delete print "

    " . __('Click \'Continue\' to delete the following Data Template(s). Any data sources attached to these templates will become individual Data Source(s) and all Templating benefits will be removed.') . "

      $ds_list
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // duplicate print "

    " . __('Click \'Continue\' to duplicate the following Data Template(s). You can optionally change the title format for the new Data Template(s).') . "

      $ds_list

    " . __('Title Format:') . '
    '; form_text_box('title_format', '<' . __('template_title') . '> (1)', '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '3') { // change profile print "

    " . __('Click \'Continue\' to change the default Data Source Profile for the following Data Template(s).') . "

      $ds_list

    " . __('New Data Source Profile') . '
    '; $available_profiles = db_fetch_assoc('SELECT id, name FROM data_source_profiles ORDER BY name'); form_dropdown('data_source_profile_id',$available_profiles, 'name', 'id', '', '', ''); print "

    " . __('NOTE: This change only will affect future Data Sources and does not alter existing Data Sources.') . "

    \n"; $save_html = " "; } } else { raise_message(40); header('Location: data_templates.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* ---------------------------- template - Data Templates ---------------------------- */ function template_rrd_remove() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('data_template_id'); /* ==================================================== */ $children = db_fetch_assoc_prepared('SELECT id FROM data_template_rrd WHERE local_data_template_rrd_id = ? OR id = ?', array(get_request_var('id'), get_request_var('id'))); if (cacti_sizeof($children)) { foreach ($children as $item) { db_execute_prepared('DELETE FROM data_template_rrd WHERE id = ?', array($item['id'])); db_execute_prepared('DELETE FROM snmp_query_graph_rrd WHERE data_template_rrd_id = ?', array($item['id'])); db_execute_prepared('UPDATE graph_templates_item SET task_item_id = 0 WHERE task_item_id = ?', array($item['id'])); } } header('Location: data_templates.php?action=template_edit&id=' . get_request_var('data_template_id')); } function template_rrd_add() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('local_data_id'); /* ==================================================== */ $hash = get_hash_data_template(0, 'data_template_item'); /* check for duplicated data source name */ $i = 0; $dsname = 'ds'; while (true) { $exists = db_fetch_cell_prepared('SELECT data_source_name FROM data_template_rrd WHERE data_source_name = ? AND data_template_id = ?', array($dsname, get_request_var('id'))); if (empty($exists)) { break; } else { $i++; $dsname = 'ds (' . $i . ')'; if ($i > 100) break; } } db_execute_prepared('INSERT IGNORE INTO data_template_rrd (hash, data_template_id, rrd_maximum, rrd_minimum, rrd_heartbeat, data_source_type_id, data_source_name) VALUES (?, ?, "U", 0, 600, 1, ?)', array($hash, get_request_var('id'), $dsname)); $data_template_rrd_id = db_fetch_insert_id(); /* add this data template item to each data source using this data template */ $children = db_fetch_assoc_prepared('SELECT local_data_id FROM data_template_data WHERE data_template_id = ? AND local_data_id > 0', array(get_request_var('id'))); if (cacti_sizeof($children)) { foreach ($children as $item) { db_execute_prepared('INSERT IGNORE INTO data_template_rrd (local_data_template_rrd_id, local_data_id, data_template_id, rrd_maximum, rrd_minimum, rrd_heartbeat, data_source_type_id, data_source_name) VALUES (?, ?, ?, 0, 0, 600, 1, ?)', array($data_template_rrd_id, $item['local_data_id'], get_request_var('id'), $dsname)); } } header('Location: data_templates.php?action=template_edit&id=' . get_request_var('id') . "&view_rrd=$data_template_rrd_id"); } function template_edit() { global $struct_data_source, $struct_data_source_item, $data_source_types, $fields_data_template_template_edit, $fields_host_edit, $hash_system_data_inputs; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('view_rrd'); /* ==================================================== */ $isSNMPget = false; if (!isempty_request_var('id')) { $template_data = db_fetch_row_prepared('SELECT dtd.*, data_sources FROM ( SELECT COUNT(*) AS data_sources FROM data_local AS dl LEFT JOIN data_template_data AS idtd ON dl.id=idtd.local_data_id WHERE idtd.data_template_id = ? ) AS ds INNER JOIN ( SELECT * FROM data_template_data WHERE data_template_id = ? AND local_data_id = 0 ) AS dtd', array(get_request_var('id'), get_request_var('id'))); $template = db_fetch_row_prepared('SELECT * FROM data_template WHERE id = ?', array(get_request_var('id'))); if (cacti_sizeof($template_data)) { $snmp_data = db_fetch_row_prepared('SELECT * FROM data_input WHERE hash="3eb92bb845b9660a7445cf9740726522" AND id = ?', array($template_data['data_input_id'])); if (cacti_sizeof($snmp_data)) { $isSNMPget = true; } } $header_label = __esc('Data Templates [edit: %s]', $template['name']); ?>
    0) { ?>*'>

    array('no_form_tag' => 'true'), 'fields' => inject_form_variables($fields_data_template_template_edit, (isset($template) ? $template : array()), (isset($template_data) ? $template_data : array()), $_REQUEST) ) ); html_end_box(true, true); html_start_box(__('Data Source'), '100%', true, '3', 'center', ''); /* make sure 'data source path' doesn't show up for a template... we should NEVER template this field */ unset($struct_data_source['data_source_path']); $form_array = array(); foreach ($struct_data_source as $field_name => $field_array) { $form_array += array($field_name => $struct_data_source[$field_name]); if ($form_array[$field_name]['method'] != 'spacer') { $form_array[$field_name]['value'] = (isset($template_data[$field_name]) ? $template_data[$field_name] : ''); } $form_array[$field_name]['form_id'] = (isset($template_data) ? $template_data['data_template_id'] : '0'); if ($field_array['flags'] == 'ALWAYSTEMPLATE') { $form_array[$field_name]['description'] .= '
    ' . __('This field is always templated.') . ''; } else { $form_array[$field_name]['sub_checkbox'] = array( 'name' => 't_' . $field_name, 'friendly_name' => __esc('Check this checkbox if you wish to allow the user to override the value on the right during Data Source creation.'), 'value' => (isset($template_data['t_' . $field_name]) ? $template_data['t_' . $field_name] : '') ); } } $form_array['data_source_profile_id']['sql'] = 'SELECT id, name FROM data_source_profiles ORDER BY name'; draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($form_array, (isset($template_data) ? $template_data : array())) ) ); html_end_box(true, true); /* fetch ALL rrd's for this data source */ if (!isempty_request_var('id')) { $template_data_rrds = db_fetch_assoc_prepared('SELECT id, data_source_name FROM data_template_rrd WHERE data_template_id = ? AND local_data_id = 0 ORDER BY data_source_name', array(get_request_var('id'))); } /* select the first "rrd" of this data source by default */ if (isempty_request_var('view_rrd')) { set_request_var('view_rrd', (isset($template_data_rrds[0]['id']) ? $template_data_rrds[0]['id'] : '0')); } /* get more information about the rrd we chose */ if (!isempty_request_var('view_rrd')) { $template_rrd = db_fetch_row_prepared('SELECT * FROM data_template_rrd WHERE id = ?', array(get_request_var('view_rrd'))); } $i = 0; if (isset($template_data_rrds)) { if (cacti_sizeof($template_data_rrds) > 1) { /* draw the data source tabs on the top of the page */ print "
    \n
    \n"; } elseif (cacti_sizeof($template_data_rrds) == 1) { set_request_var('view_rrd', $template_data_rrds[0]['id']); } } if (get_request_var('id') > 0) { $readOnly = db_fetch_cell_prepared('SELECT id FROM data_local WHERE data_template_id = ? LIMIT 1', array(get_request_var('id'))); } else { $readOnly = false; } if (!$isSNMPget && !$readOnly) { html_start_box(__('Data Source Item [%s]', (isset($template_rrd) ? html_escape($template_rrd['data_source_name']) : '')), '100%', true, '0', 'center', (!isempty_request_var('id') ? 'data_templates.php?action=rrd_add&id=' . get_request_var('id'):''), __('New')); } else { html_start_box(__('Data Source Item [%s]', (isset($template_rrd) ? html_escape($template_rrd['data_source_name']) : '')), '100%', true, '0', 'center', '', ''); } /* data input fields list */ if (empty($template_data['data_input_id'])) { unset($struct_data_source_item['data_input_field_id']); } else { $input_type = db_fetch_cell_prepared('SELECT type_id FROM data_input WHERE id = ?', array($template_data['data_input_id'])); if ($input_type != 1 && $input_type != 5) { unset($struct_data_source_item['data_input_field_id']); } else { $struct_data_source_item['data_input_field_id']['sql'] = "SELECT id, CONCAT(data_name, ' - ', name) AS name FROM data_input_fields WHERE data_input_id=" . $template_data['data_input_id'] . " AND input_output='out' AND update_rra='on' ORDER BY data_name, name"; } } $form_array = array(); foreach ($struct_data_source_item as $field_name => $field_array) { $form_array += array($field_name => $struct_data_source_item[$field_name]); $form_array[$field_name]['value'] = (isset($template_rrd) ? $template_rrd[$field_name] : ''); $form_array[$field_name]['sub_checkbox'] = array( 'name' => 't_' . $field_name, 'friendly_name' => __esc('Check this checkbox if you wish to allow the user to override the value on the right during Data Source creation.'), 'value' => (isset($template_rrd) ? $template_rrd['t_' . $field_name] : '') ); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array + array( 'data_template_rrd_id' => array( 'method' => 'hidden', 'value' => (isset($template_rrd) ? $template_rrd['id'] : '0') ) ) ) ); html_end_box(true, true); $i = 0; if (!isempty_request_var('id')) { /* get each INPUT field for this data input source */ $fields = db_fetch_assoc_prepared('SELECT * FROM data_input_fields WHERE data_input_id = ? AND input_output="in" ORDER BY name', array($template_data['data_input_id'])); $name = db_fetch_cell_prepared('SELECT name FROM data_input WHERE id = ?', array($template_data['data_input_id'])); html_start_box(__('Custom Data [data input: %s]', html_escape($name)), '100%', true, '3', 'center', ''); /* loop through each field found */ if (cacti_sizeof($fields) > 0) { $class = 'odd'; foreach ($fields as $field) { $data_input_data = db_fetch_row_prepared('SELECT t_value, value FROM data_input_data WHERE data_template_data_id = ? AND data_input_field_id = ?', array($template_data['id'], $field['id'])); if (cacti_sizeof($data_input_data)) { $old_value = $data_input_data['value']; $old_tvalue = $data_input_data['t_value']; } else { $old_value = ''; $old_tvalue = ''; } if ($field['data_name'] == 'management_ip') { $help = $fields_host_edit['hostname']['description']; } elseif (isset($fields_host_edit[$field['data_name']])) { $help = $fields_host_edit[$field['data_name']]['description']; } else { $help = $field['name']; } print "
    "; if ($class == 'odd') { $class = 'even'; } else { $class = 'odd'; } if (preg_match('/^' . VALID_HOST_FIELDS . '$/i', $field['type_code']) && $old_tvalue == '') { $title = __esc('Value will be derived from the device if this field is left empty.'); } else { $title = ''; } ?>
    "; $i++; } } else { print '
    ' . __('No Input Fields for the Selected Data Input Source') . '
    '; } html_end_box(true, true); } form_save_button('data_templates.php', 'return'); ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'profile' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'has_data' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_dt'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Data Templates'), '100%', '', '3', 'center', 'data_templates.php?action=template_edit'); ?>
    '> > ' title=''> ' title=''>
    0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(`rows`) FROM (SELECT COUNT(dt.id) `rows`, SUM(CASE WHEN dtd.local_data_id>0 THEN 1 ELSE 0 END) AS data_sources FROM data_template AS dt INNER JOIN data_template_data AS dtd ON dt.id=dtd.data_template_id LEFT JOIN data_source_profiles AS dsp ON dtd.data_source_profile_id=dsp.id LEFT JOIN data_input AS di ON dtd.data_input_id=di.id $sql_where GROUP BY dt.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $template_list_sql = "SELECT dt.id, dt.name, di.name AS data_input_method, dtd.active AS active, dsp.name AS profile_name, SUM(CASE WHEN dtd.local_data_id>0 THEN 1 ELSE 0 END) AS data_sources FROM data_template AS dt INNER JOIN data_template_data AS dtd ON dt.id=dtd.data_template_id LEFT JOIN data_source_profiles AS dsp ON dtd.data_source_profile_id=dsp.id LEFT JOIN data_input AS di ON dtd.data_input_id=di.id $sql_where GROUP BY dt.id $sql_having $sql_order $sql_limit"; $template_list = db_fetch_assoc($template_list_sql); $display_text = array( 'name' => array( 'display' => __('Data Template Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Data Template.') ), 'id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Data Template. Useful when performing automation or debugging.') ), 'nosort' => array( 'display' => __('Deletable'), 'align' => 'right', 'tip' => __('Data Templates that are in use cannot be Deleted. In use is defined as being referenced by a Data Source.') ), 'data_sources' => array( 'display' => __('Data Sources Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Data Sources using this Data Template.') ), 'data_input_method' => array( 'display' => __('Input Method'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The method that is used to place Data into the Data Source RRDfile.') ), 'profile_name' => array( 'display' => __('Profile Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The default Data Source Profile for this Data Template.') ), 'active' => array( 'display' => __('Status'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('Data Sources based on Inactive Data Templates will not be updated when the poller runs.') ) ); $nav = html_nav_bar('data_templates.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Data Templates'), 'page', 'main'); form_start('data_templates.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (cacti_sizeof($template_list)) { foreach ($template_list as $template) { if ($template['data_sources'] > 0) { $disabled = true; } else { $disabled = false; } $ds_url = 'data_sources.php?reset=true&template_id=' . $template['id']; if (get_request_var('profile') != '-1') { $ds_url .= '&profile=' . get_request_var('profile'); } form_alternate_row('line' . $template['id'], true, $disabled); form_selectable_cell(filter_value($template['name'], get_request_var('filter'), 'data_templates.php?action=template_edit&id=' . $template['id']), $template['id']); form_selectable_cell($template['id'], $template['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $template['id'], '', 'right'); form_selectable_cell('' . number_format_i18n($template['data_sources']) . '', $template['id'], '', 'right'); form_selectable_cell((empty($template['data_input_method']) ? '' . __('None') .'': html_escape($template['data_input_method'])), $template['id']); form_selectable_cell((empty($template['profile_name']) ? __('External'):html_escape($template['profile_name'])), $template['id']); form_selectable_cell((($template['active'] == 'on') ? __('Active'):__('Disabled')), $template['id']); form_checkbox_cell($template['name'], $template['id'], $disabled); form_end_row(); } } else { print "" . __('No Data Templates Found') . "\n"; } html_end_box(false); if (cacti_sizeof($template_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($ds_actions); form_end(); } cacti-release-1.2.19/formats/000077500000000000000000000000001413633772300157715ustar00rootroot00000000000000cacti-release-1.2.19/formats/cacti_group.format000066400000000000000000000034721413633772300215100ustar00rootroot00000000000000# Description: Cacti Group Format # Theme: classic
    Cacti Reporting Report
    cacti-release-1.2.19/formats/cacti_group_dark.format000066400000000000000000000035131413633772300225050ustar00rootroot00000000000000# Description: Cacti Group Dark Format # Theme: dark
    Cacti Reporting Report
    cacti-release-1.2.19/formats/cacti_monitor.format000066400000000000000000000035311413633772300220370ustar00rootroot00000000000000# Description: Cacti Monitoring Format # Theme: modern

    Cacti Monitoring Report


    cacti-release-1.2.19/formats/default.format000066400000000000000000000014341413633772300206310ustar00rootroot00000000000000# Description: Standard Formating # Theme: classic cacti-release-1.2.19/formats/index.php000066400000000000000000000000501413633772300176040ustar00rootroot00000000000000 body { margin-left: auto; margin-right: auto; } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: center; align-content: center; width: 100%; } .report_table { background-color: #F9F9F9; text-align: center; border:0; width:100%; border: 3px outset #CCCCCC; padding: 4px; margin: auto; } .title_row { background-color: #EAEAEA; border: 2px double #CCCCCC; padding: 3px; } .title { background-color: #EAEAEA; font-size: 16pt; text-align: left; border: 2px double #CCCCCC; padding: 3px; margin: auto; } .image_table { } .image_row { } .image_column { margin: auto; } .image { } .text_row { background-color: #EAEAEA; } .text { background-color: #EAEAEA; font-size: 16pt; text-align: left; border: 1px solid #CCCCCC; padding: 0px; } .header_table { background-color: #00438C; margin: auto; width: 100%; border: 3px ridge #00438C; padding: 4px; margin: auto; } .header_row { background-color: #00438C; } .header { background-color: #00438C; font-size: 16pt; text-align: left; margin: auto; color: #FFF; } .left { text-align: left; } .right { text-align: right; } .center { text-align: center; } .footer { background-color: #00438C; font-size: 10pt; text-align: left; margin: auto; color: #FFF; }
    Cacti Reporting Report for Lotus Notes
    cacti-release-1.2.19/gprint_presets.php000066400000000000000000000337551413633772300201140ustar00rootroot00000000000000 __('Delete') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'edit': top_header(); gprint_presets_edit(); bottom_footer(); break; default: top_header(); gprint_presets(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_gprint_presets')) { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $save['id'] = get_request_var('id'); $save['hash'] = get_hash_gprint(get_request_var('id')); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save['gprint_text'] = form_input_validate(get_nfilter_request_var('gprint_text'), 'gprint_text', '', false, 3); if (!is_error_message()) { $gprint_preset_id = sql_save($save, 'graph_templates_gprint'); if ($gprint_preset_id) { raise_message(1); } else { raise_message(2); } } if (is_error_message()) { header('Location: gprint_presets.php?header=false&action=edit&id=' . (empty($gprint_preset_id) ? get_nfilter_request_var('id') : $gprint_preset_id)); exit; } else { header('Location: gprint_presets.php?header=false'); exit; } } } /* ----------------------------------- gprint_presets - GPRINT Presets ----------------------------------- */ function form_actions() { global $gprint_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { /* delete */ db_execute('DELETE FROM graph_templates_gprint WHERE ' . array_to_sql_or($selected_items, 'id')); } } header('Location: gprint_presets.php?header=false'); exit; } /* setup some variables */ $gprint_list = ''; $i = 0; /* loop through each of the graphs selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $gprint_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM graph_templates_gprint WHERE id = ?', array($matches[1]))) . '
  • '; $gprint_array[$i] = $matches[1]; $i++; } } top_header(); form_start('gprint_presets.php'); html_start_box($gprint_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($gprint_array) && cacti_sizeof($gprint_array)) { if (get_request_var('drp_action') == '1') { /* delete */ print "

    " . __('Click \'Continue\' to delete the folling GPRINT Preset(s).') . "

      $gprint_list
    \n"; $save_html = " "; } } else { raise_message(40); header('Location: gprint_presets.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } function gprint_presets_edit() { global $fields_grprint_presets_edit; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (!isempty_request_var('id')) { $gprint_preset = db_fetch_row_prepared('SELECT * FROM graph_templates_gprint WHERE id = ?', array(get_request_var('id'))); $header_label = __esc('GPRINT Presets [edit: %s]', $gprint_preset['name']); } else { $header_label = __('GPRINT Presets [new]'); } form_start('gprint_presets.php', 'gprint_presets'); html_start_box($header_label, '100%', true, '3', 'center', ''); draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_grprint_presets_edit, (isset($gprint_preset) ? $gprint_preset : array())) ) ); html_end_box(true, true); form_save_button('gprint_presets.php'); } function gprint_presets() { global $gprint_actions, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_graphs' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_gp'); /* ================= input validation and session storage ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('GPRINT Presets'), '100%', '', '3', 'center', 'gprint_presets.php?action=edit'); ?>
    '> > ' title=''> ' title=''>
    0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(`rows`) FROM ( SELECT gp.id AS `rows`, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs FROM graph_templates_gprint AS gp LEFT JOIN graph_templates_item AS gti ON gti.gprint_id=gp.id $sql_where GROUP BY gp.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $gprint_list = db_fetch_assoc("SELECT rs.*, SUM(CASE WHEN local_graph_id=0 THEN 1 ELSE 0 END) AS templates, SUM(CASE WHEN local_graph_id>0 THEN 1 ELSE 0 END) AS graphs FROM ( SELECT gp.*, gti.local_graph_id FROM graph_templates_gprint AS gp LEFT JOIN graph_templates_item AS gti ON gti.gprint_id=gp.id GROUP BY gp.id, gti.graph_template_id, gti.local_graph_id ) AS rs $sql_where GROUP BY rs.id $sql_having $sql_order $sql_limit"); $display_text = array( 'name' => array( 'display' => __('GPRINT Preset Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this GPRINT Preset.') ), 'gprint_text' => array( 'display' => __('Format'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The GPRINT format string.') ), 'nosort' => array( 'display' => __('Deletable'), 'align' => 'right', 'tip' => __('GPRINTs that are in use cannot be Deleted. In use is defined as being referenced by either a Graph or a Graph Template.') ), 'graphs' => array( 'display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs using this GPRINT.') ), 'templates' => array( 'display' => __('Templates Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs Templates using this GPRINT.') ) ); $nav = html_nav_bar('gprint_presets.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('GPRINTs'), 'page', 'main'); form_start('gprint_presets.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($gprint_list)) { foreach ($gprint_list as $gp) { if ($gp['graphs'] == 0 && $gp['templates'] == 0) { $disabled = false; } else { $disabled = true; } form_alternate_row('line' . $gp['id'], false, $disabled); form_selectable_cell(filter_value($gp['name'], get_request_var('filter'), 'gprint_presets.php?action=edit&id=' . $gp['id']), $gp['id']); form_selectable_ecell($gp['gprint_text'], $gp['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $gp['id'], '', 'right'); form_selectable_cell(number_format_i18n($gp['graphs'], '-1'), $gp['id'], '', 'right'); form_selectable_cell(number_format_i18n($gp['templates'], '-1'), $gp['id'], '', 'right'); form_checkbox_cell($gp['name'], $gp['id'], $disabled); form_end_row(); } } else { print "" . __('No GPRINT Presets') . "\n"; } html_end_box(false); if (cacti_sizeof($gprint_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($gprint_actions); form_end(); } cacti-release-1.2.19/graph.php000066400000000000000000000527411413633772300161410ustar00rootroot00000000000000 array('regexp' => '/^([0-9]+|all)$/'))); get_filter_request_var('local_graph_id'); get_filter_request_var('graph_end'); get_filter_request_var('graph_start'); get_filter_request_var('view_type', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9]+)$/'))); /* ==================================================== */ api_plugin_hook_function('graph'); include_once('./lib/html_tree.php'); top_graph_header(); if (!isset_request_var('rra_id')) { set_request_var('rra_id', 'all'); } if (get_request_var('rra_id') == 'all' || isempty_request_var('rra_id')) { $sql_where = ' AND dspr.id IS NOT NULL'; } else { $sql_where = ' AND dspr.id=' . get_request_var('rra_id'); } $exists = db_fetch_cell_prepared('SELECT local_graph_id FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); /* make sure the graph requested exists (sanity) */ if (!$exists) { print '' . __('GRAPH DOES NOT EXIST') . ''; bottom_footer(); exit; } /* take graph permissions into account here */ if (!is_graph_allowed(get_request_var('local_graph_id'))) { header('Location: permission_denied.php'); exit; } $graph_title = get_graph_title(get_request_var('local_graph_id')); if (get_request_var('action') != 'properties') { print ""; } $rras = get_associated_rras(get_request_var('local_graph_id'), $sql_where); switch (get_request_var('action')) { case 'view': api_plugin_hook_function('page_buttons', array( 'lgid' => get_request_var('local_graph_id'), 'leafid' => '',//$leaf_id, 'mode' => 'mrtg', 'rraid' => get_request_var('rra_id') ) ); ?> $max_timespan) { $max_timespan = $rra['steps'] * $rra['rows'] * $rra['rrd_step']; } } } /* fetch information for the current RRA */ if (isset_request_var('rra_id') && get_request_var('rra_id') > 0) { $rra = db_fetch_row_prepared('SELECT dspr.id, step, steps, dspr.name, `rows` FROM data_source_profiles_rra AS dspr INNER JOIN data_source_profiles AS dsp ON dsp.id=dspr.data_source_profile_id WHERE dspr.id = ?', array(get_request_var('rra_id'))); $rra['timespan'] = $rra['steps'] * $rra['step'] * $rra['rows']; } else { $rra = db_fetch_row_prepared('SELECT dspr.id, step, steps, dspr.name, `rows` FROM data_source_profiles_rra AS dspr INNER JOIN data_source_profiles AS dsp ON dsp.id=dspr.data_source_profile_id WHERE dspr.id = ?', array($rras[0]['id'])); $rra['timespan'] = $rra['steps'] * $rra['step'] * $rra['rows']; } /* define the time span, which decides which rra to use */ $timespan = -($rra['timespan']); /* find the step and how often this graph is updated with new data */ $ds_step = db_fetch_cell_prepared('SELECT data_template_data.rrd_step FROM (data_template_data, data_template_rrd, graph_templates_item) WHERE graph_templates_item.task_item_id = data_template_rrd.id AND data_template_rrd.local_data_id = data_template_data.local_data_id AND graph_templates_item.local_graph_id = ? LIMIT 0,1', array(get_request_var('local_graph_id'))); $ds_step = empty($ds_step) ? 300 : $ds_step; $seconds_between_graph_updates = ($ds_step * $rra['steps']); $now = time(); if (isset_request_var('graph_end') && (get_request_var('graph_end') <= $now - $seconds_between_graph_updates)) { $graph_end = get_request_var('graph_end'); } else { $graph_end = $now - $seconds_between_graph_updates; } if (isset_request_var('graph_start')) { if (($graph_end - get_request_var('graph_start'))>$max_timespan) { $graph_start = $now - $max_timespan; }else { $graph_start = get_request_var('graph_start'); } } else { $graph_start = $now + $timespan; } /* required for zoom out function */ if ($graph_start == $graph_end) { $graph_start--; } $graph = db_fetch_row_prepared('SELECT width, height, title_cache, local_graph_id FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); $graph_height = $graph['height']; $graph_width = $graph['width']; if (read_user_setting('custom_fonts') == 'on' & read_user_setting('title_size') != '') { $title_font_size = read_user_setting('title_size'); } elseif (read_config_option('title_size') != '') { $title_font_size = read_config_option('title_size'); }else { $title_font_size = 10; } ?>
    ''
    ' graph_id='' rra_id='' graph_width='' graph_height='' graph_start='' graph_end='' title_font_size=''>
    ' style='vertical-align:top;' class='graphDrillDown noprint'> _util' graph_start='' graph_end='' rra_id=''>' alt='' title=''>
    _csv' class='iconLink csv' href=''>' alt='' title=''>

    \n";?> 'view', 'local_graph_id' => get_request_var('local_graph_id'), 'rra' => $rra['id'], 'view_type' => get_request_var('view_type'))); ?>
    '>
    ''
    ' graph_id='' rra_id='' graph_width='' graph_height='' title_font_size=''>
    " . html_escape($graph['title_cache']) . '' : '');?>
    ' style='vertical-align:top;' class='graphDrillDown noprint'> _properties' class='iconLink properties'> ' alt='' title=''>
    _csv' class='iconLink properties'> ' alt='' title=''>
    'zoom', 'local_graph_id' => get_request_var('local_graph_id'), 'rra' => get_request_var('rra_id'), 'view_type' => get_request_var('view_type'))); ?>
    '>
    \n"; print "\n"; print "\n"; print "\n"; print "
    " . __('RRDtool Graph Syntax') . "
    \n";
    	print "" . __('RRDtool Command:') . "
    "; $null_param = array(); print @rrdtool_function_graph(get_request_var('local_graph_id'), get_request_var('rra_id'), $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); unset($graph_data_array['print_source']); print "" . __('RRDtool Says:') . "
    "; if ($config['poller_id'] == 1) { print @rrdtool_function_graph(get_request_var('local_graph_id'), get_request_var('rra_id'), $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); } else { print __esc('Not Checked'); } print "
    \n"; exit; break; } print ''; bottom_footer(); cacti-release-1.2.19/graph_image.php000066400000000000000000000132041413633772300172720ustar00rootroot00000000000000 'sanitize_search_string')); /* ==================================================== */ api_plugin_hook_function('graph_image'); $graph_data_array = array(); // Determine the graph type of the output if (!isset_request_var('image_format')) { $type = db_fetch_cell_prepared('SELECT image_format_id FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); switch($type) { case '1': $gtype = 'png'; break; case '3': $gtype = 'svg+xml'; break; } } else { switch(strtolower(get_nfilter_request_var('image_format'))) { case 'png': $gtype = 'png'; break; case 'svg': $gtype = 'svg+xml'; break; default: $gtype = 'png'; break; } } $graph_data_array['image_format'] = $gtype; cacti_session_close(); /* override: graph start time (unix time) */ if (!isempty_request_var('graph_start') && get_request_var('graph_start') < FILTER_VALIDATE_MAX_DATE_AS_INT) { $graph_data_array['graph_start'] = get_request_var('graph_start'); } /* override: graph end time (unix time) */ if (!isempty_request_var('graph_end') && get_request_var('graph_end') < FILTER_VALIDATE_MAX_DATE_AS_INT) { $graph_data_array['graph_end'] = get_request_var('graph_end'); } /* override: graph height (in pixels) */ if (!isempty_request_var('graph_height') && get_request_var('graph_height') < 3000) { $graph_data_array['graph_height'] = get_request_var('graph_height'); } /* override: graph width (in pixels) */ if (!isempty_request_var('graph_width') && get_request_var('graph_width') < 3000) { $graph_data_array['graph_width'] = get_request_var('graph_width'); } /* override: skip drawing the legend? */ if (!isempty_request_var('graph_nolegend')) { $graph_data_array['graph_nolegend'] = get_request_var('graph_nolegend'); } /* print RRDtool graph source? */ if (!isempty_request_var('show_source')) { $graph_data_array['print_source'] = get_request_var('show_source'); } /* disable cache check */ if (isset_request_var('disable_cache')) { $graph_data_array['disable_cache'] = true; } /* set the theme */ if (isset_request_var('graph_theme')) { $graph_data_array['graph_theme'] = get_request_var('graph_theme'); } if (isset_request_var('rra_id')) { if (get_nfilter_request_var('rra_id') == 'all') { $rra_id = 'all'; } else { $rra_id = get_filter_request_var('rra_id'); } } else { $rra_id = null; } $null_param = array(); $output = rrdtool_function_graph(get_request_var('local_graph_id'), $rra_id, $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); if ($output !== false && $output != '') { /* flush the headers now */ ob_end_clean(); header('Content-type: image/'. $gtype); header('Cache-Control: max-age=15'); print $output; } else { ob_start(); /* get the error string */ $graph_data_array['get_error'] = true; $null_param = array(); rrdtool_function_graph(get_request_var('local_graph_id'), $rra_id, $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); $error = ob_get_contents(); if (read_config_option('stats_poller') == '') { $error = __('The Cacti Poller has not run yet.'); } if (isset($graph_data_array['graph_width']) && isset($graph_data_array['graph_height'])) { $image = rrdtool_create_error_image($error, $graph_data_array['graph_width'], $graph_data_array['graph_height']); } else { $image = rrdtool_create_error_image($error); } ob_end_clean(); header('Content-type: image/png'); header('Cache-Control: max-age=15'); if ($image !== false) { print $image; } else { print file_get_contents(__DIR__ . '/images/cacti_error_image.png'); } } cacti-release-1.2.19/graph_json.php000066400000000000000000000216601413633772300171660ustar00rootroot00000000000000 'sanitize_search_string')); /* ==================================================== */ } else { set_request_var('graph_width', 700); set_request_var('graph_height', 200); set_request_var('title_font_size', 10); set_request_var('view_type', 'tree'); set_request_var('graph_start', -1600); set_request_var('graph_end', 0); set_request_var('local_graph_id', 53); set_request_var('rra_id', 0); } cacti_session_close(); $graph_data_array = array(); /* override: graph start time (unix time) */ if (!isempty_request_var('graph_start') && get_request_var('graph_start') < FILTER_VALIDATE_MAX_DATE_AS_INT) { $graph_data_array['graph_start'] = get_request_var('graph_start'); } /* override: graph end time (unix time) */ if (!isempty_request_var('graph_end') && get_request_var('graph_end') < FILTER_VALIDATE_MAX_DATE_AS_INT) { $graph_data_array['graph_end'] = get_request_var('graph_end'); } /* override: graph height (in pixels) */ if (!isempty_request_var('graph_height') && get_request_var('graph_height') < 3000) { $graph_data_array['graph_height'] = get_request_var('graph_height'); } /* override: graph width (in pixels) */ if (!isempty_request_var('graph_width') && get_request_var('graph_width') < 3000) { $graph_data_array['graph_width'] = get_request_var('graph_width'); } /* override: skip drawing the legend? */ if (!isempty_request_var('graph_nolegend')) { $graph_data_array['graph_nolegend'] = get_request_var('graph_nolegend'); } /* print RRDtool graph source? */ if (!isempty_request_var('show_source')) { $graph_data_array['print_source'] = get_request_var('show_source'); } /* disable cache check */ if (isset_request_var('disable_cache')) { $graph_data_array['disable_cache'] = true; } /* set the theme */ if (isset_request_var('graph_theme')) { $graph_data_array['graph_theme'] = get_request_var('graph_theme'); } if (isset_request_var('rra_id')) { if (get_nfilter_request_var('rra_id') == 'all') { $rra_id = 'all'; } else { $rra_id = get_filter_request_var('rra_id'); } } else { $rra_id = null; } $graph_data_array['graphv'] = true; // Determine the graph type of the output if (!isset_request_var('image_format')) { $type = db_fetch_cell_prepared('SELECT image_format_id FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); switch($type) { case '1': $gtype = 'png'; break; case '3': $gtype = 'svg+xml'; break; default: $gtype = 'png'; break; } } else { switch(strtolower(get_nfilter_request_var('image_format'))) { case 'png': $graph_data_array['image_format'] = 'png'; break; case 'svg': $gtype = 'svg+xml'; break; default: $gtype = 'png'; break; } } $graph_data_array['image_format'] = $gtype; if ($config['poller_id'] == 1 || read_config_option('storage_location')) { $xport_meta = array(); $output = rrdtool_function_graph(get_request_var('local_graph_id'), $rra_id, $graph_data_array, '', $xport_meta, $_SESSION['sess_user_id']); ob_end_clean(); } else { if (isset_request_var('rra_id')) { if (get_nfilter_request_var('rra_id') == 'all') { $rra_id = 'all'; } else { $rra_id = get_filter_request_var('rra_id'); } } /* get the theme */ if (!isset_request_var('graph_theme')) { $graph_data_array['graph_theme'] = get_selected_theme(); } if (isset($_SESSION['sess_user_id'])) { $graph_data_array['effective_user'] = $_SESSION['sess_user_id']; } $hostname = db_fetch_cell('SELECT hostname FROM poller WHERE id = 1'); $url = get_url_type() . '://' . $hostname . $config['url_path'] . 'remote_agent.php?action=graph_json'; $url .= '&local_graph_id=' . get_request_var('local_graph_id'); $url .= '&rra_id=' . $rra_id; foreach($graph_data_array as $variable => $value) { $url .= '&' . $variable . '=' . $value; } $fgc_contextoption = get_default_contextoption(); $fgc_context = stream_context_create($fgc_contextoption); $output = @file_get_contents($url, false, $fgc_context); } $output = trim($output); $oarray = array('type' => $gtype, 'local_graph_id' => get_request_var('local_graph_id'), 'rra_id' => $rra_id); // Check if we received back something populated from rrdtool if ($output !== false && $output != '' && strpos($output, 'image = ') !== false) { // Find the beginning of the image definition row $image_begin_pos = strpos($output, 'image = '); // Find the end of the line of the image definition row, after this the raw image data will come $image_data_pos = strpos($output, "\n" , $image_begin_pos) + 1; // Insert the raw image data to the array $oarray['image'] = base64_encode(substr($output, $image_data_pos)); // Parse and populate everything before the image definition row $header_lines = explode("\n", substr($output, 0, $image_begin_pos - 1)); foreach ($header_lines as $line) { $parts = explode(' = ', $line); $oarray[$parts[0]] = trim($parts[1]); } } else { /* image type now png */ $oarray['type'] = 'png'; ob_start(); $graph_data_array['get_error'] = true; $null_param = array(); rrdtool_function_graph(get_request_var('local_graph_id'), $rra_id, $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); $error = ob_get_contents(); ob_end_clean(); if (read_config_option('stats_poller') == '') { $error = __('The Cacti Poller has not run yet.'); } if (isset($graph_data_array['graph_width']) && isset($graph_data_array['graph_height'])) { $image = rrdtool_create_error_image($error, $graph_data_array['graph_width'], $graph_data_array['graph_height']); } else { $image = rrdtool_create_error_image($error); } if (isset($graph_data_array['graph_width'])) { if (isset($graph_data_array['graph_nolegend'])) { $oarray['image_width'] = round($graph_data_array['graph_width'] * 1.24, 0); $oarray['image_height'] = round($graph_data_array['graph_height'] * 1.45, 0); } else { $oarray['image_width'] = round($graph_data_array['graph_width'] * 1.15, 0); $oarray['image_height'] = round($graph_data_array['graph_height'] * 1.8, 0); } } else { $oarray['image_width'] = round(db_fetch_cell_prepared('SELECT width FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))), 0); $oarray['image_height'] = round(db_fetch_cell_prepared('SELECT height FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))), 0); } if ($image !== false) { $oarray['image'] = base64_encode($image); } else { $oarray['image'] = base64_encode(file_get_contents(__DIR__ . '/images/cacti_error_image.png')); } } header('Content-Type: application/json'); header('Cache-Control: max-age=15'); $json = json_encode($oarray); header('Content-Length: ' . strlen($json)); print $json; cacti-release-1.2.19/graph_realtime.php000066400000000000000000000422101413633772300200110ustar00rootroot00000000000000 array('regexp' => '(true|false)'))); get_filter_request_var('local_graph_id'); get_filter_request_var('size'); get_filter_request_var('ds_step'); get_filter_request_var('count'); get_filter_request_var('top'); get_filter_request_var('left'); /* ==================================================== */ set_default_action(); switch (get_request_var('action')) { case 'init': case 'timespan': case 'interval': case 'countdown': ob_start(); $guest_account = true; switch (get_request_var('action')) { case 'init': load_current_session_value('ds_step', 'sess_realtime_ds_step', read_user_setting('realtime_interval', 10)); load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); load_current_session_value('size', 'sess_realtime_size', read_user_setting('realtime_size', 100)); load_current_session_value('graph_nolegend', 'sess_realtime_nolegend', read_user_setting('realtime_nolegend', 'false')); break; case 'timespan': load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); break; case 'interval': load_current_session_value('ds_step', 'sess_realtime_ds_step', read_user_setting('realtime_interval', 10)); load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); load_current_session_value('size', 'sess_realtime_size', read_user_setting('realtime_size', 100)); load_current_session_value('graph_nolegend', 'sess_realtime_nolegend', read_user_setting('realtime_nolegend', 'false')); break; case 'countdown': load_current_session_value('ds_step', 'sess_realtime_ds_step', read_user_setting('realtime_interval', 10)); load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); load_current_session_value('size', 'sess_realtime_size', read_user_setting('realtime_size', 100)); load_current_session_value('graph_nolegend', 'sess_realtime_nolegend', read_user_setting('realtime_nolegend', 'false')); break; default: load_current_session_value('ds_step', 'sess_realtime_ds_step', read_user_setting('realtime_interval', 10)); load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); load_current_session_value('size', 'sess_realtime_size', read_user_setting('realtime_size', 100)); load_current_session_value('graph_nolegend', 'sess_realtime_nolegend', read_user_setting('realtime_nolegend', 'false')); break; } $graph_data_array = array(); /* ds */ $graph_data_array['ds_step'] = read_user_setting('realtime_interval', 10); if (!isempty_request_var('ds_step')) { $graph_data_array['ds_step'] = get_request_var('ds_step'); $_SESSION['sess_realtime_dsstep'] = get_request_var('ds_step'); } /* override: graph height (in pixels) */ if (!isempty_request_var('graph_height') && get_request_var('graph_height') < 3000) { $graph_data_array['graph_height'] = get_request_var('graph_height'); } else { $graph_data_array['graph_height'] = 125; } /* override: graph width (in pixels) */ if (!isempty_request_var('graph_width') && get_request_var('graph_width') < 3000) { $graph_data_array['graph_width'] = get_request_var('graph_width'); } else { $graph_data_array['graph_width'] = 425; } /* override: skip drawing the legend? */ if (get_request_var('graph_nolegend') == 'true') { $graph_data_array['graph_nolegend'] = 'true'; } if (isset_request_var('size') && get_request_var('size') > 0) { $_SESSION['sess_realtime_size'] = get_request_var('size'); $size = get_request_var('size'); } elseif (isset($_SESSION['sess_realtime_size']) && $_SESSION['sess_realtime_size'] != '') { $size = $_SESSION['sess_realtime_size']; } else { $size = 100; } if (isset_request_var('local_graph_id')) { $graph_data = db_fetch_row_prepared('SELECT width, height FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); if (cacti_sizeof($graph_data)) { $graph_data_array['graph_height'] = $graph_data['height']; $graph_data_array['graph_width'] = $graph_data['width']; } } if (isset_request_var('size') && get_request_var('size') < 100) { $graph_data_array['graph_height'] = $graph_data_array['graph_height'] * $size / 100; $graph_data_array['graph_width'] = $graph_data_array['graph_width'] * $size / 100; } /* override: graph start */ if (!isempty_request_var('graph_start')) { $graph_data_array['graph_start'] = get_request_var('graph_start'); if ($graph_data_array['graph_start'] < 0) { $graph_data_array['graph_start'] = time() + $graph_data_array['graph_start']; } $_SESSION['sess_realtime_window'] = abs(get_request_var('graph_start')); } /* override: graph end */ if (!isempty_request_var('graph_end')) { $graph_data_array['graph_end'] = get_request_var('graph_end'); } else { $graph_data_array['graph_end'] = time(); } /* print RRDtool graph source? */ if (!isempty_request_var('show_source')) { $graph_data_array['print_source'] = get_request_var('show_source'); } /* check ds */ if ($graph_data_array['ds_step'] < 1) { $graph_data_array['ds_step'] = read_user_setting('realtime_interval', 10); } // Determine the graph type of the output if (!isset_request_var('image_format')) { $type = db_fetch_cell_prepared('SELECT image_format_id FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); switch($type) { case '1': $gtype = 'png'; break; case '3': $gtype = 'svg+xml'; break; default: $gtype = 'png'; break; } } else { switch(strtolower(get_nfilter_request_var('image_format'))) { case 'png': $graph_data_array['image_format'] = 'png'; break; case 'svg': $gtype = 'svg+xml'; break; default: $gtype = 'png'; break; } } $graph_data_array['image_format'] = $gtype; /* call poller */ $graph_rrd = read_config_option('realtime_cache_path') . '/user_' . hash('sha256', session_id()) . '_lgi_' . get_request_var('local_graph_id') . '.png'; $command = read_config_option('path_php_binary'); $args = sprintf('poller_realtime.php --graph=%s --interval=%d --poller_id=' . hash('sha256',session_id()), get_request_var('local_graph_id'), $graph_data_array['ds_step']); shell_exec("$command $args"); /* construct the image name */ $graph_data_array['export_realtime'] = $graph_rrd; $graph_data_array['output_flag'] = RRDTOOL_OUTPUT_GRAPH_DATA; $null_param = array(); $output = rrdtool_function_graph(get_request_var('local_graph_id'), '', $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); $error = ''; if (file_exists($graph_rrd)) { $graph_contents = file_get_contents($graph_rrd); if (preg_match('/^ERROR/',$graph_contents)) { $error = $graph_contents; $output = ''; } } if (empty($output) && empty($error)) { $graph_data_array['get_error'] = true; $null_param = array(); rrdtool_function_graph(get_request_var('local_graph_id'), $rra_id, $graph_data_array, '', $null_param, $_SESSION['sess_user_id']); $error = ob_get_contents(); if (read_config_option('stats_poller') == '') { $error = __('The Cacti Poller has not run yet.'); } } if (!empty($error)) { $graph_data_array['get_error'] = true; if (isset($graph_data_array['graph_width']) && isset($graph_data_array['graph_height'])) { $graph_contents = rrdtool_create_error_image($error, $graph_data_array['graph_width'], $graph_data_array['graph_height']); } else { $graph_contents = rrdtool_create_error_image($error); } ob_end_clean(); if ($graph_contents === false) { $graph_contents = file_get_contents(__DIR__ . '/images/cacti_error_image.png'); } } if (isset($graph_contents)) { $data = base64_encode($graph_contents); } else { $data = ''; } /* save user preferences */ set_user_setting('realtime_interval', get_request_var('ds_step')); set_user_setting('realtime_gwindow', abs(get_request_var('graph_start'))); set_user_setting('realtime_size', get_request_var('size')); set_user_setting('realtime_nolegend', get_request_var('graph_nolegend')); $_SESSION['sess_realtime_ds_step'] = get_request_var('ds_step'); $_SESSION['sess_realtime_graph_start'] = get_request_var('graph_start'); $_SESSION['sess_realtime_size'] = get_request_var('size'); $_SESSION['sess_realtime_nolegend'] = get_request_var('graph_nolegend'); /* send text information back to browser as well as image information */ $return_array = array( 'local_graph_id' => get_request_var('local_graph_id'), 'top' => get_request_var('top'), 'left' => get_request_var('left'), 'ds_step' => html_escape(isset($_SESSION['sess_realtime_ds_step']) ? $_SESSION['sess_realtime_ds_step']:$graph_data_array['ds_step']), 'graph_start' => html_escape(isset($_SESSION['sess_realtime_graph_start']) ? $_SESSION['sess_realtime_graph_start']:$graph_data_array['graph_start']), 'size' => html_escape(isset($_SESSION['sess_realtime_size']) ? $_SESSION['sess_realtime_size']:read_user_setting('realtime_size', 100)), 'thumbnails' => html_escape(isset($_SESSION['sess_realtime_nolegend']) ? $_SESSION['sess_realtime_nolegend']:'false'), 'data' => (isset($data) ? $data:''), 'image_format' => $graph_data_array['image_format'] ); print json_encode($return_array); exit; break; case 'view': $graph_rrd = read_config_option('realtime_cache_path') . '/user_' . hash('sha256',session_id()) . '_lgi_' . get_request_var('local_graph_id') . '.png'; if (file_exists($graph_rrd)) { print base64_encode(file_get_contents($graph_rrd)); } exit; break; default: load_current_session_value('ds_step', 'sess_realtime_ds_step', read_user_setting('realtime_interval', 10)); load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); load_current_session_value('size', 'sess_realtime_size', read_user_setting('realtime_size', 100)); load_current_session_value('graph_nolegend', 'sess_realtime_nolegend', read_user_setting('realtime_nolegend', 'false')); break; } /* ================= input validation ================= */ get_filter_request_var('ds_step'); get_filter_request_var('local_graph_id'); get_filter_request_var('graph_start'); get_filter_request_var('size'); /* ==================================================== */ $init = ''; if (!isset($_SESSION['sess_realtime_ds_step'])) { load_current_session_value('ds_step', 'sess_realtime_ds_step', read_user_setting('realtime_interval', 10)); } else { set_request_var('ds_step', $_SESSION['sess_realtime_ds_step']); } if (!isset($_SESSION['sess_realtime_graph_start'])) { load_current_session_value('graph_start', 'sess_realtime_graph_start', read_user_setting('realtime_gwindow', 60)); } else { set_request_var('graph_start', $_SESSION['sess_realtime_graph_start']); } /* save user preferences */ set_user_setting('realtime_interval', get_request_var('ds_step')); set_user_setting('realtime_gwindow', abs(get_request_var('graph_start'))); set_user_setting('realtime_size', get_request_var('size')); set_user_setting('realtime_nolegend', get_request_var('graph_nolegend')); if (read_config_option('realtime_enabled') == '') { print "\n"; print "\n"; print "

    " . __('Real-time has been disabled by your administrator.') . "

    \n"; print "\n"; print "\n"; exit; } elseif (!is_dir(read_config_option('realtime_cache_path'))) { print "\n"; print "\n"; print "

    " . __('The Image Cache Directory does not exist. Please first create it and set permissions and then attempt to open another Real-time graph.') . "

    \n"; print "\n"; print "\n"; exit; } elseif (!is_writable(read_config_option('realtime_cache_path'))) { print "\n"; print "\n"; print "

    " . __('The Image Cache Directory is not writable. Please set permissions and then attempt to open another Real-time graph.') . "

    \n"; print "\n"; print "\n"; exit; } $selectedTheme = get_selected_theme(); $sizes = array( '100' => '100%', '90' => '90%', '80' => '80%', '70' => '70%', '60' => '60%', '50' => '50%', '40' => '40%' ); ?>
    >
    '/> '/>
    cacti-release-1.2.19/graph_templates.php000066400000000000000000001135741413633772300202210ustar00rootroot00000000000000 __('Delete'), 2 => __('Duplicate'), 3 => __('Change Settings'), 4 => __('Sync Graphs') ); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'input_remove': get_filter_request_var('graph_template_id'); input_remove(); header('Location: graph_templates.php?header=false&action=template_edit&id=' . get_request_var('graph_template_id')); break; case 'input_edit': top_header(); input_edit(); bottom_footer(); break; case 'template_edit': top_header(); template_edit(); bottom_footer(); break; default: top_header(); template(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { // sanitize ids if (isset_request_var('graph_template_id') && !is_numeric(get_nfilter_request_var('graph_template_id'))) { $graph_template_id = 0; } else { $graph_template_id = get_filter_request_var('graph_template_id'); } if (isset_request_var('save_component_template')) { /* ================= input validation ================= */ get_filter_request_var('graph_template_graph_id'); /* ==================================================== */ $save1['id'] = $graph_template_id; $save1['hash'] = get_hash_graph_template($graph_template_id); $save1['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); $save1['multiple'] = isset_request_var('multiple') ? 'on':''; $save1['test_source'] = isset_request_var('test_source') ? 'on':''; $save2['id'] = get_nfilter_request_var('graph_template_graph_id'); $save2['local_graph_template_graph_id'] = 0; $save2['local_graph_id'] = 0; $save2['t_image_format_id'] = (isset_request_var('t_image_format_id') ? get_nfilter_request_var('t_image_format_id') : ''); $save2['image_format_id'] = form_input_validate(get_nfilter_request_var('image_format_id'), 'image_format_id', '^[0-9]+$', true, 3); $save2['t_title'] = form_input_validate((isset_request_var('t_title') ? get_nfilter_request_var('t_title') : ''), 't_title', '', true, 3); $save2['title'] = form_input_validate(get_nfilter_request_var('title'), 'title', '', (isset_request_var('t_title') ? true : false), 3); $save2['t_height'] = form_input_validate((isset_request_var('t_height') ? get_nfilter_request_var('t_height') : ''), 't_height', '', true, 3); $save2['height'] = form_input_validate(get_nfilter_request_var('height'), 'height', '^[0-9]+$', (isset_request_var('t_height') ? true : false), 3); $save2['t_width'] = form_input_validate((isset_request_var('t_width') ? get_nfilter_request_var('t_width') : ''), 't_width', '', true, 3); $save2['width'] = form_input_validate(get_nfilter_request_var('width'), 'width', '^[0-9]+$', (isset_request_var('t_width') ? true : false), 3); $save2['t_upper_limit'] = form_input_validate((isset_request_var('t_upper_limit') ? get_nfilter_request_var('t_upper_limit') : ''), 't_upper_limit', '', true, 3); $save2['upper_limit'] = form_input_validate(get_nfilter_request_var('upper_limit'), 'upper_limit', '^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$', ((isset_request_var('t_upper_limit') || (strlen(get_nfilter_request_var('upper_limit')) === 0)) ? true : false), 3); $save2['t_lower_limit'] = form_input_validate((isset_request_var('t_lower_limit') ? get_nfilter_request_var('t_lower_limit') : ''), 't_lower_limit', '', true, 3); $save2['lower_limit'] = form_input_validate(get_nfilter_request_var('lower_limit'), 'lower_limit', '^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$', ((isset_request_var('t_lower_limit') || (strlen(get_nfilter_request_var('lower_limit')) === 0)) ? true : false), 3); $save2['t_vertical_label'] = form_input_validate((isset_request_var('t_vertical_label') ? get_nfilter_request_var('t_vertical_label') : ''), 't_vertical_label', '', true, 3); $save2['vertical_label'] = form_input_validate(get_nfilter_request_var('vertical_label'), 'vertical_label', '', true, 3); $save2['t_slope_mode'] = form_input_validate((isset_request_var('t_slope_mode') ? get_nfilter_request_var('t_slope_mode') : ''), 't_slope_mode', '', true, 3); $save2['slope_mode'] = form_input_validate((isset_request_var('slope_mode') ? get_nfilter_request_var('slope_mode') : ''), 'slope_mode', '', true, 3); $save2['t_auto_scale'] = form_input_validate((isset_request_var('t_auto_scale') ? get_nfilter_request_var('t_auto_scale') : ''), 't_auto_scale', '', true, 3); $save2['auto_scale'] = form_input_validate((isset_request_var('auto_scale') ? get_nfilter_request_var('auto_scale') : ''), 'auto_scale', '', true, 3); $save2['t_auto_scale_opts'] = form_input_validate((isset_request_var('t_auto_scale_opts') ? get_nfilter_request_var('t_auto_scale_opts') : ''), 't_auto_scale_opts', '', true, 3); $save2['auto_scale_opts'] = form_input_validate(get_nfilter_request_var('auto_scale_opts'), 'auto_scale_opts', '', true, 3); $save2['t_auto_scale_log'] = form_input_validate((isset_request_var('t_auto_scale_log') ? get_nfilter_request_var('t_auto_scale_log') : ''), 't_auto_scale_log', '', true, 3); $save2['auto_scale_log'] = form_input_validate((isset_request_var('auto_scale_log') ? get_nfilter_request_var('auto_scale_log') : ''), 'auto_scale_log', '', true, 3); $save2['t_scale_log_units'] = form_input_validate((isset_request_var('t_scale_log_units') ? get_nfilter_request_var('t_scale_log_units') : ''), 't_scale_log_units', '', true, 3); $save2['scale_log_units'] = form_input_validate((isset_request_var('scale_log_units') ? get_nfilter_request_var('scale_log_units') : ''), 'scale_log_units', '', true, 3); $save2['t_auto_scale_rigid'] = form_input_validate((isset_request_var('t_auto_scale_rigid') ? get_nfilter_request_var('t_auto_scale_rigid') : ''), 't_auto_scale_rigid', '', true, 3); $save2['auto_scale_rigid'] = form_input_validate((isset_request_var('auto_scale_rigid') ? get_nfilter_request_var('auto_scale_rigid') : ''), 'auto_scale_rigid', '', true, 3); $save2['t_auto_padding'] = form_input_validate((isset_request_var('t_auto_padding') ? get_nfilter_request_var('t_auto_padding') : ''), 't_auto_padding', '', true, 3); $save2['auto_padding'] = form_input_validate((isset_request_var('auto_padding') ? get_nfilter_request_var('auto_padding') : ''), 'auto_padding', '', true, 3); $save2['t_base_value'] = form_input_validate((isset_request_var('t_base_value') ? get_nfilter_request_var('t_base_value') : ''), 't_base_value', '', true, 3); $save2['base_value'] = form_input_validate(get_nfilter_request_var('base_value'), 'base_value', '^[0-9]+$', (isset_request_var('t_base_value') ? true : false), 3); $save2['t_unit_value'] = form_input_validate((isset_request_var('t_unit_value') ? get_nfilter_request_var('t_unit_value') : ''), 't_unit_value', '', true, 3); $save2['unit_value'] = form_input_validate(get_nfilter_request_var('unit_value'), 'unit_value', '', true, 3); $save2['t_unit_exponent_value'] = form_input_validate((isset_request_var('t_unit_exponent_value') ? get_nfilter_request_var('t_unit_exponent_value') : ''), 't_unit_exponent_value', '', true, 3); $save2['unit_exponent_value'] = form_input_validate(get_nfilter_request_var('unit_exponent_value'), 'unit_exponent_value', '^-?[0-9]+$', true, 3); $save2['t_alt_y_grid'] = form_input_validate((isset_request_var('t_alt_y_grid') ? get_nfilter_request_var('t_alt_y_grid') : ''), 't_alt_y_grid', '', true, 3); $save2['alt_y_grid'] = form_input_validate((isset_request_var('alt_y_grid') ? get_nfilter_request_var('alt_y_grid') : ''), 'alt_y_grid', '', true, 3); $save2['t_right_axis'] = form_input_validate((isset_request_var('t_right_axis') ? get_nfilter_request_var('t_right_axis') : ''), 't_right_axis', '', true, 3); $save2['right_axis'] = form_input_validate((isset_request_var('right_axis') ? get_nfilter_request_var('right_axis') : ''), 'right_axis', '^-?([0-9]+(\.[0-9]*)?|\.[0-9]+):-?([0-9]+(\.[0-9]*)?|\.[0-9]+)$', true, 3); $save2['t_right_axis_label'] = form_input_validate((isset_request_var('t_right_axis_label') ? get_nfilter_request_var('t_right_axis_label') : ''), 't_right_axis_label', '', true, 3); $save2['right_axis_label'] = form_input_validate((isset_request_var('right_axis_label') ? get_nfilter_request_var('right_axis_label') : ''), 'right_axis_label', '', true, 3); $save2['t_right_axis_format'] = form_input_validate((isset_request_var('t_right_axis_format') ? get_nfilter_request_var('t_right_axis_format') : ''), 't_right_axis_format', '', true, 3); $save2['right_axis_format'] = form_input_validate((isset_request_var('right_axis_format') ? get_nfilter_request_var('right_axis_format') : ''), 'right_axis_format', '^[0-9]+$', true, 3); $save2['t_no_gridfit'] = form_input_validate((isset_request_var('t_no_gridfit') ? get_nfilter_request_var('t_no_gridfit') : ''), 't_no_gridfit', '', true, 3); $save2['no_gridfit'] = form_input_validate((isset_request_var('no_gridfit') ? get_nfilter_request_var('no_gridfit') : ''), 'no_gridfit', '', true, 3); $save2['t_unit_length'] = form_input_validate((isset_request_var('t_unit_length') ? get_nfilter_request_var('t_unit_length') : ''), 't_unit_length', '', true, 3); $save2['unit_length'] = form_input_validate((isset_request_var('unit_length') ? get_nfilter_request_var('unit_length') : ''), 'unit_length', '^[0-9]+$', true, 3); $save2['t_tab_width'] = form_input_validate((isset_request_var('t_tab_width') ? get_nfilter_request_var('t_tab_width') : ''), 't_tab_width', '', true, 3); $save2['tab_width'] = form_input_validate((isset_request_var('tab_width') ? get_nfilter_request_var('tab_width') : ''), 'tab_width', '^[0-9]*$', true, 3); $save2['t_dynamic_labels'] = form_input_validate((isset_request_var('t_dynamic_labels') ? get_nfilter_request_var('t_dynamic_labels') : ''), 't_dynamic_labels', '', true, 3); $save2['dynamic_labels'] = form_input_validate((isset_request_var('dynamic_labels') ? get_nfilter_request_var('dynamic_labels') : ''), 'dynamic_labels', '', true, 3); $save2['t_force_rules_legend'] = form_input_validate((isset_request_var('t_force_rules_legend') ? get_nfilter_request_var('t_force_rules_legend') : ''), 't_force_rules_legend', '', true, 3); $save2['force_rules_legend'] = form_input_validate((isset_request_var('force_rules_legend') ? get_nfilter_request_var('force_rules_legend') : ''), 'force_rules_legend', '', true, 3); $save2['t_legend_position'] = form_input_validate((isset_request_var('t_legend_position') ? get_nfilter_request_var('t_legend_position') : ''), 't_legend_position', '', true, 3); $save2['legend_position'] = form_input_validate((isset_request_var('legend_position') ? get_nfilter_request_var('legend_position') : ''), 'legend_position', '', true, 3); $save2['t_legend_direction'] = form_input_validate((isset_request_var('t_legend_direction') ? get_nfilter_request_var('t_legend_direction') : ''), 't_legend_direction', '', true, 3); $save2['legend_direction'] = form_input_validate((isset_request_var('legend_direction') ? get_nfilter_request_var('legend_direction') : ''), 'legend_direction', '', true, 3); $save2['t_right_axis_formatter'] = form_input_validate((isset_request_var('t_right_axis_formatter') ? get_nfilter_request_var('t_right_axis_formatter') : ''), 't_right_axis_formatter', '', true, 3); $save2['right_axis_formatter'] = form_input_validate((isset_request_var('right_axis_formatter') ? get_nfilter_request_var('right_axis_formatter') : ''), 'right_axis_formatter', '', true, 3); $save2['t_left_axis_formatter'] = form_input_validate((isset_request_var('t_left_axis_formatter') ? get_nfilter_request_var('t_left_axis_formatter') : ''), 't_left_axis_formatter', '', true, 3); $save2['left_axis_formatter'] = form_input_validate((isset_request_var('left_axis_formatter') ? get_nfilter_request_var('left_axis_formatter') : ''), 'left_axis_formatter', '', true, 3); if (!is_error_message()) { // Clear the Graph Template cache if (empty($graph_template_id)) { clear_cached_allowed_types(); } $graph_template_id = sql_save($save1, 'graph_templates'); if ($graph_template_id) { raise_message(1); } else { raise_message(2); } } if (!is_error_message()) { $save2['graph_template_id'] = $graph_template_id; $graph_template_graph_id = sql_save($save2, 'graph_templates_graph'); if ($graph_template_graph_id) { raise_message(1); push_out_graph($graph_template_graph_id); } else { raise_message(2); } } if (!empty($graph_template_id)) { resequence_graphs($graph_template_id); } } header('Location: graph_templates.php?header=false&action=template_edit&id=' . (empty($graph_template_id) ? get_nfilter_request_var('graph_template_id') : $graph_template_id)); } /* ------------------------ The 'actions' function ------------------------ */ function form_actions() { global $graph_actions, $config, $image_types; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { // delete db_execute('DELETE FROM graph_templates WHERE ' . array_to_sql_or($selected_items, 'id')); $snmp_graph_ids = array_rekey( db_fetch_assoc('SELECT id FROM snmp_query_graph WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')), 'id', 'id' ); if (cacti_sizeof($snmp_graph_ids)) { db_execute('DELETE FROM snmp_query_graph WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); db_execute('DELETE FROM snmp_query_graph_rrd WHERE snmp_query_graph_id IN (' . implode(', ', $snmp_graph_ids) . ')'); db_execute('DELETE FROM snmp_query_graph_rrd_sv WHERE snmp_query_graph_id IN (' . implode(', ', $snmp_graph_ids) . ')'); db_execute('DELETE FROM snmp_query_graph_sv WHERE snmp_query_graph_id IN (' . implode(', ', $snmp_graph_ids) . ')'); } $graph_template_input = db_fetch_assoc('SELECT id FROM graph_template_input WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); if (cacti_sizeof($graph_template_input) > 0) { foreach ($graph_template_input as $item) { db_execute_prepared('DELETE FROM graph_template_input_defs WHERE graph_template_input_id = ?', array($item['id'])); } } db_execute('DELETE FROM graph_template_input WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); db_execute('DELETE FROM graph_templates_graph WHERE ' . array_to_sql_or($selected_items, 'graph_template_id') . ' AND local_graph_id=0'); db_execute('DELETE FROM graph_templates_item WHERE ' . array_to_sql_or($selected_items, 'graph_template_id') . ' AND local_graph_id=0'); db_execute('DELETE FROM host_template_graph WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); /* 'undo' any graph that is currently using this template */ db_execute('UPDATE graph_templates_graph SET local_graph_template_graph_id=0, graph_template_id=0 WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); db_execute('UPDATE graph_templates_item SET local_graph_template_item_id=0, graph_template_id=0 WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); db_execute('UPDATE graph_local SET graph_template_id=0 WHERE ' . array_to_sql_or($selected_items, 'graph_template_id')); clear_cached_allowed_types(); } elseif (get_request_var('drp_action') == '2') { // duplicate for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $graph_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array($matches[1]))) . '
  • '; $graph_array[$i] = $matches[1]; $i++; } } top_header(); form_start('graph_templates.php'); html_start_box($graph_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($graph_array) && cacti_sizeof($graph_array)) { if (get_request_var('drp_action') == '1') { // delete print "

    " . __('Click \'Continue\' to delete the following Graph Template(s). Any Graph(s) associated with the Template(s) will become individual Graph(s).') . "

      $graph_list
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // duplicate print "

    " . __('Click \'Continue\' to duplicate the following Graph Template(s). You can optionally change the title format for the new Graph Template(s).') . "

      $graph_list

    " . __('Title Format:'). "
    "; form_text_box('title_format', ' (1)', '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '3') { // resize print "

    " . __('Click \'Continue\' to resize the following Graph Template(s) and Graph(s) to the Height and Width below. The defaults below are maintained in Settings.') . "

      $graph_list
    "; print __('Graph Height') . ''; form_text_box('graph_height', read_config_option('default_graph_height'), '', '5', '5', 'text'); print '
    ' . __('Graph Width') . ''; form_text_box('graph_width', read_config_option('default_graph_width'), '', '5', '5', 'text'); print '
    ' . __('Image Format') . ''; form_dropdown('image_format_id', $image_types, '', '', read_config_option('default_image_format'), '', ''); print "
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '4') { // retemplate print "\n"; $save_html = " "; } } else { raise_message(40); header('Location: graph_templates.php?header=false'); exit; } print "\n"; html_end_box(); form_end(); bottom_footer(); } function item() { global $consolidation_functions, $graph_item_types; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (isempty_request_var('id')) { $template_item_list = array(); $header_label = 'Graph Template Items [new]'; } else { $template_item_list = db_fetch_assoc_prepared("SELECT gti.id, gti.sequence, gti.text_format, gti.alpha, gti.value, gti.hard_return, gti.graph_type_id, gti.consolidation_function_id, gti.textalign, CONCAT(IFNULL(dt.name, ''), ' (', dtr.data_source_name, ')') AS data_source_name, cdef.name AS cdef_name, vdef.name as vdef_name, colors.hex, gtgp.name as gprint_name FROM graph_templates_item AS gti LEFT JOIN data_template_rrd AS dtr ON gti.task_item_id=dtr.id LEFT JOIN data_local AS dl ON dtr.local_data_id=dl.id LEFT JOIN data_template AS dt ON dt.id=dtr.data_template_id LEFT JOIN data_template_data AS dtd ON dl.id=dtd.local_data_id LEFT JOIN graph_templates_gprint as gtgp ON gtgp.id=gti.gprint_id LEFT JOIN cdef ON cdef_id=cdef.id LEFT JOIN vdef ON vdef_id=vdef.id LEFT JOIN colors ON color_id=colors.id WHERE gti.graph_template_id = ? AND gti.local_graph_id=0 ORDER BY gti.sequence", array(get_request_var('id'))); $header_label = __esc('Graph Template Items [edit: %s]', db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array(get_request_var('id')))); } html_start_box($header_label, '100%', '', '3', 'center', 'graph_templates_items.php?action=item_edit&graph_template_id=' . get_request_var('id')); draw_graph_items_list($template_item_list, 'graph_templates_items.php', 'graph_template_id=' . get_request_var('id'), false); html_end_box(); html_start_box(__('Graph Item Inputs'), '100%', '', '3', 'center', 'graph_templates_inputs.php?action=input_edit&graph_template_id=' . get_request_var('id')); print ""; DrawMatrixHeaderItem(__('Name'),'',2); print ''; $template_item_list = db_fetch_assoc_prepared('SELECT id, name FROM graph_template_input WHERE graph_template_id = ? ORDER BY name', array(get_request_var('id'))); $i = 0; if (cacti_sizeof($template_item_list) > 0) { foreach ($template_item_list as $item) { form_alternate_row('', true); ?> "; } ?> array('no_form_tag' => true), 'fields' => inject_form_variables($fields_graph_template_template_edit, (isset($template) ? $template : array()), (isset($template_graph) ? $template_graph : array())) ) ); html_end_box(true, true); html_start_box(__('Graph Template Options'), '100%', true, '3', 'center', ''); $form_array = array(); foreach ($struct_graph as $field_name => $field_array) { $form_array += array($field_name => $struct_graph[$field_name]); if ($form_array[$field_name]['method'] != 'spacer') { $form_array[$field_name]['value'] = (isset($template_graph[$field_name]) ? $template_graph[$field_name] : ''); } $form_array[$field_name]['form_id'] = (isset($template_graph['id']) ? $template_graph['id'] : '0'); if ($form_array[$field_name]['method'] != 'spacer') { $form_array[$field_name]['sub_checkbox'] = array( 'name' => 't_' . $field_name, 'friendly_name' => __esc('Check this checkbox if you wish to allow the user to override the value on the right during Graph creation.'), 'value' => (isset($template_graph['t_' . $field_name]) ? $template_graph['t_' . $field_name] : '') ); } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); html_end_box(true, true); form_save_button('graph_templates.php', 'return'); //Now we need some javascript to make it dynamic ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_graphs' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_gt'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Graph Templates'), '100%', '', '3', 'center', 'graph_templates.php?action=template_edit'); ?> 0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(`rows`) FROM (SELECT COUNT(gt.id) AS `rows`, COUNT(gl.id) AS graphs FROM graph_templates AS gt LEFT JOIN graph_local AS gl ON gt.id=gl.graph_template_id INNER JOIN ( SELECT * FROM graph_templates_graph AS gtg WHERE gtg.local_graph_id=0 ) AS gtg ON gtg.graph_template_id=gt.id $sql_where GROUP BY gt.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $template_list = db_fetch_assoc("SELECT gt.id, gt.name, gl.snmp_query_id AS dqid, CONCAT(gtg.height,'x',gtg.width) AS size, gtg.vertical_label, gtg.image_format_id, COUNT(gl.id) AS graphs FROM graph_templates AS gt INNER JOIN graph_templates_graph AS gtg ON gtg.graph_template_id=gt.id AND gtg.local_graph_id=0 LEFT JOIN graph_local AS gl ON gt.id=gl.graph_template_id $sql_where GROUP BY gt.id $sql_having $sql_order $sql_limit"); $display_text = array( 'name' => array( 'display' => __('Graph Template Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Graph Template.') ), 'gt.id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal ID for this Graph Template. Useful when performing automation or debugging.') ), 'nosort3' => array( 'display' => __('Deletable'), 'align' => 'right', 'tip' => __('Graph Templates that are in use cannot be Deleted. In use is defined as being referenced by a Graph.') ), 'graphs' => array( 'display' => __('Graphs Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Graphs using this Graph Template.') ), 'size' => array( 'display' => __('Size'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The default size of the resulting Graphs.') ), 'image_format_id' => array( 'display' => __('Image Format'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The default image format for the resulting Graphs.') ), 'vertical_label' => array( 'display' => __('Vertical Label'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The vertical label for the resulting Graphs.') ) ); $nav = html_nav_bar('graph_templates.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Graph Templates'), 'page', 'main'); form_start('graph_templates.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($template_list)) { foreach ($template_list as $template) { if ($template['graphs'] > 0) { $disabled = true; } else { $disabled = false; } form_alternate_row('line' . $template['id'], true, $disabled); form_selectable_cell(filter_value($template['name'], get_request_var('filter'), 'graph_templates.php?action=template_edit&id=' . $template['id']), $template['id']); form_selectable_cell($template['id'], $template['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $template['id'], '', 'right'); form_selectable_cell(number_format_i18n($template['graphs'], '-1'), $template['id'], '', 'right'); form_selectable_ecell($template['size'], $template['id'], '', 'right'); form_selectable_cell($image_types[$template['image_format_id']], $template['id'], '', 'right'); form_selectable_ecell($template['vertical_label'], $template['id'], '', 'right'); form_checkbox_cell($template['name'], $template['id'], $disabled); form_end_row(); } } else { print "\n"; } html_end_box(false); if (cacti_sizeof($template_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($graph_actions); form_end(); } cacti-release-1.2.19/graph_templates_inputs.php000066400000000000000000000224641413633772300216200ustar00rootroot00000000000000 $val) { if (preg_match('/^i_(\d+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $selected_graph_items[$matches[1]] = $matches[1]; if (isset($db_selected_graph_item[$matches[1]])) { /* is selected and exists in the db; old item */ $old_members[$matches[1]] = $matches[1]; } else { /* is selected and does not exist the db; new item */ $new_members[$matches[1]] = $matches[1]; } } } if ((isset($new_members)) && (cacti_sizeof($new_members) > 0)) { foreach ($new_members as $item_id) { push_out_graph_input($graph_template_input_id, $item_id, (isset($new_members) ? $new_members : array())); } } db_execute_prepared('DELETE FROM graph_template_input_defs WHERE graph_template_input_id = ?', array($graph_template_input_id)); if (cacti_sizeof($selected_graph_items) > 0) { foreach ($selected_graph_items as $graph_template_item_id) { db_execute_prepared('INSERT INTO graph_template_input_defs (graph_template_input_id, graph_template_item_id) VALUES (?, ?)', array($graph_template_input_id, $graph_template_item_id)); } } } else { raise_message(2); } } if (is_error_message()) { header('Location: graph_templates_inputs.php?header=false&action=input_edit&graph_template_input_id=' . (empty($graph_template_input_id) ? get_nfilter_request_var('graph_template_input_id') : $graph_template_input_id) . '&graph_template_id=' . get_nfilter_request_var('graph_template_id')); exit; } else { header('Location: graph_templates.php?header=false&action=template_edit&id=' . get_nfilter_request_var('graph_template_id')); exit; } } } /* ------------------------------------ input - Graph Template Item Inputs ------------------------------------ */ function input_remove() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ db_execute_prepared('DELETE FROM graph_template_input WHERE id = ?', array(get_request_var('id'))); db_execute_prepared('DELETE FROM graph_template_input_defs WHERE graph_template_input_id = ?', array(get_request_var('id'))); } function input_edit() { global $consolidation_functions, $graph_item_types, $struct_graph_item, $fields_graph_template_input_edit; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ $header_label = __esc('Graph Item Inputs [edit graph: %s]', db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array(get_request_var('graph_template_id')))); /* get a list of all graph item field names and populate an array for user display */ foreach ($struct_graph_item as $field_name => $field_array) { if ($field_array['method'] != 'view') { $graph_template_items[$field_name] = $field_array['friendly_name']; } } if (!isempty_request_var('id')) { $graph_template_input = db_fetch_row_prepared('SELECT * FROM graph_template_input WHERE id = ?', array(get_request_var('id'))); } form_start('graph_templates_inputs.php'); html_start_box($header_label, '100%', true, '3', 'center', ''); draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($fields_graph_template_input_edit, (isset($graph_template_input) ? $graph_template_input : array()), (isset($graph_template_items) ? $graph_template_items : array()), $_REQUEST) ) ); if (!isset_request_var('id')) { set_request_var('id', 0); } html_end_box(true, true); $item_list = db_fetch_assoc_prepared("SELECT CONCAT_WS(' - ', dtd.name, dtr.data_source_name) AS data_source_name, gti.text_format, gti.id AS graph_templates_item_id, gti.graph_type_id, gti.consolidation_function_id, gtid.graph_template_input_id FROM graph_templates_item AS gti LEFT JOIN graph_template_input_defs AS gtid ON gtid.graph_template_item_id = gti.id AND gtid.graph_template_input_id = ? LEFT JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id LEFT JOIN data_local AS dl ON dtr.local_data_id = dl.id LEFT JOIN data_template_data AS dtd ON dl.id = dtd.local_data_id WHERE gti.local_graph_id = 0 AND gti.graph_template_id = ? ORDER BY gti.sequence", array(get_request_var('id'), get_request_var('graph_template_id'))); html_start_box(__('Associated Graph Items'), '100%', false, '3', 'center', ''); $i = 0; $any_selected_item = ''; if (cacti_sizeof($item_list)) { foreach ($item_list as $item) { form_alternate_row(); if ($item['graph_template_input_id'] == '') { $old_value = ''; } else { $old_value = 'on'; $any_selected_item = $item['graph_templates_item_id']; } if ($graph_item_types[$item['graph_type_id']] == 'GPRINT') { $start_bold = ''; $end_bold = ''; } else { $start_bold = ''; $end_bold = ''; } print ''; $i++; form_end_row(); } } else { print ''; } form_hidden_box('any_selected_item', $any_selected_item, ''); html_end_box(true, true); form_save_button('graph_templates.php?action=template_edit&id=' . get_request_var('graph_template_id')); } cacti-release-1.2.19/graph_templates_items.php000066400000000000000000000626721413633772300214240ustar00rootroot00000000000000 array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '4', 'text_format' => __('Cur:'), 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => __('Avg:'), 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => __('Max:'), 'hard_return' => 'on' ) ); } elseif ($graph_item_types[get_nfilter_request_var('graph_type_id')] == 'LEGEND_CAMM') { /* this can be a major time saver when creating lots of graphs with the typical GPRINT LAST/AVERAGE/MAX legends */ $items = array( 0 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '4', 'text_format' => __('Cur:'), 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => __('Avg:'), 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '2', 'text_format' => __('Min:'), 'hard_return' => '' ), 3 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => __('Max:'), 'hard_return' => 'on' ) ); } $sequence = get_request_var('sequence'); foreach ($items as $item) { /* generate a new sequence if needed */ if (empty($sequence)) { $sequence = get_sequence($sequence, 'sequence', 'graph_templates_item', 'graph_template_id=' . get_request_var('graph_template_id') . ' AND local_graph_id=0'); } $save['id'] = get_request_var('graph_template_item_id'); $save['hash'] = get_hash_graph_template(get_request_var('graph_template_item_id'), 'graph_template_item'); $save['graph_template_id'] = get_request_var('graph_template_id'); $save['local_graph_id'] = 0; $save['task_item_id'] = form_input_validate(get_request_var('task_item_id'), 'task_item_id', '^[0-9]+$', true, 3); $save['color_id'] = form_input_validate((isset($item['color_id']) ? $item['color_id'] : get_request_var('color_id')), 'color_id', '', true, 3); /* if alpha is disabled, use invisible_alpha instead */ if (!isset_request_var('alpha')) { set_request_var('alpha', get_nfilter_request_var('invisible_alpha')); } $save['alpha'] = form_input_validate((isset($item['alpha']) ? $item['alpha'] : get_nfilter_request_var('alpha')), 'alpha', '', true, 3); $save['graph_type_id'] = form_input_validate((isset($item['graph_type_id']) ? $item['graph_type_id'] : get_filter_request_var('graph_type_id')), 'graph_type_id', '^[0-9]+$', true, 3); if (isset_request_var('line_width') || isset($item['line_width'])) { $save['line_width'] = form_input_validate((isset($item['line_width']) ? $item['line_width'] : get_nfilter_request_var('line_width')), 'line_width', '(^[0-9]+[\.,0-9]+$|^[0-9]+$)', true, 3); }else { # make sure to transfer old LINEx style into line_width on save switch ($save['graph_type_id']) { case GRAPH_ITEM_TYPE_LINE1: $save['line_width'] = 1; break; case GRAPH_ITEM_TYPE_LINE2: $save['line_width'] = 2; break; case GRAPH_ITEM_TYPE_LINE3: $save['line_width'] = 3; break; default: $save['line_width'] = 0; } } $save['dashes'] = form_input_validate((isset_request_var('dashes') ? get_nfilter_request_var('dashes') : ''), 'dashes', '^[0-9]+[,0-9]*$', true, 3); $save['dash_offset'] = form_input_validate((isset_request_var('dash_offset') ? get_nfilter_request_var('dash_offset') : ''), 'dash_offset', '^[0-9]+$', true, 3); $save['cdef_id'] = form_input_validate(get_nfilter_request_var('cdef_id'), 'cdef_id', '^[0-9]+$', true, 3); $save['vdef_id'] = form_input_validate(get_nfilter_request_var('vdef_id'), 'vdef_id', '^[0-9]+$', true, 3); $save['shift'] = form_input_validate((isset_request_var('shift') ? get_nfilter_request_var('shift') : ''), 'shift', '^((on)|)$', true, 3); $save['consolidation_function_id'] = form_input_validate((isset($item['consolidation_function_id']) ? $item['consolidation_function_id'] : get_nfilter_request_var('consolidation_function_id')), 'consolidation_function_id', '^[0-9]+$', true, 3); $save['textalign'] = form_input_validate((isset_request_var('textalign') ? get_nfilter_request_var('textalign') : ''), 'textalign', '^[a-z]+$', true, 3); $save['text_format'] = form_input_validate((isset($item['text_format']) ? $item['text_format'] : get_nfilter_request_var('text_format')), 'text_format', '', true, 3); $save['value'] = form_input_validate(get_nfilter_request_var('value'), 'value', '', true, 3); $save['hard_return'] = form_input_validate(((isset($item['hard_return']) ? $item['hard_return'] : (isset_request_var('hard_return') ? get_nfilter_request_var('hard_return') : ''))), 'hard_return', '', true, 3); $save['gprint_id'] = form_input_validate(get_nfilter_request_var('gprint_id'), 'gprint_id', '^[0-9]+$', true, 3); $save['sequence'] = $sequence; if (!is_error_message()) { /* Before we save the item, let's get a look at task_item_id <-> input associations */ $orig_data_source_graph_inputs = db_fetch_assoc_prepared("SELECT gtin.id, gtin.name, gti.task_item_id FROM graph_template_input AS gtin INNER JOIN graph_template_input_defs AS gtid ON gtin.id = gtid.graph_template_input_id INNER JOIN graph_templates_item AS gti ON gtid.graph_template_item_id = gti.id WHERE gtin.graph_template_id = ? AND gtin.column_name = 'task_item_id' GROUP BY gti.task_item_id", array($save['graph_template_id'])); $orig_data_source_to_input = array_rekey($orig_data_source_graph_inputs, 'task_item_id', 'id'); $graph_template_item_id = sql_save($save, 'graph_templates_item'); if ($graph_template_item_id) { raise_message(1); if (!empty($save['task_item_id'])) { /* old item clean-up. Don't delete anything if the item <-> task_item_id association remains the same. */ if (get_nfilter_request_var('_task_item_id') != get_nfilter_request_var('task_item_id')) { /* It changed. Delete any old associations */ db_execute_prepared('DELETE FROM graph_template_input_defs WHERE graph_template_item_id = ?', array($graph_template_item_id)); /* Input for current data source exists and has changed. Update the association */ if (isset($orig_data_source_to_input[$save['task_item_id']])) { db_execute_prepared('REPLACE INTO graph_template_input_defs (graph_template_input_id, graph_template_item_id) VALUES (?, ?)', array($orig_data_source_to_input[$save['task_item_id']], $graph_template_item_id)); } } /* an input for the current data source does NOT currently exist, let's create one */ if (!isset($orig_data_source_to_input[$save['task_item_id']])) { $ds_name = db_fetch_cell_prepared('SELECT data_source_name FROM data_template_rrd WHERE id = ?', array(get_nfilter_request_var('task_item_id'))); db_execute_prepared("REPLACE INTO graph_template_input (hash, graph_template_id, name, column_name) VALUES (?, ?, ?, 'task_item_id')", array(get_hash_graph_template(0, 'graph_template_input'), $save['graph_template_id'], "Data Source [$ds_name]")); $graph_template_input_id = db_fetch_insert_id(); $graph_items = db_fetch_assoc_prepared('SELECT id FROM graph_templates_item WHERE graph_template_id = ? AND task_item_id = ?', array($save['graph_template_id'], get_nfilter_request_var('task_item_id'))); if (cacti_sizeof($graph_items)) { foreach ($graph_items as $graph_item) { db_execute_prepared('REPLACE INTO graph_template_input_defs (graph_template_input_id, graph_template_item_id) VALUES (?, ?)', array($graph_template_input_id, $graph_item['id'])); } } } } push_out_graph_item($graph_template_item_id); if (isset($orig_data_source_to_input[get_nfilter_request_var('task_item_id')])) { /* make sure all current graphs using this graph input are aware of this change */ push_out_graph_input($orig_data_source_to_input[get_nfilter_request_var('task_item_id')], $graph_template_item_id, array($graph_template_item_id => $graph_template_item_id)); } } else { raise_message(2); } } $sequence = 0; } if (is_error_message()) { header('Location: graph_templates_items.php?header=false&action=item_edit&graph_template_item_id=' . (empty($graph_template_item_id) ? get_nfilter_request_var('graph_template_item_id') : $graph_template_item_id) . '&id=' . get_nfilter_request_var('graph_template_id')); exit; } else { header('Location: graph_templates.php?header=false&action=template_edit&id=' . get_nfilter_request_var('graph_template_id')); exit; } } } /* ----------------------- item - Graph Items ----------------------- */ function item_movedown() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ global $graph_item_types; $arr = get_graph_group(get_request_var('id')); $next_id = get_graph_parent(get_request_var('id'), 'next'); $graph_type = db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); $text_type = $graph_item_types[$graph_type]; if (!empty($next_id) && isset($arr[get_request_var('id')])) { move_graph_group(get_request_var('id'), $arr, $next_id, 'next'); } elseif (!preg_match('/(AREA|STACK|LINE)/', $text_type)) { /* this is so we know the "other" graph item to propagate the changes to */ $next_item = get_item('graph_templates_item', 'sequence', get_request_var('id'), 'graph_template_id=' . get_request_var('graph_template_id') . ' AND local_graph_id=0', 'next'); move_item_down('graph_templates_item', get_request_var('id'), 'graph_template_id=' . get_request_var('graph_template_id') . ' AND local_graph_id=0'); } if (!isempty_request_var('graph_template_id')) { resequence_graphs(get_request_var('graph_template_id'), -1); } } function item_moveup() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ global $graph_item_types; $arr = get_graph_group(get_request_var('id')); $next_id = get_graph_parent(get_request_var('id'), 'previous'); $graph_type = db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); $text_type = $graph_item_types[$graph_type]; if (!empty($next_id) && isset($arr[get_request_var('id')])) { move_graph_group(get_request_var('id'), $arr, $next_id, 'previous'); } elseif (!preg_match('/(AREA|STACK|LINE)/', $text_type)) { /* this is so we know the "other" graph item to propagate the changes to */ $last_item = get_item('graph_templates_item', 'sequence', get_request_var('id'), 'graph_template_id=' . get_request_var('graph_template_id') . ' AND local_graph_id=0', 'previous'); move_item_up('graph_templates_item', get_request_var('id'), 'graph_template_id=' . get_request_var('graph_template_id') . ' AND local_graph_id=0'); } if (!isempty_request_var('graph_template_id')) { resequence_graphs(get_request_var('graph_template_id'), -1); } } function item_remove() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ db_execute_prepared('DELETE FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); db_execute_prepared('DELETE FROM graph_templates_item WHERE local_graph_template_item_id = ?', array(get_request_var('id'))); /* delete the graph item input if it is empty */ $graph_item_inputs = db_fetch_assoc_prepared('SELECT graph_template_input.id FROM (graph_template_input, graph_template_input_defs) WHERE graph_template_input.id = graph_template_input_defs.graph_template_input_id AND graph_template_input.graph_template_id = ? AND graph_template_input_defs.graph_template_item_id = ? GROUP BY graph_template_input.id', array(get_request_var('graph_template_id'), get_request_var('id'))); if (cacti_sizeof($graph_item_inputs) > 0) { foreach ($graph_item_inputs as $graph_item_input) { if (cacti_sizeof(db_fetch_assoc_prepared('SELECT graph_template_input_id FROM graph_template_input_defs WHERE graph_template_input_id = ?', array($graph_item_input['id']))) == 1) { db_execute_prepared('DELETE FROM graph_template_input WHERE id = ?', array($graph_item_input['id'])); } } } db_execute_prepared('DELETE FROM graph_template_input_defs WHERE graph_template_item_id = ?', array(get_request_var('id'))); } function item_edit() { global $struct_graph_item, $graph_item_types, $consolidation_functions; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ form_start('graph_templates_items.php', 'graph_items'); $header_label = __esc('Graph Template Items [edit graph: %s]', db_fetch_cell_prepared('SELECT name FROM graph_templates WHERE id = ?', array(get_request_var('graph_template_id')))); html_start_box($header_label, '100%', true, '3', 'center', ''); if (!isempty_request_var('id')) { $template_item = db_fetch_row_prepared('SELECT * FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); } /* by default, select the LAST DS chosen to make everyone's lives easier */ if (!isempty_request_var('graph_template_id')) { $default = db_fetch_row_prepared('SELECT task_item_id FROM graph_templates_item WHERE graph_template_id = ? AND local_graph_id = 0 ORDER BY sequence DESC', array(get_request_var('graph_template_id'))); if (cacti_sizeof($default) > 0) { $struct_graph_item['task_item_id']['default'] = $default['task_item_id']; } else { $struct_graph_item['task_item_id']['default'] = 0; } } /* modifications to the default graph items array */ $struct_graph_item['task_item_id']['sql'] = "SELECT CONCAT_WS('',data_template.name,' - ',' (',data_template_rrd.data_source_name,')') AS name, data_template_rrd.id FROM (data_template_data,data_template_rrd,data_template) WHERE data_template_rrd.data_template_id=data_template.id AND data_template_data.data_template_id=data_template.id AND data_template_data.local_data_id=0 AND data_template_rrd.local_data_id=0 ORDER BY data_template.name,data_template_rrd.data_source_name"; $form_array = array(); foreach ($struct_graph_item as $field_name => $field_array) { $form_array += array($field_name => $struct_graph_item[$field_name]); $form_array[$field_name]['value'] = (isset($template_item) ? $template_item[$field_name] : ''); $form_array[$field_name]['form_id'] = (isset($template_item) ? $template_item['id'] : '0'); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(true, true); form_hidden_box('graph_template_item_id', (isset($template_item) ? $template_item['id'] : '0'), ''); form_hidden_box('graph_template_id', get_request_var('graph_template_id'), '0'); form_hidden_box('_graph_type_id', (isset($template_item) ? $template_item['graph_type_id'] : '0'), ''); form_hidden_box('_task_item_id', (isset($template_item) ? $template_item['task_item_id'] : '0'), ''); form_hidden_box('save_component_item', '1', ''); form_hidden_box('invisible_alpha', $form_array['alpha']['value'], 'FF'); form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); form_save_button('graph_templates.php?action=template_edit&id=' . get_request_var('graph_template_id')); ?> 0 WHERE gtg.title_cache LIKE ? OR h.description LIKE ? OR h2.description LIKE ? OR h.hostname LIKE ? OR h2.hostname LIKE ? OR gti.title LIKE ?", array($filter, $filter, $filter, $filter, $filter, $filter)); } else { $matching = db_fetch_assoc("SELECT parent, graph_tree_id FROM graph_tree_items"); } if (cacti_sizeof($matching)) { foreach($matching as $row) { while ($row['parent'] != '0') { $match[] = 'tbranch-' . $row['parent']; $row = db_fetch_row_prepared('SELECT parent, graph_tree_id FROM graph_tree_items WHERE id = ?', array($row['parent'])); if (!cacti_sizeof($row)) { break; } } if (cacti_sizeof($row)) { $match[] = 'tree_anchor-' . $row['graph_tree_id']; $my_matches[] = array_reverse($match); $match = array(); } } // Now flatten the list of nodes $final_array = array(); $level = 0; while (true) { $found = 0; foreach($my_matches as $match) { if (isset($match[$level])) { if ($level == 0) { $final_array[$match[$level]][$match[$level]] = 1; } else { $final_array[$match[0]][$match[$level]] = 1; } $found++; } } $level++; if ($found == 0) { break; } } if (cacti_sizeof($final_array)) { $fa = array(); foreach($final_array as $key => $matches) { foreach($matches as $branch => $dnc) { $fa[] = $branch; } } } header('Content-Type: application/json; charset=utf-8'); print json_encode($fa); } } switch (get_nfilter_request_var('action')) { case 'ajax_hosts': get_allowed_ajax_hosts(); break; case 'ajax_search': get_matching_nodes(); exit; break; case 'ajax_reports': // Add to a report get_filter_request_var('report_id'); get_filter_request_var('timespan'); get_filter_request_var('align'); if (isset_request_var('graph_list')) { $items = explode(',', get_request_var('graph_list')); if (cacti_sizeof($items)) { $good = true; foreach($items as $item) { if (!reports_add_graphs(get_filter_request_var('report_id'), $item, get_request_var('timespan'), get_request_var('align'))) { raise_message('reports_add_error'); $good = false; break; } } if ($good) { raise_message('reports_graphs_added'); } } } else { raise_message('reports_no_graph'); } header('Location: graph_view.php?action=list&header=false'); break; case 'update_timespan': // we really don't need to do anything. The session variables have already been updated break; case 'save': if (is_view_allowed('graph_settings')) { get_filter_request_var('columns'); get_filter_request_var('predefined_timespan'); get_filter_request_var('predefined_timeshift'); get_filter_request_var('graphs'); get_filter_request_var('thumbnails', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '(true|false)'))); if (isset_request_var('predefined_timespan')) { set_graph_config_option('default_timespan', get_request_var('predefined_timespan')); } if (isset_request_var('predefined_timeshift')) { set_graph_config_option('default_timeshift', get_request_var('predefined_timeshift')); } if (isset_request_var('section') && get_nfilter_request_var('section') == 'preview') { if (isset_request_var('columns')) { set_graph_config_option('num_columns', get_request_var('columns')); } if (isset_request_var('graphs')) { set_graph_config_option('preview_graphs_per_page', get_request_var('graphs')); } if (isset_request_var('thumbnails')) { set_graph_config_option('thumbnail_section_preview', get_nfilter_request_var('thumbnails') == 'true' ? 'on':''); } } else { if (isset_request_var('columns')) { set_graph_config_option('num_columns_tree', get_request_var('columns')); } if (isset_request_var('graphs')) { set_graph_config_option('treeview_graphs_per_page', get_request_var('graphs')); } if (isset_request_var('thumbnails')) { set_graph_config_option('thumbnail_section_tree_2', get_request_var('thumbnails') == 'true' ? 'on':''); } } } break; case 'tree': html_validate_tree_vars(); if (isset_request_var('tree_id')) { $_SESSION['sess_tree_id'] = get_filter_request_var('tree_id'); } top_graph_header(); ?> 0) { $ndata = explode('-', get_nfilter_request_var('id')); $tree_id = $ndata[1]; input_validate_input_number($tree_id); } } else { $tree_id = read_user_setting('default_tree_id'); } if (isset_request_var('id') && get_nfilter_request_var('id') != '#') { if (substr_count(get_nfilter_request_var('id'), 'tree_anchor')) { $parent = -1; } else { $ndata = explode('_', get_nfilter_request_var('id')); foreach($ndata as $node) { $pnode = explode('-', $node); if ($pnode[0] == 'tbranch') { $parent = $pnode[1]; input_validate_input_number($parent); $tree_id = db_fetch_cell_prepared('SELECT graph_tree_id FROM graph_tree_items WHERE id = ?', array($parent)); break; } } } } api_tree_get_main($tree_id, $parent); break; case 'tree_content': html_validate_tree_vars(); top_graph_header(); if (!is_view_allowed('show_tree')) { print "" . __('YOU DO NOT HAVE RIGHTS FOR TREE VIEW') . ''; exit; } if (!isempty_request_var('node')) { $_SESSION['sess_graph_node'] = sanitize_search_string(get_nfilter_request_var('node')); if (!isempty_request_var('hgd')) { $_SESSION['sess_graph_hgd'] = sanitize_search_string(get_nfilter_request_var('hgd')); } else { $_SESSION['sess_graph_hgd'] = ''; } } elseif (isset($_SESSION['sess_graph_node'])) { set_request_var('node', $_SESSION['sess_graph_node']); set_request_var('hgd', $_SESSION['sess_graph_hgd']); } ?> 0) { if (!is_tree_allowed($tree_id)) { header('Location: permission_denied.php'); exit; } grow_right_pane_tree($tree_id, $node_id, $hgdata); } bottom_footer(); break; case 'preview': if (!is_view_allowed('show_preview')) { print "" . __('YOU DO NOT HAVE RIGHTS FOR PREVIEW VIEW') . ""; bottom_footer(); exit; } if (isset_request_var('external_id')) { $host_id = db_fetch_cell_prepared('SELECT id FROM host WHERE external_id = ?', array(get_nfilter_request_var('external_id'))); if (!empty($host_id)) { set_request_var('host_id', $host_id); set_request_var('reset',true); } } html_graph_validate_preview_request_vars(); top_graph_header(); /* include graph view filter selector */ html_start_box(__('Graph Preview Filters') . (isset_request_var('style') && get_request_var('style') != '' ? ' ' . __('[ Custom Graph List Applied - Filtering from List ]'):''), '100%', '', '3', 'center', ''); html_graph_preview_filter('graph_view.php', 'preview'); html_end_box(); /* the user select a bunch of graphs of the 'list' view and wants them displayed here */ $sql_or = ''; if (isset_request_var('style')) { if (get_request_var('style') == 'selective') { $graph_list = array(); /* process selected graphs */ if (!isempty_request_var('graph_list')) { foreach (explode(',', get_request_var('graph_list')) as $item) { if (is_numeric($item)) { $graph_list[$item] = 1; } } } if (!isempty_request_var('graph_add')) { foreach (explode(',', get_request_var('graph_add')) as $item) { if (is_numeric($item)) { $graph_list[$item] = 1; } } } /* remove items */ if (!isempty_request_var('graph_remove')) { foreach (explode(',', get_request_var('graph_remove')) as $item) { unset($graph_list[$item]); } } $i = 0; foreach ($graph_list as $item => $value) { $graph_array[$i] = $item; $i++; } if ((isset($graph_array)) && (cacti_sizeof($graph_array) > 0)) { /* build sql string including each graph the user checked */ $sql_or = array_to_sql_or($graph_array, 'gtg.local_graph_id'); } } } $total_graphs = 0; /* create filter for sql */ $sql_where = ''; if (!isempty_request_var('rfilter')) { $sql_where .= " gtg.title_cache RLIKE " . db_qstr(get_request_var('rfilter')); } $sql_where .= ($sql_or != '' && $sql_where != '' ? ' AND ':'') . $sql_or; if (!isempty_request_var('host_id') && get_request_var('host_id') > 0) { $sql_where .= (empty($sql_where) ? '' : ' AND') . ' gl.host_id=' . get_request_var('host_id'); } elseif (isempty_request_var('host_id')) { $sql_where .= (empty($sql_where) ? '' : ' AND') . ' gl.host_id=0'; } if (!isempty_request_var('graph_template_id') && get_request_var('graph_template_id') != '-1' && get_request_var('graph_template_id') != '0') { $sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . get_request_var('graph_template_id') . '))'; } elseif (get_request_var('graph_template_id') == '0') { $sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . get_request_var('graph_template_id') . '))'; } $limit = (get_request_var('graphs')*(get_request_var('page')-1)) . ',' . get_request_var('graphs'); $order = 'gtg.title_cache'; $graphs = get_allowed_graphs($sql_where, $order, $limit, $total_graphs); $nav = html_nav_bar('graph_view.php', MAX_DISPLAY_PAGES, get_request_var('page'), get_request_var('graphs'), $total_graphs, get_request_var('columns'), __('Graphs'), 'page', 'main'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); if (get_request_var('thumbnails') == 'true') { html_graph_thumbnail_area($graphs, '', 'graph_start=' . get_current_graph_start() . '&graph_end=' . get_current_graph_end(), '', get_request_var('columns')); } else { html_graph_area($graphs, '', 'graph_start=' . get_current_graph_start() . '&graph_end=' . get_current_graph_end(), '', get_request_var('columns')); } html_end_box(); if ($total_graphs) { print $nav; } if (!isset_request_var('header') || get_nfilter_request_var('header') == 'false') { bottom_footer(); } break; case 'list': global $graph_timespans, $alignment, $graph_sources; if (!is_view_allowed('show_list')) { print "" . __('YOU DO NOT HAVE RIGHTS FOR LIST VIEW') . ''; bottom_footer(); exit; } /* reset the graph list on a new viewing */ if (!isset_request_var('page')) { set_request_var('graph_list', ''); } /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'rfilter' => array( 'filter' => FILTER_VALIDATE_IS_REGEX, 'pageset' => true, 'default' => '', ), 'graph_template_id' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'pageset' => true, 'default' => '-1' ), 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'graph_add' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'default' => '' ), 'graph_list' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'default' => '' ), 'graph_remove' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_gl'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } $graph_list = array(); /* save selected graphs into url */ if (!isempty_request_var('graph_list')) { foreach (explode(',', get_request_var('graph_list')) as $item) { if (is_numeric($item)) { $graph_list[$item] = 1; } } } if (!isempty_request_var('graph_add')) { foreach (explode(',', get_request_var('graph_add')) as $item) { if (is_numeric($item)) { $graph_list[$item] = 1; } } } /* remove items */ if (!isempty_request_var('graph_remove')) { foreach (explode(',', get_request_var('graph_remove')) as $item) { unset($graph_list[$item]); } } /* update the revised graph list session variable */ if (cacti_sizeof($graph_list)) { set_request_var('graph_list', implode(',', array_keys($graph_list))); } load_current_session_value('graph_list', 'sess_gl_graph_list', ''); $reports = db_fetch_assoc_prepared('SELECT * FROM reports WHERE user_id = ?', array($_SESSION['sess_user_id'])); top_graph_header(); form_start('graph_view.php', 'chk'); /* display graph view filter selector */ html_start_box(__('Graph List View Filters') . (isset_request_var('style') && get_request_var('style') != '' ? ' ' . __('[ Custom Graph List Applied - Filter FROM List ]'):''), '100%', '', '3', 'center', ''); ?> 0) { $sql_where .= ($sql_where == '' ? '' : ' AND') . ' gl.host_id=' . get_request_var('host_id'); } elseif (isempty_request_var('host_id')) { $sql_where .= ($sql_where == '' ? '' : ' AND') . ' gl.host_id=0'; } if (!isempty_request_var('graph_template_id') && get_request_var('graph_template_id') != '-1' && get_request_var('graph_template_id') != '0') { $sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . get_request_var('graph_template_id') . '))'; } elseif (get_request_var('graph_template_id') == '0') { $sql_where .= ($sql_where != '' ? ' AND ':'') . ' (gl.graph_template_id IN (' . get_request_var('graph_template_id') . '))'; } $total_rows = 0; $limit = ($rows*(get_request_var('page')-1)) . ',' . $rows; $graphs = get_allowed_graphs($sql_where, 'gtg.title_cache', $limit, $total_rows); $nav = html_nav_bar('graph_view.php?action=list', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('Graphs'), 'page', 'main'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); if (is_realm_allowed(10)) { $display_text = array( 'title_cache' => array( 'display' => __('Graph Name'), 'align' => 'left', 'tip' => __('The Title of this Graph. Generally programatically generated from the Graph Template definition or Suggested Naming rules. The max length of the Title is controlled under Settings->Visual.') ), 'local_graph_id' => array( 'display' => __('Device'), 'align' => 'left', 'tip' => __('The device for this Graph.') ), 'source' => array( 'display' => __('Source Type'), 'align' => 'right', 'tip' => __('The underlying source that this Graph was based upon.') ), 'name' => array( 'display' => __('Source Name'), 'align' => 'left', 'tip' => __('The Graph Template or Data Query that this Graph was based upon.') ), 'height' => array( 'display' => __('Size'), 'align' => 'left', 'tip' => __('The size of this Graph when not in Preview mode.') ) ); } else { $display_text = array( 'title_cache' => array( 'display' => __('Graph Name'), 'align' => 'left', 'tip' => __('The Title of this Graph. Generally programatically generated from the Graph Template definition or Suggested Naming rules. The max length of the Title is controlled under Settings->Visual.') ), 'height' => array( 'display' => __('Size'), 'align' => 'left', 'tip' => __('The size of this Graph when not in Preview mode.') ) ); } html_header_checkbox($display_text, false); $i = 0; if (cacti_sizeof($graphs)) { foreach ($graphs as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ $template_details = get_graph_template_details($graph['local_graph_id']); if($graph['graph_source'] == '0') { //Not Templated, customize graph source and template details. $template_details = api_plugin_hook_function('customize_template_details', $template_details); $graph = api_plugin_hook_function('customize_graph', $graph); } if (isset($template_details['graph_name'])) { $graph['name'] = $template_details['graph_name']; } if (isset($template_details['graph_description'])) { $graph['description'] = $template_details['graph_description']; } form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell(filter_value($graph['title_cache'], get_request_var('rfilter'), 'graph.php?local_graph_id=' . $graph['local_graph_id'] . '&rra_id=0'), $graph['local_graph_id']); if (is_realm_allowed(10)) { form_selectable_ecell($graph['description'], $graph['local_graph_id']); form_selectable_cell(filter_value($graph_sources[$template_details['source']], get_request_var('rfilter')), $graph['local_graph_id'], '', 'right'); form_selectable_cell(filter_value($template_details['name'], get_request_var('rfilter'), $template_details['url']), $graph['local_graph_id'], '', 'left'); } form_selectable_ecell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id']); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } } html_end_box(false); if (cacti_sizeof($graphs)) { print $nav; } form_end(); $report_text = ''; if (cacti_sizeof($reports)) { $report_text = '

    " . __('Click \'Continue\' to Synchronize your Graphs with the following Graph Template(s). This function is important if you have Graphs that exist with multiple versions of a Graph Template and wish to make them all common in appearance.') . "

      $graph_list
    $save_html
    '> ' href=''>
    " . __('No Inputs') . "
    '> > ' title=''> ' title=''>
    " . __('No Graph Templates Found') . "
    '; $name = $start_bold . __('Item #%s', $i+1) . ': ' . $graph_item_types[$item['graph_type_id']] . ' (' . $consolidation_functions[$item['consolidation_function_id']] . ')' . $end_bold; form_checkbox('i_' . $item['graph_templates_item_id'], $old_value, '', '', '', get_request_var('graph_template_id')); print "'; print '
    ' . __('No Items') . '
    '> ' title=''> ' title='' onClick='clearFilter()'> ' title='' onClick='viewGraphs()'> ' title=''>
    '>
    '; $report_text .= ''; $report_text .= ''; $report_text .= ''; $report_text .= ''; $report_text .= ''; $report_text .= ''; $report_text .= '
    ' . __('Report Name') . '
    ' . __('Timespan') . '
    ' . __('Align') . '
    '; } ?>
     
    ' title='' onClick='viewGraphs()'>
    \n"; print " " . __('Summary Details') . " " . __('Download') . " \n"; print " " . __('Title') . " " . html_escape($xport_array['meta']['title_cache']) . " \n"; print " " . __('Vertical Label') . " " . html_escape($xport_array['meta']['vertical_label']) . " \n"; print " " . __('Start Date') . " " . date('Y-m-d H:i:s', $xport_array['meta']['start']) . " \n"; print " " . __('End Date') . " " . date('Y-m-d H:i:s', ($xport_array['meta']['end'] == $xport_array['meta']['start']) ? $xport_array['meta']['start'] + $xport_array['meta']['step']*($xport_array['meta']['rows']-1) : $xport_array['meta']['end']) . " \n"; print " " . __('Step') . " " . $xport_array['meta']['step'] . " \n"; print " " . __('Total Rows') . " " . $xport_array['meta']['rows'] . " \n"; print " " . __('Graph ID') . " " . $xport_array['meta']['local_graph_id'] . " \n"; print " " . __('Host ID') . " " . $xport_array['meta']['host_id'] . " \n"; $class = 'even'; if (isset($xport_meta['NthPercentile'])) { foreach($xport_meta['NthPercentile'] as $item) { if ($class == 'even') { $class = 'odd'; } else { $class = 'even'; } print " " . __('Nth Percentile') . ' [ ' . html_escape($item['format']) . " ] " . html_escape($item['value']) . " \n"; } } if (isset($xport_meta['Summation'])) { foreach($xport_meta['Summation'] as $item) { if ($class == 'even') { $class = 'odd'; } else { $class = 'even'; } print " " . __('Summation') . ' [ ' . html_escape($item['format']) . " ] " . html_escape($item['value']) . " \n"; } } print "
    \n"; print "
    \n"; print "\n"; } } /* log the memory usage */ cacti_log("The Peak Graph XPORT Memory Usage was '" . memory_get_peak_usage() . "'", false, 'WEBUI', POLLER_VERBOSITY_MEDIUM); cacti-release-1.2.19/graphs.php000066400000000000000000002545151413633772300163270ustar00rootroot00000000000000 __('Delete'), ); if ((get_nfilter_request_var('template_id') != '' && get_nfilter_request_var('template_id') != '-1' && get_nfilter_request_var('template_id') != '0') || get_nfilter_request_var('drp_action') == 2) { $graph_actions += array( 2 => __('Change Graph Template'), ); } $graph_actions += array( 5 => __('Change Device'), 6 => __('Reapply Suggested Names'), 11 => __('Place Graphs on Report'), 9 => __('Create Aggregate Graph'), 10 => __('Create Aggregate from Template'), 8 => __('Apply Automation Rules') ); if (read_config_option('grds_creation_method') == 1) { $graph_actions += array( 3 => __('Duplicate'), 4 => __('Convert to Graph Template') ); } $graph_actions = api_plugin_hook_function('graphs_action_array', $graph_actions); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'item': top_header(); item(); bottom_footer(); break; case 'ajax_graph_items': get_ajax_graph_items(); break; case 'ajax_hosts': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(true, 'applyFilter', $sql_where); break; case 'ajax_hosts_noany': $sql_where = ''; if (get_request_var('site_id') > 0) { $sql_where = 'site_id = ' . get_request_var('site_id'); } get_allowed_ajax_hosts(false, 'applyFilter', $sql_where); break; case 'lock': case 'unlock': $_SESSION['sess_graph_lock_id'] = get_filter_request_var('id'); $_SESSION['sess_graph_locked'] = (get_request_var('action') == 'lock' ? true:false); case 'graph_edit': top_header(); graph_edit(); bottom_footer(); break; default: top_header(); validate_graph_request_vars(); graph_management(); bottom_footer(); break; } /* -------------------------- Global Form Functions -------------------------- */ function get_ajax_graph_items() { $rrd_id = get_filter_request_var('rrd_id'); $host_id = get_filter_request_var('host_id'); if ($host_id > 0) { $sql_where = ' AND data_local.host_id=' . $host_id; } else { $sql_where = ''; } if (get_request_var('term') != '') { $sql_where .= ' HAVING name LIKE "%' . trim(db_qstr(get_request_var('term')),"'") . '%"'; } $items = db_fetch_assoc_prepared("SELECT * FROM (SELECT data_template_rrd.id AS id, CONCAT_WS('', CASE WHEN host.description IS NULL THEN '" . __esc('No Device - ') . "' WHEN host.description IS NOT NULL THEN '' END, data_template_data.name_cache,' (',data_template_rrd.data_source_name,')') AS name FROM (data_template_data,data_template_rrd,data_local) LEFT JOIN host ON (data_local.host_id=host.id) WHERE data_template_rrd.local_data_id=data_local.id AND data_template_data.local_data_id=data_local.id AND data_template_rrd.id = ? ) AS a UNION SELECT * FROM (SELECT data_template_rrd.id AS id, CONCAT_WS('', CASE WHEN host.description IS NULL THEN '" . __esc('No Device - ') . "' WHEN host.description IS NOT NULL THEN '' END, data_template_data.name_cache,' (',data_template_rrd.data_source_name,')') AS name FROM (data_template_data,data_template_rrd,data_local) LEFT JOIN host ON (data_local.host_id=host.id) WHERE data_template_rrd.local_data_id=data_local.id AND data_template_data.local_data_id=data_local.id $sql_where ORDER BY name ) AS b LIMIT " . read_config_option('autocomplete_rows'), array($rrd_id)); foreach($items as $key => $item) { $items[$key]['label'] = $item['name']; } print json_encode($items); } function add_tree_names_to_actions_array() { global $graph_actions; /* add a list of tree names to the actions dropdown */ $trees = db_fetch_assoc('SELECT id, name FROM graph_tree ORDER BY name'); if (cacti_sizeof($trees)) { foreach ($trees as $tree) { $graph_actions['tr_' . $tree['id']] = __esc('Place on a Tree (%s)', $tree['name']); } } } /* -------------------------- The Save Function -------------------------- */ function parse_validate_graph_template_id($variable) { $output_type_id = 0; if (strpos(get_nfilter_request_var($variable), '_') !== false) { $template_parts = explode('_', get_nfilter_request_var($variable)); if (is_numeric($template_parts[0]) && is_numeric($template_parts[1])) { set_request_var('graph_template_id', $template_parts[0]); $output_type_id = $template_parts[1]; } else { cacti_log('ERROR: Unable to parse graph_template_id with value ' . get_nfilter_request_var($variable), false, 'WEBUI'); exit; } } else { get_filter_request_var($variable); } return $output_type_id; } function form_save() { /* ================= input validation ================= */ get_filter_request_var('local_graph_id'); get_filter_request_var('host_id_prev'); get_filter_request_var('graph_template_graph_id'); get_filter_request_var('local_graph_template_graph_id'); /* ==================================================== */ /* handle special case of callback on host_id */ if (!is_numeric(get_nfilter_request_var('host_id'))) { set_request_var('host_id', get_request_var('host_id_prev')); } else { get_filter_request_var('host_id'); } $gt_id_unparsed = get_nfilter_request_var('graph_template_id'); $gt_id_prev_unparsed = get_nfilter_request_var('graph_template_id_prev'); parse_validate_graph_template_id('graph_template_id'); if (isset_request_var('save_component_graph_new') && !isempty_request_var('graph_template_id')) { $snmp_query_array = array(); $suggested_values = array(); $graph_template_id = get_request_var('graph_template_id'); $host_id = get_request_var('host_id'); $return_array = create_complete_graph_from_template($graph_template_id, $host_id, $snmp_query_array, $suggested_values); if ($return_array !== false) { debug_log_insert('new_graphs', __('Created graph: %s', get_graph_title($return_array['local_graph_id']))); /* lastly push host-specific information to our data sources */ if (cacti_sizeof($return_array['local_data_id'])) { # we expect at least one data source associated foreach($return_array['local_data_id'] as $item) { push_out_host($host_id, $item); } } else { debug_log_insert('new_graphs', __('ERROR: No Data Source associated. Check Template')); } } if (isset($return_array['local_graph_id'])) { $local_graph_id = $return_array['local_graph_id']; header('Location: graphs.php?action=graph_edit&header=false&id=' . $local_graph_id); } else { header('Location: graphs.php?header=false'); } exit; } if (isset_request_var('save_component_graph')) { if (get_filter_request_var('host_id') == '-1') { set_request_var('host_id', '0'); } $save1['id'] = get_nfilter_request_var('local_graph_id'); $save1['host_id'] = get_request_var('host_id'); $save1['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $save2['id'] = get_nfilter_request_var('graph_template_graph_id'); $save2['local_graph_template_graph_id'] = get_nfilter_request_var('local_graph_template_graph_id'); $save2['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $save2['image_format_id'] = form_input_validate(get_nfilter_request_var('image_format_id'), 'image_format_id', '^[0-9]+$', true, 3); $save2['title'] = form_input_validate(get_nfilter_request_var('title'), 'title', '', false, 3); $save2['height'] = form_input_validate(get_nfilter_request_var('height'), 'height', '^[0-9]+$', false, 3); $save2['width'] = form_input_validate(get_nfilter_request_var('width'), 'width', '^[0-9]+$', false, 3); $save2['upper_limit'] = form_input_validate(get_nfilter_request_var('upper_limit'), 'upper_limit', "^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$", ((strlen(get_nfilter_request_var('upper_limit')) === 0) ? true : false), 3); $save2['lower_limit'] = form_input_validate(get_nfilter_request_var('lower_limit'), 'lower_limit', "^(-?([0-9]+(\.[0-9]*)?|[0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?)|U$", ((strlen(get_nfilter_request_var('lower_limit')) === 0) ? true : false), 3); $save2['vertical_label'] = form_input_validate(get_nfilter_request_var('vertical_label'), 'vertical_label', '', true, 3); $save2['slope_mode'] = form_input_validate((isset_request_var('slope_mode') ? get_nfilter_request_var('slope_mode') : ''), 'slope_mode', '', true, 3); $save2['auto_scale'] = form_input_validate((isset_request_var('auto_scale') ? get_nfilter_request_var('auto_scale') : ''), 'auto_scale', '', true, 3); $save2['auto_scale_opts'] = form_input_validate(get_nfilter_request_var('auto_scale_opts'), 'auto_scale_opts', '', true, 3); $save2['auto_scale_log'] = form_input_validate((isset_request_var('auto_scale_log') ? get_nfilter_request_var('auto_scale_log') : ''), 'auto_scale_log', '', true, 3); $save2['scale_log_units'] = form_input_validate((isset_request_var('scale_log_units') ? get_nfilter_request_var('scale_log_units') : ''), 'scale_log_units', '', true, 3); $save2['auto_scale_rigid'] = form_input_validate((isset_request_var('auto_scale_rigid') ? get_nfilter_request_var('auto_scale_rigid') : ''), 'auto_scale_rigid', '', true, 3); $save2['auto_padding'] = form_input_validate((isset_request_var('auto_padding') ? get_nfilter_request_var('auto_padding') : ''), 'auto_padding', '', true, 3); $save2['base_value'] = form_input_validate(get_nfilter_request_var('base_value'), 'base_value', '^[0-9]+$', false, 3); $save2['unit_value'] = form_input_validate(get_nfilter_request_var('unit_value'), 'unit_value', '', true, 3); $save2['unit_exponent_value'] = form_input_validate(get_nfilter_request_var('unit_exponent_value'), 'unit_exponent_value', '^-?[0-9]+$', true, 3); $save2['alt_y_grid'] = form_input_validate((isset_request_var('alt_y_grid') ? get_nfilter_request_var('alt_y_grid') : ''), 'alt_y_grid', '', true, 3); $save2['right_axis'] = form_input_validate((isset_request_var('right_axis') ? get_nfilter_request_var('right_axis') : ''), 'right_axis', '^-?([0-9]+(\.[0-9]*)?|\.[0-9]+):-?([0-9]+(\.[0-9]*)?|\.[0-9]+)$', true, 3); $save2['right_axis_label'] = form_input_validate((isset_request_var('right_axis_label') ? get_nfilter_request_var('right_axis_label') : ''), 'right_axis_label', '', true, 3); $save2['right_axis_format'] = form_input_validate((isset_request_var('right_axis_format') ? get_nfilter_request_var('right_axis_format') : ''), 'right_axis_format', '^[0-9]+$', true, 3); $save2['no_gridfit'] = form_input_validate((isset_request_var('no_gridfit') ? get_nfilter_request_var('no_gridfit') : ''), 'no_gridfit', '', true, 3); $save2['unit_length'] = form_input_validate((isset_request_var('unit_length') ? get_nfilter_request_var('unit_length') : ''), 'unit_length', '^[0-9]+$', true, 3); $save2['tab_width'] = form_input_validate((isset_request_var('tab_width') ? get_nfilter_request_var('tab_width') : ''), 'tab_width', '^[0-9]*$', true, 3); $save2['dynamic_labels'] = form_input_validate((isset_request_var('dynamic_labels') ? get_nfilter_request_var('dynamic_labels') : ''), 'dynamic_labels', '', true, 3); $save2['force_rules_legend'] = form_input_validate((isset_request_var('force_rules_legend') ? get_nfilter_request_var('force_rules_legend') : ''), 'force_rules_legend', '', true, 3); $save2['legend_position'] = form_input_validate((isset_request_var('legend_position') ? get_nfilter_request_var('legend_position') : ''), 'legend_position', '', true, 3); $save2['legend_direction'] = form_input_validate((isset_request_var('legend_direction') ? get_nfilter_request_var('legend_direction') : ''), 'legend_direction', '', true, 3); $save2['right_axis_formatter'] = form_input_validate((isset_request_var('right_axis_formatter') ? get_nfilter_request_var('right_axis_formatter') : ''), 'right_axis_formatter', '', true, 3); $save2['left_axis_formatter'] = form_input_validate((isset_request_var('left_axis_formatter') ? get_nfilter_request_var('left_axis_formatter') : ''), 'left_axis_formatter', '', true, 3); if (!is_error_message()) { $local_graph_id = sql_save($save1, 'graph_local'); } if (!is_error_message()) { $save2['local_graph_id'] = $local_graph_id; $graph_templates_graph_id = sql_save($save2, 'graph_templates_graph'); if ($graph_templates_graph_id) { raise_message(1); } else { raise_message(2); } /* update the title cache */ update_graph_title_cache($local_graph_id); /* if the host id changes, then update the graph items association too */ if (get_request_var('host_id') != get_request_var('host_id_prev')) { if (!api_graph_change_device($local_graph_id, get_request_var('host_id'))) { raise_message(34); } } } if (!is_error_message()) { $lg_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array($local_graph_id) ); if ($lg_template_id > 0) { change_graph_template($local_graph_id, $gt_id_unparsed); $lg_dq_id = db_fetch_cell_prepared('SELECT snmp_query_id FROM graph_local WHERE id = ?', array($local_graph_id) ); if ($lg_dq_id > 0) { update_graph_data_query_cache($local_graph_id); } } } } if (isset_request_var('save_component_input')) { /* ================= input validation ================= */ get_filter_request_var('local_graph_id'); /* ==================================================== */ /* first; get the current graph template id */ $graph_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array(get_nfilter_request_var('local_graph_id'))); /* get all inputs that go along with this graph template, if templated */ if ($graph_template_id > 0) { $input_list = db_fetch_assoc_prepared('SELECT id, column_name FROM graph_template_input WHERE graph_template_id = ?', array($graph_template_id)); if (cacti_sizeof($input_list)) { foreach ($input_list as $input) { /* we need to find out which graph items will be affected by saving this particular item */ $item_list = db_fetch_assoc_prepared('SELECT gti.id FROM graph_template_input_defs AS gtid INNER JOIN graph_templates_item AS gti ON gtid.graph_template_item_id=gti.local_graph_template_item_id WHERE gti.local_graph_id = ? AND gtid.graph_template_input_id = ?', array(get_nfilter_request_var('local_graph_id'), $input['id'])); /* loop through each item affected and update column data */ if (cacti_sizeof($item_list)) { foreach ($item_list as $item) { /* if we are changing templates, the POST vars we are searching for here will not exist. this is because the db and form are out of sync here, but it is ok to just skip over saving the inputs in this case. */ if (isset_request_var($input['column_name'] . '_' . $input['id'])) { db_execute_prepared('UPDATE graph_templates_item SET ' . $input['column_name'] . ' = ? WHERE id = ?', array(get_nfilter_request_var($input['column_name'] . '_' . $input['id']), $item['id'])); } } } } } } } if ((isset_request_var('save_component_graph_new')) && (isempty_request_var('graph_template_id'))) { header('Location: graphs.php?action=graph_edit&header=false&host_id=' . get_nfilter_request_var('host_id') . '&new=1'); } elseif ((is_error_message()) || (isempty_request_var('local_graph_id')) || (get_nfilter_request_var('graph_template_id') != get_nfilter_request_var('graph_template_id_prev')) || (get_nfilter_request_var('host_id') != get_nfilter_request_var('host_id_prev'))) { header('Location: graphs.php?action=graph_edit&header=false&id=' . (empty($local_graph_id) ? get_nfilter_request_var('local_graph_id') : $local_graph_id) . (isset_request_var('host_id') ? '&host_id=' . get_nfilter_request_var('host_id') : '')); } elseif (!empty($local_graph_id)) { header('Location: graphs.php?action=graph_edit&header=false&id=' . $local_graph_id); } else { header('Location: graphs.php?header=false'); } exit; } /* ------------------------ The "actions" function ------------------------ */ function get_current_graph_template($local_graph_id) { $graph_local = db_fetch_row_prepared('SELECT * FROM graph_local WHERE id = ?', array($local_graph_id)); $task_items = db_fetch_cell_prepared('SELECT GROUP_CONCAT(DISTINCT task_item_id) AS items FROM graph_templates_item WHERE local_graph_id = ?', array($local_graph_id)); if ($task_items != '') { $local_data_id = db_fetch_cell("SELECT DISTINCT local_data_id FROM data_template_rrd WHERE id IN($task_items)"); } else { $local_data_id = 0; } if ($local_data_id > 0) { $data = db_fetch_row_prepared('SELECT id, data_input_id, data_template_id, name, local_data_id FROM data_template_data WHERE local_data_id = ?', array($local_data_id)); /* get each INPUT field for this data input source */ $output_type_field_id = db_fetch_cell_prepared('SELECT id FROM data_input_fields WHERE data_input_id = ? AND input_output="in" AND type_code="output_type" ORDER BY sequence', array($data['data_input_id'])); $snmp_query_graph_id = db_fetch_cell_prepared('SELECT value FROM data_input_data WHERE data_template_data_id = ? AND data_input_field_id = ?', array($data['id'], $output_type_field_id)); if (!empty($snmp_query_graph_id)) { return $graph_local['graph_template_id'] . '_' . $snmp_query_graph_id; } else { return $graph_local['graph_template_id']; } } else { return $graph_local['graph_template_id']; } } function get_common_graph_templates(&$graph) { $dqid = 0; if (cacti_sizeof($graph)) { $dqid = db_fetch_cell_prepared('SELECT snmp_query_id FROM graph_local WHERE id = ?', array($graph['local_graph_id'])); } // Default in worst case $gtsql = 'SELECT gt.id, gt.name FROM graph_templates AS gt ORDER BY name'; if ($dqid > 0) { $sqgi = db_fetch_cell_prepared('SELECT GROUP_CONCAT(id) AS id FROM snmp_query_graph WHERE snmp_query_id = ? AND graph_template_id = ?', array($dqid, $graph['graph_template_id'])); if ($sqgi != '') { $query_fields = array_rekey(db_fetch_assoc_prepared('SELECT snmp_query_graph_id, GROUP_CONCAT(snmp_field_name ORDER BY snmp_field_name) AS columns FROM snmp_query_graph_rrd WHERE snmp_query_graph_id IN (' . $sqgi . ') GROUP BY snmp_query_graph_id'), 'snmp_query_graph_id', 'columns'); if (cacti_sizeof($query_fields)) { $ids = array_to_sql_or(array_values($query_fields), 'columns'); $common_graph_ids = array_rekey(db_fetch_assoc_prepared('SELECT snmp_query_graph_id, GROUP_CONCAT(snmp_field_name ORDER BY snmp_field_name) AS columns FROM snmp_query_graph_rrd GROUP BY snmp_query_graph_id HAVING ' . $ids), 'snmp_query_graph_id', 'columns'); if (cacti_sizeof($common_graph_ids)) { $ids = implode(',', array_keys($common_graph_ids)); $gtids = db_fetch_cell_prepared('SELECT GROUP_CONCAT(DISTINCT graph_template_id) AS gtids FROM snmp_query_graph WHERE snmp_query_id = ? AND id IN (' . $ids . ')', array($dqid)); if ($gtids != '') { $gtsql = "SELECT CONCAT_WS('', graph_template_id, '_', id, '') AS id, name FROM snmp_query_graph WHERE (snmp_query_id = $dqid AND id IN ($ids)) OR graph_template_id IN ($gtids) ORDER BY name"; } else { $gtsql = "SELECT CONCAT_WS('', graph_template_id, '_', id, '') AS id, name FROM snmp_query_graph WHERE (snmp_query_id = $dqid AND id IN ($ids)) ORDER BY name"; } } } } } return $gtsql; } function form_actions() { global $graph_actions, $struct_aggregate; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '1') { // delete if (!isset_request_var('delete_type')) { set_request_var('delete_type', 1); } api_delete_graphs($selected_items, get_filter_request_var('delete_type')); } elseif (get_request_var('drp_action') == '2') { // change graph template $gt_id_unparsed = get_nfilter_request_var('graph_template_id'); $gt_id_prev_unparsed = get_nfilter_request_var('graph_template_id_prev'); parse_validate_graph_template_id('graph_template_id'); for ($i=0;($i graph template for ($i=0;($i $data) { $item_new = array(); $item_new['aggregate_graph_id'] = $aggregate_graph_id; $item_new['graph_templates_item_id'] = $item_id; $item_new['color_template'] = isset($data['color_template']) ? $data['color_template'] : 0; $item_new['item_skip'] = isset($data['item_skip']) ? 'on' : ''; $item_new['item_total'] = isset($data['item_total']) ? 'on' : ''; $item_new['sequence'] = isset($data['sequence']) ? $data['sequence'] : 0; $aggregate_graph_items[] = $item_new; } aggregate_graph_items_save($aggregate_graph_items, 'aggregate_graphs_graph_item'); } else { $aggregate_graph_items = db_fetch_assoc_prepared('SELECT * FROM aggregate_graph_templates_item WHERE aggregate_template_id = ?', array($ag_data['aggregate_template_id'])); } $attribs = $ag_data; $attribs['graph_title'] = $ag_data['title_format']; $attribs['reorder'] = $ag_data['order_type']; $attribs['item_no'] = $item_no; $attribs['color_templates'] = array(); $attribs['skipped_items'] = array(); $attribs['total_items'] = array(); $attribs['graph_item_types']= array(); $attribs['cdefs'] = array(); foreach ($aggregate_graph_items as $item) { if (isset($item['color_template']) && $item['color_template'] > 0) { $attribs['color_templates'][ $item['sequence'] ] = $item['color_template']; } if (isset($item['item_skip']) && $item['item_skip'] == 'on') { $attribs['skipped_items'][ $item['sequence'] ] = $item['sequence']; } if (isset($item['item_total']) && $item['item_total'] == 'on') { $attribs['total_items'][ $item['sequence'] ] = $item['sequence']; } if (isset($item['cdef_id']) && isset($item['t_cdef_id']) && $item['t_cdef_id'] == 'on') { $attribs['cdefs'][ $item['sequence'] ] = $item['cdef_id']; } if (isset($item['graph_type_id']) && isset($item['t_graph_type_id']) && $item['t_graph_type_id'] == 'on') { $attribs['graph_item_types'][ $item['sequence'] ] = $item['graph_type_id']; } } /* create actual graph items */ aggregate_create_update($local_graph_id, $member_graphs, $attribs); header("Location: aggregate_graphs.php?header=false&action=edit&tab=details&id=$local_graph_id"); exit; } elseif (get_request_var('drp_action') == '8') { // automation cacti_log('automation_graph_action_execute called: ' . get_request_var('drp_action'), true, 'AUTM8 TRACE', POLLER_VERBOSITY_MEDIUM); /* work on all selected graphs */ for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $graph_list .= '
  • ' . html_escape(get_graph_title($matches[1])) . '
  • '; $graph_array[$i] = $matches[1]; if ($i == 0) { $graph = db_fetch_row_prepared('SELECT id AS local_graph_id, graph_template_id FROM graph_local WHERE id = ? LIMIT 1', array($matches[1])); } $i++; } } top_header(); /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); form_start('graphs.php'); html_start_box($graph_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($graph_array) && cacti_sizeof($graph_array)) { if (get_request_var('drp_action') == '1') { // delete /* find out which (if any) data sources are being used by this graph, so we can tell the user */ if (isset($graph_array) && cacti_sizeof($graph_array)) { $data_sources = array_rekey( db_fetch_assoc('SELECT DISTINCT dtd.local_data_id, dtd.name_cache FROM data_template_data AS dtd INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dtd.local_data_id INNER JOIN graph_templates_item AS gti ON dtr.id=gti.task_item_id WHERE ' . array_to_sql_or($graph_array, 'gti.local_graph_id') . ' AND dtd.local_data_id > 0'), 'local_data_id', array('local_data_id', 'name_cache')); /* data sources to delete */ $data_array = array_keys($data_sources); if (cacti_sizeof($data_array)) { $not_deletable = array_rekey( db_fetch_assoc('SELECT DISTINCT dtd.local_data_id FROM data_template_data AS dtd INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dtd.local_data_id INNER JOIN graph_templates_item AS gti ON dtr.id=gti.task_item_id WHERE gti.local_graph_id NOT IN(' . implode(',', $graph_array) . ') AND gti.local_graph_id NOT IN(SELECT local_graph_id FROM aggregate_graphs) AND dtr.local_data_id IN(' . implode(',', $data_array) . ') AND dtd.local_data_id > 0'), 'local_data_id', 'local_data_id'); } else { $not_deletable = array(); } if (cacti_sizeof($not_deletable)) { $data_sources = array_rekey( db_fetch_assoc('SELECT DISTINCT dtd.local_data_id, dtd.name_cache FROM data_template_data AS dtd INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dtd.local_data_id INNER JOIN graph_templates_item AS gti ON dtr.id=gti.task_item_id WHERE gti.local_graph_id IN (' . implode(',', $graph_array) . ') AND gti.local_graph_id NOT IN(SELECT local_graph_id FROM aggregate_graphs) AND dtr.local_data_id NOT IN (' . implode(',', $not_deletable) . ') AND dtd.local_data_id > 0'), 'local_data_id', array('local_data_id', 'name_cache')); } } print "

    " . __('Click \'Continue\' to delete the following Graph(s). Note that if you choose to Delete Data Sources, only those Data Sources not in use elsewhere will also be Deleted.') . "

      $graph_list
    "; if (isset($data_sources) && cacti_sizeof($data_sources)) { print "

    " . __('The following Data Source(s) are in use by these Graph(s).') . "

    \n"; print '
      '; foreach ($data_sources as $data_source) { print '
    • ' . html_escape($data_source['name_cache']) . "
    • \n"; } print '

    '; print ''; $ds_preselected_delete = read_config_option('ds_preselected_delete'); if ($ds_preselected_delete == 'on') { $delete_radio_button_1_state = '2'; $delete_radio_button_2_state = '1'; } else { $delete_radio_button_1_state = '1'; $delete_radio_button_2_state = '2'; } form_radio_button('delete_type', '2', $delete_radio_button_1_state , __('Delete all Data Source(s) referenced by these Graph(s) that are not in use elsewhere.'), '1'); print '
    '; form_radio_button('delete_type', '2', $delete_radio_button_2_state , __('Leave the Data Source(s) untouched.'), '1'); print '
    '; print '
    '; print ''; } print "\n"; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // change graph template print "

    " . __('Choose a Graph Template and click \'Continue\' to change the Graph Template for the following Graph(s). Please note, that only compatible Graph Templates will be displayed. Compatible is identified by those having identical Data Sources.') . "

      $graph_list

    " . __('New Graph Template') . "
    "; $gtsql = get_common_graph_templates($graph); form_dropdown('graph_template_id', db_fetch_assoc($gtsql), 'name', 'id', '', '', '0'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '3') { // duplicate print "

    " . __('Click \'Continue\' to duplicate the following Graph(s). You can optionally change the title format for the new Graph(s).') . "

      $graph_list

    " . __('Title Format') . "
    "; form_text_box('title_format', __(' (1)'), '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '4') { // graph -> graph template print "

    " . __('Click \'Continue\' to convert the following Graph(s) into Graph Template(s). You can optionally change the title format for the new Graph Template(s).') . "

      $graph_list

    " . __('Title Format') . "
    "; form_text_box('title_format', __(' Template'), '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } elseif (preg_match('/^tr_([0-9]+)$/', get_request_var('drp_action'), $matches)) { // place on tree print "

    " . __('Click \'Continue\' to place the following Graph(s) under the Tree Branch selected below.') . "

      $graph_list

    " . __('Destination Branch') . "
    "; grow_dropdown_tree($matches[1], '0', 'tree_item_id', '0'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '5') { // change host print "

    " . __('Choose a new Device for these Graph(s) and click \'Continue\'.') . "

      $graph_list

    " . __('New Device'). "
    "; form_dropdown('host_id',db_fetch_assoc("SELECT id,CONCAT_WS('',description,' (',hostname,')') as name FROM host ORDER BY description,hostname"),'name','id','','','0'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '6') { // reapply suggested naming to host print "

    " . __('Click \'Continue\' to re-apply suggested naming to the following Graph(s).') . "

      $graph_list
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '9') { include_once('./lib/api_aggregate.php'); /* initialize return code and graphs array */ $return_code = false; $data_sources = array(); $graph_template = ''; if (aggregate_get_data_sources($graph_array, $data_sources, $graph_template)) { # provide a new prefix for GPRINT lines $gprint_prefix = '|host_description|'; /* list affected graphs */ print ''; print "

    " . __('Click \'Continue\' to create an Aggregate Graph from the selected Graph(s).'). "

      " . get_nfilter_request_var('graph_list') . '
    '; /* list affected data sources */ print ''; if (cacti_sizeof($data_sources)) { print "" . '

    ' . __('The following Data Sources are in use by these Graphs:') . '

      '; foreach ($data_sources as $data_source) { print '
    • ' . html_escape($data_source['name_cache']) . '
    • '; } print '
    '; } print ''; print ''; $ttitle = $graph_array[0]; /* aggregate form */ $_aggregate_defaults = array( 'title_format' => auto_title($ttitle), 'graph_template_id' => $graph_template, 'gprint_prefix' => $gprint_prefix ); $helper_string = '|host_description|'; if ($graph_template > 0) { $data_query = db_fetch_cell_prepared('SELECT snmp_query_id FROM snmp_query_graph WHERE graph_template_id = ?', array($graph_template)); if ($data_query > 0) { $data_query_info = get_data_query_array($data_query); foreach($data_query_info['fields'] as $field_name => $field_array) { if ($field_array['direction'] == 'input' || $field_array['direction'] == 'input-output') { $helper_string .= ($helper_string != '' ? ', ':'') . '|query_' . $field_name . '|'; } } } } // Append the helper string $struct_aggregate['suggestions'] = array( 'method' => 'other', 'friendly_name' => __('Prefix Replacement Values'), 'description' => __('You may use these replacement values for the Prefix in the Aggregate Graph'), 'value' => $helper_string ); draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => inject_form_variables($struct_aggregate, $_aggregate_defaults) ) ); # draw all graph items of first graph, including a html_start_box draw_aggregate_graph_items_list(0, $graph_template); print ''; # again, a new html_start_box. Using the one from above would yield ugly formatted NO and YES buttons html_start_box(__('Please confirm'), '100%', '', '3', 'center', ''); ?>  "; } else { $save_html = ""; } } elseif (get_request_var('drp_action') == '10') { // aggregate template include_once('./lib/api_aggregate.php'); /* initialize return code and graphs array */ $data_sources = array(); $graph_template = ''; /* find out which (if any) data sources are being used by this graph, so we can tell the user */ if (aggregate_get_data_sources($graph_array, $data_sources, $graph_template)) { $aggregate_templates = db_fetch_assoc_prepared('SELECT id, name FROM aggregate_graph_templates WHERE graph_template_id = ? ORDER BY name', array($graph_template)); if (cacti_sizeof($aggregate_templates)) { /* list affected graphs */ print "

    " . __('Select the Aggregate Template to use and press \'Continue\' to create your Aggregate Graph. Otherwise press \'Cancel\' to return.') . "

      " . $graph_list . "
    \n"; print "
    " . __('Graph Title') . "
    " . __('Aggregate Template') . "
    \n"; $save_html = " "; } else { print "

    " . __('There are presently no Aggregate Templates defined for this Graph Template. Please either first create an Aggregate Template for the selected Graphs Graph Template and try again, or simply crease an un-templated Aggregate Graph.') . "

    " . __('Press \'Return\' to return and select different Graphs.') . "

    \n"; $save_html = ""; } } else { $save_html = ""; } } elseif (get_request_var('drp_action') == 8) { // automation print "

    " . __('Click \'Continue\' to apply Automation Rules to the following Graphs.') . "

      $graph_list
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '11') { global $alignment, $graph_timespans; $reports = db_fetch_assoc_prepared('SELECT id, name FROM reports WHERE user_id = ? ORDER BY name', array($_SESSION['sess_user_id'])); if (cacti_sizeof($reports)) { print "

    " . __('Click \'Continue\' to add the selected Graphs to the Report below.') . "

      $graph_list
    " . __('Report Name') . '
    '; form_dropdown('report_id', $reports, 'name', 'id', '', '', '0'); print ''; print '' . __('Timespan') . '
    '; form_dropdown('timespan',$graph_timespans, '', '', '', '', read_user_setting('default_timespan')); print ''; print '' . __('Align') . '
    '; form_dropdown('align',$alignment, '', '', '', '', REPORTS_ALIGN_CENTER); print "\n"; $save_html = " "; } else { print "" . __('You currently have no reports defined.') . "\n"; $save_html = ""; } } else { $save['drp_action'] = get_nfilter_request_var('drp_action'); $save['graph_list'] = $graph_list; $save['graph_array'] = (isset($graph_array) ? $graph_array : array()); api_plugin_hook_function('graphs_action_prepare', $save); $save_html = " "; } } else { raise_message(40); header('Location: graphs.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* ----------------------- item - Graph Items ----------------------- */ function item() { global $consolidation_functions, $graph_item_types, $struct_graph_item; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ if (isempty_request_var('id')) { $template_item_list = array(); $header_label = __('Graph Items [new]'); $add_text = ''; $anchor_link = ''; } else { $template_item_list = db_fetch_assoc_prepared("SELECT gti.id, gti.text_format, gti.value, gti.hard_return, gti.graph_type_id, gti.alpha, gti.textalign, gti.consolidation_function_id, gti.sequence, CONCAT(dtd.name_cache, ' (', dtr.data_source_name, ')') AS data_source_name, cd.name AS cdef_name, c.hex, vd.name AS vdef_name, gtgp.name AS gprint_name FROM graph_templates_item AS gti LEFT JOIN data_template_rrd AS dtr ON (gti.task_item_id = dtr.id) LEFT JOIN data_local AS dl ON (dtr.local_data_id = dl.id) LEFT JOIN data_template_data AS dtd ON (dl.id = dtd.local_data_id) LEFT JOIN graph_templates_gprint AS gtgp ON (gprint_id = gtgp.id) LEFT JOIN cdef AS cd ON (cdef_id = cd.id) LEFT JOIN vdef AS vd ON (vdef_id = vd.id) LEFT JOIN colors AS c ON (color_id = c.id) WHERE gti.local_graph_id = ? ORDER BY gti.sequence", array(get_request_var('id'))); $template_item_list = api_plugin_hook_function('graphs_item_array', $template_item_list); $host_id = db_fetch_cell_prepared('SELECT host_id FROM graph_local WHERE id = ?', array(get_request_var('id'))); $graph_template_id = db_fetch_cell_prepared('SELECT graph_template_id FROM graph_local WHERE id = ?', array(get_request_var('id'))); $header_label = __esc('Graph Items [edit: %s]', get_graph_title(get_request_var('id'))); $add_text = 'graphs_items.php?action=item_edit' . (!empty($host_id) ? '&host_id=' . $host_id:'') . '&local_graph_id=' . get_request_var('id'); $anchor_link = 'host_id=' . $host_id . '&local_graph_id=' . get_request_var('id'); } html_start_box($header_label, '100%', '', '3', 'center', $add_text); draw_graph_items_list($template_item_list, 'graphs_items.php', $anchor_link, (empty($graph_template_id) || empty($host_id) ? false : true)); ?> 1 ? true : false; } function graph_edit() { global $config, $struct_graph, $image_types, $consolidation_functions, $graph_item_types, $struct_graph_item; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ $use_graph_template = true; $locked = 'false'; $graph = array(); if (!isempty_request_var('id')) { $_SESSION['sess_graph_lock_id'] = get_request_var('id'); $local_graph_template_graph_id = db_fetch_cell_prepared('SELECT local_graph_template_graph_id FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('id'))); $auto_unlock = read_config_option('graphs_auto_unlock'); if (get_request_var('id') != $_SESSION['sess_graph_lock_id'] && !empty($local_graph_template_graph_id)) { if ($auto_unlock == 'on') { $locked = false; } else { $locked = true; } $_SESSION['sess_graph_locked'] = $locked; } elseif (empty($local_graph_template_graph_id)) { $locked = false; $_SESSION['sess_graph_locked'] = $locked; } elseif (isset($_SESSION['sess_graph_locked'])) { $locked = $_SESSION['sess_graph_locked']; } else { if ($auto_unlock == 'on') { $locked = false; } else { $locked = true; } $_SESSION['sess_graph_locked'] = $locked; } $graph = db_fetch_row_prepared('SELECT * FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('id'))); $graph_template = db_fetch_row_prepared('SELECT * FROM graph_templates_graph WHERE id = ?', array($local_graph_template_graph_id)); $host_id = db_fetch_cell_prepared('SELECT host_id FROM graph_local WHERE id = ?', array(get_request_var('id'))); /* case of a deleted graph */ if (!cacti_sizeof($graph)) { raise_message(31); header('Location: graphs.php'); exit; } $header_label = __esc('Graph [edit: %s]', get_graph_title(get_request_var('id'))); if ($graph['graph_template_id'] == '0') { $use_graph_template = 'false'; } } else { $header_label = __('Graph [new]'); $use_graph_template = false; if (isset_request_var('host_id') && get_filter_request_var('host_id') > 0) { $host_id = get_request_var('host_id'); } else { $host_id = 0; } if (isempty_request_var('graph_template_id')) { $locked = false; } } /* handle debug mode */ if (isset_request_var('debug')) { if (get_nfilter_request_var('debug') == '0') { kill_session_var('graph_debug_mode'); } elseif (get_nfilter_request_var('debug') == '1') { $_SESSION['graph_debug_mode'] = true; } } if (!isempty_request_var('id')) { if (isset($_SESSION['graph_debug_mode'])) { $message = __('Turn Off Graph Debug Mode.'); } else { $message = __('Turn On Graph Debug Mode.'); } $data_sources = db_fetch_assoc_prepared('SELECT DISTINCT local_data_id FROM graph_templates_item AS gti INNER JOIN data_template_rrd AS dtr ON dtr.id = gti.task_item_id WHERE local_graph_id = ?', array(get_request_var('id'))); ?>
    *'>
    *'>
    *'>
    * 0 ? $host_id : get_request_var('host_id')));?>'>
    **
    array( 'method' => 'drop_sql', 'friendly_name' => __('Selected Graph Template'), 'description' => __('Choose a Graph Template to apply to this Graph. Please note that you may only change Graph Templates to a 100%% compatible Graph Template, which means that it includes identical Data Sources.'), 'value' => $graph_template_id, 'none_value' => (!isset($graph['graph_template_id']) || $graph['graph_template_id'] == 0 ? __('None'):''), 'sql' => $gtsql ), 'host_id' => array( 'method' => 'drop_callback', 'friendly_name' => __('Device'), 'description' => __('Choose the Device that this Graph belongs to.'), 'sql' => 'SELECT id, description as name FROM host ORDER BY name', 'action' => 'ajax_hosts_noany', 'none_value' => __('None'), 'id' => $host_id, 'value' => db_fetch_cell_prepared('SELECT description FROM host WHERE id = ?', array($host_id)), ), 'graph_template_graph_id' => array( 'method' => 'hidden', 'value' => (isset($graph['id']) ? $graph['id'] : '0') ), 'local_graph_id' => array( 'method' => 'hidden', 'value' => (isset($graph['local_graph_id']) ? $graph['local_graph_id'] : '0') ), 'local_graph_template_graph_id' => array( 'method' => 'hidden', 'value' => (isset($graph['local_graph_template_graph_id']) ? $graph['local_graph_template_graph_id'] : '0') ), 'graph_template_id_prev' => array( 'method' => 'hidden', 'value' => $graph_template_id ), 'host_id_prev' => array( 'method' => 'hidden', 'value' => (isset($host_id) ? $host_id : '0') ) ); if (cacti_sizeof($graph)) { if ($graph['graph_template_id'] == 0) { $form_array['graph_template_id']['method'] = 'hidden'; $form_array['graph_template_id']['value'] = '0'; } if ($graph['graph_template_id'] > 0 && $host_id > 0) { $form_array['graph_template_id']['method'] = 'hidden'; $form_array['host_id']['method'] = 'hidden'; } if (is_multi_device_graph($graph['local_graph_id'])) { $form_array['host_id']['method'] = 'hidden'; } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(true, true); /* only display the "inputs" area if we are using a graph template for this graph */ if (!empty($graph['graph_template_id'])) { html_start_box(__('Supplemental Graph Template Data'), '100%', true, '3', 'center', ''); draw_nontemplated_fields_graph($graph['graph_template_id'], $graph, '|field|', __('Graph Fields'), true, true, 0); draw_nontemplated_fields_graph_item($graph['graph_template_id'], get_request_var('id'), '|field|_|id|', __('Graph Item Fields'), true, $locked); html_end_box(true, true); } /* graph item list goes here */ if ((!isempty_request_var('id')) && (empty($graph['graph_template_id']))) { item(); } $graph_start = -86400; $graph_end = '-' . read_config_option('poller_interval'); $graph['src'] = html_escape($config['url_path'] . 'graph_json.php?local_graph_id=' . get_request_var('id') . '&rra_id=0&graph_start=' . $graph_start . '&graph_end=' . $graph_end . '&v=' . mt_rand()); if (!isempty_request_var('id')) { ?>



    $field_array) { $form_array += array($field_name => $struct_graph[$field_name]); if (($field_array['method'] != 'header') && ($field_array['method'] != 'spacer' )){ $form_array[$field_name]['value'] = (isset($graph[$field_name]) ? $graph[$field_name] : ''); $form_array[$field_name]['form_id'] = (isset($graph[$field_name]) ? $graph['id'] : '0'); if ($use_graph_template == true && isset($graph_template['t_' . $field_name]) && ($graph_template['t_' . $field_name] == 'on')) { $form_array[$field_name]['method'] = 'template_' . $form_array[$field_name]['method']; $form_array[$field_name]['description'] = ''; } } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); html_end_box(true, true); } if ((isset_request_var('id')) || (isset_request_var('new'))) { form_hidden_box('save_component_graph','1',''); form_hidden_box('save_component_input','1',''); } else { form_hidden_box('save_component_graph_new','1',''); } form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); form_save_button('graphs.php', 'return'); //Now we need some javascript to make it dynamic ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'rfilter' => array( 'filter' => FILTER_VALIDATE_IS_REGEX, 'pageset' => true, 'default' => '', ), 'orphans' => array( 'filter' => FILTER_CALLBACK, 'default' => '', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'title_cache', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'site_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'template_id' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(cg_[0-9]|dq_[0-9]|[\-0-9])')), 'pageset' => true, 'default' => '-1' ), 'custom' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => '' ), 'local_graph_ids' => array( 'filter' => FILTER_VALIDATE_IS_NUMERIC_LIST, 'pageset' => true, 'default' => '' ) ); validate_store_request_vars($filters, 'sess_graph'); /* ================= input validation ================= */ } function graph_management() { global $graph_actions, $graph_sources, $item_rows, $config; if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } ?> 0) { $host_where = 'site_id = ' . get_request_var('site_id'); } else { $host_where = ''; } ?>
    > ' title=''> ' title=''>
    '>
    0 AND gl.snmp_index = '')) $sql_where2 ) AS dtr ON gl.id = dtr.local_graph_id"; } else { $orphan_join = ''; } /* don't allow aggregates to be view here */ $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' ag.local_graph_id IS NULL'; /* allow plugins to modify sql_where */ $sql_where = api_plugin_hook_function('graphs_sql_where', $sql_where); $total_rows = db_fetch_cell("SELECT COUNT(gtg.id) FROM graph_local AS gl INNER JOIN graph_templates_graph AS gtg ON gl.id=gtg.local_graph_id LEFT JOIN graph_templates AS gt ON gl.graph_template_id=gt.id LEFT JOIN aggregate_graphs AS ag ON ag.local_graph_id=gl.id LEFT JOIN host AS h ON h.id=gl.host_id LEFT JOIN sites AS s ON h.site_id=s.id $orphan_join $sql_where"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $graph_list = db_fetch_assoc("SELECT gtg.id, gl.id AS local_graph_id, gtg.height, gtg.width, gtg.title_cache, gt.name, gl.host_id, IF(gl.graph_template_id=0, 0, IF(gl.snmp_query_id=0, 2, 1)) AS graph_source FROM graph_local AS gl INNER JOIN graph_templates_graph AS gtg ON gl.id=gtg.local_graph_id LEFT JOIN graph_templates AS gt ON gl.graph_template_id=gt.id LEFT JOIN aggregate_graphs AS ag ON ag.local_graph_id=gl.id LEFT JOIN host AS h ON h.id=gl.host_id LEFT JOIN sites AS s ON h.site_id=s.id $orphan_join $sql_where $sql_order $sql_limit"); $nav = html_nav_bar('graphs.php', MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, 5, __('Graphs'), 'page', 'main'); form_start('graphs.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); $display_text = array( 'title_cache' => array( 'display' => __('Graph Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Title of this Graph. Generally programatically generated from the Graph Template definition or Suggested Naming rules. The max length of the Title is controlled under Settings->Visual.') ), 'local_graph_id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Graph. Useful when performing automation or debugging.') ), 'nosort_source' => array( 'display' => __('Source Type'), 'align' => 'center', 'sort' => 'ASC', 'tip' => __('The underlying source that this Graph was based upon.') ), 'nosort_name' => array( 'display' => __('Source Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The Graph Template or Data Query that this Graph was based upon.') ), 'height' => array( 'display' => __('Size'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The size of this Graph when not in Preview mode.') ) ); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($graph_list)) { foreach ($graph_list as $graph) { /* we're escaping strings here, so no need to escape them on form_selectable_cell */ $template_details = get_graph_template_details($graph['local_graph_id']); if($graph['graph_source'] == '0') { //Not Templated, customize graph source and template details. $template_details = api_plugin_hook_function('customize_template_details', $template_details); $graph = api_plugin_hook_function('customize_graph', $graph); } if (isset($template_details['graph_name'])) { $graph['name'] = $template_details['graph_name']; } if (isset($template_details['graph_description'])) { $graph['description'] = $template_details['graph_description']; } if (empty($graph['title_cache'])) { $graph['title_cache'] = __('Empty Graph'); } form_alternate_row('line' . $graph['local_graph_id'], true); form_selectable_cell(filter_value(title_trim($graph['title_cache'], read_config_option('max_title_length')), get_request_var('rfilter'), 'graphs.php?action=graph_edit&id=' . $graph['local_graph_id']), $graph['local_graph_id']); form_selectable_cell($graph['local_graph_id'], $graph['local_graph_id'], '', 'right'); form_selectable_cell(filter_value($graph_sources[$graph['graph_source']], get_request_var('rfilter')), $graph['local_graph_id'], '', 'center'); form_selectable_cell(filter_value($template_details['name'], get_request_var('rfilter'), $template_details['url']), $graph['local_graph_id'], '', 'left'); form_selectable_ecell($graph['height'] . 'x' . $graph['width'], $graph['local_graph_id'], '', 'right'); form_checkbox_cell($graph['title_cache'], $graph['local_graph_id']); form_end_row(); } } else { print "" . __('No Graphs Found') . ""; } html_end_box(false); if (cacti_sizeof($graph_list)) { print $nav; } /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($graph_actions); form_end(); } cacti-release-1.2.19/graphs_items.php000066400000000000000000000644331413633772300175260ustar00rootroot00000000000000 array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '4', 'text_format' => 'Cur:', 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => 'Avg:', 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => 'Max:', 'hard_return' => 'on' )); } elseif ($graph_item_types[get_nfilter_request_var('graph_type_id')] == 'LEGEND_CAMM') { /* this can be a major time saver when creating lots of graphs with the typical GPRINT LAST/AVERAGE/MAX legends */ $items = array( 0 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '4', 'text_format' => __('Cur:'), 'hard_return' => '' ), 1 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '1', 'text_format' => __('Avg:'), 'hard_return' => '' ), 2 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '2', 'text_format' => __('Min:'), 'hard_return' => '' ), 3 => array( 'color_id' => '0', 'graph_type_id' => '9', 'consolidation_function_id' => '3', 'text_format' => __('Max:'), 'hard_return' => 'on' ) ); } $sequence = get_nfilter_request_var('sequence'); foreach ($items as $item) { /* generate a new sequence if needed */ if (empty($sequence)) { $sequence = get_sequence($sequence, 'sequence', 'graph_templates_item', 'local_graph_id=' . get_nfilter_request_var('local_graph_id')); } $save['id'] = get_nfilter_request_var('graph_template_item_id'); $save['graph_template_id'] = get_nfilter_request_var('graph_template_id'); $save['local_graph_template_item_id'] = get_nfilter_request_var('local_graph_template_item_id'); $save['local_graph_id'] = get_nfilter_request_var('local_graph_id'); $save['task_item_id'] = form_input_validate(get_nfilter_request_var('task_item_id'), 'task_item_id', '^[0-9]+$', true, 3); $save['color_id'] = form_input_validate((isset($item['color_id']) ? $item['color_id'] : get_nfilter_request_var('color_id')), 'color_id', '^[0-9]+$', true, 3); /* if alpha is disabled, use invisible_alpha instead */ if (!isset_request_var('alpha')) { set_request_var('alpha', get_nfilter_request_var('invisible_alpha')); } $save['alpha'] = form_input_validate((isset($item['alpha']) ? $item['alpha'] : get_nfilter_request_var('alpha')), 'alpha', '', true, 3); $save['graph_type_id'] = form_input_validate((isset($item['graph_type_id']) ? $item['graph_type_id'] : get_nfilter_request_var('graph_type_id')), 'graph_type_id', '^[0-9]+$', true, 3); if (isset_request_var('line_width') || isset($item['line_width'])) { $save['line_width'] = form_input_validate((isset($item['line_width']) ? $item['line_width'] : get_nfilter_request_var('line_width')), 'line_width', '(^[0-9]+[\.,0-9]+$|^[0-9]+$)', true, 3); } else { # make sure to transfer old LINEx style into line_width on save switch ($save['graph_type_id']) { case GRAPH_ITEM_TYPE_LINE1: $save['line_width'] = 1; break; case GRAPH_ITEM_TYPE_LINE2: $save['line_width'] = 2; break; case GRAPH_ITEM_TYPE_LINE3: $save['line_width'] = 3; break; default: $save['line_width'] = 0; } } $save['dashes'] = form_input_validate((isset_request_var('dashes') ? get_nfilter_request_var('dashes') : ''), 'dashes', '', true, 3); $save['dash_offset'] = form_input_validate((isset_request_var('dash_offset') ? get_nfilter_request_var('dash_offset') : ''), 'dash_offset', '^[0-9]+$', true, 3); $save['cdef_id'] = form_input_validate(get_nfilter_request_var('cdef_id'), 'cdef_id', '^[0-9]+$', true, 3); $save['vdef_id'] = form_input_validate(get_nfilter_request_var('vdef_id'), 'vdef_id', '^[0-9]+$', true, 3); $save['shift'] = form_input_validate((isset_request_var('shift') ? get_nfilter_request_var('shift') : ''), 'shift', '^((on)|)$', true, 3); $save['consolidation_function_id'] = form_input_validate((isset($item['consolidation_function_id']) ? $item['consolidation_function_id'] : get_nfilter_request_var('consolidation_function_id')), 'consolidation_function_id', '^[0-9]+$', true, 3); $save['textalign'] = form_input_validate((isset_request_var('textalign') ? get_nfilter_request_var('textalign') : ''), 'textalign', '^[a-z]+$', true, 3); $save['text_format'] = form_input_validate((isset($item['text_format']) ? $item['text_format'] : get_nfilter_request_var('text_format')), 'text_format', '', true, 3); $save['value'] = form_input_validate(get_nfilter_request_var('value'), 'value', '', true, 3); $save['hard_return'] = form_input_validate(((isset($item['hard_return']) ? $item['hard_return'] : (isset_request_var('hard_return') ? get_nfilter_request_var('hard_return') : ''))), 'hard_return', '', true, 3); $save['gprint_id'] = form_input_validate(get_nfilter_request_var('gprint_id'), 'gprint_id', '^[0-9]+$', true, 3); $save['sequence'] = $sequence; if (!is_error_message()) { $graph_template_item_id = sql_save($save, 'graph_templates_item'); if ($graph_template_item_id) { raise_message(1); } else { raise_message(2); } } $sequence = 0; } if (is_error_message()) { header('Location: graphs.php?header=false&action=item_edit&graph_template_item_id=' . (empty($graph_template_item_id) ? get_nfilter_request_var('graph_template_item_id') : $graph_template_item_id) . '&id=' . get_nfilter_request_var('local_graph_id')); exit; } else { header('Location: graphs.php?header=false&action=graph_edit&id=' . get_nfilter_request_var('local_graph_id')); exit; } } } /* ----------------------- item - Graph Items ----------------------- */ function item_movedown() { global $graph_item_types; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('local_graph_id'); /* ==================================================== */ $arr = get_graph_group(get_request_var('id')); $next_id = get_graph_parent(get_request_var('id'), 'next'); if ((!empty($next_id)) && (isset($arr[get_request_var('id')]))) { move_graph_group(get_request_var('id'), $arr, $next_id, 'next'); } elseif (preg_match('/(GPRINT|VRULE|HRULE|COMMENT)/', $graph_item_types[db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id')))])) { move_item_down('graph_templates_item', get_request_var('id'), 'local_graph_id=' . get_request_var('local_graph_id')); } } function item_moveup() { global $graph_item_types; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('local_graph_id'); /* ==================================================== */ $arr = get_graph_group(get_request_var('id')); $previous_id = get_graph_parent(get_request_var('id'), 'previous'); if ((!empty($previous_id)) && (isset($arr[get_request_var('id')]))) { move_graph_group(get_request_var('id'), $arr, $previous_id, 'previous'); } elseif (preg_match('/(GPRINT|VRULE|HRULE|COMMENT)/', $graph_item_types[db_fetch_cell_prepared('SELECT graph_type_id FROM graph_templates_item WHERE id = ?', array(get_request_var('id')))])) { move_item_up('graph_templates_item', get_request_var('id'), 'local_graph_id=' . get_request_var('local_graph_id')); } } function item_remove() { /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ db_execute_prepared('DELETE FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); } function validate_item_vars() { /* ================= input validation and session storage ================= */ $filters = array( 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '0' ), 'local_graph_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '0' ), 'data_template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '0' ) ); validate_store_request_vars($filters, 'sess_gitems'); /* ================= input validation ================= */ } function item_edit() { global $struct_graph_item, $graph_item_types, $consolidation_functions; /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); get_filter_request_var('local_graph_id'); get_filter_request_var('data_template_id'); /* ==================================================== */ validate_item_vars(); $id = (!isempty_request_var('id') ? '&id=' . get_request_var('id') : ''); $host = db_fetch_row_prepared('SELECT hostname FROM host WHERE id = ?', array(get_request_var('host_id'))); if (empty($host['hostname'])) { $header = __('Data Sources [No Device]'); } else { $header = __esc('Data Sources [%s]', $host['hostname']); } html_start_box($header, '100%', '', '3', 'center', ''); ?>
    0) { $sql_where = 'h.id=' . get_request_var('host_id'); } elseif (get_request_var('host_id') == 0) { $sql_where = 'h.id IS NULL'; } else { $sql_where = ''; } if (get_request_var('data_template_id') == '-1') { $sql_where .= ''; } elseif (get_request_var('data_template_id') == '0') { $sql_where .= ($sql_where != '' ? ' AND ':'') . 'dl.data_template_id=0'; } elseif (!isempty_request_var('data_template_id')) { $sql_where .= ($sql_where != '' ? ' AND ':'') . 'dl.data_template_id=' . get_request_var('data_template_id'); } if (!isempty_request_var('id')) { $template_item = db_fetch_row_prepared('SELECT * FROM graph_templates_item WHERE id = ?', array(get_request_var('id'))); } else { $template_item = array(); kill_session_var('sess_graph_items_dti'); } $title = db_fetch_cell_prepared('SELECT title_cache FROM graph_templates_graph WHERE local_graph_id = ?', array(get_request_var('local_graph_id'))); $header_label = __esc('Graph Items [graph: %s]', $title); form_start('graphs_items.php', 'greph_edit'); html_start_box($header_label, '100%', true, '3', 'center', ''); /* by default, select the LAST DS chosen to make everyone's lives easier */ if (!isempty_request_var('local_graph_id')) { $struct_graph_item['task_item_id']['default'] = 0; if (isset($template_item['task_item_id'])) { $task_item_id = $template_item['task_item_id']; $value = db_fetch_cell_prepared("SELECT CONCAT_WS('', dtd.name_cache,' (', dtr.data_source_name, ')') as name FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dtd.local_data_id=dl.id INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dl.id LEFT JOIN host AS h ON dl.host_id=h.id WHERE dtr.id = ?", array($task_item_id)); } else { $task_item_id = 0; $value = ''; } if (get_selected_theme() != 'classic' && read_config_option('autocomplete_enabled') > 0) { $action = 'ajax_graph_items'; if (get_request_var('host_id') > 0) { $action .= '&host_id=' . get_filter_request_var('host_id'); } if (get_request_var('data_template_id') > 0) { $action .= '&data_template_id=' . get_filter_request_var('data_template_id'); } $struct_graph_item['task_item_id'] = array( 'method' => 'drop_callback', 'friendly_name' => __('Data Source'), 'description' => __('Choose the Data Source to associate with this Graph Item.'), 'sql' => '', 'action' => $action, 'none_value' => __('None'), 'id' => $task_item_id, 'value' => $value ); } /* modifications to the default graph items array */ $struct_graph_item['task_item_id']['sql'] = "SELECT CONCAT_WS('', dtd.name_cache,' (', dtr.data_source_name, ')') as name, dtr.id FROM data_local AS dl INNER JOIN data_template_data AS dtd ON dtd.local_data_id=dl.id INNER JOIN data_template_rrd AS dtr ON dtr.local_data_id=dl.id LEFT JOIN host AS h ON dl.host_id=h.id"; /* Make sure we don't limit the list so that the selected DS isn't in the list in edit mode */ if ($sql_where != '') { if (!isempty_request_var('id')) { $struct_graph_item['task_item_id']['sql'] .= " WHERE ($sql_where) OR (dtr.id=" . $template_item['task_item_id'] . ")"; } else { $struct_graph_item['task_item_id']['sql'] .= " WHERE $sql_where"; } } $struct_graph_item['task_item_id']['sql'] .= ' ORDER BY name'; } $form_array = array(); foreach ($struct_graph_item as $field_name => $field_array) { $form_array += array($field_name => $struct_graph_item[$field_name]); if (get_selected_theme() != 'classic' && read_config_option('autocomplete_enabled')) { if ($field_name != 'task_item_id') { $form_array[$field_name]['value'] = (isset($template_item[$field_name]) ? $template_item[$field_name] : ''); } } else { $form_array[$field_name]['value'] = (isset($template_item[$field_name]) ? $template_item[$field_name] : ''); } $form_array[$field_name]['form_id'] = (isset($template_item['id']) ? $template_item['id'] : '0'); } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); form_hidden_box('local_graph_id', get_request_var('local_graph_id'), '0'); form_hidden_box('graph_template_item_id', (!empty($template_item) ? $template_item['id'] : '0'), ''); form_hidden_box('local_graph_template_item_id', (!empty($template_item) ? $template_item['local_graph_template_item_id'] : '0'), ''); form_hidden_box('graph_template_id', (!empty($template_item) ? $template_item['graph_template_id'] : '0'), ''); form_hidden_box('_graph_type_id', (!empty($template_item) ? $template_item['graph_type_id'] : '0'), ''); form_hidden_box('save_component_item', '1', ''); form_hidden_box('invisible_alpha', $form_array['alpha']['value'], 'FF'); form_hidden_box('rrdtool_version', get_rrdtool_version(), ''); html_end_box(true, true); form_save_button('graphs.php?action=graph_edit&id=' . get_request_var('local_graph_id')); ?> $val) { if (preg_match('/^cg_(\d+)$/', $var, $matches)) { $selected_graphs['cg'][$matches[1]][$matches[1]] = true; } elseif (preg_match('/^cg_g$/', $var)) { if (get_nfilter_request_var('cg_g') > 0) { $selected_graphs['cg'][get_nfilter_request_var('cg_g')][get_nfilter_request_var('cg_g')] = true; } } elseif (preg_match('/^sg_(\d+)_([a-f0-9]{32})$/', $var, $matches)) { $selected_graphs['sg'][$matches[1]][get_nfilter_request_var('sgg_' . $matches[1])][$matches[2]] = true; } if (strpos($var, 'sgg_') !== false) { $snmp_query_id = str_replace('sgg_', '', $var); store_get_selected_dq_index($snmp_query_id); } } if (!isset_request_var('host_id')) { $host_id = 0; } else { $host_id = get_filter_request_var('host_id'); } if (!isset_request_var('host_template_id')) { $host_template_id = 0; } else { $host_template_id = get_filter_request_var('host_template_id'); } if (isset($selected_graphs)) { html_graph_new_graphs('graphs_new.php', $host_id, $host_template_id, $selected_graphs); exit; } header('Location: graphs_new.php?host_id=' . $host_id . '&header=false'); } if (isset_request_var('save_component_new_graphs')) { host_new_graphs_save(get_filter_request_var('host_id')); header('Location: graphs_new.php?host_id=' . get_filter_request_var('host_id') . '&header=false'); } } /* ------------------- Data Query Functions ------------------- */ function host_reload_query() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); /* ==================================================== */ run_data_query(get_request_var('host_id'), get_request_var('id')); } /* ------------------- New Graph Functions ------------------- */ function host_new_graphs_save($host_id) { $selected_graphs_array = unserialize(stripslashes(get_nfilter_request_var('selected_graphs_array'))); $values = array(); /* form an array that contains all of the data on the previous form */ foreach ($_POST as $var => $val) { if (preg_match('/^g_(\d+)_(\d+)_(\w+)/', $var, $matches)) { // 1: snmp_query_id, 2: graph_template_id, 3: field_name if (empty($matches[1])) { // this is a new graph from template field $values['cg'][$matches[2]]['graph_template'][$matches[3]] = $val; } else { // this is a data query field $values['sg'][$matches[1]][$matches[2]]['graph_template'][$matches[3]] = $val; } } elseif (preg_match('/^gi_(\d+)_(\d+)_(\d+)_(\w+)/', $var, $matches)) { // 1: snmp_query_id, 2: graph_template_id, 3: graph_template_input_id, 4:field_name /* ================= input validation ================= */ input_validate_input_number($matches[3]); /* ==================================================== */ /* we need to find out which graph items will be affected by saving this particular item */ $item_list = db_fetch_assoc_prepared('SELECT graph_template_item_id FROM graph_template_input_defs WHERE graph_template_input_id = ?', array($matches[3])); /* loop through each item affected and update column data */ if (cacti_sizeof($item_list)) { foreach ($item_list as $item) { if (empty($matches[1])) { // this is a new graph from template field $values['cg'][$matches[2]]['graph_template_item'][$item['graph_template_item_id']][$matches[4]] = $val; } else { // this is a data query field $values['sg'][$matches[1]][$matches[2]]['graph_template_item'][$item['graph_template_item_id']][$matches[4]] = $val; } } } } elseif (preg_match('/^d_(\d+)_(\d+)_(\d+)_(\w+)/', $var, $matches)) { // 1: snmp_query_id, 2: graph_template_id, 3: data_template_id, 4:field_nam if (empty($matches[1])) { // this is a new graph from template field $values['cg'][$matches[2]]['data_template'][$matches[3]][$matches[4]] = $val; } else { // this is a data query field $values['sg'][$matches[1]][$matches[2]]['data_template'][$matches[3]][$matches[4]] = $val; } } elseif (preg_match('/^c_(\d+)_(\d+)_(\d+)_(\d+)/', $var, $matches)) { // 1: snmp_query_id, 2: graph_template_id, 3: data_template_id, 4:data_input_field_id if (empty($matches[1])) { // this is a new graph from template field $values['cg'][$matches[2]]['custom_data'][$matches[3]][$matches[4]] = $val; } else { // this is a data query field $values['sg'][$matches[1]][$matches[2]]['custom_data'][$matches[3]][$matches[4]] = $val; } } elseif (preg_match('/^di_(\d+)_(\d+)_(\d+)_(\d+)_(\w+)/', $var, $matches)) { // 1: snmp_query_id, 2: graph_template_id, 3: data_template_id, 4:local_data_template_rrd_id, 5:field_name if (empty($matches[1])) { // this is a new graph from template field $values['cg'][$matches[2]]['data_template_item'][$matches[4]][$matches[5]] = $val; } else { // this is a data query field $values['sg'][$matches[1]][$matches[2]]['data_template_item'][$matches[4]][$matches[5]] = $val; } } } debug_log_clear('new_graphs'); foreach ($selected_graphs_array as $form_type => $form_array) { $current_form_type = $form_type; foreach ($form_array as $form_id1 => $form_array2) { /* enumerate information from the arrays stored in post variables */ create_save_graph($host_id, $form_type, $form_id1, $form_array2, $values); } } } /* ------------------- Graph Functions ------------------- */ function graphs() { global $config, $item_rows; /* ================= input validation and session storage ================= */ $filters = array( 'rows' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'host_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => db_fetch_cell('SELECT id FROM host ORDER BY description, hostname LIMIT 1') ), 'graph_type' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => read_user_setting('graph_type', read_config_option('default_graphs_new_dropdown'), true) ) ); validate_store_request_vars($filters, 'sess_grn'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_user_setting('num_rows_table', read_config_option('num_rows_table'), true); } else { $rows = get_request_var('rows'); } if (!isempty_request_var('host_id')) { $host = db_fetch_row_prepared('SELECT id, description, hostname, host_template_id FROM host WHERE id = ?', array(get_request_var('host_id'))); if (cacti_sizeof($host)) { $name = db_fetch_cell_prepared('SELECT name FROM host_template WHERE id = ?', array($host['host_template_id'])); $header = __esc('New Graphs for [ %s ] (%s %s)', $host['description'], $host['hostname'], (!empty($host['host_template_id']) ? $name:'')); } else { $header = __('New Graphs for [ All Devices ]'); $host['id'] = -1; $host['host_template_id'] = 0; } } else { $host['id'] = 0; $host['host_template_id'] = 0; $header = __('New Graphs for None Host Type'); } html_start_box($header, '100%', '', '3', 'center', ''); print ''; ?>
    ' title=''> ' title=''> ' title=''>
    '>
    *'>
    *'>
    0) { /* validate the page filter */ if (isset_request_var('page' . get_request_var('graph_type'))) { get_filter_request_var('page' . get_request_var('graph_type')); } load_current_session_value('page' . get_request_var('graph_type'), 'sess_grn_page' . get_request_var('graph_type'), '1'); }else if (get_request_var('graph_type') == -2) { foreach($snmp_queries as $query) { /* validate the page filter */ if (isset_request_var('page' . $query['id'])) { get_filter_request_var('page' . $query['id']); } load_current_session_value('page' . $query['id'], 'sess_grn_page' . $query['id'], '1'); } } $script = ""; print $script; } form_hidden_box('save_component_graph', '1', ''); if (!isempty_request_var('host_id')) { form_hidden_box('host_id', $host['id'], '0'); form_hidden_box('host_template_id', $host['host_template_id'], '0'); } if (isset($_SERVER['HTTP_REFERER']) && !substr_count($_SERVER['HTTP_REFERER'], 'graphs_new')) { set_request_var('returnto', basename($_SERVER['HTTP_REFERER'])); } load_current_session_value('returnto', 'sess_grn_returnto', ''); if (substr_count(get_nfilter_request_var('returnto'), 'host.php') == 0) { set_request_var('returnto', ''); } form_save_button(get_nfilter_request_var('returnto'), 'create'); } cacti-release-1.2.19/host.php000066400000000000000000001772571413633772300160270ustar00rootroot00000000000000 __('Delete'), 2 => __('Enable'), 3 => __('Disable'), 4 => __('Change Device Settings'), 5 => __('Clear Statistics'), 6 => __('Apply Automation Rules'), 7 => __('Sync to Device Template') ); $device_actions = api_plugin_hook_function('device_action_array', $device_actions); /* set default action */ set_default_action(); switch (get_request_var('action')) { case 'export': host_export(); break; case 'save': form_save(); break; case 'reindex': host_reindex(); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'actions': form_actions(); break; case 'gt_add': get_filter_request_var('host_id'); host_add_gt(); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'gt_remove': get_filter_request_var('host_id'); host_remove_gt(); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'query_add': get_filter_request_var('host_id'); host_add_query(); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'query_remove': get_filter_request_var('host_id'); host_remove_query(); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'query_change': get_filter_request_var('host_id'); host_change_query(); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'query_reload': get_filter_request_var('host_id'); host_reload_query(); raise_message('query_reloaded', __('Data Query Re-indexed.'), MESSAGE_LEVEL_INFO); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'query_verbose': get_filter_request_var('host_id'); host_reload_query(); raise_message('query_reloaded', __('Device Data Query Re-indexed. Verbose output displayed.'), MESSAGE_LEVEL_INFO); header('Location: host.php?header=' . (isset_request_var('header') && get_nfilter_request_var('header') == 'true' ? 'true':'false') . '&action=edit&id=' . get_request_var('host_id') . '&display_dq_details=true'); break; case 'edit': top_header(); host_edit(); bottom_footer(); break; case 'ping_host': $host_id = get_filter_request_var('id'); api_device_ping_device($host_id); break; case 'enable_debug': enable_device_debug(get_filter_request_var('host_id')); raise_message('enable_debug', __('Device Debugging Enabled for Device.'), MESSAGE_LEVEL_INFO); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'disable_debug': disable_device_debug(get_filter_request_var('host_id')); raise_message('disable_debug', __('Device Debugging Disabled for Device.'), MESSAGE_LEVEL_INFO); header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'repopulate': if (get_filter_request_var('host_id') > 0) { push_out_host(get_request_var('host_id')); raise_message('repopulate_message', __('Poller Cache for Device Refreshed.'), MESSAGE_LEVEL_INFO); } else { raise_message('repopulate_error', __('ERROR: Invalid Device ID.'), MESSAGE_LEVEL_ERROR); } header('Location: host.php?header=false&action=edit&id=' . get_request_var('host_id')); break; case 'ajax_locations': get_site_locations(); break; default: top_header(); host(); bottom_footer(); break; } /* -------------------------- Global Form Functions -------------------------- */ function host_reindex() { global $config; $start = microtime(true); shell_exec(read_config_option('path_php_binary') . ' -q ' . $config['base_path'] . '/cli/poller_reindex_hosts.php --qid=all --id=' . get_filter_request_var('host_id')); $end = microtime(true); $total_time = $end - $start; $items = db_fetch_cell_prepared('SELECT COUNT(*) FROM host_snmp_cache WHERE host_id = ?', array(get_filter_request_var('host_id'))); raise_message('host_reindex', __('Device Reindex Completed in %0.2f seconds. There were %d items updated.', $total_time, $items), MESSAGE_LEVEL_INFO); } function add_tree_names_to_actions_array() { global $device_actions; /* add a list of tree names to the actions dropdown */ $trees = db_fetch_assoc('SELECT id, name FROM graph_tree ORDER BY name'); if (cacti_sizeof($trees)) { foreach ($trees as $tree) { $device_actions['tr_' . $tree['id']] = __esc('Place on a Tree (%s)', $tree['name']); } } } function get_site_locations() { $return = array(); $term = get_nfilter_request_var('term'); $host_id = $_SESSION['cur_device_id']; $site_id = db_fetch_cell_prepared('SELECT site_id FROM host WHERE id = ?', array($host_id)); $locations = db_fetch_assoc_prepared('SELECT DISTINCT location FROM host WHERE site_id = ? AND location LIKE ? ORDER BY location', array($site_id, "%$term%")); if (cacti_sizeof($locations)) { foreach($locations as $l) { $return[] = array('label' => $l['location'], 'value' => $l['location'], 'id' => $l['location']); } } print json_encode($return); } /* -------------------------- The Save Function -------------------------- */ function form_save() { if (isset_request_var('save_component_host')) { if (get_nfilter_request_var('snmp_version') == 3 && (get_nfilter_request_var('snmp_password') != get_nfilter_request_var('snmp_password_confirm'))) { raise_message(14); } else if (get_nfilter_request_var('snmp_version') == 3 && (get_nfilter_request_var('snmp_priv_passphrase') != get_nfilter_request_var('snmp_priv_passphrase_confirm'))) { raise_message(13); } else { get_filter_request_var('id'); get_filter_request_var('host_template_id'); $host_id = api_device_save(get_nfilter_request_var('id'), get_nfilter_request_var('host_template_id'), get_nfilter_request_var('description'), trim(get_nfilter_request_var('hostname')), get_nfilter_request_var('snmp_community'), get_nfilter_request_var('snmp_version'), get_nfilter_request_var('snmp_username'), get_nfilter_request_var('snmp_password'), get_nfilter_request_var('snmp_port'), get_nfilter_request_var('snmp_timeout'), (isset_request_var('disabled') ? get_nfilter_request_var('disabled') : ''), get_nfilter_request_var('availability_method'), get_nfilter_request_var('ping_method'), get_nfilter_request_var('ping_port'), get_nfilter_request_var('ping_timeout'), get_nfilter_request_var('ping_retries'), get_nfilter_request_var('notes'), get_nfilter_request_var('snmp_auth_protocol'), get_nfilter_request_var('snmp_priv_passphrase'), get_nfilter_request_var('snmp_priv_protocol'), get_nfilter_request_var('snmp_context'), get_nfilter_request_var('snmp_engine_id'), get_nfilter_request_var('max_oids'), get_nfilter_request_var('device_threads'), get_nfilter_request_var('poller_id'), get_nfilter_request_var('site_id'), get_nfilter_request_var('external_id'), get_nfilter_request_var('location'), get_nfilter_request_var('bulk_walk_size')); if ($host_id !== false) { api_plugin_hook_function('host_save', array('host_id' => $host_id)); } } header('Location: host.php?header=false&action=edit&id=' . (empty($host_id) ? get_nfilter_request_var('id') : $host_id)); } } /* ------------------------ The "actions" function ------------------------ */ function form_actions() { global $device_actions, $fields_host_edit; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_request_var('drp_action') == '2') { // Enable Selected Devices api_device_enable_devices($selected_items); } elseif (get_request_var('drp_action') == '3') { // Disable Selected Devices api_device_disable_devices($selected_items); } elseif (get_request_var('drp_action') == '4') { // change device options api_device_change_options($selected_items, $_POST); } elseif (get_request_var('drp_action') == '5') { // Clear Statisitics for Selected Devices api_device_clear_statistics($selected_items); } elseif (get_request_var('drp_action') == '7') { // sync to device template api_device_sync_device_templates($selected_items); } elseif (get_request_var('drp_action') == '1') { // delete if (!isset_request_var('delete_type')) { set_request_var('delete_type', 2); } api_device_remove_multi($selected_items, get_filter_request_var('delete_type')); } elseif (preg_match('/^tr_([0-9]+)$/', get_request_var('drp_action'), $matches)) { // place on tree get_filter_request_var('tree_id'); get_filter_request_var('tree_item_id'); foreach ($selected_items as $selected_item) { api_tree_item_save(0, get_nfilter_request_var('tree_id'), TREE_ITEM_TYPE_HOST, get_nfilter_request_var('tree_item_id'), '', 0, $selected_item, 0, 1, 1, false); } } elseif (get_request_var('drp_action') == 6) { // automation cacti_log(__FUNCTION__ . ' called, action: ' . get_request_var('drp_action'), true, 'AUTOM8 TRACE', POLLER_VERBOSITY_MEDIUM); cacti_log(__FUNCTION__ . ', items: ' . get_nfilter_request_var('selected_items'), true, 'AUTOM8 TRACE', POLLER_VERBOSITY_MEDIUM); /* work on all selected hosts */ foreach ($selected_items as $host_id) { automation_update_device($host_id); } } else { api_plugin_hook_function('device_action_execute', get_nfilter_request_var('drp_action')); } } /* update snmpcache */ snmpagent_device_action_bottom(array(get_nfilter_request_var('drp_action'), $selected_items)); api_plugin_hook_function('device_action_bottom', array(get_nfilter_request_var('drp_action'), $selected_items)); header('Location: host.php?header=false'); exit; } /* setup some variables */ $host_list = ''; $host_array = array(); /* loop through each of the host templates selected on the previous page and get more info about them */ foreach ($_POST as $var => $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $host_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT description FROM host WHERE id = ?', array($matches[1]))) . '
  • '; $host_array[] = $matches[1]; } } top_header(); /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); form_start('host.php'); html_start_box($device_actions[get_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($host_array) && cacti_sizeof($host_array)) { if (get_request_var('drp_action') == '2') { // Enable Devices print "

    " . __('Click \'Continue\' to enable the following Device(s).') . "

      $host_list
    "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '3') { // Disable Devices print "

    " . __('Click \'Continue\' to disable the following Device(s).') . "

      $host_list
    "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '4') { // Change Device options print "

    " . __('Click \'Continue\' to change the Device options below for multiple Device(s). Please check the box next to the fields you want to update, and then fill in the new value.') . "

      $host_list
    "; $form_array = array(); foreach ($fields_host_edit as $field_name => $field_array) { if ((preg_match('/^snmp_/', $field_name)) || (preg_match('/^ping_/', $field_name)) || ($field_name == 'poller_id') || ($field_name == 'site_id') || ($field_name == 'host_template_id') || ($field_name == 'availability_method') || ($field_name == 'device_threads') || ($field_name == 'location') || ($field_name == 'max_oids')) { $form_array += array($field_name => $fields_host_edit[$field_name]); $form_array[$field_name]['value'] = ''; if (read_config_option('hide_form_description') == 'on') { $form_array[$field_name]['description'] = ''; } $form_array[$field_name]['form_id'] = 0; $form_array[$field_name]['sub_checkbox'] = array( 'name' => 't_' . $field_name, 'friendly_name' => __('Update this Field'), 'class' => 'ui-state-disabled', 'value' => '' ); $form_array['location']['method'] = 'textbox'; $form_array['location']['default'] = ''; $form_array['location']['size'] = '20'; $form_array['location']['max_length'] = '40'; } } draw_edit_form( array( 'config' => array('no_form_tag' => true), 'fields' => $form_array ) ); device_javascript(); device_change_javascript(); $save_html = " "; } elseif (get_request_var('drp_action') == '5') { // Clear Statisitics for Selected Devices print "

    " . __('Click \'Continue\' to clear the counters for the following Device(s).') . "

      $host_list
    "; $save_html = " "; } elseif (get_nfilter_request_var('drp_action') == '7') { // sync device template print "

    " . __('Click \'Continue\' to Synchronize the following Device(s) to their Device Template.') . "

      $host_list
    "; $save_html = " "; } elseif (get_request_var('drp_action') == '1') { // Delete print "

    " . __('Click \'Continue\' to delete the following Device(s).') . "

      $host_list
    "; form_radio_button('delete_type', '2', '1', __('Leave all Graph(s) and Data Source(s) untouched. Data Source(s) will be disabled however.'), '1'); print '
    '; form_radio_button('delete_type', '2', '2', __('Delete all associated Graph(s) and Data Source(s).'), '1'); print '
    '; print " "; $save_html = " "; } elseif (preg_match('/^tr_([0-9]+)$/', get_request_var('drp_action'), $matches)) { // place on tree print "

    " . __('Click \'Continue\' to place the following Device(s) under the branch selected below.') . "

      $host_list

    " . __('Destination Branch:') . "
    "; grow_dropdown_tree($matches[1], '0', 'tree_item_id', '0'); print "

    "; $save_html = " "; } elseif (get_request_var('drp_action') == 6) { // automation print "

    " . __('Click \'Continue\' to apply Automation Rules to the following Devices(s).'). "

      $host_list
    "; $save_html = " "; } else { $save['drp_action'] = get_request_var('drp_action'); $save['host_list'] = $host_list; $save['host_array'] = $host_array; api_plugin_hook_function('device_action_prepare', $save); $save_html = " "; } } else { raise_message(40); header('Location: host.php?header=false'); exit; } print " $save_html "; html_end_box(); form_end(); bottom_footer(); } /* ------------------- Device Export Function ------------------- */ function host_export() { host_validate_vars(); $hosts = get_device_records($total_rows, 9999999); $stdout = fopen('php://output', 'w'); header('Content-type: application/excel'); header('Content-Disposition: attachment; filename=cacti-devices-' . time() . '.csv'); if (cacti_sizeof($hosts)) { $columns = array_keys($hosts[0]); fputcsv($stdout, $columns); foreach($hosts as $h) { fputcsv($stdout, $h); } } fclose($stdout); } /* ------------------- Data Query Functions ------------------- */ function host_add_query() { /* ================= input validation ================= */ get_filter_request_var('host_id'); get_filter_request_var('snmp_query_id'); get_filter_request_var('reindex_method'); /* ==================================================== */ api_device_dq_add(get_request_var('host_id'), get_request_var('snmp_query_id'), get_request_var('reindex_method')); } function host_reload_query() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); /* ==================================================== */ run_data_query(get_request_var('host_id'), get_request_var('id')); } function host_remove_query() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); /* ==================================================== */ api_device_dq_remove(get_request_var('host_id'), get_request_var('id')); } function host_change_query() { /* ================= input validation ================= */ get_filter_request_var('data_query_id'); get_filter_request_var('host_id'); get_filter_request_var('reindex_method'); /* ==================================================== */ api_device_dq_change(get_request_var('host_id'), get_request_var('data_query_id'), get_request_var('reindex_method')); } function host_add_gt() { /* ================= input validation ================= */ get_filter_request_var('host_id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ db_execute_prepared('REPLACE INTO host_graph (host_id, graph_template_id) VALUES (?, ?)', array(get_nfilter_request_var('host_id'), get_nfilter_request_var('graph_template_id'))); automation_hook_graph_template(get_nfilter_request_var('host_id'), get_nfilter_request_var('graph_template_id')); api_plugin_hook_function('add_graph_template_to_host', array('host_id' => get_nfilter_request_var('host_id'), 'graph_template_id' => get_nfilter_request_var('graph_template_id'))); } function host_remove_gt() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_id'); /* ==================================================== */ api_device_gt_remove(get_request_var('host_id'), get_request_var('id')); } /* --------------------- Device Functions --------------------- */ function host_edit() { global $fields_host_edit, $reindex_types; /* ================= input validation ================= */ get_filter_request_var('id'); /* ==================================================== */ api_plugin_hook('host_edit_top'); $header_label = __('Device [new]'); $debug_link = ''; $repop_link = ''; if (!isempty_request_var('id')) { $_SESSION['cur_device_id'] = get_request_var('id'); $host = db_fetch_row_prepared('SELECT * FROM host WHERE id = ?', array(get_request_var('id'))); if (cacti_sizeof($host)) { $header_label = __esc('Device [edit: %s]', $host['description']); if (is_device_debug_enabled($host['id'])) { $debug_link = "*" . __('Disable Device Debug') . "
    "; } else { $debug_link = "*" . __('Enable Device Debug') . "
    "; } $repop_link = "*" . __('Repopulate Poller Cache') . "
    "; } } else { $_SESSION['cur_device_id'] = 0; } if (!empty($host['id'])) { ?>
    () *'>
    *'>
    *'>
    *'>
    *'>
     

    array('no_form_tag' => true), 'fields' => inject_form_variables($fields_host_edit, (isset($host) ? $host : array())) ) ); html_end_box(true, true); device_javascript(); if (!empty($host['id'])) { html_start_box(__('Associated Graph Templates'), '100%', '', '3', 'center', ''); html_header( array( array('display' => __('Graph Template Name'), 'align' => 'left', 'nohide' => true), array('display' => __('Status'), 'align' => 'left', 'nohide' => true) ), 2); $selected_graph_templates = db_fetch_assoc_prepared(" SELECT result.id, result.name, graph_local.id AS graph_local_id FROM ( SELECT DISTINCT gt.id, gt.name FROM graph_templates AS gt INNER JOIN host_graph AS hg ON gt.id = hg.graph_template_id WHERE hg.host_id = ? ) AS result LEFT JOIN graph_local ON graph_local.graph_template_id = result.id AND graph_local.host_id = ? ORDER BY result.name", array(get_request_var('id'), get_request_var('id')) ); $available_graph_templates = db_fetch_assoc_prepared("SELECT DISTINCT gt.id, gt.name FROM graph_templates AS gt LEFT JOIN snmp_query_graph AS sqg ON sqg.graph_template_id = gt.id INNER JOIN graph_templates_item AS gti ON gti.graph_template_id = gt.id INNER JOIN data_template_rrd AS dtr ON gti.task_item_id = dtr.id INNER JOIN data_template_data AS dtd ON dtd.data_template_id = dtr.data_template_id WHERE sqg.name IS NULL AND gti.local_graph_id = 0 AND dtr.local_data_id = 0 AND gt.id NOT IN (SELECT graph_template_id FROM host_graph WHERE host_id = ?) ORDER BY gt.name", array(get_request_var('id')) ); $i = 0; $displayed_templates = array(); if (cacti_sizeof($selected_graph_templates)) { foreach ($selected_graph_templates as $item) { if (isset($displayed_templates[$item['id']])) { continue; } else { $displayed_templates[$item['id']] = true; } $i++; form_alternate_row("gt$i", true); /* get status information for this graph template */ $is_being_graphed = $item['graph_local_id'] > 0; ?> ) " . __('Is Being Graphed') . " (" . __('Edit') . ")" : "" . __('Not Being Graphed') ."");?> ' class='deletequery fa fa-times' id='gtremove' data-id=''> " . __('No associated graph templates.') . ""; } ?>
    ' id='add_gt' title=''>
    __('Data Query Name'), 'align' => 'left', 'nohide' => true), array('display' => __('Re-Index Method'), 'align' => 'left', 'nohide' => true), array('display' => __('Status'), 'align' => 'left'), array('display' => __('Actions'), 'align' => 'right') ) ); if ($host['snmp_version'] == 0) { $sql_where1 = ' AND snmp_query.data_input_id != 2'; $sql_where2 = ' WHERE snmp_query.data_input_id != 2 AND'; } else { $sql_where1 = ''; $sql_where2 = ' WHERE'; } $sql_where2 .= ' snmp_query.id NOT IN(SELECT snmp_query_id FROM host_snmp_query WHERE host_id = ' . get_request_var('id') . ')'; $selected_data_queries = db_fetch_assoc_prepared("SELECT snmp_query.id, snmp_query.name, host_snmp_query.reindex_method, IFNULL(`items`.`itemCount`, 0) AS itemCount, IFNULL(`rows`.`rowCount`, 0) AS rowCount FROM snmp_query INNER JOIN host_snmp_query ON snmp_query.id = host_snmp_query.snmp_query_id AND host_snmp_query.host_id = ? LEFT JOIN ( SELECT snmp_query_id, COUNT(*) AS `itemCount` FROM host_snmp_cache WHERE host_id = ? GROUP BY snmp_query_id ) AS `items` ON items.snmp_query_id = snmp_query.id LEFT JOIN ( SELECT snmp_query_id, COUNT(DISTINCT snmp_index) AS `rowCount` FROM host_snmp_cache WHERE host_id = ? GROUP BY snmp_query_id ) AS `rows` ON rows.snmp_query_id = snmp_query.id $sql_where1 ORDER BY snmp_query.name", array(get_request_var('id'), get_request_var('id'), get_request_var('id')) ); $available_data_queries = db_fetch_assoc("SELECT snmp_query.id, snmp_query.name FROM snmp_query $sql_where2 ORDER BY snmp_query.name"); $i = 0; if (cacti_sizeof($selected_data_queries)) { foreach ($selected_data_queries as $item) { $i++; form_alternate_row("dg$i", true); $status = 'success'; ?> ) " . __('Success') . "" : "" . __('Fail')) . "" . __(' [%d Items, %d Rows]', $item['itemCount'], $item['rowCount']);?> ' title='' data-id=''> ' title='' data-id=''> ' title='' data-id=''> " . __('No Associated Data Queries.') . ""; } if ($host['snmp_version'] == 0) { unset($reindex_types[1]); $default = 0; } else { $default = read_config_option('reindex_method'); } ?>
    ' id='add_dq' title=''>
    $type) { if ($selectedTheme != 'classic') { if ($i == 0) { print "
    "; } print ""; print ""; } else { print $reindex_types[$item['reindex_method']]; break; } $i++; } if ($selectedTheme != 'classic') { print "
    "; } } function device_change_javascript() { ?> array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'location' => array( 'filter' => FILTER_CALLBACK, 'pageset' => true, 'default' => '-1', 'options' => array('options' => 'sanitize_search_string') ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'description', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'host_status' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'host_template_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'site_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'poller_id' => array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ) ); $filters = api_plugin_hook_function('device_filters', $filters); validate_store_request_vars($filters, 'sess_host'); /* ================= input validation ================= */ } function get_device_records(&$total_rows, $rows) { $sql_where = ''; /* form the 'where' clause for our main sql query */ if (get_request_var('filter') != '') { $sql_where = 'WHERE (deleted = "" AND ( host.hostname LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ' OR host.description LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ' OR host.id = ' . db_qstr(get_request_var('filter')) . '))'; } else { $sql_where = "WHERE deleted = ''"; } if (get_request_var('location') == __('Undefined') || get_request_var('location') == '') { $sql_where .= ($sql_where != '' ? ' AND':' WHERE') . ' IFNULL(host.location,"") = ""'; } elseif (get_request_var('location') != '-1') { $sql_where .= ($sql_where != '' ? ' AND':' WHERE') . ' host.location = ' . db_qstr(get_request_var('location'));; } if (get_request_var('host_status') == '-1') { /* Show all items */ } elseif (get_request_var('host_status') == '-2') { $sql_where .= ($sql_where != '' ? " AND host.disabled='on'" : " WHERE host.disabled='on'"); } elseif (get_request_var('host_status') == '-3') { $sql_where .= ($sql_where != '' ? " AND host.disabled=''" : " WHERE host.disabled=''"); } elseif (get_request_var('host_status') == '-4') { $sql_where .= ($sql_where != '' ? " AND (host.status!='3' OR host.disabled='on')" : " WHERE (host.status!='3' OR host.disabled='on')"); } else { $sql_where .= ($sql_where != '' ? ' AND (host.status=' . get_request_var('host_status') . " AND host.disabled = '')" : 'where (host.status=' . get_request_var('host_status') . " AND host.disabled = '')"); } if (get_request_var('host_template_id') == '-1') { /* Show all items */ } elseif (get_request_var('host_template_id') == '0') { $sql_where .= ($sql_where != '' ? ' AND host.host_template_id=0' : ' WHERE host.host_template_id=0'); } elseif (!isempty_request_var('host_template_id')) { $sql_where .= ($sql_where != '' ? ' AND host.host_template_id=' . get_request_var('host_template_id') : ' WHERE host.host_template_id=' . get_request_var('host_template_id')); } if (get_request_var('site_id') == '-1') { /* Show all items */ } elseif (get_request_var('site_id') == '0') { $sql_where .= ($sql_where != '' ? ' AND host.site_id=0' : ' WHERE host.site_id=0'); } elseif (!isempty_request_var('site_id')) { $sql_where .= ($sql_where != '' ? ' AND host.site_id=' . get_request_var('site_id') : ' WHERE host.site_id=' . get_request_var('site_id')); } if (get_request_var('poller_id') == '-1') { /* Show all items */ } else { $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' host.poller_id=' . get_request_var('poller_id'); } $sql_where = api_plugin_hook_function('device_sql_where', $sql_where); $total_rows = db_fetch_cell("SELECT COUNT(host.id) FROM host $sql_where"); $poller_interval = read_config_option('poller_interval'); $sql_order = get_order_string(); $sql_limit = 'LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $sql_query = "SELECT host.*, graphs, data_sources, CAST(IF(availability_method = 0, '0', IF(status_event_count > 0 AND status IN (1, 2), status_event_count*$poller_interval, IF(UNIX_TIMESTAMP(status_rec_date) < 943916400 AND status IN (0, 3), total_polls*$poller_interval, IF(UNIX_TIMESTAMP(status_rec_date) > 943916400, UNIX_TIMESTAMP() - UNIX_TIMESTAMP(status_rec_date), IF(snmp_sysUptimeInstance>0 AND snmp_version > 0, snmp_sysUptimeInstance/100, UNIX_TIMESTAMP() ))))) AS unsigned) AS instate FROM host LEFT JOIN (SELECT host_id, COUNT(*) AS graphs FROM graph_local GROUP BY host_id) AS gl ON host.id=gl.host_id LEFT JOIN (SELECT host_id, COUNT(*) AS data_sources FROM data_local GROUP BY host_id) AS dl ON host.id=dl.host_id $sql_where GROUP BY host.id $sql_order $sql_limit"; return db_fetch_assoc($sql_query); } function host() { global $device_actions, $item_rows, $config; if ((!empty($_SESSION['sess_host_status'])) && (!isempty_request_var('host_status'))) { if ($_SESSION['sess_host_status'] != get_nfilter_request_var('host_status')) { set_request_var('page', '1'); } } host_validate_vars(); /* if the number of rows is -1, set it to the default */ if (get_request_var('rows') == -1) { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } if (get_request_var('host_template_id') > 0) { $url = 'host.php?action=edit&host_template_id=' . get_request_var('host_template_id'); } else { $url = 'host.php?action=edit'; } html_start_box(__('Devices'), '100%', '', '3', 'center', $url); ?>
    ' title=''> ' title=''> ' title=''>
    '>
    array( 'display' => __('Device Description'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name by which this Device will be referred to.') ), 'hostname' => array( 'display' => __('Hostname'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('Either an IP address, or hostname. If a hostname, it must be resolvable by either DNS, or from your hosts file.') ), 'id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Device. Useful when performing automation or debugging.') ), 'graphs' => array( 'display' => __('Graphs'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The total number of Graphs generated from this Device.') ), 'data_sources' => array( 'display' => __('Data Sources'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The total number of Data Sources generated from this Device.') ), 'status' => array( 'display' => __('Status'), 'align' => 'center', 'sort' => 'ASC', 'tip' => __('The monitoring status of the Device based upon ping results. If this Device is a special type Device, by using the hostname "localhost", or due to the setting to not perform an Availability Check, it will always remain Up. When using cmd.php data collector, a Device with no Graphs, is not pinged by the data collector and will remain in an "Unknown" state.') ), 'instate' => array( 'display' => __('In State'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The amount of time that this Device has been in its current state.') ), 'snmp_sysUpTimeInstance' => array( 'display' => __('Uptime'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The current amount of time that the host has been up.') ), 'polling_time' => array( 'display' => __('Poll Time'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The amount of time it takes to collect data from this Device.') ), 'cur_time' => array( 'display' => __('Current (ms)'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The current ping time in milliseconds to reach the Device.') ), 'avg_time' => array( 'display' => __('Average (ms)'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The average ping time in milliseconds to reach the Device since the counters were cleared for this Device.') ), 'availability' => array( 'display' => __('Availability'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The availability percentage based upon ping results since the counters were cleared for this Device.') ) ); $display_text_size = sizeof($display_text); $display_text = api_plugin_hook_function('device_display_text', $display_text); $hosts = get_device_records($total_rows, $rows); $nav = html_nav_bar('host.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Devices'), 'page', 'main'); form_start('host.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); if (sizeof($display_text) != $display_text_size && cacti_sizeof($hosts)) {//display_text changed api_plugin_hook_function('device_table_replace', $hosts); } else if (cacti_sizeof($hosts)) { foreach ($hosts as $host) { if ($host['disabled'] == '' && ($host['status'] == HOST_RECOVERING || $host['status'] == HOST_UP) && ($host['availability_method'] != AVAIL_NONE && $host['availability_method'] != AVAIL_PING)) { $uptime = get_uptime($host); } else { $uptime = __('N/A'); } $graphs_url = $config['url_path'] . 'graphs.php?reset=1&host_id=' . $host['id']; $data_source_url = $config['url_path'] . 'data_sources.php?reset=1&host_id=' . $host['id']; form_alternate_row('line' . $host['id'], true); form_selectable_cell(filter_value($host['description'], get_request_var('filter'), 'host.php?action=edit&id=' . $host['id']), $host['id']); form_selectable_cell(filter_value($host['hostname'], get_request_var('filter')), $host['id']); form_selectable_cell(filter_value($host['id'], get_request_var('filter')), $host['id'], '', 'right'); form_selectable_cell('' . number_format_i18n($host['graphs'], '-1') . '', $host['id'], '', 'right'); form_selectable_cell('' . number_format_i18n($host['data_sources'], '-1') . '', $host['id'], '', 'right'); form_selectable_cell(get_colored_device_status(($host['disabled'] == 'on' ? true : false), $host['status']), $host['id'], '', 'center'); form_selectable_cell(get_timeinstate($host), $host['id'], '', 'right'); form_selectable_cell($uptime, $host['id'], '', 'right'); form_selectable_cell(round($host['polling_time'],2), $host['id'], '', 'right'); form_selectable_cell(round(($host['cur_time']), 2), $host['id'], '', 'right'); form_selectable_cell(round(($host['avg_time']), 2), $host['id'], '', 'right'); form_selectable_cell(round($host['availability'], 2) . ' %', $host['id'], '', 'right'); form_checkbox_cell($host['description'], $host['id']); form_end_row(); } } else { print "" . __('No Devices Found') . ""; } html_end_box(false); if (cacti_sizeof($hosts)) { print $nav; } /* add a list of tree names to the actions dropdown */ add_tree_names_to_actions_array(); /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($device_actions); form_end(); api_plugin_hook('device_table_bottom'); } cacti-release-1.2.19/host_templates.php000066400000000000000000000730371413633772300200740ustar00rootroot00000000000000 __('Delete'), 2 => __('Duplicate'), 3 => __('Sync Devices') ); /* set default action */ set_default_action(); api_plugin_hook('device_template_top'); switch (get_request_var('action')) { case 'save': form_save(); break; case 'actions': form_actions(); break; case 'item_add_gt': template_item_add_gt(); header('Location: host_templates.php?header=false&action=edit&id=' . get_filter_request_var('host_template_id')); break; case 'item_remove_gt_confirm': template_item_remove_gt_confirm(); break; case 'item_remove_gt': template_item_remove_gt(); header('Location: host_templates.php?header=false&action=edit&id=' . get_filter_request_var('host_template_id')); break; case 'item_add_dq': template_item_add_dq(); header('Location: host_templates.php?header=false&action=edit&id=' . get_filter_request_var('host_template_id')); break; case 'item_remove_dq_confirm': template_item_remove_dq_confirm(); break; case 'item_remove_dq': template_item_remove_dq(); header('Location: host_templates.php?header=false&action=edit&id=' . get_filter_request_var('host_template_id')); break; case 'edit': top_header(); template_edit(); bottom_footer(); break; default: top_header(); template(); bottom_footer(); break; } /* -------------------------- The Save Function -------------------------- */ function form_save() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_template_id'); get_filter_request_var('snmp_query_id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ if (isset_request_var('save_component_template')) { $save['id'] = get_nfilter_request_var('id'); $save['hash'] = get_hash_host_template(get_nfilter_request_var('id')); $save['name'] = form_input_validate(get_nfilter_request_var('name'), 'name', '', false, 3); if (!is_error_message()) { $host_template_id = sql_save($save, 'host_template'); if ($host_template_id) { raise_message(1); } else { raise_message(2); } } header('Location: host_templates.php?header=false&action=edit&id=' . (empty($host_template_id) ? get_nfilter_request_var('id') : $host_template_id)); } } function duplicate_host_template($_host_template_id, $host_template_title) { global $fields_host_template_edit; $host_template = db_fetch_row_prepared('SELECT * FROM host_template WHERE id = ?', array($_host_template_id)); $host_template_graphs = db_fetch_assoc_prepared('SELECT * FROM host_template_graph WHERE host_template_id = ?', array($_host_template_id)); $host_template_data_queries = db_fetch_assoc_prepared('SELECT * FROM host_template_snmp_query WHERE host_template_id = ?', array($_host_template_id)); /* substitute the title variable */ $host_template['name'] = str_replace('', $host_template['name'], $host_template_title); /* create new entry: host_template */ $save['id'] = 0; $save['hash'] = get_hash_host_template(0); foreach ($fields_host_template_edit as $field => $array) { if (!preg_match('/^hidden/', $array['method'])) { $save[$field] = $host_template[$field]; } } $host_template_id = sql_save($save, 'host_template'); /* create new entry(s): host_template_graph */ if (cacti_sizeof($host_template_graphs)) { foreach ($host_template_graphs as $host_template_graph) { db_execute_prepared('INSERT INTO host_template_graph (host_template_id,graph_template_id) VALUES (?, ?)', array($host_template_id, $host_template_graph['graph_template_id'])); } } /* create new entry(s): host_template_snmp_query */ if (cacti_sizeof($host_template_data_queries)) { foreach ($host_template_data_queries as $host_template_data_query) { db_execute_prepared('INSERT INTO host_template_snmp_query (host_template_id,snmp_query_id) VALUES (?, ?)', array($host_template_id, $host_template_data_query['snmp_query_id'])); } } } /* ------------------------ The "actions" function ------------------------ */ function template_item_add_dq() { /* ================= input validation ================= */ get_filter_request_var('host_template_id'); get_filter_request_var('snmp_query_id'); /* ==================================================== */ db_execute_prepared('REPLACE INTO host_template_snmp_query (host_template_id, snmp_query_id) VALUES (?, ?)', array(get_request_var('host_template_id'), get_request_var('snmp_query_id'))); raise_message(41); } function template_item_add_gt() { /* ================= input validation ================= */ get_filter_request_var('host_template_id'); get_filter_request_var('graph_template_id'); /* ==================================================== */ db_execute_prepared('REPLACE INTO host_template_graph (host_template_id, graph_template_id) VALUES (?, ?)', array(get_request_var('host_template_id'), get_request_var('graph_template_id'))); raise_message(41); } function form_actions() { global $host_actions; /* ================= input validation ================= */ get_filter_request_var('drp_action', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^([a-zA-Z0-9_]+)$/'))); /* ==================================================== */ /* if we are to save this form, instead of display it */ if (isset_request_var('selected_items')) { $selected_items = sanitize_unserialize_selected_items(get_nfilter_request_var('selected_items')); if ($selected_items != false) { if (get_nfilter_request_var('drp_action') == '1') { // delete db_execute('DELETE FROM host_template WHERE ' . array_to_sql_or($selected_items, 'id')); db_execute('DELETE FROM host_template_snmp_query WHERE ' . array_to_sql_or($selected_items, 'host_template_id')); db_execute('DELETE FROM host_template_graph WHERE ' . array_to_sql_or($selected_items, 'host_template_id')); /* "undo" any device that is currently using this template */ db_execute('UPDATE host SET host_template_id = 0 WHERE deleted = "" AND ' . array_to_sql_or($selected_items, 'host_template_id')); } elseif (get_nfilter_request_var('drp_action') == '2') { // duplicate for ($i=0;($i $val) { if (preg_match('/^chk_([0-9]+)$/', $var, $matches)) { /* ================= input validation ================= */ input_validate_input_number($matches[1]); /* ==================================================== */ $host_list .= '
  • ' . html_escape(db_fetch_cell_prepared('SELECT name FROM host_template WHERE id = ?', array($matches[1]))) . '
  • '; $host_array[$i] = $matches[1]; $i++; } } top_header(); form_start('host_templates.php'); html_start_box($host_actions[get_nfilter_request_var('drp_action')], '60%', '', '3', 'center', ''); if (isset($host_array) && cacti_sizeof($host_array)) { if (get_request_var('drp_action') == '1') { // delete print "

    " . __('Click \'Continue\' to delete the following Device Template(s).') . "

      $host_list
    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '2') { // duplicate print "

    " . __('Click \'Continue\' to duplicate the following Device Template(s). Optionally change the title for the new Device Template(s).') ."

      $host_list

    " . __('Title Format:'). "
    \n"; form_text_box('title_format', ' (1)', '', '255', '30', 'text'); print "

    \n"; $save_html = " "; } elseif (get_request_var('drp_action') == '3') { // sync devices print "

    " . __('Click \'Continue\' to Synchronize Devices associated with the selected Device Template(s). Note that this action may take some time depending on the number of Devices mapped to the Device Template.') ."

      $host_list
    \n"; print "

    \n"; $save_html = " "; } } else { raise_message(40); header('Location: host_templates.php?header=false'); exit; } print " $save_html \n"; html_end_box(); form_end(); bottom_footer(); } /* --------------------- Template Functions --------------------- */ function template_item_remove_gt_confirm() { /* ================= input validation ================= */ get_filter_request_var('id'); get_filter_request_var('host_template_id'); /* ==================================================== */ form_start('host_templates.php?action=edit&id' . get_request_var('host_template_id')); html_start_box('', '100%', '', '3', 'center', ''); $template = db_fetch_row_prepared('SELECT * FROM graph_templates WHERE id = ?', array(get_request_var('id'))); ?>

    '
    ' onClick='$("#cdialog").dialog("close")' name='cancel'> ' name='continue' title=''>

    '
    ' onClick='$("#cdialog").dialog("close")' name='cancel'> ' name='continue' title=''> array('no_form_tag' => 'true'), 'fields' => inject_form_variables($fields_host_template_edit, (isset($host_template) ? $host_template : array())) ) ); /* we have to hide this button to make a form change in the main form trigger the correct * submit action */ echo "

    "; html_end_box(true, true); if (!isempty_request_var('id')) { html_start_box(__('Associated Graph Templates'), '100%', '', '3', 'center', ''); $selected_graph_templates = db_fetch_assoc_prepared('SELECT graph_templates.id, graph_templates.name FROM (graph_templates,host_template_graph) WHERE graph_templates.id = host_template_graph.graph_template_id AND host_template_graph.host_template_id = ? ORDER BY graph_templates.name', array(get_request_var('id'))); $i = 0; if (cacti_sizeof($selected_graph_templates)) { foreach ($selected_graph_templates as $item) { form_alternate_row("gt$i", true); ?> ) ' href=''> ' . __('No associated graph templates.') . ''; } ?>
    ' id='add_gt' title=''>
    ) ' href=''> ' . __('No associated data queries.') . ''; } ?>
    ' id='add_dq' title=''>
    array( 'filter' => FILTER_VALIDATE_INT, 'pageset' => true, 'default' => '-1' ), 'page' => array( 'filter' => FILTER_VALIDATE_INT, 'default' => '1' ), 'filter' => array( 'filter' => FILTER_DEFAULT, 'pageset' => true, 'default' => '' ), 'sort_column' => array( 'filter' => FILTER_CALLBACK, 'default' => 'name', 'options' => array('options' => 'sanitize_search_string') ), 'sort_direction' => array( 'filter' => FILTER_CALLBACK, 'default' => 'ASC', 'options' => array('options' => 'sanitize_search_string') ), 'has_hosts' => array( 'filter' => FILTER_VALIDATE_REGEXP, 'options' => array('options' => array('regexp' => '(true|false)')), 'pageset' => true, 'default' => read_config_option('default_has') == 'on' ? 'true':'false' ) ); validate_store_request_vars($filters, 'sess_ht'); /* ================= input validation ================= */ if (get_request_var('rows') == '-1') { $rows = read_config_option('num_rows_table'); } else { $rows = get_request_var('rows'); } html_start_box(__('Device Templates'), '100%', '', '3', 'center', 'host_templates.php?action=edit'); ?>
    '> > ' title=''> ' title=''>
    0'; } else { $sql_having = ''; } $total_rows = db_fetch_cell("SELECT COUNT(`rows`) FROM ( SELECT COUNT(host_template.id) AS `rows`, COUNT(DISTINCT host.id) AS hosts FROM host_template LEFT JOIN host ON host.host_template_id=host_template.id $sql_where GROUP BY host_template.id $sql_having ) AS rs"); $sql_order = get_order_string(); $sql_limit = ' LIMIT ' . ($rows*(get_request_var('page')-1)) . ',' . $rows; $template_list = db_fetch_assoc("SELECT host_template.id,host_template.name, COUNT(DISTINCT host.id) AS hosts FROM host_template LEFT JOIN host ON host.host_template_id=host_template.id $sql_where GROUP BY host_template.id $sql_having $sql_order $sql_limit"); $display_text = array( 'name' => array( 'display' => __('Device Template Name'), 'align' => 'left', 'sort' => 'ASC', 'tip' => __('The name of this Device Template.') ), 'host_template.id' => array( 'display' => __('ID'), 'align' => 'right', 'sort' => 'ASC', 'tip' => __('The internal database ID for this Device Template. Useful when performing automation or debugging.') ), 'nosort' => array( 'display' => __('Deletable'), 'align' => 'right', 'sort' => '', 'tip' => __('Device Templates in use cannot be Deleted. In use is defined as being referenced by a Device.') ), 'hosts' => array( 'display' => __('Devices Using'), 'align' => 'right', 'sort' => 'DESC', 'tip' => __('The number of Devices using this Device Template.') ) ); $nav = html_nav_bar('host_templates.php?filter=' . get_request_var('filter'), MAX_DISPLAY_PAGES, get_request_var('page'), $rows, $total_rows, cacti_sizeof($display_text) + 1, __('Device Templates'), 'page', 'main'); form_start('host_templates.php', 'chk'); print $nav; html_start_box('', '100%', '', '3', 'center', ''); html_header_sort_checkbox($display_text, get_request_var('sort_column'), get_request_var('sort_direction'), false); $i = 0; if (cacti_sizeof($template_list)) { foreach ($template_list as $template) { if ($template['hosts'] > 0) { $disabled = true; } else { $disabled = false; } form_alternate_row('line' . $template['id'], true, $disabled); form_selectable_cell(filter_value($template['name'], get_request_var('filter'), 'host_templates.php?action=edit&id=' . $template['id']), $template['id']); form_selectable_cell($template['id'], $template['id'], '', 'right'); form_selectable_cell($disabled ? __('No'):__('Yes'), $template['id'], '', 'right'); form_selectable_cell('' . number_format_i18n($template['hosts'], '-1') . '', $template['id'], '', 'right'); form_checkbox_cell($template['name'], $template['id'], $disabled); form_end_row(); } } else { print "" . __('No Device Templates Found') . "\n"; } html_end_box(false); if (cacti_sizeof($template_list)) { print $nav; } /* draw the dropdown containing a list of available actions for this form */ draw_actions_dropdown($host_actions); form_end(); } cacti-release-1.2.19/images/000077500000000000000000000000001413633772300155635ustar00rootroot00000000000000cacti-release-1.2.19/images/accept.png000066400000000000000000000014151413633772300175310ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ŸIDAT8Ë¥“ëKSaÇý;vÎvl dD!‚„P{$;š ż,KÓݽÒ6cØL‹2r^ÆH)-³ÔjsNmêÔæÖ”2qÙQB̽éBµat±oçìÅL#zà Ïçó{®qâþ' ø‰r§ê³=)LÆãýaéˆ8,u%2Rg¢>ݾW´« Ï›JË<É!G†›A ú–»¢é\lF‰ë$½THÒCÑ; تtæxRäêœÎÕ~Ø^^ƒi®2®ïXíCãLØø‘dŸÞ&Èñ¤3ÝIëÌM¬ ”¡Â_ÍÌèØ”³©ö…ýõ=\œª€ØB®‹¯“˜@æN2¨Æ²¢•9˜UÞSPLB1UõT!Ükƒ0x•p°’Üž#H¸Bb‚Œ1Ól†5Ø„ _1”Oä,˜å$O>Æß¸ÀµPd mÏa›kD|=ÉÄGí Vn£6 Ö[Ä®d‹桚(ÄØÚPþ±ùmÏ.Á0QŒ¾`'Fb#&ܧ6ú—»aô«Pë×âÓ×Qèý—·1Ø2[µ+z÷iô; ¨ù]ÐC17æ›Ð¾pºI9̾jD¾}ŽÂ›?7ayzeÎ,hXAK í^3¨*bk ©·ù@ì+wQ=!‡Ú}uÓåXz·€¶Ù”‡Âq:g쯺‘n= ª’Ø:Äd+_¸½³Gƒ‡ÌTŽæA;œÕ JÎÆ£¥.‡Š!PóÖ)5!Üö›H:¾ˆ˜Üep°’Ö€úÑ"œ–£•Ý‚…õÎ"ðKy¦w|Ê{Hš2!i‡í~3z_XÑ;o…ÅkBZK* ^ˆRô®Ÿ‰:OŠ(¡§jF å…*^˜­È°ÑS¥„诿ñ_ó gЬåyºÔcIEND®B`‚cacti-release-1.2.19/images/application_edit.png000066400000000000000000000012771413633772300216100ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<QIDAT¥ÁÝkÍqÀñ÷çw~çXÎæ0Ù™ç$Ö¢Q"¹šBJ1‰I-QJü¦qA‘‡˜;jv±”\x(yš’§Qvl±VŽÙÃÙÎùïçc¿•ÚËë%fÆÿ®î]¹ºæX&kq3@SÅ©ÃÔPSÌ9Ô s§Ê„Xð«£#u¸õDÝ¿fEÍ©hQÜ+/b,⿲îpÆÏæe3?«ÁÀ<†ù挆ms«Ý=„|3%”/8 05œ‚b¨NW0\Á>ß%ûü2‘â*ö•ÝãÕÙý;|̉'ˆæ &†¨ày‚ˆ‡ˆC3׉ö>¥¢j;‰Y‹ùÖ=Ÿä­¦ã¾SGÈL"* jD éÛÄroˆÏ[Aæ]1ÉS2¡‚âÉ• ßÔ!fx€‰€€äûï#?ž˜½†\o3±ñBÏË$Y\¦ÚSuü!" BÈréû¾Ü&1g-C/"ѯD‹Kˆ[†+©å,Ý×Úé‚€"ˆ!¡/y쇛$æn`(u/˜Iúa;Sjø88‘gN ED„þä ~¤Ú([¸Žü§&"1#70ƒô£Tl:OQùL•¯ªü!@W[3…ï¯)ÈTz_ŸfRYŒ¡Ìt¾=KR¹åÑÄ4BjFÈOu÷´ÔŸ êÔ9Ô)µÒÄæúK¼m>Hçƒ6ÆUVó½/Å¡­ô5<ÆTQ%ÔÂ013F;²gQphW½çxyç=Ý]?SJWÖmoç/ÄÌ­nUéà’Ùåþ²³°h®m°?½s}ã«÷üÃo¦E(ΖSáIEND®B`‚cacti-release-1.2.19/images/arrow.gif000066400000000000000000000015331413633772300174060ustar00rootroot00000000000000GIF89a÷`  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAAEEEIIIMMMPPPTTTVVVXXXZZZ[[[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\]]]]]]]]]]]]]]]]]]^^^aaaiiisss|||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ„„„†††‰‰‰ŒŒŒ–––žžž¨¨¨µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ¢,8E H° ÁƒÁ(DXP!†B(q¢¨Š1BÔxñ Ç… Šü8²dÄ’"-^|¨’¥Jƒ;cacti-release-1.2.19/images/auth_background.gif000066400000000000000000000330721413633772300214170ustar00rootroot00000000000000GIF89aE÷ÿ 3)4 8<&7Pe!V, o:CJDJEWFXVESZSZNZ%HiHeTgShVwYzIk&Ke4Mp(Mp2Xi"Vk6Zu$Xv8lV k\!hu bh'dj6dy&hx5yd"tv%s|5OR@Uo@]vG_wPkmAc|JcyQuzI[ƒ j‹iˆ%l‡4l‘$l’6t‹$uŠ6w”$y•7s§ |£'|£3²$fKgTt‹B‚Qz•Cž)–SQ9j‹m)f42™x)˜u:±h,tH¨~H»zDÍhÐ>ÆE…–†‰%…Š6„™$‡™5—…6˜œ"‘œ6†­ˆ¢&ˆ£7„²+„±3–©)š¦8šµ%›µ4§•§™&¡•9©¨¬³2†‰D‡ŠX†™F‘R’šH”˜Z—™gŠ£C—¨Eš¥X´E›¥c¡‡]¨™F½‹D¾‘V£ªI¥¬Y¨³Fª´Y³ºF²¼W£«d¬¬uª³fµ¡p²¸f²³qžÇ*¬Ì­Ê)ªÄ8²Î+µÍ:¹Ý&¸Ó:¿ç¾á+¬ÉC§ÆR¯ÖG´ÉI¸ÊSºÕHº×U¨Ád¸Èe¹Îq¹Ôf¼×q½èTÖ«ص:Ì€CΞ_Æ©Bν]Ó³@¸eé©VÏÐÊÌ3ÎõÓó+áÜæÝ4øæåý4ÄÈAÆÊXÈØJÇ×XÕÍ@ÑÔE×ÙVÇÉfÇÊzÅ×gÒÉ|×ÙdÔ×xÉæDÆè\ÔëK×èZØøLÙóYÅçkÀáqÞâcÛãwÛ÷dÞñséÒSãÚhçÛwéõNìâhàåvåühæøróídóîyóþfñúp–—“µ´Ž²²°ÁÏ€ÊË–ÕÛÔÕ’ËÆ£ÈÊ¶ÚØªÜ󵧾„Ûâ“ýÞ”âë‰äè–íõ†íò—üáöüõú—çç©æè²ïð·ùü±ÈÈÇ×ÚÃÙÚØßãÑéçÂæè×îñÚûýÈøûÙèèèîîñîøëï÷öóîíóîôøùèùùø,EÿY°xñB ‹"4Á°aÃk™H±¢Å‹3 !±cÇ6 CŠIrä›7rä´QYRäÉ7Ñ™ ‡Ž:m„ì ²£gÏBrô¼±"Ð@)F´xi›™PùH:uÏž2}"Y²«ë®]ݺ¹s÷®¬Ù³g½±ár«T)@¶âÚÚÅFEŠ&î6ÄKÂG¼;XÑA0 …MÀysåJ ˆI@6qø°‹WöôÔÇÏšWšD9r$ŠiQ¹²E˺õÙ±a³eõ W–r¾|ñÁ[Ž&Lƒ ÂD\N–”º¿dḳcsÐûÜéz _À Ƚ A&j„ÿgQâDžÑÓ«O¿zË÷+å œ3'%}úrîëן¿~Êÿù$UL2ÒQ7Ý‚>UÔQ„RWqÅTIåÇ ~tèag”PÂ/¼øòË7㨣Ž<òØãâ‹0¨N\ì,¶è¢Ë7ß AB5Ü%¤$¤ÀDã„ÐA ¹Ç\¬Á×aAF a6F&¶âGcWd±ÃT”)J2*Â<ðÄèæ›.²¨Î8<ÓŒ0¼…¡§ž_HÂI&¿e"h&É}‘€*±Rm±"}ÄQŒ2×S L€Ý@Ûq÷A ™ê啇Ôz¨¦ê¤ï!Ú_}÷Ùÿ·ß¬´úà}|âá ¼ØƒÀN—à Ã"µƒNH…Ñ„¶‘Åòá! ÔVËY’(b ‰$úŒ8⬳Î<äêsÏ=æš{î¹úè³Ncsc-ÄÔÒŒ81pEC™WD ÉBX*ÔA { å]•ÆÐ•ya¶G\ÔRšÅ\h¡(¤ÂŒ¸óÈC®=÷À¸îÉçšO=øà³Ïøùì“Ïùè›?þøøÔS:è3Í3Ï£øç†$Âä,(.¸„’C³¡%‡7D ˜¥’é i4˜ÝÓ4•N}êLÚ€7¸|`v ¤!bƒ¬é`'¼AÖî6ºp…Àú‚³œE½, °mÉC¿ CŽá‡@ÔaÿhÀ/l ›ñRáü ‡ô@PŒ¢¥hTpUÄ·ÈEР"!à¢8‡>ÔA3²µ§E4¾€œä(‡ṽœË£÷ÈÒ5£µ 1RÇŒhD`^a @8;Œ Œ Ô &II`°B𬌠‡¤ä''Y`á´ˆ °ÀJV2á Lˆå¼ArñcýÀú@·GΡsîcGüÈa gðÂ?H¦2°‰þáb• "zà0xAO`ÐSyÓƒnzÓ›ÁŠâE(Á T ì¢vòîï# °hq¾ðžø¤ç Y¸ÿ 1ÕR\(âÐÄ@Ђzá ^Hލ‡Ð:\«|؃Tæ€Â)ꀞµÁ l0Ï0zô£aœ 6JO|¡(íƒJÿÀR–â}hã" U¸â¦Ëp†4à‡¹^ú´ôpÃtHZ,ƒ“#ÇðQF–Àœ(hZ v7 h ªUÍT¶j…1lÁ (ðäV# @à¬(¬ð ZT‚eÀA´ŵVá!89êñ=\nî§€­=à' gÖ3Xf2Áp a\╨„,dQ‡nþÀ›—ýf7-ÊY‹b”œS5':  ;Lú@;5€L™³ˆ­lEx‘ÿŠP¤"#/JOz´žcœ":«ƒV÷ X@¨r—Ë\å²² Ð….Æ RÍXÅ*^ÐÁ ¶ËÝîrw¤Ü½À Ä+Ûòš·¼2ð.¼ðC”Ö¡-oÊP†E8âªHÅM]¡Sø}°|„CI‹Y,ã¨Ó`Æ °]ˆà¼€ÀP[¼ÖÎ0 Ì@ f¨ DC ª[Ýê( ‚*¨,-à  ;c`a U˜oðÕ¯þ©ûkXg(B<àAºÀƒÄöâ±o¥ÄcÅ ä%w¡›Wö¦v½ë]zn7£€íÓÎ9í˜TAÈj[+6»Yÿ€³ælØÙÎ\Îswñ¬ç<ã`:ø3 ¥X…(F÷Ј–n¢M苺?œC¤³ÀåôÞÙ»w¾3ç|M{ºÎ™Nï Øûh ªá樂Į@2 øU…¬]qàiL£x 2ç‚:`ZЬ +¦A (@›¦€²•ý°Øh3 À€ [ûÚ(À±”­€ 3@ßî°Àâ*(‚ŠX„Ìnè  -®‚tÜRºö)÷ÎqŽøHN²À»Ð‰KL"DZY„ÀÎð&÷YϽD"Ú Œö¦§^ 5WõÍnŽó¦C-ê‡ïy|ÿÆíw½;ÏáVqË]ô¢± óC:ÇU n‚ø…9`a»%zÊQ®iMÓ¹ÓŸµ ”ŽgRq «ŽºÊÐêC,¢²¶©*j=ÿæ›×64j1ZÛÓËf¶³çíh·ùÚp¯‚àMt›`€ÝÅý€´´ˆ„"¼ ‚î^ÇеÐÌÝ#ß½,¿ý½ €7œà§D$´‰*4|á&ïsÄqÆrRSAÂi1È$ l€µy›E>òP‡>è&¡u_×ÞÇœæ4®q¥ûÜšúÝTéH¡ÒDÇ}¨“Ný9‡ÚÁU(õÓ¡þôV¿º¦Yßïÿ2¤Áz@ìF…°‡]l$[ÙЦ¸Y¬l7W›÷'€6¬€èn{ïàÆ8€Êöw´@¯o¢ÖnÜÕbàñPyyÄû6 &9]p '7 •°y–pŸÇp·Çe`Fç`q”q‘Z' {ŸFr¡—ƒ,çQ[D\P|‡ö\@|57E§ROçszviÜErÕÇi›&×7cÛD«6eÀjdp~³FkÀpk¹¦kôU@ ¾6 ¬°†e'ð~i'€ÀvnWmÔfmùçu'nnzÇb[xŠÐyR¨c vx3oP x4ÿÇøp¸ Øp‡Ð “pp"H‚%˜d9Èg¢–Q^TzSÕ‚èÄ)g†Záz¬U²7{´g@rLØg%‡{yF^¤E/×YXðn@XÁ7ŒÁÈh5iA4”†iчr@}K÷„²Egì&‡—sU¸}Tçj‹k6µ_À@~cdôP ½ökÁ6l²à†ïÇvÐl϶lPmùwm ày×mȇ(H j€…hgˆØ]U C`~õˆH¶Fy<Àw‰o‚"B艶øŒ]öY‰dzQSZ/ª¨f°75rq‹¶W‹:z 9 Šp «0 µ k瀀±ØœÕæªH¤Fg ³Iʤúx«/ƲPž.‹ˆ96³ÃŠkìÀÆê ’3 ÊÊbp …e–Ð3Àp[öe>9¢yf´„´ ´0p N;§ªÅ pU‹§³‡µÈ«®}Ú]V„¡„F¯ˆ&E‰8÷ÚúÑ“Ÿé¯%z¢Ö©&j¢qÿÛ|t«ˆÐ]˜ œúž[ç·ù†Gçð §À „K Àp" 0gÈö~æ¸;– @G:²—»¤ßÖ¤f¹‘ ›Û¹0Ë] ›¥îÃ=¥kºº‡y®«Ÿ —˜¶ë]¼8VÄQG;A»Û0à´¿« Á‹€’FµÆÛ½Èk»C—®Ûe„ï ¶69¶7ÉÃÔk½ú1»ýZÃê¶&zµC—„ºY· ‹·Y·uOÙ·æ×¾ü0 ³ ¸³ lÄ(¸ªŠvÍn·C ¹Ç6ÀÚùm†–,f€‡j ìÀTú¹ @³\£[º‘cy —Á—@ Q6 ÌüEŨ7ÿ¼¦!f%œ)'<’©·ÂPk™0œaUkƒ‹ƒ-‰Ãß%hRô‹¿(¨2çË–|‰z½ŠlÄÑø„•º] DbP û¢Y÷ž|˾æ9·t´ Å̰†ö‹¿Î9‡s¤u÷nVƒ5¹–m2»¤àv¹àæwfÐVj ePgKž×Áy9Á¤ûž}œº‘y÷Y¦hJÄéÚÈX¤­&\f7Ïsêz.|ÉÌì šµÿéÉ~F] ¯s4)Œm|É·zìL´ç:›k®ÍØb@”¯MÌP|Ë® ® Ë€u>ý0ç€ Z¼ ÄP± IÇläÖ¤m†aÎŒzxÛÿi €²þˆ ¯@Š0ífiÔXÇÁºzÌ9•Èpç"÷yžgÈP­Qišƒ¸ §¤uZô\ÉUÃù<ÃûeÒúÔPÔd%¥Q•ŠêúYTŠ.ÈÛ©7Ï,üÜ\É,.é¡6éqM¡!¥é€êµ7gš¦)ê‡F]ûÑÐsmÄ•þiH·ÉÛÅ^ßÞ²ž·0jëø=ìÀ žà ÌÀ×ÀìV>½âËÖw=€‘ÿmÆW¾ßÿ‡ÙÜÙÆèb³ jpíÙþÓìÖ`9àíæÇKù&X©Mî_ºp€\ ÑJ dðÔIv¦€3è'×™‡Ûiz7ϦµïâzU\Ï*)é.ngœé¨o[·•[œîµ«9ê*s@\êôÑ!šÝ_^µW{Tª›-˱~u}Å ¯kx>îƒ gáPÛMMðØÊ0ÿØ0MCÊ4 U ²Hæ|Híj€ >ôœëÀ:–õÒ¸oã.9`î ²P‘”° ]†Ì]îÁ[ŸQ…Ž´ˆnf`/öuZö]ðÅ­˜Æí“_¡Üÿoã ?÷ñZ„ŸNêûÑ“žyiX;‹~¿Ï‘ªtöê³¼…† è›_ðìÀà¶9Ž_á` !E ½zÛ¶Uk‚D„ B ð€AD  \$À€€7TY%¢ L’<ùà…*jP)RCi†"lÞ¼9C'CêõË×OèP¢EûÕ£ÇîÜ2WÀ€u’ÁCêÔH(]½ÚE*H:mt«SÆ edž%ëÕÆZ¶4Ü–ðà¡Â,X¼€È ½{_|¼aƒº 6 !qEÆ,\€|Á,ä³h+£Å<íf:ià°¡C´,£M›®¢#äjXXWq­zFÿ•1}úÌÁ=ç‹ØÌcÍþ6+"2dÇŽË7kAD1cœ?‡}Ls2d-jÄKÕvHÅ£gT|?}üúá›Ç©©"‹ARÄSˆÈ€D/j|`Žúª0Ã&¸HH*É$ a 5^I&åpÂI'f@€8Ìo<~:çWšZ¦‘¨xÐJ*Jd©¤’«"©‚xÈ ,àÌÊQ-¶lx«„ ä¢Ë.òê+I> Â@ 1Ås¨¸ÈdŒ²Ëzä’³Í4Ãá41OKíµÕ°p-$ÒTÉŠÚnËm·´ÂÚqG²†» 8=‘“& t€Ž é ›ã92ÿÔ8»F D•GA$ðB$Š~ð Jzø ‡½"ø>ð»‚WÒü+‰,¬@@<‰Á”ˆ ÕPc¡0Ìé×*P šŸ(©Of™IVœª‹Kd¤ömıÇ:}£¬t‹!‰¬ë® Îí+½–d 3 J)©¬ò±Ç²¤¬K}½Ü¬³Ï­´ÔPS³L3Ó„ $ÑV{³Ð/t›“ÎmÏÂÏ<÷ܳ&hƒ £+ô9Üœ+£ ë®kdÑG#ýId‡rù<}ð9‡)Þ+$fÀÏ!ü’ g*ê/£ŒP8ƒÀE(ÁmU‚\ÿ_áµ›~öj:ÜÄ—…2z–Eñh¥êBJb¤Ä2®Õ!ÛÞ"α,om Ü·†œ«®^8WÝ$XR°   Jy›²±z-–LÇÌ6ì2ÜÎÀÔàÒJCMµ…63a4GcØ6‡!ÞR¬‰ç´Ø^Œ‘Û°cÔ¹ÛH®.”YðÈ{ùž¡.ŧŸsÄH $`è¾ûô :U‹Œ.‰%3®¯B„Q:)ATÊ^Ëðu¡›.´ :ìÆë¯…"ÑD»°`*´e‰„mJÞžJÛÔí¦Ûe¾¥7!] oË^·¿´ ‹‹Rã¨ä‡äéJ’If2È¥ÿ1uPL  Ýjt0ÑÌ µ™Cõ•®dp2‘!ËŽ0F=ÝD_øÈnW;5(bŠ@Ä" )I½,ø(ÞÌ„Âv,Ãj@‚Îâ<†ØçTH•~J’ ’€Ä ÃÒ­ºç=ð¹&ŠCÖ0Ô( î{Y=FDiLêp ¢Ò"F•ˆ„%,¡•kÉÍ2Ttt–oYŽq©À\`—î/¸ “/)F˜ ž,¨%»!r_ûò C:Ò™°6cPáFØ¥‰a©,YÚÓÅj(‚~Œvµ“¯a ž‚ˆá‰Ùx0…D¡¤‡á8…'Lÿ±8¤ª¢~ *êmÑ$Ë Lõ4“øÇ$*iÉ,¨öŠ4bH}k´‰õ¾ôˆívTÅ2€¡Gûñà0 %jt-ÿQ,†NZh9¸Dr“¼K^ÔÅ¿°K0OŠã@I/+Ý _¥\¤"Ñr¹‘¢%•bJØ*YC°7•FN´\E3 dt^ÿ‹©ˆ(/¨Hn4ƒþ*©IOJ0•¾ÆsªC`‰ƒ—Î-‘ÛÂWMmz¡^ ê—;}NO}(ÄF“BýšËê£.#©"€pìsM ò‹ZÔˆ ПïhX#iƒ´°ÒâŒÙsg†f3•¤G­øà[éèV`ð"®S™«ÚÚ¶¿~î‹b?[IC¤:4!sÏÈ6Or9k%5 =YW“²Nª0m÷#¼Yf‡4–¡Š¦ âl<ðÂ%ÔHþÕ(Íç†/›Û½°° 8l%ïŒçþÊk߉pdýLà@Û é¦ÝWÁ&„³ ÂŒf¸Ã¦+°) ”-Å¿^§°d\µ6¹a\ ÛèTLJ#O…* á ”§œ(âà)-lmëZLãõ¡Ï‘uŒó 1fhÈõf¬ÔÇÕ•³ö¸JÄÐhÿ5 ¡/XU`@„"¼¯]{·•:Õ—Ñ…«cA•àŸT/Ò5׉&>"»œÏ>oèW/|aWÛüöOr”À€ŽœesB¹ƒžRïzçœÁÇÔš×4:MlÚ\›HÓJŒï—®>„2²°‰ŒÓ%ÈË!É™QSƒïH…T€„eP¹¯±”Z¨VÐd`…cd@…ë9ƒ3Påš›£ª¢±€ü8‰§á"€05˜…::ßS#P7 LyKÁ¶Ûò­íا«ƒK€…õƒ°‘ £¾ö«¬9ùGŠ7ºà>tI’ `;Ò·xÉ(óë(@{/Èx¶3ä º1´ÿ÷+÷›¿‡k û£¿F+“Â30A´Þà–‰¹á˜Ȱ¦š‚¼/p×Ê¡1(”,È‚`:DPµä…eè¼Ky… ¤…W †½Yx¢3(œc= á9a3‰ŸËZq𞉈TÑÊšš–ÙP€8Š| d¹,c¢äÃ#~²1P/J 'Ì«n‘Be´)l¤·(,hî R¬ ` È7x;¸C{ ±È’m9%Ì?Ñ84ƒë;Øð‚3±?Ði4/¸?,˜ƒÛ(8m9­ä¸¾ DAü“/È‚Ž›D$È#kè(5E@<š† Œ£zƒ- T@ÿZðÀÑC50¶ŸÉ¦ÖƒVÙ"½TTéÚ¢• Á4 Y”2Ê©‚ CÈE T¤ ©ã§ ‹~2S„—LÆDâêƒ/ìÓ›ú: iÔÂta»‹z n„Ê¢ CGRšÂr „ëŠs :l¸w„GÁ ºÇº4ËÊ´MsÇSPDCô˜Q{ÉWŠ-5P”Ì<`hH8 ¤  bx…W°HNœV˜3ˆˆŸYü€ž I"Ë|€Z1ÉV¡0ƒÜë¡vê=íʨ†¡ØÅ”»6¨Ó§œ„Š~ê5˜X¸„2À‘ ´¬Ëà«öC°u;³#—,\JÿÅê€lÜF¨ä3zi ˜;¸€?¼¬TC­D´5±4ê;ÒËwŒCщԠGÿs¯ÚŽ‹q¼]â%.P@œ5¦DáGÈh¤3j<ŠR,MÒÆñs, .äÌ%8( ;öË»…±4¯üJÀ£Cì„ ¿K0qŽC£¥t »ãè]ÏATÀÙù%.à55€¥‰¼|Ïi8‡òxŸú¼OÿÁ$Ìþ„†4ÐR)•,²ªËLÐú¨ÌÚc•yP­„*PôÑÁ ÉH‡¡(d™| u…œ\„«ë¶‘/pB=4%¾4Æ»wÓ¾ œšQát»¨ä7ưÈÒQ¢ŒåD·€ë óŒ®4 Y“$ËÀs Q“Ñè¸éÄÇfD­ªÄÌÒt,ˆ,p“éÀKKP™ípq8£m4 Z ÑCÌüÄ"k"•_ã&a3’x°SõªŒÀ¥Ù‚4¨@Å ^› ˆ¡:Ô”›#&:<ò6……JXJè‚íZh˜:`P…Ùœ /X›/.ØDÎMÁµFÒ›gÞ_ÄÕB{㯋ú¯ààÆ/„z %áÐ4Ì]3}I­lY@ŽÇ*hG°\©Ô(¼w†ÂÒq\UjK=‰]Ùdó¤ä™¸¡åxŽ>ÌìpÏ;úä„6 zˆhèR¦dPªàâÚ*êÚ¯ýÈÈÜhqº^0[§a &ÏLºa!€mÈP ¥#–Þ^è'ƒüi›Ÿ”˜‚ºÍeÜ*|f¾ÁBŸœýú_ÆÊ·86êNÚX 0ÈéC[šŒ¢ÌÊÿ̰¨ê7 KAä 0 >]m!Ù¾k|!kaIÖR€\ëzK Èí :O¦Pþ¼žÊDZ˜Z§!î™ü˜*Œ¦ÞU!€ÃŽˆ%fHtºåÎéhÃâmãFØl1¨+·yÉnA(ÊšR`e3ÓÔ–FŸî‹6γ‚mˆí0Œ;ô‹ ’%Ù±¶\WÍ_¡“:˜ëD6)¼…£¥ ÙÛ¶ vŒ*@kè^Ä -O °îÚxî}…F9ð¸áïvƒðV„RV^qpzáH»èé¥ÃÐDlIX‰íï…ló± ô ÿ§ý,i#l'$$ø­·9$Üä°¾OªB9‡šp]»ð£Qw±æ°æf@4à k[âãóíâ\@þ»ë\©Ï9n›nÕŠ‘qA ÓRèv-›PDXÄÚé0DÈ'W¸-á¥z8rS+eæpò×ñZ‰0PW¶ò«‚þ6Vôª.‡Eý6«ð­‚@§ð,»I-D+9§KhŸLÍó=LQnQqi¨hF—Õ?Æ= ¸æ£–cE¬Q*0 å0TâíGG–=çEK…¡&u¯EδÈðppD઴.aó„¥õQ!ÿè8ÛIƒœ@¦H‡zÈ×—¡‡5¨ QòZØÀ§ŠÞŠø6Å’0²ùnŒ0ö’P‰¤ï2)‹ðÁÊ~Huéœä£'·¶énïvfþöÕY7N ’ÞD\ @wŠ¥ÑÆýÂÃÐX:î³*!xFO_ï ¢—ôƒ{°K·?&Ít(¥%ÖŲ—+Mø}¾qSÏTGÄXTƒ-Èž*¨øeïÖxŽo͇V^fùÀVïùæ9*oPˆ’4IV<'°úrE°‚ó™¢õ'ɦ[Ô¨£öa¶˜iX°¯“œ„:úzOz†ºÂ@¯ÆÀ¡f|3t}3ê Ÿã«wÿbtOÏBg´ß EK©\í÷˜å\àÊð¤)‚/ëaÕ¸—dÉ£dø², º·]QƒFè×S+vàø4H^‡>åkù§P¨’€ŒXr5 ÉuP™÷REÀË.P…ðo_VÔ¤vË\©RÅ«Ë  «x©D©,JUfP¬hq†ŒŒ7rìØ±¢!i,QâB… ´h#L˜@€¼`ñáæ†œ0èéÓР@% *á(R .\XºT„ˆ 2˜2Ýxñ*V‹4,âÐáõ+X¯U°TK Ú´dDz­¢£+ެX;*­«”©Ó¼v•ŠÐ‘å/—¿€¿ÿ|ÁA†Ž"¾Œi]ƒ?ó°C:èŒZ*#:TÑE=èPG&™À’I«Î*’=d¡CH÷ÙG+·øõxQàöágÁ¾V0ÂÊ8h9NÈnàæäˆîI%˜0°ˆcXë­³žCë9ä0.í³Ó~ûíùê¾{„æa\øN˜`mÜ‹û¸8ì¢ì9àÀ:¶$Øa~¥[ýÁo¸ñFÃ/üF %±F V\¼‡£;ÒqA–Ñ£üñƒ ?ÿØ`Ï38Vl!ưÀbK1”ᇠÀz¤ë•IH7 p@à„8m#ØY2¨Á@À‚VPÃ+Œæ‡? `'8Òp¦B+0 8A<è1{ìãûÐG ï¡Ã^mòXÇ:ÊQ`ø¢TŠHQÜVE·ºÁ‚ VðŠ gƒì€aËc\ẢågWX,\õNò8ȱ 1‚L^ð›Ü¤nìd¬l®sèÀtÇÑ®t&hI\'ÈA²yÍ—!ew»oéŽvøbñìõÈ¿ï/È[ )Èü°Žô$¯®'Ê ¬ o€˜Ãè‡6Ô kÿÈA ®À°9\©‘P#Á‹]Æ#öø%0ƒ Ì{ÈCÙ¨ÉúW [袂€(EéˆÎYÖLPIp+XpÌà Á à 4öPBœ Z@ÞÆÂ$à ½´Ç;„©O`ÊéHÇ8²á‹XÄ¢}ÀÄ7Ð •ÀDºÅÜ 7W T—QN‚RuÅÐ~ÆÈ0aÁ RêÆ¼±xcbúR™fàš âNs:ºhFs£¤';™QB&²‰4$"mw…¥êk’‚¹Â z…£6ϧ˜IBÉÓŠ&ɈІ±’•¬D8ÿ,K‡aŽR„"¡ËFxÃï¸+^óª×wØ\@`±@Ø"NXjr`täÁD`ˆåpú͈s³7cÐ 4˜Ð‚IH‚œð„œ6'°Â(êº×ÙâÕîðF7tQ‹Z8‚–ð‚Wäö–9ø¡¸{ ‘ê@ôQnµt+Ýè7ÒÀ+ )ve lW»Pw»ëŸ4 ‚ÐéèÒ«Þ6·½&è£éÞk@Õ¨†Ìd"S _ٵιíEàzŒSp 9ÅéyMƒÈn –r÷ª&XÃRMÙ˜2” ‰`„"¶ÿ±v¸Ä&617Úˆ§-5~(…-â0i¥„5NIe$¨ü¬Ç A B, ÈF€‘  ´Zд‚Œ`Ê!Hí åè¡·ñ‰Ã\bn™ÛÀ†ÿ@‰Hè€$µšè0‡6ðôeÖ{™.^=3%ÏëíU€ùìgõÚ˜Œ/XA­èE3ºÑ^@’\ä÷8‚5‹¥i iÙØÆç=0¨œÞƲ÷¿Í%°è|^NëlŒˆ,„ëUºÇ0ÁÞ«k]»€h@ Àý¦ “+òBÈ@1T£Öx6´£-mkìAhJSÒö`ˆÿ!€ÒÞÔ@#{8EŽÀ`d°»Ýì.2^k¥½á;Û@`#@ |Àø@gO»àÑnv³ÿЇ2ðo (áóËr@Vиâ¯8¦3qLÓ,Ö¢52Àîp’|0¹»S®ò•³œÝÄŽp@¨—Gܺ±ynÄýíûÞ>ÿ9Ðy¨`›?› Í‹£›˜'æÀú’Eag–›Ò ÊRjp½ë^ÿzׯ`< å\Ã\â´{8î» ÷¹Ã}P@Ê庳[ PÚ”M™ÊHâ•°%œ` qˆØ#ùÇ+ šÁlŽ2› ”@¿(Îlnz¤ç6M?=êQ;cacti-release-1.2.19/images/bullet_arrow_down.png000066400000000000000000000003111413633772300220140ustar00rootroot00000000000000‰PNG  IHDRµú7êgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<[IDAT(ÏcøÏ€2 )þïú¿ùÿêÿ‹þÏøß÷ ‹‚í_wýßÿ'PÑœÿõç±(X-±èËŠÿÿÏü_õ­P«&Kt~Ÿò¿ì[®NGVI¾Î”‚! Ž §QƒP:IEND®B`‚cacti-release-1.2.19/images/bullet_arrow_up.png000066400000000000000000000003111413633772300214710ustar00rootroot00000000000000‰PNG  IHDRµú7êgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<[IDAT(ÏcøÏ€2 9›%V¿^$‡SÁz‰eßWÿŸü­S«‚Õ‹¾¬ø¿ñÿÌÿUß ±(˜ûuéÿõÿWþ_ô¿íêy, úþ·ü¯ú_ø?óÒÿ˜oC,$Ó Шi¶^IEND®B`‚cacti-release-1.2.19/images/cacti_about_logo.gif000066400000000000000000000201761413633772300215550ustar00rootroot00000000000000GIF89aí[÷ÿ˜ÔZ6”'P—A‹Éfu¼\zd¼2˜¨Še€Q‚Åb¼Æµ$›¤ÜQ†¹eJ¥7Px¶CÈÈȸâyŒ( yÀ^D3c³K™Òn£ÙeJ­#tÄ8-tb«P*RzÂV3¢T²*Z´4lllååå• )‡Yµ+C« R¡(ÐÐÐT‰((ž:•ÛçÑ~Ã`5„'„Ÿy•ÔHOž%7H)xÆ;t¼9Z•,{{{240Gu!¤Ørb«3…ÌA}È<„ºWg¬C‹Ì]]²Ci¼<ÐEžÔp‰ÎCŽÌhëëëi´UM¦#IMF€”Ðlòòò‘ÓH™ÖJ>a!M°&r½QpÀ@l·XlÀ4¡³–…É[A |¹_qÁ6ƒÉR]®I]¸-tÀKYªE‘ ÇFxÄEJx>œÕf9¡&‘Ì[ÁÁÁ ‰T¤Bb /Q«<ªÛuÕÙÒ—”ÑbŠÍK{ „ is¬VB›e¯Qt£I~ÄWa¹/a”2ƒÊI’"4>T*Mj9U¨Ci­5/™"™Éq\žMY¯>q²NQ›7œØMÃSl»OL¬.Q®2ÅXQy*†Èd®Ýxg±4ŒÅ]#˜e j¯8 ‹l²>‘ÅjzµZ@‚(zšX?Ž/‡Ádt«½‰(¡£oÂÈbâ§é"R,D`¶±ãÇ#K¶jBY‹`±`™I&n uðI((qD5U3dpa t¶HÁÉäÛ¸së~,N?Ša˜EcL RÏÆ„þqÌg 7¢kÈ¢áÎ5lÌ1ùÐÔ¹2´ìÿO¾üø ,~GVœ€IcÆl(U @è+?|"ý! sÚq‡1²$Uî˜çàƒz•„ g=Ä^c;`¥²výpÅy $Ñu0€p¨¡ÆÚMÓ5l’XÊD¨ãŽ;6±„ ]–ÃAC‡€h׈„ô€Ä1ýU`.ÞA2b@!`¡Ø <†y[:ð¨c¦™H¬£æšë¤ãæxKLPaC+5Æ‚eäÈž…,yǘHÈ t@ €Ì¸¨Æ•LQCMåÌbVúX;ýdªé¦œnZT'†±ÁžÇˆÿ8"… ‘Å …ªÁj(¡£ZRó(üÐ¥È~C§Ì6ÛKï8»WM$ÐÄC• €Fä±'²uQHÚÁ„AE¯¿.eŒ£ÖÂÂR$k¯Vë8«¯¦òP¦úÎÀXV&èÀ¶­5Šì™ÇˆETãúFºaôzîÂK@,7æxïÈU©Ã):èX©%(ãÀ)üðãϾ0# U â ü˜ÚhaœO³šFQÄÆÑJ°qÇ xÀ`’,5K&kšCÌe¼3?*k 3?R¬¬u7O ³c_`ñƒü1tCg!à­ôÆn0ñnœÄÿ`…—(0õdn¾YÕ™~ͧòÄŒŒ›~Í@úJžU f;™pûÜåS!¦E7uUЭÆÑT$}²LcM` ‹(&Þ཰¦UÀ‘Ç<§[3€x?’cê¬åXa~¶È£^=qtCiPúų‹†ÒPhg 5PÃÚ‹»cÑvzÊÀÍ£)eÄLñ1Kq¼äéè[üå™kˆd° Ñf/Ñ‘’ö®ÃïÀP¸Òë`ƒO€ÀX ZŸ²œUJÔ«10H,êg?üÉl1cÌ<Žgµÿ5/€ q ’@ïÀÄ…ðIx8h dÿ¨ð½Ìa n˜`*X¬6,Fƒ_Q³`&¸ÇÔckeߦ¶æò~­8 eÀ‡$ X€4£F,ìÀZZá\mé*Q."aÄ-Ä@‰ØÅ+?(j…•‹Y#0ÀýÛb̺¸)’´àÆÈÛ”Ñ!j”2œÐ XŒ¢ 6H#ø>°å ú©#¡î¨¨! ñ{Ž˜HáØ]Â\PÔFÆŽuŒªëð]VÚ§¯’*Åt#Hlc˜Ù4óÈø&œ1œ¸˜Qâxhn0KXíjXËZ¸sýpð¾Ø•¾2Äξ À=:A»˜ª°CŒÛÐVªðÐùî¢M4<º¤r5†ì‡K+æX.¹%4!H0D=êR÷¯Ycò•a¬±D3žKø). oÌ™Ê5UÞøÛ8KÞ¼9›Ä ±3(Àl2äãV…*p`‡ÄHö;ÿ„Rc±-únP¨ì^RìbÜ×(·‘ÏM˜àãÉí.ÒjQÀÝèÃ!Ñm˜õ+îwš‹»©?·Sw0‚-LÍ`SÝkÜ䊱râ<ß™ d°Ã³Ua ü@RÕn‰¶nÀòÕÀA]åP·@€9¤Òá¾9¹Ít·„€D°ÇÜ=ï8t¡ÇÆ ܇ âh¡¿âE›a‘[çÙ°®kJ‚ýÕY¡¸°O?g«Œ]!ÍMö²ÑNƒ=üÚ>ðA?ÀÛµ„Ht§ŽéÔPŽ!BAïìûßÑ»€]pàÑ0á ï;@Ÿf¼ „‘\ŒØ8AÿÒ¹qù?1,ß=[SÏ)Æcfgæ:KÒO¸[Eõ_¯5±ÅŽq„4wãÐq4 ­mmç8  N$NK É ÕÁ@å .Çç”Y~— Ì· *}*p#Ô· ö@ïj‘'y‘ t‡y›Ç ·`ûw g [³´Öjòwƒ)v]'IpvÇu&{Ø H¸—{¦À ¢oþ°Éð¢(ÅG˜K˜Ù° `sf Ñ 1 "èÂQ‚Ðúj€Ð¼~’w–wy`PxðA^R¦HYÁp®I¤ç‚¸5"lFÿXqÃÖzŠÕá(€ð ˜{¹À € %CÀÌ wÐO]X…Ù  Ð|f}ÔPlÈs¿'í¦ ö ó&e¼Ð€~ƒ0' 1ƒÐPxWÕ(åjøü€ ·•ˆŽ˜pÄU„wH‰GSÊÖqh÷ § rœèn 7ò~…V¥X¨h|µŠ¤0Ù0#ðŠžõiH‹mØ X‚Ø' ¡yqÂxiy`ˆÐà{Ì” cåpi¦E&ÍhkZ±‘–ÈC„3åy€´7Àvœ¸ @…N´yx¢@-â+©EöÿøŠE¦±0 µXx.A‚îfšÀ_×`‡Ãˆ‘ ÉÉ _á‘¥W2¡'8 „Y7¹•÷d³zú'‰™F‰ñh7÷Qè·ð®ð “e %a0“€[@lpY•^s`f “À i8 5)A)%oq`”÷‹¸@ŒLYO9ƒÉh…[A•bÙp1c3Y©pÕ¨•U©fÖè•V‘„[ñz AgÇ⨒> Û𬠗/I1™.pà+J€T°}ùhºD h ˜„©i˜‰Ih$¨_€ô~q@” Q`™O• µ™ÐXš.q<ÿi3o%š÷‰žÉ<«i–Áqiù¥’œø–›` à‘›ëxwaP¾’—Á) —•hx#`ƒE¦( ‹ps¹˜ðnÜW -ˆ °L‰Ú¹ 5È~] ž-!žŸiz#ªˆê‰œ¹ž"ùI á H=Ð ²I› 80 ÆRzxŸþ©4z¹zYàdj ZdO†øÐDŠÙÏù zp¡z°¼PŒÙ¹ O ÉøS¹¢Ûxz6à Ôxž)*¢§I¢%ÊJè&ɘ˜ ö¹@ çÖÀ@ª:C* Ëg º¤ð Љÿ¹Œ$eD÷}’Ç ‹‘pÙÙ _¦ÔçkgÃÖVbž\Ù¦éù© ÊzÝ(§3ဠ¬p§,© >p"èy-'ÄðrBZY¢4G °x¨ ª*€Ñ€x LA‰2jÙ‚Ä•À¡*ƒÉØcŠªVV’󃤩¢ÜZ¼&e:–«Úñ)=  œ˜ ° +€rynÏô§9&Yz‡@¤¦Âº ÊKj¬(€Êʬ-‘;À tØx¸”•Ø^z™ ™ŒÛjªYÁ8)„[á:š¤j†h®© §íù´Wϰ?À‰BðB §¼”ºÿYw@aÀûÊw¿*†VðŠk[¬* ;H_â%°E‡”vx'¡ÙY}p™À©²XaB •\[ªaK²dz®!™ƒ#©®­Ê!8a ¹ nà+P«€Ó{TáJòc|ù@ŽP|×7†B‹ f1p p´ú€œ5.±_P”ü¥] R›¥—Puƒ iP©±X¶UaBRudÚ¢XQ²¨i•ª§êêòQ c`n›§8  "¸ŒW(-³{kME€ÛŠd8¬p‡ G‹°±8ñå”ð˜Ræ]yˆ—°™»¹kY•[ÿ;²£ûˆ,¶¨«ƒ¢Ëºèêº áű'9á¶,I5ÐùYxš)9œ|i˜%¼­(¸Æ{pÊ ‹ ’_Ú2,x”Àx½M¹PÆØ½ àºãJÐxB£ª‘é;p#ž(›¶í[c :á¶nà +P?`ÆÒ©þ@$jÀ¿là¿ÁÛ\¼g@´Ç[À¡ð/ÀÒp#,áJLÖ‰\ÊŒÁß ºÙÁ.ñÁ(ŠªçK¶Zl­›²¡ÂlÛÂ> ³50¯‰‘Œêø¸Xð›C´ÃF*ib8Å+°ÀŸ@ÄO` ½€±Ð j RàJ uÿ(eà7±×‰•à‘ Þë½Éh³Y̱]›¢hš¦b+¾ WÂo:Æ(¼Åa¢Z` 󻯏‰¿UÚ Çý[ÇêUf@¯{¬}lÀȃœÄ`kä.P‡G‰¡] ÅÉuPÝPÉ–ì‡ák²œ¢kµ•_\ªë¦TsÂ0Êñ!Ÿ±>à 0\5P³6ìJe Çþj¤á¸¬¤ ÚË¿\Ä€œ Ôà ¶0_`úÀ_Ñù xˆ ZZŒê’\}@Í3èD6\ˆ›²Mn*„ ·ÍºÆpýŒa<ÊëKÆ =ñ!;¯BÀÎ^`Ì…Wƒú  óœMÿ…¤Iºù̾ìÇ€<à úànDj”k¹’—¥[j­Æð“¼ Ýý g‘nÊ™Í"SÍ$ÒáLÊã¼&ö"BàºÀÒµSxÝéÚÒ«3]s!¤ø\dÆúË P =ýÓA o`”E‡”ª˜ZµÀÔMÍLÕ^‘ÕĦ¤ ²CØÑ¡§»Þ\uZ-Æ#]Ê 1» 3Ö?° ®ÀÒ^À§…g,1ÐnM¨€‡¤„[°u]À 0yí †ànŽçו+yÄX©ÖZ…]eÓ\ɯeÍ‹z¸ú•# ÙýpŒ}Ü`œ)T ‰^ýBÁÙp Jâ › ÚéSxÏÿÔX ©ýh«„[´ øÚp׳í ï¢ö Õ{•U ¿½ ‡@Í€/-ÕÆíØ¹¶™Ò8pÖÜ Ý1óÆ©šÙ_½Ù¨œ$ R²°Ò^páÚpnO—X ©ýw€·æ=° zƪp@SÀ ÞàÓ†`šzÀÈóM™tP ÷ßð_2轈ֵàRçܦIš¦«5à]äÒíàÔí9±= $Ç g}á^¡˜|x;@½*¼ÿZsCK´%®OðDPÀâßðâ?-ãßP 4Á°”'P :®¹“\ØÆß5¬™ ǢßY¾™ÿ2 ùÓÞä ^è ÉžšSþ!væPZîø° è†@ [ 4~K?âeN°l¬j^  Sðæ0.ã.P¥€ð}ÕK™yN|Í~¾ß@.äSAänäâÚ¦Îb‘ðÓè©Ëä‘þ¢QÞz’K’§ é~ ® )ðãJXT¼™õ«Ä;¸B|¸ðhN*ÎâSç1eÀyÔz°|^<Ñ•Ü  Î̎ܧI βMõÀèÎŽ¾Nî¢hûà”Î6àb=À ›^Ö3  à|š1'îÂûwx<¸{Ìlâi¾æ¯>ï>ë¡Ötÿ€‡t@ÎŒ = Ñ\ýãY+‚RÐÈ΂f¸:ô•ÝðÏþðÑÎFp ×-"ZP=) å›° Šàµ£ m`mÀ «³ÕÃ?,´'Ï»Û+ïê°>ú ™`½`”Ió6Ï¥÷nÁÍ~0•Œjä‡!:èã)à¢ç2š¢VkÖØ,¡ô¡Ìô ~¶dÉ´îIZ õ±r9To ån Š /p P@àCö@6¼9‰Ó'¿ÓÀÜê-/à ÷to÷)y5Ï”QPØ ]eÆøäÿO'ð OôU^¶)£À)×`¿ÕÅþ䔟® Á0ÿPøÑ¢^@n£¯50 äpªs¶lϸL˜:-ûE\ ,ë"` ¸Ï ¢€aÃ6ˆ‘¢D¹ôáR¤ ú ˆeÀ€"lœáÏãG!A®ëW²_ ~ü|œ·Îeº&eÊ ÆÇÌe>’4‰R%K—ë`zl'ÓçJ‘!ÕÉä‘’AÒ¤%&ü£ZÕêU-ý¸rå @n(¹åf…"E/ÂÉR£äÀ[([äÈ)BŠ@ˆl#F˜Y° *T|ºp!Ô“)š Ð$B„­X™ ésᢄ. "TXçÒ¢K¹ÈT£ÆG ®Þi4%R2í|,:ÓõÿŸ™è~úãYòhL“³=.5Ùt7kâ%?eýQêUèV³ö¸Â5†°7n ã(—#%pÂ(q{ÀQܹE»—oŒ¿‚U«–bÆŽEžÜÀ?æ‚ …¢ðl‘hÀ°ÈL^Á"£"FæVëí¤×€3 €ÁÛJÒŸrK©£ óh&˜)¥ãVK®Ÿå*ôè¹è¢ûê®"<´»¡Byã 5Ô(g¼·ÞšC.9¬X/÷Þ‹O0 Å>Åì!±o"3 ‚aN8ÀAÎ\¤³:®ÉÄ‹ÀˆFQ“P ¡J1ÃeJI'f,)'×X‡‘Zÿ'%xsí¸ù‘'R~˜CŽ)§òÄ1Ç«~’+ ² DÈ4`æÈ$—,ÏGæ `.+Ha¯Jøbo¾@™b P °'€ S²H Zƒ.I‚E \ 2ñÀ"n,x°¥Á3Ϥ.´„Ït(ýHQx0· ùiÔŸ5ÒU×Q“¾Ý-\?ùáA&yù±qÆmܔӪ<ÍÃG 8F»J­ÉT©hò9\M!…XÙ3ãb3j•ï‰O ¸ ¾)„ñX`\ˆŒ›ˆ*X…šúp™| n¢õÆ6€0Â#¶åV$z‹û)*dQߤPÀ]~œpç#8äÏ •ÿºh“F¼7k÷Å´RM§Ø* 6ab4 †a5†¢IG"~•bYCÀ8cø{b°Åt yda‡å¦‰ú`¹‚n‰lf‹P-À6Bžþ9)vlCgqê:$wËYË<7ÎmË!¥­EL ¯…Û_±Ç¦J` ƹ‰*†ì í;’l‹ 6ÞŠ[î‰c]`Œ9€ï‚;ÎuWaìùUXdȤ—Uº7£•O–üVá #èÿ8D>@£f™&¦r•/·„à—Åÿƒ(ìå*"À‹XÄ ÌlfN$‚ÍPCä!o—cÐÒ®* `”Œ¼ Ÿl&Œl±V&t¡ý±„b$@+Þ²?XŒRÁÁ¢ðòÄôbʼB „ vð ùVF¶³&¬§‰o虵|îC7þ|‚ Úг¦¯ tP‚°À[®J}àiIH‚” §%aI`:cö>jÑFoƒE,¿QÖffyõÎhýíO@±ÅÐÁ(Äë«pAKHÀ­KðnxÇ[Þó¦w½í}o|ç[ßûæw¿ýýo€ã¸K˜€[ n«ˆÁM`ÁþpˆG\â§xÅ-~qŒg\ãçxÇ=þqŒ³  GxÉM~r”§\å+gyË]þr˜Ç\æ3§yÍm~sœç\ç;çyÏ}þs ]èC'úØ;cacti-release-1.2.19/images/cacti_backdrop.gif000066400000000000000000000160741413633772300212120ustar00rootroot00000000000000GIF89a%÷b—a™ËM’ÈIo°lŒÆFN.P”?žÌOv³CŽE‰ÆoPv=U’W©Óud£C}ªeX´GœÌN[ˆ>J­HJc=‚ÃC…Ão\œB©ÑUi½E)H¢Ãu‰ÅEQ±H;¦H–Gd¥haºFA©H†B`žC"˜GU³G±Õz½Ú!?ŽºQ z=R–@xÁX_¸G’¼Su¾X#„@QSP }>i¶X ÍP®ÒX2¢Ht¦YcwT —G–ÊLŒÈoz»nc4¬ÒWb£g¥ÏRg½E,žH“F¢ÎQiªjUkP}¼niih›ÃU1k;j¬j+€¬gx¹nl®k²ÕjF›S„Åc¹Ø}«Òk\¶G y=N°Hw¸n™œ—V˜@5‡DT¢C!C'¾nD«H%9#~>ºÙ€Q¬Of¨i=^7‹¸O¢ÎY¡ÏbL¡U€¾n]¦`œÍ]G¬H„Š‚:›Mz¾cE‹MM¯H‚¿oE.--aªa755€Ào {>Q¤V­Ó`6šK§Ñd[¨\Z£^µÖpSB€ºD‰·M`•`Q™A>¨H£ÎR4F¤Ðj¬Ôw´×|-X4v·m—ÊSŽÇG&›G\³O2"&ŠAm¢R2•KUž\f¸N¨Òqr¹b+‘DC¢N*ŽC1•D¨ÎVŒºk;P2 ÆUq:†µK  10/¯Ôr ÎW’ÉM3C,¥ÊWs¯C¢ÉS¦ÍV \1&†@zM¦Ð^-˜F#V,dŽc·×u>ŸNX’A†ŸP¬Ópªª©&Q'”F”ÉJ’FT²HÊo•ÊK—ÊK/ HŽÉo‘FƒÂoc¼F‡Äo?e»Fµ×{²Ö{¦ÏSÇGzyxw<‘F]®WV°O|ˆvtƒnAA@€@SŸCŸ¡zºnd·N”‰wK.V,l}f†³i«Rh«B7¡Iq¿M–¾U_…_«ÏX ÍS§Ñp+N1#%"Y¦Cnµb*šH­Íz´Ò}n‚Hlˆ_g N'’HIŽN¯ÓYT¬QÉl†²f,–I!ù,%ÿ{ H° +ÎZ§dŸ ?"F¤‚¢"ŠA0DÛ-ˆGE )R£dIZÏR>s¤*‚Ë0c3¶cG±bÁrªiÄ“§Ò‚JCàÀ‰£$.(u”é.P¡ºª@µÂ‚„ÅüÚÊ•kÁ¯`ÊÀZ)ƒÙ ÄÒªU‹ 3gË–…˜;×…] òêeÆÌ‚€6A˜°œ:ˆõ(^L£C–,t"g™@™’ËHzhîá-^˜Ï EÈ=š€Óòª„µI×­aÁæA((6(Pð ÑÀ»7ïIÀ'­aBœx‰ãÈëXÎüƒsçÀ€0¢º"؉Û.,Y‚mà·5ÿ?£¼ùò{Ò§/Àž½¶ºÆžv,Ö}¤>”ÑbÅ(qÔQ!‰D’I%U¡Ò3'¸ALÎTÓM9ÃHO0”PC…TRÜÓS÷DUUT±‚Õ)¯uE}±Ù‡PYg­µ2mÁ%]!Øu—^yñe_‚ V˜a‰-¦X=&e•a–Ùfö™¢‘&‹i¨åóÉX Ò"ŒB[Gà…ol7I.Å'OrÊ1×ÜsÑHuÖe§wvŒÞxÍœg¨zëµWÀ{ñyE&ŒÚ`…Š é²}ø‡Bqä!„`I©¨äHB“„6áT!†¸ÿ±aP’âáQJ]€Ãˆ\`â(V`fB®µ¸U~5[B¬œ…–iáèV\<öè#^@ Id‘‰dJ.Iƒ“OBiÙe›qÖƒgVb©e \ž–O `eE‹p™DB§äq‹šlöææ$CÄÉDt–`çrÏA]&|‚IvÜuè äŠ¢+(º¨¯%KŸ XÒJ:­\*Qšè)¨ ‰:*; :òÇKª²Új…‘À ‡ÒÔú!ˆ$Œè&raŠWa¥•±¿€#2Aw`u†³Ðƒc[Ôòèã{õ5ä_ÜzkÂaáêØ¸Ñ1”œ;¥fÞ¬Û.–ŸŒC ù ÿ1,aï¯å )¿·©yLÀ <‰Ákй0Ãxæ)EÄP¼]5v\,^ÆÏ€è+ú^ÈSƒµ…½9(‘,ñ÷à þQÑéFŸ(3‚i˜ÊÎÒ´s…;õÔÀ¬A T®—M‚‰, €¢ŠüBý‹8©—‰ÕXC‹#ètM××.`¤ØÛéí0h‡»vÛnÃ7ºTjÆî•xëͷ߀wbo%¯ŒV‡ ¨ ž˜ã&ц8ñAr kØòŒ8D Ø©Xç<:n¥kO,bºìdö*G:Ò±ŽØñþÁˆ€>ªê¦jЃr&¼áåäB=aÐÿ$¡<\)å¼J P„{ËX/2¡½$н};ù̧­±•m}rHb˜Ô¶·Aé çJWÝ솿üím¨œ,X“1uYô‘BÔqÀúf“DœÚœÉé a$‚.¨ƒ? ƒsvH† º©„a M(–‘b….äü…Ò0f64ÉJµ’SO&£P…‚+7pˆˆEÌUÑFt è«*MKÈÓŒ• ¢+$pV?¬ˆ ð Y¬ËÃ6$/ªïHÃ`ŸëD&~pCãÜÔe¿Ð`Iy{cß⃸Ã^¯‰â|HVÇBa mZàpˆcÿ<2‚ˆÌ>pALh°s’ü\%EÇ1L*J“òáä@–…T|2¡Œ4ÕSê.•ª„FJa³¯&> FÏ0ô3¡à²ËSÊ®F䫨°À(zÇŠ¬÷‹n˜p_XqV¦ÀLg¶ Zä[­³e3ŒJc7ËuFqª‘nh£щ7Âñ4 HA ç´®œ!örȇ?Nü4r Ðèdç‚qà$“!IJVòƒ+(…Çà³INê4!ø¤d‘LùÇ/ƒ™FUƒô®•ÐHƒIa9!WC ¸åKxÄ!ͦ,XUHàDëÕ„zl‚P‰­ïÿ©IÅÖRÓ×­õ=5ªˆƒ¼ù½á ׸ªfžð­&^]'XÅj‰a!䉰‰Í¬k…S€b­jj«ÀX?ÄÕ~¨“$˜Hì´!bRB퀪¡l£%Ñ^°îd¤`,kÖ²•E f7»ªʲB@ä‰i…KåéÒh%B­ô¨BÁYO€&¤¨Ä0[¶Øö™^Kjù°[Þ:u€ê’‚ËN€³ªÈU®7˜†sžºêäŸXS&¬¼Fja±Ü1@ã%o ΋0ºVήÙÙŸâûH„&ƒ¾ö=`ókº1õ÷˜ ÙE(P&`–Y„ÿ ‘ý(ep‘©PUƒ;;Ëœ4C¶¤0 Ó\éÊh5å ½á ˆ+¾àé kµkíÄ(Ö"ù®¾ ¯šdë-6³Ù,Fªz' cÜã&—n›ans}œyoÒýÛÉšr¥˜`*¿@1>Qrð`„f!r“c¯@³1>eb;ü2˜:f2·d…Íž°â×É.#´³.pwÊÉÎy•˜­‚žYuÏæd¥5UmFÊ×Õõ㌬i½Õ[U×bÿý=Â"®àÑ ö²Â#†PìcÿÈiƒ³À+; ËÙ¹œµ»É Ú¡PÅ/ûP3KTïxÈbÏZ¤”‚ÙH@ZÙD³Ð Å¼ci´.Å%mè]6%Ê^´ªÂÚ²B ÄÙC3BtQâ‡C<ÓÖÚ4Å? êÁøÆÃ0µÚ‚›jUÓ¡Õ 'gdý’?׫sðÛ!†L/{ sáw­P š×\ML¸¹ã’Ç"Úu†Ÿˆ ôêB^6ú6’~I®`éÛ/9Y5f=„¡àOF0@‘«g]ÎïVØUÁÃΖ=ÅkD&ÌïµÂÐ3mJÿ¢ >wª!’æä¸­ Ô¡^º™?jàßéjÚ[Ǹâ¥Ê0¨ò‘·F;6rXRk‰‹àU]à70d) ÜÕr[áS‘£w ]@sà öÔ88‡k°s PW&{³gA³WFg»:c†XàÁçtœ´rV@¡S§QÁQχJ\Gg@ w Ð0v|ÖgÐÆh¶vl—+Hp¨ÅP~@=iP#OÙ)½&TB0~÷5W†õw^„M&Mˆ—q¨æÿN—ck4y”wNˆ€ È€Ø õ&\ ¡J†K`zØÿˆ¹°sf@‚?g‚~‚ ”{”#à‚øõ{1è1ÆÒ_þ…õéðÉ÷Ë·Qþѹs`£Bg^WE˜g'Õ*×· Æ£oÉ£vk‡6"FpVˆ…‡u]Öl&”ŒV0 bH†˜v[*æiÈil8$Êðù§‹ÇMýçœ`‡w˜\Hy•·U[u€ øF ˆ›7d²à£÷4G`s‹¨pö” xqàlf`~p'%8{؉ƒEgtœè‰½Š¡¨(£(Qzg»/ð‹ÕІd€±h Aèu Ž`„Ð o¹ø`"øÖ ° ¿ØoPÿè ̃h'wWXž5â@ —ÜsB0†ÓHwš  ÊðbqXjsH‡ãˆcw yˆŽé؇ÐŽ{óާCvƒ&6¨¦·¼ñRF'iq€•¨Ø1@€ |‘y_I‘± (ÃQœ”‘±©­’þA%énB‹.q+i„ð’0™pvÚ×›p“8¹v: pLqZÆx…KTàaÆri/|‡”J ÷LÕxWð”l(•Sé[‡qY@‰áH•p‡Ç\I7^ɇ–X–f)VµpMsV wàŒÝµüÿø–«—0f`iR@9 ‰—ÂÀ'@°—Ú¶‰ ¤t0ˆƒÙ¾nS£G‚­°˜éЊn&’TP’[÷n.Á—i„ÔÇY)Å™D4)DO…PšnçPŒ>iˆ =çw/Pcˆœ¤G§à,Ié dx›*¦›»™¾yxcŽAœÜÔxþ—œZÙœek^É`Iî×™Ÿp]0zïTZ|¤—ŒèLp@kpž £së¹îy—ð)Ÿôé—÷ ˜éá{û ƒ¶Ð_pÙÅIùh¨¤ð*°§J°|nFd€ í¶;ª$„ &Eo×ÿ ?± ŸÙnÐ}ZšÍÓ½w>É%Z£@ˆPC”Ùc¥#æ¢B£¶ùw @£M锽™££œŽ1œàbœtxYÉœoðo^Y똠¤ciMj 7¥ÜE¥Ìz ‚°Çp mÉ&à…|à¥tëi¯'m@7{Û±'ó R°‚÷™¦b¦Ÿû©(•@848ªXÁ xª§{ª°¨’E¨…ê À’ÐpšÙgŽ*´©‘°¡kÇ`2…©¨9¢ˆÐ©t¤ŒÆz©C@ q5fñ¢0*£Î´ª­êª÷盿Ip¸£ÂI«ÂE‡È‰OàqÌ»º\^ÿùÀ:Ã*–)ðއð³˜c¬ÊšÌš2°Ñ*­YêÕ ×ê& ‚ÛÚ­±‡—1ó åjŸçŠt 5‘m |íá î  "ãŒéP¯{úC€Jƒ°¯'‰’PË º™Ú34I“« °À°°˜ÚK©iœJKcƒrz,±‰³™; ›¬Š†6Ê›Õd²'›²Áù@ ©vœR²œ3 "w³ep€Âº³oÔ³ð³?ÛNC6Ù™¬]ð•P p·0K;­lâdjR;µÇ!ÛjÞj‰àº™0®\‹¦÷Ù‚a»¦ 4¶LÿW`5ýÅ:lë¶*€¤Pu" ¨Q}³ˆ·À ›™{V¡Û™ š„˰p¸"â™J~W8±Ž[®Ù"*úSöB›o± ˜+£š+x[²&[¤¦²Žq”в·Šª{‡4ûzè•Zðº±+»¸›µk»]»cÐ D;À@¼Ä‹ÑмlbljÒÍë¼q½Ó‹µÜq½@`^{®-ø‚c+ƒìQ ˆ¶Éb/áè‹h A€ sKï+‹“i¨• °bŒJ°ùËûËýk¸‡&ÀšzŒË ðPw q¶¯1i+Úü¬ª̹º ž• ‹²¼²ÿl«A*%ºj%a0€&ŒÂêÂCf»?ûÂb5cð¤3œ¬|`ÃÄ›ÃMë<Œ> ΫA¼­~ðž Y1F @ I|Ÿ8:¤ó½cÛŸà vô®S“‘åð¡pÅX¬TÐÅUÆaì p zÆJø° û;©ƒÆ¡þ{¸Sø ¸‹„àðКFf,Ø#Q¤Jb–{ªpñ±·©›k6z„l û›Ì£Yœ¦ûÁŽ<³»ú7ûZpÂ),»ˆÉ‡ Éœ<²ðÉ7p ž Êp:¼ÃÇ«¬0:½qP‰Ôë'#GL˶L_çz®¹¬®mú¦âÿk‘û “›ê¶XŒ†€]L´àÌ%A™’Ó|fLvhŒÍ°¿úÖÍÞl¸n'Î÷°¸sì^p¢]Ø_6ȱëÇõlÏ‚|€á¹ý<•¢«ÈŽÑÁm% ½Ð¯[É}ɘ,Ñœ} ç ÑžÐѾ‘ ¨Çª¼Ê̽R@¦±ÌÉ Ò´\ËóÒ0­Ël ¾í±…i˜âf/xÊÓXl†@]<Ô’ùÌЬ+°K„³äÔ‘Õƒ;š…ë¿ÿ{©âÜ+L¢æ¬Õ^ð©u5/—=‹Üã±Ë²dmùhÝÏoÈ£=ºný²R‚q 7»Ð'ÿl×;´ýÂÍÉŸ¼´Í¥Ì&„ÄqØSk'Ú¦Ô^mB7Ÿ¶LÙ•-Óû¾f‚Çœ:zt§? õÚÓ¢móPÚ¨ônòÿÊ’|kÍ×ünÕR½°¶í3%Î8€ÕæÌ ¾ Ü´‘¢µ~”òüÀË $"ëÜ6 ÝÚ˜Ök=«+{ÝÙ}"|ÐÜmÂt Þpâ×B[Þ‹0ÃK‹¢ ë-0í]“Òò½­kPßߊҎm—3®ûÍßœø‰c‹ÔПÅfõt’¾§ .ÚààüZÔž·,yÎÔ¸lLÛ¶m¸H”Û—°ÛìÛ^ÿðNÁm,H[+Ϭ#/$¬úÜ4nÈýüÏÂ9ºYàÖ;Îã7ÂrŽÞ­ü äPä.\Þœ¼»½´5L¼¹1ž ´îM¹€Øv²UKA'­9ØÆå‘]Ë`ŽËþ ƒÔ@Ó¾`Ó]ÍI"fàm›¾¡-Ú*°¤ ¨2çF Íôk„' þÚØ, j¸j@ÛµmÛæ À@œÕ¾­è+ÌSs§py€ ¬ÀâoñÀ q0ã–~Ö˜ºu@jгJžþé¡îã ¤îÝրꪞɬ®»D»´Çʲ´îV“q’ëλ0¼¾ž`ßÕ»Ú¦Ò^^ìaÿܦÔÀtE¶Ù.çÎÄŠôúæ†Pí NTpÚý ÍrçßîúA¡Í;©P˜î¶½+¹ý†ÞÛˆž–ÌÞ";5«ƒ Ìš–éÔòÇO£Oði­ /«¼² Ý;þð/k¥ /äÑ/ï¾´=ŠÃ8ªGòÅ0ñ½0л­ÓŸòõØãJìŶ—=¶ÔàÄÛiþkù€°Ï¾òÓoÿøȇ‚.ÃÇ_ÎA­ƒWDBSLAc“,¼ð% c €?:<¡ž@(¢Š*ñDFTd1ªH^´jF®¼Â1DZÄè±@lN] ŽƒàÊÞ#ïRR/&|2Ê+¦¤ÒJÇêÐC².+»,³ ÂôŒÌÑÎDó 5]c³M,y7Ýx›s Kì<áS?ÿ¤®ºAµ+T‡C5ÃFÏ{t½ö’™´RK/¥/Ó=6íÔÓ 0!RЖ­TW}Å£Wa••V”.Ä0W]yõµ ž|–XbäD7”]–7D± hk$ÿ䯰täf‰/N9HšY"·ˆÌCdèJrɽÌ=7Ju«ÒJ,õвK.½Ä,‹zíó³|õEMÍ5ÿmS`ÛÎÍà9cPX8>òÄãáˆ'dâ@*¾øÐ@HTŠŽË{RöD¹R“é›!e•;ˆšP"ÐÇlƦ¨fVqÖyçy(ôùç\w   œpÚ¤èE,Ö(£6aÚ©§¡bDꪰ¢±«¯pÔšë!­»@±mÈk"e &mqÙnÛmÁàŽ‚¹{Lw'“wï úóoÐÌ4M4õË_°âàT°ƒÁq Âò>Un|˜Xu1Œ*Ÿ >V:ÓQJ>©K€¦8µ²O¹ì"_ Õ/¶¤€;cacti-release-1.2.19/images/cacti_backdrop2.gif000066400000000000000000000100741413633772300212660ustar00rootroot00000000000000GIF89a¤%÷Ë“š’’™‘˜–œ”˜ž—šŸ™œ¡›Ÿ£ž£¥£¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨ª´­Ðƒ®Üx®Þv¯Þv¯Þv¯ßv°ßv±àv±àv±àv±àv±àv±àv°ßv®Þu«Ýt§Ûr¥Úq¥Úq¤Úq£Ùo£Ùn£Ùm¢Ùm¢Øn¡×o ×oŸÖnŸÖmŸÖmŸÖmŸÖmŸÖmÕm™Ój–Òi•Ñi•Ñi”Ñi“Ðh’Ðh’Ðg‘ÏgÏgÎfÍe‹Ëd‡ÈcƒÅdÁez½hxºiwºjwºju¹hs·fqµdp³ao³`p²`r³`w·^~¿Y‚ÅW†ÉW‰ÌWŽÏW’ÑV–ÔUšÖTšÖQœØM›ØL›×Kš×Kš×Kš×K˜ÖJ•ÕH”ÔG”ÔG’ÓG’ÓF‘ÒFÒFÑEŽÐDÐDÐEŽÐEÐEŒÏCŠÏCˆÎC‡ÎB‡ÎB†ÍA†ÍA†ÍA…Ì@…Ì@…Ì@„Ì@ƒË?‚Ë?Ê>Ê>Ê>Ê?€É>É>~É>}È>}È=}ÈI룮ìÞ+oÞçУKŸN½ºõ¹ëöúÃçð¦Àœ2þžx¸"šÅC­RÏ^òcT’áÃ_¥ÙeJÌh\¶AÓêfhÑ9‘šj@éqÉk°Í&0oðÁÔn†è•6ÂW•8âD¢ ]ewP>̱s݈$–hâ‰(ÆõˆvþÐâxmr˜DåÆ GÊ)§<¦Þ{#M&$&—]–_c´á1ù÷€¥EI OJ½áÚk³!•ÔRîæe6T‰sU7z“̀•‡ÙÜ)Æ)çœtÖÉ–AÚ)Äw0r2Øx5n‘&í¸#êµòØ{ñA6*Fy†l¼t7A9ZN”fÉ”?ƒàQ²!Ňzé¥#S‰)&pþdz#fš€DÒ•^-'–:vöêë¯ÀF÷Õ^ÜýÕ'`žˆGX ñ‘(9®·Êc§@6Ÿ³¬2Ë~c\ê’à²qi+6Í"Ìœ £./çh‡RJY‚%2Ï”zT% ¢ª—¿y\™²BkWÃú¢Xî«ð 7ü›‰ò×wßæÉÅ32[ŽIûã´Ž:z­d­‰šKâ²Ää*jJZ§B•ªOvEj½Ïõ 0§ Òå¾Ú|C•¿±Êš!­\%‡›b9çðÓPG=¢,*t,'_ü§Æ‚&öÑ)¢8¶JµA ©íÙ«¨¬Ÿ},ÑF¦,‹¦îºê"sÉOtÀûþ¼BÁF/½93S¯R©î›H6¯rã ™âxct6´Ú ±®añ*õå˜g>®õÅ Åàe,×9»Ñz!¡R-£"c«-,)y²¥g°a‰N-ãÎnÝì¶2³R¢Êö÷3Ï ÈòónŒ<"ôTþ6î8†Û2ð:œ,Öšwïý÷A|(ÇŠŽñaYšE9Vû1fŸm¶%·a†ì´»MÇ“rϽ;2Bù‰Þªôy ¯^H!ñjÓ Ã%B*arÜô0$¥‰+œóÓÂòðyðƒO£Zž@g1ómMPåY_21 Ië1ÒjÔÈä· 6€ë~)k[Ø`.(ÁL(þsÆ0îF ½!c8£—ÎH TñA_^b„n®"ÁéÍiª„­ æÊÉCD £}•ÁíôÉ|Sú,¢Â5´PZŠYü$3¿:ÒÁ†²k›ÛÜF.qwÂX†§z’·½õDoÄžà§@jãT|„ª¤È qãÒ3!70¥}ˆ9ò€ÓGIʉ¯ECG‘Âô J…Y˜–Üó¨M¦ŽÚ²¸P£Ç=¶>ä܆±Œv’JÇd ØÈ¤èA+ÌÓ-YEYiRÖ„šÄJË•ò›à”Ž÷²ŽÐ¡ñbj`cú`¹¾Lð(l0lÅ é¨-\n‹m:þô¥ý@dðBCáÉ!Ú þ™Ä£3¨Q›gBÒ|`"Ñ* R‚ܰ`­ÄçÅ„…ó£ ­KñQBó£PÖ:_©Â1¬¡G$YTë\7¿zb"±óe9%Lu#Bùø†šÅ¦x 4^õ`IJ1¢‰È¤/*F¤i„ÀÞ^´Q†ô«`UË)Ñ¡ÊU¢Tì\ßN‘:9α¦uÌ–%ðéK·±á¸ã§OÚOß ”¨|†Î™ÐgPcp|€¦D)™ˆmd’ªäÀ#´ ˆA¨ƒ‹þèfX7ËYài/íÀÚ9OŠÒ1¬¥-]Ÿ(âÈ(ù˜ ®Ù*þ×õø’ÚV*]=5†n¸ d¼áÈ,h¼´”ÔF.CÏüÃC¡ˆæ*¢’Ul#KŽGdðd›˜ãÑÎz7¤Ú=-Îy±“¦µì4àD2¶9ÒÓž2ñÌói[ԬŸzÆOº ¾Ò¸ÀåƒpT „Ö°‡¥r™:æ:¢Ú°ètÅA]mlƒ(Dx½Êïz8œ+ÒŽ:Ìj^O„â´iUoÔ¹öµò£Ig,‘ÃÚÚµRýùáÜtËccôÖ4=pO\%7ò°•°ÃøÐàKñõ9¤<]m$ÂziWåáÍ{yŒeÌÇhQê‰ &­°\kþ{Ý Û³u&¾–²ñ+ņ7 cøÝ±~ÉWa´À.rKUØ'˜gÐà ÁXE,‚Ž›²¬¨Ka1M¶²€HGAÙÝ/{úƒ§L‡èH{ÒS T<éuÉúØàN9ζ3é̹î(.Û²¡Rox[Õ%ÈbòøÇÂø­°}HJ¶‘¦2«•‡>ø¹ŠóÆ7¦<]rX›XD$ÊÈa¯~úÛÝû,BðaR2›ú¨FsØ…—º—†ñ­gX6 ËùÖûɵ%v­_þö˜(ÿôoü†#ÛІ}$³›ìÜi~ã“®td)üˆBhØÝr:ÀÍñîR彨¹þË\ZXªWÅYP¯^ã™x¦&’Á÷댆\cBǽæµù ä;¸ýCqjhk@’ dsáiSYâ‘͆U³©eP‚±ãXÚ8⎬‘šä=ZšÙ}rõ¼5ÆnfËra“\û²R5GÍê¦çþþº˜¦ù9pÿð¾ÿp§†à_äñÁÁÏÕM6$=eê:^VÅt:X´Á°p/ë˜wXxý¡ ÒŽÜÔ'Í„ O¾>Òc‚lo«Ld‹\°ì¦õ}CÜQƒçÝùºßv¶Àkó]ÓHªà“ÍPÃ+WŠÏ}ò„%NarlƒÇp!XÄáfþú Û:_Èþlî2·ðè%½z×Àf¸ÖsÞ³h½MZak¹£5ûŽÙ¯çÈ¡ø¼ >ï»þùN fLƒÖ@|‚g À°dÉ“&MŒÐxTfmÍç|Їai‚Ú±e]†}h'arçVj-$~¥—r"6#k«÷r€‚¼@g•ò¹ö~7GwûµsËPƒ?æsBæwúÿ÷8xøHÈ£\Ìõ@”¤ •FaRæxäÀ‘‡U˜•Y TX…tb{‘%zQfé&‚ (O0f~ò& ê§v˜pk¸ö~r7wT¹Ç_õ· –°{8xZñ =ø ?8xÖÀ ƒ`x‚x”TI”æ€þÖæ€`U8yÚQyÍa…’'À"íPj`Wf= ¤†"˜tà:ðv‚6Ñz,c†~†o.Ȇ=Ñ þô†vçcÅTƒCQ ùw‡¿µw²1 ¼(€Ö`t†×`…ÈtFÓxLHR—MÚF}š5‰Îh"§¤(`×BícZžHzl€c¨z0—‚²v«À~-ø‚mhP¥Ág;'‹´@zw‡>|>h Ò„Ô` •`|ŒEI‹Ç|‰˜ˆ§Œ“@[ÅiÏXSÃ"êÐ…=2è¦b ¨b·ô^ñV†ó†Šê†étÐOèØ_³øcöçŽîÈ”À‹>€@h ”0„!N(Q0þqˆ8“W“PYƒ… ÔaÙ“Ó1R8‚R=2”èvŸ¨$™‘ñöråb†6Šq{ùçèkq¸Ž5¨w¹ˆƒ•`’Ó ¿è‡Ö@ ,é’Fè„Í·„Çè Ž0uæˆ{‰Öç“t‰§D œ°_6!HzJ‚˜ð^-W‘„‰Šìr™?áŠ|æ‘dƒCQƒ¶¸•#i ¼€h ø‹B˜&Œ¶X‹°ÜÐ|ØÞÀXD •… Ì"uùšv¡}þá}<²ùá‰ëó—Ú(˜ñÕ¬ÇvPÙ2«@Žåè®@¿@XYƒu(’wø^ù‹Ó ™¿h Έ€þð„à„…¸Û0“ý˜ˆŽàX…aÔ ±eò›î9˜… Ù#ÔÈ#¢'~*¦$h°œkgŠÞ˜WÆ©˜?q ¥Qƒpˆ•õ" wîøw€ >XÕy¿¨ZA‹Å¡© ãYšÖöŽ`=Öã : JÞöž**V,Òyôù}<Òº©$÷‘”™v)œ¼ N)ˆyœ?1}ÜiƒÓÀ €ö w@ Ó@ j z´ÂÃè„HhŒãimÙà„0 ê@y͸¢dŠâvë õÙB¡‚©Ÿ¡W²¦v;:§=ª?J @gBjƒ :Ó8¡&%ù¤Qz”ˆ ŒÞé„1™¥ã yŠ€a•0 ÜКbqueš;cacti-release-1.2.19/images/cacti_error_image.png000066400000000000000000000240541413633772300217340ustar00rootroot00000000000000‰PNG  IHDRÂÈ{ôá—PLTEÿÿ )3 IDATxœíÝkŒ\ç}ßñï¹Ì}fïäJ")‰²$Z"e9±;’c[²áZ¶›8­$*ŠØF%M^µPCª@q›BM HR¥€“6S$p$¨Ž'q#Y77–í8$#3²D]–/{›Ù¹ËsN_œ¹ïì.E“ÒPç÷ qgÎÌœYüñÿ<Ïÿy¬ûï¿‘´²ßìy3)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©æ¾Ù70 zîÁøàê{X^Y¦™=Í••ƒûwßpõ&ßžˆˆ\D©ÂÏ?ø@ü©»>ÍOßöIæß¾N+ Ùp¯§Yo>—cñôí<ô…߉ù±†QDä-ʺÿþûßì{xÃ=òèÃqaoÀ?;ÇÍレ’»€F°Ì™ÖÇWòÍ ¥ÂnŠ:ü[ñì׎qï=÷) EDÞbRU>ùÔñÑc‡ùÜ>ÉMç¨ú'©úËøf‰ÙÜ^òÎ4³9›pö%Îlø´ãJ‹üäç>ε­ðùÿ@¼ÿ¦]Üõ‘_P Šˆ¼E¤f±Ì“O=7 ¯ñŸ¿|+W^ׯD1e÷r\ËÆ3ë¬yKœi¦³—±»2S~rñ,×¼ý=üÌoÜÂñÃgùâ_þ÷øÍü.""rá¤&;ÌÝ¿v=™"4‚UZfÏ*îÛ¢ˆz°J-8 Àtv;.FíøUJ……\Žù+öÂPDDÞR„=÷`üÓŸ½“BÙ Œ#V½Wpì •L2G¸î-Ó2UæòW&×F±u €ébïò?ó·ðùPU("òŠ \|þZ>ø Ìæö=Þ­d*½BEdœ S™]ÔüuB;©çy¼ËK¼ógö) EDÞR„g¼ã3ylrdì2¡‰ðÌ:Í` W†QDÕ; @ÑÝÕ{ ª°»|AËç†íc×Õ%¾úí?QŠˆ\ÂR„åJ‘–Y àN÷¢ˆà5ÂȦàô¯gi~òZ÷2 ¯„³ùY6¬˜Ûú=¬œY}£¾†ˆˆ\©B€f˜ÌóÙTp˜ê=îGmLÜ äî&Œ"j~2‡XÎÌà:6ž»ÀT6©ë[\Y9Èü®ªB‘KTj‚0ŒL¯*ÌÙÓÀ £ˆ•Ök@2êÚ6aÑ45Â(Ƶ-²ö¡‰ˆ­ÎuÙ<«añ½,©­PDäR•Š ¬o4 ㈚€b¦BÆîõfoµhÑ™ï=^ó_%Œbfò³ÉsÙ(J®›v“6Îõ-Šþ¢ªB‘KT*‚ðìK Úaˆ‰’y¾œ3Ó £ˆ†Ÿ,šé. MDÍO*Ȭ]Ķ ˜(&Ì$×òÉ¢› +æàûöñÊáå7î ‰ˆÈ“Š õDüøÓqÇ]7ò/~ýãÜzðϽò2MïÝd‡Œwü[ñÐ~'¾û3ÿvË0úÙ+xòyôáx«Êð?ñSÖŸëâ[ÞëE²N‘ª—´S ö vQ˜Æ¶ „ñJï—sû}…^ûœ¿ÏCÏ=óL‰å•œ½P¼Êb-Ó¯FçÚ³d<î¾á­¼¹ˆ.‰ üüƒÄ¿øŸÞÅí?u5@/Á*1!®[HB0 Xª½ØüËŸ¿ßào¶ ÃjµE3h“Íõ‚Ûq‹^¯Øu ²ÍÕ‰G}8^k´ùñ»oÄ=p%K¯0¬4=<PoÕ†üêòýñ\¸_a("r‘Lüb™Á´âòP†q„ëØ\³g7³s†µày¦ó—±Ò\磟½‚£ÇŽð̉/M·Æ‹­ÞŸ]»_ÙëôÍæ·;ó‹];W„<úpüjéEÝ»›æÕë,÷sÂ("ã8Ìs¸¶±pºØ+ð«Ë÷«'QDä"™è |ò©'â;W Ý9êÁ`µwMÁÞMå©/“+e¨dKœ­¿Ì©f•;ǿþcßÿ̱ƦæùQƒmíÐlz “K~QËí…ç8=÷`\ØðÎ_Nñm†¬y§ØS¹r躜“ÌCÚ‹øí·Ô /"r‘Lt=v˜_¸ï\vÐ OÉÙ®eSÊ,P ND¶ã3¿Œ ¿A+ði7,~b³_<ò»cƒ¤¾Öi…ˆº-ÃÕà¨nk…?Ø`ï&Û¯E;´]ðL‰ò»K”3»1qLEœØx…ÙÜe8V`LÓ~Æq`ÌÆ«­1o(""?¨‰ ‡¾ð;ñgþËõXq™rf–5ïøP{ÃTv`™z§BÌZå^5Ø–š,Ìϳ\[ÙTU½ÿÖpê…Ó@ÿˆ%ØÜ.1zŠý&a™–Ù|BŨå•¢këÌäûð àLs…ËKIЛ8Æí ·FAr»Ö.‹ÆlÌŸ¿úª ED.°‰ B«Òæ–Û®úC¢]aá0…M…àTïñ¼[èUƒ¾1ø&Ä´Á^hã×£±»½øUƒ×òÝEf'Ý]fÜ™ä¿í Bg/T½urNÇê¯9Õ8Á®â½Ÿ3¶ÍL9‡I®É8öTÌK«êÔ¹Ð&2yôáø“?ÿv ©3vžfxj¸Ì,Ò–{Õ[EÝ]CÕ @ÎùÀûÞ7vÿÏ£sßàùïœ=xÕààc¾‰¨xýB­lŸ†&ŽYoW)gv÷Þ§nàÃTnf(Œó¹¤Y?0†hVó!¿ýÝ_SU("rMd=v„¾}ëjеl;3T –ÜÝ4k Uƒ»ÊW±ÜÇ×+Œ£m·]3Ùî¾UìÆög:–ÅFP£éïHÃéÆóùÙ¡k݉üGDä­e"ÿª½åƒ˜žIV€Ž«³ÖžMÕ`Öɳ2xs…=ÔìÇŸÅߺêž5èZ¥äýÌÎC¤Á˜k66b¼Wƒm_g☚W¥’™ê¼Oò½VÚ¯1•[L7D[¶ˆjj'¹Ð&.Ÿ|ê‰øG>XÆ .»6UƒÅL¥·@Àµm\«Â+ëgzÕ`Öq™*ͳ¾r’†¿óB–qÚ¡>°×D@!9Ô7JNßÍÚ%âÜë­l†3Ã÷í0$ŒšdÒØ×X“¢Vó;LDŠˆÈë2qAxôØa®{ÏY×!ç0qk¨,8S˜(Àïœ"Fv<Í‹'νO9»H­±‚9s¬A¶|n_u\5šˆv§jì6ÐwØä]‡Œ}î¿Æ0Šh‡!AÔ¤à&ah:‡ÿV½ufsócï#n=•îÿÌÿºæ ED.‰ B«ÒfïåɰaÆÎã™ä4‡nefÅÓÔ‚ÓC¯ñÃ<Õö©¡¹Á©Òúø¶÷ ""çn¢‚p×Õý94›1­¡U›9ü¨=VY'Öqmc åì"§kɹ‚/= ÍíæKûÆl´=¸RtL0ŽVŽƒÃ§•Ü<Î^ðëï;zìíËÃÞ™vXïm®=ôÞ÷2qnP¡ˆÈÅ3QAxÕÛöýÜìMÎÉã™õç#\«B=¬õ+Ÿ+³á w‡†EÇyüéǸòÚmRrÀ¸¾ÁQm’VÊÞw-¾>Cr”Ô®=MõÛ8LÓ6˜ÊM÷û!MD#¨“ïì{šqœM!8×¾$޹dLÔߪS‹­6ÅòÞH5˜ }6Ñçí2IæäêžßmxM¦‹9/¶(í.-~éæ_Ûž-[ø&$çtzù6õ &Ÿ•ù'ø•¢µfÊôåä~¬ˆó þîæ++Åûï\Àù‘Íó‰ÁÈB €ÖÀ¢ŸÑÓ(¢šÙç:EDäÜML>ùÔñ/àûEÖ[†‚ÛY(3P‰yfxXÔ¶rñ:aa¢xhXt5lqæXƒÊm[ïÆ²ÿÎ…-û_3rŽ¡©º\÷Ë‹8»ù¡ë¯çxõ{øQƒ¢[f­½†‰"j^•‚3 ¬mzÏîA½AÁôªÂÒš‹¯ëÖDDd54ZÙT}­ZH /bÉ:Eü(©þºa˜q2½Šúâ›TSN ®»úÚ±Ÿ7=Ý_…2ºt°5X za8t’D—q*ûW)g²½ÇZÁðŠR/ŒG>kó=ö†Fë꡹&&—W–Ù8“l˜†Ën÷ûé:Á3pš|aÅÓ´Ã$)¬¨?,j²ÑP•¶«´gÓç=ùÔñ Ú·éñ­ú[áíеûsŠU/©>»Û¥~fèu­ è?70ÌÙ])Ú2Ufò[oÒ=ø{…±'hˆˆÈfb‚ðè±#ÜøÁþÊ–ÑŠ0gO{¨Bsm ?N¶>›)ÎÐö’?÷ªÁÎÛ|í…1Ÿw˜½WV¶=fip¯=rúÄÐmh0n@&ýGodŽ/Œ"ÜÎvlAg«µþsý•¢q8¼Z4ómgË69„0Ü£·ÚòÑaÈá³3N†0Š:;ÎäY«¯÷ŽDÊ—›Þ»ÖéÍA÷äSOÄïøg‹øfçáÆq»ÈŒS±‡°øÆFQg™¤*l†õM›mo¥{:=õ³´}ˆˆˆœŸ‰ B«TS¾1Ô×CNžéo¬=(Œ"²V™Và÷*³¬S v®ÁÄ1ÅÒ.f®Ù…÷]‹+.ÛÐëŸ|å1~è“—½‡­v‘º¦;d;Ü~>Ü44 ýªÐÄqoÔn¸WÛUrNyS5Øl„øõþÏîï;½E?wþè'ÆÞ·ˆˆœŸ‰Y5º0?Ï©ëäæst×—4›Ëu—™"8V‘áã”ü¾¼¬]$?›ƒ•äðÛrf n¬1óa‹¯þécœ|ï ñ‹/Õˆþܵ„…ÎVfq„Fd²[o¬=ÎèJÑÁ3­ ¢Ôù7F3Ø`*;ÅZ;Yº]?â¸aÚÜÃ6ìíWƒ×x‡4,*"rML¢ž1x úÓß;•zÌ©OR[iv*A‹Ìâw]¦¹X&&Ž>K1qÊ >í°{F_sêDwUi{Ó{uQ„;Pµ›¯ó#CÎI²lÕ.šhÇà\έò¶¼‡ç´ ‹8„fp¶ÞäôJ²°çê¢ÏÊZ2··€i(¿–ÅÿÛf Öö®0óá$÷®žÛËÇ.û”BPDä"š¨9ƒñO_[%ç$ûŠfݤ7¯ÖØú5¡‰pídµ[©å"Mo}èºî\$飡¶Õ¡¼ÛéÎæÝäß¹¶KÞƒ¬XÓ½•¢»²EÖדûŠ[@=¦ñøkœýäš­ÜfQ¹±¿0æcû‚""ÛDá§î3üå¿Âôn‡¦±)Z|c8}¦ÞÛStpx³Û€ŸµsÔƒd©e8ÐÖ0ºÒs»]d †b+ M4ÔXt§LÄFÌ fÒ¦÷‰r¶Ö¨C­o€õ½˜Ò×-rípòäÙ^:%¸õàûù¥›ÅÒ‘7ÆD ®­­YÇŸ«g {É‰î¾ 9s¶M˜ë vzÿ¶’sÊÔÍFïç¡ãŽâíWonWz¦IÖÞtôÄz§eag,Ê… Þóí ©ö¬jÌF­Á+Á u›lÙ¦°äÝ]·ÿ+fW÷+üDDÞ`„ŸºëÓ|éþ/óo~û‡ ªýmËÖ|Ÿ—NÖ¸j_×鲃szãªÁÐD¸#ßò\ŽYjÛû7ØP?ø~ù¼G2…ŒÁkR«¯SX´™Ã…,…BÉæê¹½Üzóûûá·ºã-‰ˆÈE0qA¸gÏ^ëøÏÆÿW¯ð]ËKËý1Fc ϽXc¦âRÞÓïóó£~—ùvýzãªÁÁ!MÏŒ_ 3®op+ +K˜m9üz”œ±Èøƒ~""oº‰ B€{ï¹Ïúü¯=[þ¼ýö9ž;q?ôp‡Àkpb¹IU©6NÛ\¸ŒzØÆi¾ßéÐÝn{„o"ò+K·ÚEf´opT­•¼n6;CL‹pÅÂ銈Èä™È „$ O,-Å_ù¯Osà#f®ÈpräšÀ±Yk·9¹Qgic™ª·N!“!C•Õ JÙätŠb&CÖîWãÈôÞsLóüV}ƒƒ¾ç´©›™ŒM#x}§Ü‹ˆÈ›cbƒ’aÒC‡îŽ?{Ï¿ã–ì~ÇåL¿#y®âÀ©L>4à ÊÙ)êëø­ˆf%äô™¤o¯éG³Ü0?Ïß¿¶Âe³yf¦s½jð\Y§pðø6f *7&ó""2™&:!YIzï=÷ñüú³ñŸü·¿`÷øÉæKÌL;\13 @Ö­á…†…b‰¹…d¥ËT+ ºéœKåÅ)À˯®2=Ýbήûhò9íÐwÊT©ŽRÝîÔˆ.;“ A4ô£Ç@‰ˆÈä˜ø ìºnæëÞ{namîxüÐoÿ_úâ×0KÝgI@|/û—Ô7’ŠðìKI7þ‘ù:Ë++@rrý•³»pw™‰ í°N6;þÔ[oËmÖ’ ëî€3:¯˜k»è¨‘ÉwÉa×ìê~ë?üì}¬ÍŸþîã¼´º„i@µžœ`ßvb¼é$+·Ù8%YefpÑŠƒ¿ùýG«ÁœëPõºñ|ûÜšòk¯ößü‡Ü×j‘ uÉá ÙÕýÖÇöí‡}ç÷ú¯~ûOb€fà35°3š‰cª^•|±LÆ.+›â…dn`*7}~7 ""oº‰ÚbmÒu·T+ºZ;lÂ-""“/ÕA¸rfuÓÜÞ`å7zèî ÁCw!RõãðœÕˆˆÈäHuŽò{æšÞ"˜®0Š¶ÝšÍul²Ö%=Ò,"’J©Âéƒù¯ DØÜ7Ø­ý8¤Ö¨â˜â…¹A¹èR„ƒ¶ÚE&yl|%è›oLPŠˆÈ¥CAÈæ£”Æí7oè†ÛlD*"")µAhWì83•]»Èt‡DÇð«E2""—¤Ôá«ß{…Ò¾áªnp>pðÏã‚o»ãžXБKAjƒp+ƒÕ o¶_):È3f¨¥"Èk{5‘KAjƒð›ßú&™«2cçúÎ¥o’ã˜ykx~P""—ýuý: ‘QD%[¬åœÍ¿FÓ9õÂ4Þ˜{‘ó“ÚŠ°°79¨·Ûqþ‡ŠˆÈE•Ê Œã8žZÜÜê0¸@¦æU(f’Ðë—ö †&êÓdbƒ±Xo­3mMkŠPDä’Ê |êé'É/îûÜVÍóçbt^Ð W,N¾öÂy¿§ˆˆ\\© ÂÇŸ~Œò{ì-Ý…á“%Æ-ž9—Õ¤Ùäu/­.íp¥ˆˆ¼YR„Î^pí­¿úè.2°sßà¸JÒžŠ1Ê@‘‰–º |äчã¹Ûûé&»±vïù1{½S*¶þœ¸Ñüùß§ˆˆ¼1R„Gámï/oùüv»È´·8ˆ×ë¬8õ‚°ôÏï˰0¯4™d© ÂÙÙÙx÷ad6ÞN»ÈŒàFÉJÑAãVŠn>Ó{|Ê.ôþÜÜ•'ÞÈ«…BDdB¥*½q6åîÜ`w…èV}ƒÕv²ÛL9;µågl´d2ýêЪ$,""“)5AÇq\¼Êêý¼Ý<à Áàl—­$¼5ô3õ$L­ Éþ›v-‘É“š VŠˆL¨­»ÂߢöìÙky_´âÆ7Viîw ‰`‡–À0no~¬· åW ®hS¶¦¡la ùj•ø+.ff>lIö)ED&Oê‚àÞ{î³NœXŠ¿ù¹ß'wsLæyøPò\·¥™@© BH*Ã{ï¹ßûÓߌÏþa•¥¿;Í«³¯Òʇ°?&¿¯_&v+ÂÁU¢%?KcªÇ«øß«rúï—qWlr7w‡AUŠˆ\ ¬ûï¿ÿ;‡‰ð̉/ÅýzÛ íººÄUoÛËwŽºöÊÙ]?| × _¼Êê­uæ¹ó}avu¿BPDdÂ)Çx1w$þÆ·ž`¹¶‚Õ*à™Æ¦kº‹_Ýù£ŸàïÂODä’Ú¡Ñí\ã²®9tèõ¿ðu6Ø‹ˆÈ›/uí"""ƒ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘TSŠˆHª)ED$Õ„""’j BI5¡ˆˆ¤š‚PDDRMA(""©¦ ‘Tûÿ¶ˆá˜ÖKIEND®B`‚cacti-release-1.2.19/images/cacti_logo.gif000066400000000000000000000130111413633772300203510ustar00rootroot00000000000000GIF89aLy÷ÿñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPlˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§ý€Ð ì± É À(^DW…†ŸàÀÅ&ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] (  `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð Ÿ(ÀbûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.pPEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ `à5‰Ã) 32tF1rÀC=(‘býf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð8QŒKðZãµM™ñŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š'  …¬Øvá \½Y÷ƒžÑò¢¾æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^bQÿF ’]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä5˜Ÿ@²àˆÐ;Ø –@ ´`â]pÞ°Ä ö£EpK8M¸oß…4…J@‚@PXH[Ø$ÿPMàp]}ªõMŽ@†v4 hH'6ÒÑ"O0ß ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—äfÀ 3w‹€|º˜e¼H!péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{³<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö gV" @Q î°>1˜`ÕàGpº±ƒm)e/› ™È³¼T—Ùp™£Ö–ðƒ€‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Iàð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿjçîÕp*§<ù{ —@© )º¡ÀÕõ§ƒ°9a”¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²baiü 9À ‡PzØËP Ñ ±@ p"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«‰jÄ·«´VöL € $ÀÒ`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@€ ÝBÒ"p³®UÖ hÆÌæ`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>;cacti-release-1.2.19/images/cacti_logo.svg000066400000000000000000000412201413633772300204060ustar00rootroot00000000000000 image/svg+xmlcacti-release-1.2.19/images/cacti_logo_new.gif000066400000000000000000000142011413633772300212240ustar00rootroot00000000000000GIF89aLy÷ÿ ' :+= 2&802/KYFCQW lmxhv{&T9N*5c :q(Ge-DECO|C[pLeed„ˆ ‰ Љ ’ • —‘•!ˆ)‹$”!™$š$š*—-“)-Ÿ,ž5ˆ7™$…!"’!,%2Ž&0†07•(1“000?•91¡4¢9¥=§2¡!5¡,;¥%<¥-5 2EŽ'E…5Hž$B1Z‡,]˜7@¨E¤"@§/D«!C©)N 'I­#N¯&J­,G¢5@¦8E©2E©:L¢:I¬4N¨0O¯7J¬ƒÂD‡ÀO„Ë@„ÊHˆÎBŠÍJ€Æ_‡Á^„ÊR…ÊYÃRŠÍRŽÏZŒÍ\ŒÐD“ÉH‘ÇUÒF”ÔH˜ÖJØL’ÑP”ÒZ˜ÔRšÕYžØRŸØ^‚Äg„ÉaŽÄfŒÍdˆÇv”ÇišËn”Ña“ÐhšÕcšÔk¡ÛN ÒP¥ÜP¤Û\©ÞSªÞ\ ×m¥Ûf¤ÙnªÝd«Ýk©Üs®Þu¯âV°áb³âk²àsµâxºåt¼å{¿ç|‚‚‘‘‘Ѝ‚™³’   ¨¼¡±±±ÀÀÀÅÔÁÒÖÐâåàñóðQ!ùèÿ,Ly‡ ' :+= 2&802/KYFCQW lmxhv{&T9N*5c :q(Ge-DECO|C[pLeed„ˆ ‰ Љ ’ • —‘•!ˆ)‹$”!™$š$š*—-“)-Ÿ,ž5ˆ7™$…!"’!,%2Ž&0†07•(1“000?•91¡4¢9¥=§2¡!5¡,;¥%<¥-5 2EŽ'E…5Hž$B1Z‡,]˜7@¨E¤"@§/D«!C©)N 'I­#N¯&J­,G¢5@¦8E©2E©:L¢:I¬4N¨0O¯7J¬ƒÂD‡ÀO„Ë@„ÊHˆÎBŠÍJ€Æ_‡Á^„ÊR…ÊYÃRŠÍRŽÏZŒÍ\ŒÐD“ÉH‘ÇUÒF”ÔH˜ÖJØL’ÑP”ÒZ˜ÔRšÕYžØRŸØ^‚Äg„ÉaŽÄfŒÍdˆÇv”ÇišËn”Ña“ÐhšÕcšÔk¡ÛN ÒP¥ÜP¤Û\©ÞSªÞ\ ×m¥Ûf¤ÙnªÝd«Ýk©Üs®Þu¯âV°áb³âk²àsµâxºåt¼å{¿ç|‚‚‘‘‘Ѝ‚™³’   ¨¼¡±±±ÀÀÀÅÔÁÒÖÐâåàñóðQÿÿ H° ÁƒlH€`Æ#JœH±"Á$Õô©’¡ ZI²d‚ ƽ{wNÙ«Q×l]P²¦MƒØ’ÇÎ[¸wîÊ%kåëÚµ)Ü\JrÃ…oìâÅÇ,œ;uÒ’%ÓvR¥LÃJð ¸v@—- §N]3cƶ]…T¬]ƒ$‰çÍÛÊrË”•Sgίf]Õ½Ë8;x|}¦U¦,]:h¼tQ£Õ©šŒí:Î3fè‚*K-¹Ì²hÑR³¦À…Ðb´‹×Îô²hmW#gΙ®T¤hURS,î¥ÄÅ{Ž™ZtXá63GN×-X´DÑÿÞ`á9ô³ïЩUöL]ºd¼x–J-RjÂ47³€7p+YGY9—Å× 9ܤ’Ê(¤PÆ ”Ç_I˜æu”±æZfºCŽ+¨ÄBJ'a¨ÑÁštGUî “a2æ˜Ó‹wÚ3 *®"J]"@)ŽôÀª³ŒVÆpSœwÃt£ *§LCJ]À"AŽÀ1Ë`M2Úqw˘ÝtsÊ)ÁÂH•\€b–m Å2Ò¨#”aò‘³‹‚ÚtãŠ)À4Å"… $œ Ì2îÁ76*HL7À˜ÒʈQ„áI JQ(ƒN:ÍħËÚ¤‚Ê0Û S +ÓtÿE£@€§=€A2Ò˜Y/ätƒ ŽÛSJ)Óˆ2ë(¼‰kDhH‡·ëÊ)¬l³M)$;k'0Á³šÌ†ÞÝÒçµ§hËí,¢„%HuJîAd£ŒÞ¥2é0§˜¢- ÀÆ špz/B#9ÃŒ™J“Å\Ì6ªü‹(‹±È*`¹°A°âLq·(¸K7ŘRJ1Ö¨²Ç*E, ÒÈ% ÅvܤŒ#Ë.óÌ¢0bó+ÍîÌó?ºÛ‚¨¤ân)F2ó(1K³ö>-’£*”WgÇ*³tÄ,(LÈoyÿH€Œ°Ká7˜ Hà?"dÀ<ÚaoœÃÌè(°!?hÀY ÀÊÿˆq> Zc3£Æ*ÞÀ‡ ¢®q`ݰ`„" (œ H@( zöÚ½ü‡:Ë0Æû€A@BAÑŽe#&Qo¨ÃwðJDqyx‚Š€#X"3Ð"C[DX÷—vœC-Íà!Kq¥mÀÝØ†ËþPÇ=¬xÔã+‚?².X€!oP†/Ì@+`a¼ˆƒ@†í0ãO¬³ hü‚lðCÎÂ&§«‘òˆ§Lå,^±0â€8aÜ ‘¸% rÿ0”%½áŽKÆ‚@¦ N6]¹ tuÌC4ÝPÿ‡Yl ÖäëP„FX…7pDX0Îì X^^7C3ˆ˜ÒÈ2Ùð‹Ö÷|fà  TòÓŸU€AÂ0P#ˆA Ydº<4¢¹öÔYCt¸S0¹@f&b|ôbÛC>IjÒ9 DxÂ@‹°„F¤p gMw)0óâhG0#óŽh¨eé@&Fчe&H½ 5¨’úbmpÃ,`q¨Juy-‚%®*3Ð`[Æc¬ÚãË8ܱc 5~ÙQ1†Ä¹Â‰lÃf1 -øu Þ|DÄi%ÔÔ¦ Àðÿüvfô:±m€l`Ã(ÎàF|Ôh2Û5èšÇÐŽ–¯§]Þ¼Y&ˆ3 ^¨©  ‚Ùràˆ!; Ãf”50•p3‘ 4HSÇ=Z–û†æ¾b Ͻ‚ ¢Ê:  Ð _Ci lQ±²]ÀwI±FÆ*ëy†9RÁ†4„"™`Û™®²fJúžô¾Z€_÷ Æ=€(LBésA‘9Ro@™–9z† °—!è~œù7pa€,pšÆõœ øP•R Á5 ipzP C BA ÿ³‘YW½© mÀ–O¨ÂɰˆƒxœÉ‰&À€©šõÀš5…€ ÆY•p[ €p,éƒDåY_šp {؇WО°(‹ñi È9ˆà,ðg tpvð * c‚T„°°KV¯ðYnРê_Ç)Ž8pœ,MpXzô`7\™àžr@r‡;`;@ 6Pnp —À“Nèu`W£ãø–py:zXœB{vÑus…0i€n°£ gUP™` < tÀx3zF@‘8€¥—GMà* u¸±’0"Y7p€ÿPuã<σ —@§vú{xJ‘7ð‘`¹ô§' ¨Ïáø à§I@¨ùœÆe“Z©tà€3jFЖ°› Lð©.œRY²û`õp¬ÇjÄÚü0©t@§Ý'Ÿ@U„«ºº‘p~ú«Á*6ͪÏ:«H ­ÔZò NÚú§ÀêÂú4ü€W®H0®œ@E`®:èª"0Üêö 6ú¯Ï*°HõJHXjKèšKþº®ú¹0÷€ñ {+ ›¥ú *(z ±b3±ñú rŽ›?|:Wö±!Ë){/$+­'‹±uÿéMœŠ‚-»!ð²2(6óT@³xš²8Ç«õçk׳=°®ø 6àC;­x*uù_¼ª‹JkSz9Ýú4Q;µÔêRеL µ`°]zI_Ë3 @¤ÓZEòyˆYKŽ0¦—%ж Óo;®q‹¯ÈYy¼ŠXŽ  —!2“ð4ùp4аöz£ùʲk¸ùÇ´"ðgá·0•¹uIH%d·´³* ZH(Дœû4À ‹?80º¥«´5…º\¸º ˜^J.þ€6+»I` f I»v§»ˆº«pÇ3÷0 ¼F NÇ‹¶Š¨%Pº»œBäÿ’0½t‰?ß”­ve^ðb¨»½«Û|0Û·`¢å›bÙ:`ް¾) ‰P"0B $ ð´÷B‹T$Ÿç«Ž+`·^°yüˈ,ÀÀíJ.0 ,¸)„®˜§lü+k ?ô÷":ÐÁs N*øÀ"¼…^¾XÁлˆÒ`«0ŽÇ™H;+Ã^À…M( #@³|/ú0™z¥›¼Y¸ˆI¼Ä@¿¿Ïò €§`ÅVP»÷ǾÚ[IܳF ?€ÁžâP­ºÊ§&Žàbj¼½IÜe^ <Ð,*Œ+ÿPz¼«(ÈPübûÛ¿~Š) ]Ç<0o¤Áp¯e|´gÛb.&Áý[C€-  PÈ0!c’ˆ’Œ\PI Ê4u¸ú—‰@"Ж "Ç@B`¨‹+?LHeL·g‹¹,ÈË"Яˆ€¬ Ljà½<$€„ÔmVµˆ…»\(ÍÔ c­œÍÚ,±¬Ì0àMÝÆ…{»‹XèœÊ«ÜÊÍDfÇY²Èò¼ZLà®eÏ\ˆÏ‰0Í=€{و͎˜;ЀBôwÐ ·¼Û[5ì¿Ñ@0Ñ#pŸŠ¼mÜ–2ÀÑ>×¾ Ì—ÿ<ÒŠUÒÙÌ<‰Ðž"Æ)d9À0ÈþKÓ Ñ±…ÓPà½?‹(ù0)ôm;‡Ð/f5ܾ¬Ï‰«ÔÀÔ÷³ò»10V­X½yL«LÍÖlÓ'mÒà—pgÖs32ðm+ÀÖJ m<Í©Œ_½—uÍwݪ²œ%ô0}ÍjI L ØpMØÕ|ØÍÍ FÕ¡AâÃ'¬F`GŒÄ—-×IÝÙŒÓÎÚÉŒ+@¦mÄ =Ør¸„À9Í"Ú’p/>œ= ¨Ûx‹Ù¾XD^6Îóœ,Å`+ ÂÛ[Éq=¶^ðÜ(ŒP’bƒŽš  PÉ— ÞýÔ pÎÚì ¾<ãöðC‡j†j¨yó<¡7Œ’àÓbcý`†` °ª¬Êª®:•ÓyàÑû€¬Ž;cacti-release-1.2.19/images/calendar.gif000066400000000000000000000016371413633772300200320ustar00rootroot00000000000000GIF89a ÷€€€€€€€€€€€€ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿ3f™Ìÿ3333f3™3Ì3ÿff3fff™fÌfÿ™™3™f™™™Ì™ÿÌÌ3ÌfÌ™ÌÌÌÿÿÿ3ÿfÿ™ÿÌÿÿ3333f3™3Ì3ÿ3333333f33™33Ì33ÿ3f3f33ff3f™3fÌ3fÿ3™3™33™f3™™3™Ì3™ÿ3Ì3Ì33Ìf3Ì™3ÌÌ3Ìÿ3ÿ3ÿ33ÿf3ÿ™3ÿÌ3ÿÿff3fff™fÌfÿf3f33f3ff3™f3Ìf3ÿffff3fffff™ffÌffÿf™f™3f™ff™™f™Ìf™ÿfÌfÌ3fÌffÌ™fÌÌfÌÿfÿfÿ3fÿffÿ™fÿÌfÿÿ™™3™f™™™Ì™ÿ™3™33™3f™3™™3Ì™3ÿ™f™f3™ff™f™™fÌ™fÿ™™™™3™™f™™™™™Ì™™ÿ™Ì™Ì3™Ìf™Ì™™ÌÌ™Ìÿ™ÿ™ÿ3™ÿf™ÿ™™ÿÌ™ÿÿÌÌ3ÌfÌ™ÌÌÌÿÌ3Ì33Ì3fÌ3™Ì3ÌÌ3ÿÌfÌf3ÌffÌf™ÌfÌÌfÿ̙̙3Ì™fÌ™™Ì™ÌÌ™ÿÌÌÌÌ3ÌÌfÌÌ™ÌÌÌÌÌÿÌÿÌÿ3ÌÿfÌÿ™ÌÿÌÌÿÿÿÿ3ÿfÿ™ÿÌÿÿÿ3ÿ33ÿ3fÿ3™ÿ3Ìÿ3ÿÿfÿf3ÿffÿf™ÿfÌÿfÿÿ™ÿ™3ÿ™fÿ™™ÿ™Ìÿ™ÿÿÌÿÌ3ÿÌfÿÌ™ÿÌÌÿÌÿÿÿÿÿ3ÿÿfÿÿ™ÿÿÌÿÿÿ!ù, | ¡U*B£¢*8 Ũ*VH„˜à(Q(PIT1⟅¢:ü÷I“%OþCQHeÊ—ÎVŽ¢Fs,šÔàè¤D%IX$cþ£D’( Q$§¹$úÎJTÎh:›†s'œiG]¢Üº²åK®)³þªtlÒ•(Òª]Ë6 ;cacti-release-1.2.19/images/chart_curve_go.png000066400000000000000000000014671413633772300212730ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÉIDAT8Ë¥kL’aÇ_ÅLÚÌt3§–Šó‚ ÊÅ ˜×9Is–…iÓЉ¨3—·å̉XŠ–y)ÅVFæ(Ë•–ff—™¦5]}ék«kyÉ”yO¯4ÖÚÚüð{Îvžóÿ=gÈv0!Ó!ŸKÝ– ¦zZÄkŸ»gy¹”–Þ„ƒ. N~ÂÉü· | Ø (+¦Qeˆ»¬"nöVó'¿óŽêpf–SŽÍáèqp¼ÿ”½?É!°ÕÒkÑ‘µè¸†±ñØj<7Ò4¸ÊMò^IL^Y<Ä_O¾ŠJþ°J'Áû d¿{Å|SÞéÝ“­YãtX¾ÄªA›ÃkÕŽT­¬Wk£ejÌ,`–N€ið+…ƒÍ3´–a¯b´Ï§D¥÷/U)4ÌPßuVÜÍÉ·%ãF~¯›RëºOudL³Kˆ¶ÛgÏöd«G…ªŸùw"t¹ duÓˆZ m\C Z6 èg_Cl°wÄ6v;Õ#ièD€‚µ5(f{B-ÈQ0Öj‡ÒAÐE^‡'QKòÑm Š_XíàµígÓÚÅÊ((êecy=,LØ çŽÃƒÙ6(ëçAB‹‹aÑÓmØ,>ó´ˆMª±q1 {Ãaðc'<üpÍì›m…Ö—eÐó® ÄJ.„6ì4ÐꬌÃAEÏá¦39ÖŽ“1;ñ•á+cÅÐ8ZGD ‚ôitMÔÁ©Û‘à[ƒl´ÂgÀ) te—S¯‡—Óðú-ãFÜŸiåûfè™n‚[S2\Rò )ˆ”‰@ªF¾¸W"ôß‚‚`Šx ±?ןÏIÀ+1ENÂ’ÚܱøgìÀ%,So$ÝËÏ*ësv!æ? æU<ñœÇ@ â @À&¹€ŒC•ÚAVOc¸!ýi¸ýÖ‚á½9BL%†^Öéð0—Þn9ÖˆsÐ>i Ö“ˆ¡«Þië¶»œÿ®ùk>¯Gj—ÜÿÎý ˆ]ò™î†IEND®B`‚cacti-release-1.2.19/images/cog_add.png000066400000000000000000000014561413633772300176570ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÀIDAT8Ëu“ËK[Aƃ€û,º¯‹.ºjéR²pQh5‹J¡`šôAR»P4($bHjJM Ñ Š¯`L(‘ÞFã3>¯Æ4ÅÇÂG/ -–®îýzÎPÓìÀ0 w¾ßùÎ7sut7͵µ5óÒÒRjaa!EÃü¿sE›­­­²R—øüôô''';O$%ñx¼t||¼ìF‰{H¬®®®*étZ?77§âàà$Tb±˜ž@ÊÈȈ:00ÐSÈd2öýý}\\\`oo$¾šžžÖòùÂSg¹öøuùw£Ñ(B$‹. RÅ+=$ŒŽŽ‚îˆލ ŸrAd¾Ið±â‰ÿîÙô>!ŽF£-ÃÃÃÚöö¶óuÑÙ0¨ÆSØ×÷ˆå?€‡/ùþä+ü€ÁÁA;'Ï/@ t¯\.—Æ¡qßíw‘È…ñïˆgƒ øû¦GO]]j±X”††=Av¼¹¥y¥çpK5Bìþ\Sìàz Ìjµ–677—ð|jjŠÿTXîÿ4únãd•yå}!ƒ›fmm­¹ºº:UYY™ªªª2Óáš?ØöŸµƒÏýeyÛ1çB0_IEND®B`‚cacti-release-1.2.19/images/cog_delete.png000066400000000000000000000015171413633772300203670ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<áIDAT8ËuSKHQ½of’˜L$Q“T0f¡%´ÅÒº1³h©t(n„Bµtg© JC (.ÄîÚEèÊ,µ»n´`‰%ŠUÁ`«bCIBlbb¢Ñü43é½ 6pgÂ{÷œsÏyoXµZ…ë~ëëë•J¥_–e¸¸¸ð»\®×õ±Ë¡PÈ€8Ö‚­­­M´¿ººš2 \3"Y‹ÛíÞù‡á.}ÜÆ¦=l2cÉår¨´Z­Lkççç{XÛ~¿ßw…`kkkLÅA›ÍÆI’DJûXæR©ÅbE!Â}Ü· ®±±qpzzzŒ°=•K$ä…‘¢Ùl9Ž#慠Ãá u‘ö"‘*’sW2ƒ&“i”T)¸““ˆF£ ÑhÀn·ƒ *a¡P »“###ê ÚÀq›±D‹Å"åóyÈf³D¸‚ÿ=:Ж·«««›ÄÐ*,--e‘,˜C÷ÚÛÛ¹££#U•“É$ ÏÔÔÔRñù|´¶ˆ@}N§SB›ÒÌÌÌMŽÆ"oH¤ŽN*F£ÐNíx©‡ö1Lµ3š”ì°ÙÙÙt:ÝŒcŠ¥ŽÇF>Wè!0–÷‹w+kŸ ’ˆÁ™¶NÙÓ¶®i:µççç'¬Vë()Q`t ±XLUlIn‚)„—töÛP -ÀÏåE9»»óZ%˜››{ƒ*ã8;>>V' ¢¡±óïúÀùìèÃ_âßL7 -Ø`saù·z0bz½ž.„Ã។`vv2™,[WW§È³àr¹4ôòââ"æææ011ÎÎNtwwÓŠ@lÁápðêšœÂè%êq»Ýž^__‡×ë…ÅbJ¥rK¥Ò²úúú²ÁžÇÁuÛ=Ì8>ðçÍÍÍi­Vohhð ˜ÛÞÞæË¥Ê$HôõõA­V—Q…ÈdeáÆû›±TÈ€UË3¾2Z W"‘pÒcnss“÷H¨Immm¼lÉ{J¥²£¶¶–«©©aœ¯¯=Š9[ùú†WßU ¥üÊFÅ`™a8Îm;”Ågó>!ŠÅâ¹——ìn™´‡I’AÒðÏ4á觉Y=lòÓ†c¿¨ëyéî´¶$cW_à¦Tç9ûÓâŒý‰Rœa ˆµÊN±VéIÖòàÄôoÉtö‚S_IEND®B`‚cacti-release-1.2.19/images/delete_icon.gif000066400000000000000000000002621413633772300205240ustar00rootroot00000000000000GIF89a Ä皌çÛÞïÏÎ÷ycïýÿãÞç²­ÿ²œÞ¢œïyc煮÷}cÿ}cÞžœÿ×ÎïucÎÃÎçuc÷®œï¦œ÷ªœÿAÖßï÷U1ÿ4ÿÿÿ!ù, /`&Ždv`ÌX "æ.Yå™äÞØ5R¸NÊ®ÄHs=Z® àÖÈLr"&22 ¢;cacti-release-1.2.19/images/delete_icon_large.gif000066400000000000000000000002521413633772300216750ustar00rootroot00000000000000GIF89a Ä皌çÛÞïÏÎ÷ycïýÿãÞç²­ÿ²œÞ¢œïyc煮÷}cÿ}cÞžœÿ×ÎïucÎÃÎçuc÷®œï¦œ÷ªœÿAÖßï÷U1ÿ4ÿÿÿ!ù, '`–ab9–Xj¦$«Ž;ºXüÎôe⩾׮íæºÐx¾£ EÜ2!;cacti-release-1.2.19/images/device_template.png000066400000000000000000000015251413633772300214260ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<çIDAT8Ë}“Kh\u…¿{gîÌ4ÃL¦’”)‰BŸ1>Òn\ÔâF²±)µ¡PAD¨  Q¤TWf!”"ØŠ¸®Š¦` ¡HC0ijC“1ͳ“ÌL›fwîëÿû¹(v!ƒg}ø6ß9–ªÒ)wyc‘/T4«"žœ˜ëÔ³þ X˜8Ñ«¢¨Èû»÷Ì›v‡Ë×›*ú¹ôÜØõû‹WGU}[E>ÉîÙß7ø&¶šåœt‚Ji’Gë³+*rQE¾>û{û `áêè¢Ò=ÃÇûŸÂí9o/rorœþgaw=MЪ²Uš¥QŸVcƾ;}ź;qâDÎ>µÌr Ïã7jìTç1a“¨U&mì8þ6‰îl7K½¼ÀVio{åǤ9sðÕËVÔ¨Ñ,O"a´WÅ«—©¯mptìkœÌ.h-£­V}ÝÅÈàÖ¯K§“*ÒR¬\ÊM“- Юޡ«'O¾'CüU0)ð7 ½†·9Msù&î3§P#­¤Š€V 'w'Å¯Ì Í N,ïo°•póú#âLRi4ŠQ’j„Ç hÉ]¸½GˆS\ÿ²ù;QƒØíƤ³ˆB¬H£Æ`«1…ª‰@<Ѐd÷^²{â9¦]â Æø!Æó‰¼‰"Ô¶ŠdlÇDÔ @|0mp‹Ä Ä ‰›QÓÇÉ a+¨ˆk«‘K7¾¢½½ é"$ºÀ„  h$?$öB©r‡N#&Cif ™N¼7ÚÿS°³²V[¼6¶…lßaìL/HbFå6ºt÷¿ŽåX¿=Çֽɕد}ŽÈGO¦|ë»—zUäC5r®øâh¾8üD>õµ)4VÊwþâÁêͦŠ|«"—޶´ÑñL\>2¤FΫÈ[û^yÇjW–¹?ÿ'q{ýgùBiîßøo¦.¨È§ˆ¤TäËcç¯têýܲÂ^&ýÈIEND®B`‚cacti-release-1.2.19/images/disable_icon.png000066400000000000000000000020731413633772300207060ustar00rootroot00000000000000‰PNG  IHDR(-SPLTE€€€¾/µ0·9¸6¹9º9½B#À,À2 Á3 Â8À<×2Ô8à9á>ÙDÞAØG#ßH"ÞN%ÛQ,ÚQ/ÜP*ÜS0àB éHàGàKâN&äP$áP,èV$é],âT1ãZ8ã];ã`?èc7äaBåeFågHælOçoSçpTèuZèv[èy^è}cÑêgî‡eéƒkê…kìvìyðkñ’qµ&Ü–…Þ›Ší—€î‰ï Œð¨•ñ®ö±˜ò²¢ô½°ô¿²õ·õÆ»øÇ¶ûäÜûèâüðîÿÿÿÚú ¤tRNS@æØfbKGDˆH pHYsÄÄ•+ÇIDATxœeÏ[o‚@`¯ã­¦!ÙŠ¶T6šh¤!»àEK´”ùÿÇöÍyü’™djµ§d:\¯<Ï¥…tÞ ú|Št¬$^Ô)QiÇ…¬`édJeHÅ{‡ÁW)"—¤­ E ^P\}°?²¼Z#©à3„YnH‰û³>ƒã=*ó¯ß|ÚctDB´œoOº ¦¤3nq|ÃÅz5ƶCÑo-kTÂp,ʘ³éd4Ø1ìf³Ýjw놱û~>®‚"X_#ÀIEND®B`‚cacti-release-1.2.19/images/enable_icon.png000066400000000000000000000020421413633772300205250ustar00rootroot00000000000000‰PNG  IHDR(-SPLTE€€€o~tywz#}# € ‘‚Œž££ ¤ ­ ¤¯¢¬#Œ#%š%)—).”.0•00˜01˜1;ž;$¯$!µ!? ?8ª8BŸBB BA¨AO§OR¦RT©T[­[a¯ag³gkµkv»v°y¼yo…·…лЀÀ€ŒÆŒÏ£Ö£±Ø±ÿÿÿ×X4tRNS@æØfbKGDˆH pHYsÄÄ•+®IDATxœeÏÛ‚0 `ä Ó`2%3› £ceïÿfv˜è½û¿¦ië8‹šºFW sÁO„î5ö]SkTÉ„v|¶ž €l û®ÖÊsæœm*ì+(P›­U!8J:Hm~•ZÕö;J,¯˜‰VØ«JÌqL‰.圳,¢.Bˆ’ços9F_ !îgiš$”n„ûÊóÏ÷ qÝá¶|þ@{IÇ=þIEND®B`‚cacti-release-1.2.19/images/enable_icon_disabled.png000066400000000000000000000020211413633772300223510ustar00rootroot00000000000000‰PNG  IHDR(-SPLTE€€€PPPUUUWWWXXXYYYZZZ[[[\\\^^^```bbbiiijjjssstttuuuvvvwwwxxx|||}}}~~~KKK‚‚‚………†††‡‡‡ŠŠŠ‹‹‹ŒŒŒŽŽŽ’’’–––———ššš›››   £££¤¤¤¦¦¦«««³³³´´´¾¾¾ÅÅÅËËËÿÿÿøÝ2bKGDˆH pHYsÄÄ•+ªIDATxÚ]ÎÍJBQ@Ñ¥|WiRrA'M:Žßÿœ59D3ƒÂ%åüØ(¨ö ¬ ·Km̦–§E¸,†¢¶­nò¼uèU{˜}š˜ ­Ðú̘)K¡W­ç|^‡á,Ð '»\y»b) ›þï£:&ÓÉŒ`J²4ò• N'iäht®ËÊ´š7j!\çÃXê›±–¡¯…ÝËúã‡Xß w{¿Øo"ÍH“ì>]îIEND®B`‚cacti-release-1.2.19/images/favicon.ico000066400000000000000000000025761413633772300177160ustar00rootroot00000000000000h(  ¥1|# 1ÔàØš%•5­J Y 1`<š!…øøøE¸b!Œ, %D¸a.«Gr&ôöô)\5›&+@>¿m?¿oCÀm•( AÂs"‹+”F»g•+­J•:®NC y=²VKÂu™"=ºc!¡2òöó’##¤6?¢Qœ' ’;¬S€MWMpU#§8S5³T$¤79µZ5°P3°Q<³X7¯P y¤18aAxU*RÈ'Aµ\!ª:5¸`,|-–œ*BM“QÄzA½j›&*Y53µ[ŒLÄy;´W+@8°Qm"£6š'{-'Œ;=½j†!Ž,›%=ªSc9®Uc›'@¨Qdüýýœ)“*ž+-ªE –8ºdJF/­J&¥9:¶\JÀr2X9"-˜ 8®Qƒ+±QW z&XɃ™/.w' .y¤€G½l!t+ž,F¼h<¸_ ‰@¼g:±U C6ŒIJ¿pCmNDÁo˜)I¾n0a<K­Z" 18üýü4·^š#FrP"¡3ŽGmO”>.°Os$¨;&¢5 „+Hµ^.±Q4­Ku'Eºdz%-²F)«G'¬=“2®M›%8®R@´Z.³Uõøö` 4«HU]@¯P$2ðõñÿÿÿ9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t».—œ`»»F‚†S¦›»>Nj1f»»m(;ƒ?»4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿÿÿcacti-release-1.2.19/images/graph_page_top.gif000066400000000000000000000017651413633772300212420ustar00rootroot00000000000000GIF89a÷6  !!!"""###$$$%%%&&&'''((()))***0,,5..:00>11A22C33E44G44J55O55R55U33R66P77N88O88M99K99J::H;;E==A??AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQWWWaaajjjrrryyy}}}€€€€€€~~~}}}zz}xx|vv|ss|qq|oo{kk{ggzddzbby``y__z^^z]]z\\{\\{[[|[[|ZZ}ZZ~ZZYY€YYXXƒXX†WW‡VVŠUURR•OO›LL£OO«QQ³SS¶SS¹RR»QQ½SSÀWWÂYYÄ]]ÆaaÇccÇeeÇggÈiiÊllÌooÎrrÏttÐxxÑ{{Ó~~Ô‚‚Ö††×ŠŠ×ŽŽ×‘‘ו•×™™Ö››Ô×  Ù££Ü¦¦Ý©©ÝªªÞ¬¬Þ­­Ù®®Ö¯¯Ô±±Ö²²Ù´´Þ··áººá½½äÀÀåÃÃæÆÆéÉÉéËËêÍÍìÐÐîÒÒðÔÔñÖÖñØØòÙÙóÛÛóÝÝôÞÞôààôààôââôããôääõææõççõééõêêõëëõììõííõîîôîîôîîôïïôïïôïïôïïôððôððôððôððôññóññóòòóññòññòññòññññññññððððððððððððñððñððñððòññóòòôóóõôôöôôöõõ÷ööø÷÷ùùùúúúûûûüüüýýýþþþÿÿÿ!ù g,ÒÏH° Ap°8Q¢ÄÉV=ƒgl9*…k×.\£í*HK’¬\ª\¹R•K–¤©1R¥ T)jÏNbÉœ@U—JaÅìß?f¢0¢DKà!M—0ó铨zîHºTµj²þã$ʆ@œFÅŠ¥©Z5Nªd:åõ LªD‰U­^©Q¥€Â#pU#YªNª÷/í.jj Tgc0\¬€“¬ð›k5&vŒ1jõØú*¨ë#Q²d‰b´ãÄ3µðÔ¨åëÛ;cacti-release-1.2.19/images/graph_properties.gif000066400000000000000000000016671413633772300216410ustar00rootroot00000000000000GIF89a÷  !!!"""###$$$%%%&&&'''))),,,...///000111222444555666666777777888888888:98;:9=;9><:@=:A>;C?;E@;HA;IA;JA;KB;LB:MB9NB9NB9NB9OB9QHAWRM^[Xecamlltttyyy|{{}}}~~~}}}}}||||{{{{{|yw|wt}vp~tm€rg‚ob„m]‡jTŠgMeHdB’b=“`:”_8•_7•_6–^5˜]3š]0œ\.ž[+ Z(£Z&¥Y#¦Y"¨Y!ªY ¬X³]!¹b$¿e&Ãi(Çl+Ën-Íq/Ðt2Ðv6Ïx:Î{@Ë}EÇ€M¿„YµŠi©Žy¤~¢€Ÿƒœ‡š‘Š—‘Œ—’Ž–“—•”———˜˜˜šššœœœ   ¥¥¥¨¨¨©©©¬¬¬­­­®®®¯¯¯°°°°°°±±±³²²´³²µ³²·´²¸´²º´°¼³¬À²¨Å±£Ë¯›Ú«‹ä©€î¦s÷¤iû¢cü¢aý¡`þ¡_þ¡_þ¢`þ£bý¥fý©lý­sþ°yþ³~ý¶‚þ¸…ý¹ˆý»Šý½Žý¾ý¿’üÀ•ú™÷ÄŸóÇ¥ëÆ¬ádzÝȹ×Ê¿ÑÊÅÑÍÊÒÑÐÒÒÒÓÓÓÕÕÕÕÕÕÖÖÖ×××ÙÙÙÚÚÚÜÜÜÝÝÝßßßâââäääæææèèèêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù S,”§%jÊ"å ‚šuî\Ä„œ8Mq¢ÍáEàP9q‚¨$±Íš… 'qLa‰ ›6mœ&Ù‰ˆÃɱ´íJ–lçG S~›6-žS ‹Ö¬YÓ§ ‹¦ì˜Õdz>jFTÙ´ca³ƒ–Ì«4`Pµ²M nܵІ9‚*Ð#GŒ¦;cacti-release-1.2.19/images/graph_query.png000066400000000000000000000014161413633772300206210ustar00rootroot00000000000000‰PNG  IHDRH-ÑtIME× -' O>º pHYsÂÂnÐu>gAMA± üaIDATxÚUR]H“a=ï÷}›Ûšî'Ñ ­°)ÓéºÐJ…èÏD,”(‚Š.²è(è:‹ˆîo£ (¢)ALS‚¬0ñ'jé&MçüÙtNkssß÷ôªIõ¹{Îáœ÷†ÿÞmâì0ýY¨Ô» bK èÈÆàNbý’ý%]/MésK÷XWšc€BÀÐp­­?àì|?ªÌû.B6¼ãÊÒå2SîCº×@4'e$HÔí&ê&ú:FôÉCtå‘Áöœ Þ¨^aˆÀ˜–Ý~«þšùê1(N }.† °Ìu:€X(ʱŒBö½øˆÚö€gÒUÙ÷îß~üèC Žq†À"`ß ds¿€ñ0è"fÏe•T&#IsR‚Öx¦¼Â·¬ËɰÀÕ“T@\~£×ó…¸K`{6훆=4Q×D™QV ^kJÆÝ7<+I°YAb|JBi"z¡Ñým`šÛcûŠAþe÷;£yõ !&¢Ä2›À&½ŠõSÞ¦¸bªrD#tzÇÎM,?4دà‹!*‰(²2ÒráÏmnx‡Üµ¡ÞSâÊ â…îHJRŸÇ5[¥Ö¤js·ª`20ôjÀ録¶W=QÏ §6¼ÀT³Âþ¸¥²%%¬j7¨O¤¤h,|+Âb86²7†#òËP{epýö7Œƒ& ³†÷IEND®B`‚cacti-release-1.2.19/images/graph_zoom.gif000066400000000000000000000017471413633772300204300ustar00rootroot00000000000000GIF89a÷þþþÎýýÖýýÐþý÷ñë”§óïìÃþþÉþý˜æûšæûþØtÎÎÖ‚ÑùƒÒûØ‚Ñþý¾ýýýýþ¼þýÂþýÌýý¿ÂÏÒþþ«îü’®Êqo…{ÌùÑÑÚÞüÎÏØÜøyÌý¢‰y©‹x—oU}¥Ò§u  "Ã( 2:Ñs#cš"@¸“$J•!k2ÆÁd@ …xLÀá(#ÐPiQ¡I€ J2®ØÑ£F^(T £|¡ à3S2¾q2ãK0YéÂ!ã#:*–9p$†B{ŒÈÈ€M"XÜx@R ‹:n3!2ç ‰êP³eœER"3ÑÈÇ¡š^ áE Ð ýÈ£! ;cacti-release-1.2.19/images/index.php000066400000000000000000000000501413633772300173760ustar00rootroot00000000000000ðFU¤NV§RU£Z]¨LdµN}ÏAyä0ƒÿ5‚ÿ;…ÿ?“ÿ^†ÒB„ûM…ÿOŠÿN’ûRˆÿW‘úV˜ü^õZ¤ÿa“ÿg—ÿ`˜ÿkšÿr—ót˜ðu›õrŸÿc£öd«ÿh¨ûi±ÿhµÿ}¦ÿ{¼ý~Äÿ&š•˜Ä‘ Ò…«ÿНÿ±ÿ’¿ÿ—¹ÿ›»ÿ«¬Ð¥²Ú¦¶ß±²Ó¹ºØ¡·ãª»ã‡Ìÿ‰ÈÿÉÿ“ÑÿºÆå³Ëþ¸×ÿºÕÿÅÅÝÅÖþÇÛÿËÝûÉÞÿÃáÿÏâÿÖãÿÙæüßëüßîÿÜòÿêí÷îîõèïÿæúÿìòÿõõùòÿÿÿÿÿÜ`átRNS@æØfbKGDˆH pHYsÄÄ•+ÍIDATxœc`À Ü%XXÄÝàÜ vn''=w(ßÊ61:4$"\› ¬(™Í6%Ø)4ØÞ)PÛ*(àÌëïd—šdnkïÈk 34×6LNÒÕÖ¶U 0š:Ú©&%(99é*1˜u”#S“œRC…8€’j2j‘©@ª($' p•6RNMR‘ѱYËef&om$olÆ ²–ÁOÀÒËÌÂÂÌËKÐâT?~ o__o#~W˜g’<¤¤<â°ëz%àÝÔ²IEND®B`‚cacti-release-1.2.19/images/install_icon_disabled.png000066400000000000000000000017651413633772300226070ustar00rootroot00000000000000‰PNG  IHDR(-SPLTE€€€dddfffgggnnnrrrxxx}}}```‹‹‹•••œœœ¢¢¢©©©­­­µµµ¹¹¹ºººÁÁÁÈÈÈÏÏÏÛÛÛéééíííñññýýýþýýgÓötRNS@æØfbKGDˆH pHYsÄÄ•+IDATxœmÎÁ 1Ð"+RK TŠôÿtéìarË;D[{Í”JØ_uÒ‹žî«’‰#)±’È F DáÝ3‡p¹ÀjÑ2 tе™É½¬ß ZRÉ~êÚóê:”÷Yàí8g?œ1ùù½J3búóz MÕÈö–/›¶Æ'¸ãïIEND®B`‚cacti-release-1.2.19/images/location.png000066400000000000000000000010141413633772300200750ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<žIDAT8Ë’Ý+Q‡÷_\¸Ð"’"ŸYv•,íR"6%ÒØhb±5%ÖÇZçÂ…(ù˜]»käFÊwÙã¼~gb††5§žš93ç÷žóœ×ån•K†ã¹Íî…,óσh†ygOYÇÌ kŸ>fm‘#Ö2yÈ|ÆÄ¿DäúŽ+¸”K…×o˜šGwS¶QÙ)uCIf ðG/Ĥ#j¶ì¾¹´ñQIe2S‰«×ÁÕK>°byZÌò~9Í g¼7z›&8\hpá±$ÕS´Âtò–cX¹æp¡ÁEÞ h ï¢òtJç.4¸ÐÌl§¯~duI*|yœ?< &÷‚§y}{Ä" .¬€¯¸“Z|G½Sò:*ú‚ЄczƒÐ„¾ ôÁ¡xƒ ©F@(–#œÓpñnÀ… *;.¬ûÄvÆáBC_Ó?›âÓÅŸ t.Ð÷ªàÆ/Vl|…ˆá ¬ÙàÂñÜm²=.d¸0ÕnSu0A•ýëTÑ£PywœÊ|ËTê‰+Èú#{à"WbIEND®B`‚cacti-release-1.2.19/images/menuarrow.gif000066400000000000000000000001041413633772300202640ustar00rootroot00000000000000GIF89añ€€€îîæÿÿÿ!ù,¢D€%J„(Q¢D‰%J”¨;cacti-release-1.2.19/images/move_down.gif000066400000000000000000000001131413633772300202420ustar00rootroot00000000000000GIF89a ‘ž½ÓLs$cÿÿÿ!ù, œ…)Æ§ØØƒrªÀ°k÷xQ˜E hhj”Q;cacti-release-1.2.19/images/move_left.gif000066400000000000000000000001251413633772300202300ustar00rootroot00000000000000GIF89a ¡ž½ÓLs$cÿÿÿ!þLeft!ù, œ/§#¹Ü^›Òxi¹Ý wci‚¸­¬+;cacti-release-1.2.19/images/move_right.gif000066400000000000000000000001261413633772300204140ustar00rootroot00000000000000GIF89a ¡ž½ÓLs$cÿÿÿ!þRight!ù, œa©šÁœ° qYÇžU`ŒÙer t²‚4I;cacti-release-1.2.19/images/move_up.gif000066400000000000000000000001121413633772300177160ustar00rootroot00000000000000GIF89a ‘ž½ÓLs$cÿÿÿ!ù, œq»ÂZxFW3ÃYÞi`è¤ÅœÑ ;cacti-release-1.2.19/images/reload_icon_small.gif000066400000000000000000000001031413633772300217120ustar00rootroot00000000000000GIF89a €rÄIÿÿÿ!ù, Œ wêkÞ‹‰)Tvz_-u×GAWN ;cacti-release-1.2.19/images/rrd_not_found.png000066400000000000000000000240741413633772300211420ustar00rootroot00000000000000‰PNG  IHDR¨±²àtEXtSoftwareAdobe ImageReadyqÉe<viTXtXML:com.adobe.xmp uA‡$\IDATxÚìi\×ußÏ}KoÓÝ3= ¶!@bÀ$!‰à€dHšI %KQ¤À P’âÒ'ü!«hW,')I>ØUJ¹âI•œr9„JªH‘DÈŒhI–dŒHP¢¸ ˆu0K÷ôôú¶›{ï»ïõ›æ 3"ÐøÿÀÇéåõíׯoßÿ;çÜ{ãœp)8      DDDDDD€h€h€h€h€h€h       ¢¢¢¢¢¢,‰uµcl¥›LmÚ¼aïæ›7î}ù¥WÖÜÒgrf0ç´[KeRO½ú›_ûœýe|6Î9zàš†]mÙJŠÆÆÍëöX¶ñùñ­)ìü‡Óýëmšj¼N¯ÏpÊÉ?ãò?ýƒ¯-ÌLÏýQuºýä¸Ñ€ëO4rÙ¯=üÑ»îÿÇ¿ûþ¾¦}š¼  bj£øëѹúk4]3)ǶD_ýã¯zG¿sêG œˆ×: XšžŒi oÈ}éã¿uë#ŸüwûRy¢‚=JNР¹öIbdÓ`f# äZ”ʼF¦iУ{&¬û>¹éÁâhêGR·Ð-à:l6»ñ†7|ðïþæ­f ¬Šùöi¡å¬5Ôòj4ïœ%ÛÈ‹ûƒä !1Rç(cèÖoc›w n¸-õ?Ñ-à:5JŸøäž‡‹9{„ΩåרéÏ ‘RVÆ‚;Mm!{-1fQ+8O†áQ^ì?þOn¥`>1ð«æGÑ5à:f{þï ÞsPˆ„©„cÞ9§â }Ö°¸O4×>#ž3„P¬!?ðÉáÓÔgç©åféƒÿâ.æë¾<²ÓJ¡{@‹†Pƒµ~¦¬nHáàâŸ8TwË”µJâÛÔöT÷¤õQRÂâ±’1êbªŸ2·ei4¿)4韡{@‹†°(õFMC2FI‰´2Ü B>˜ŠeÈûgJ}|)†ÙÂR£BºŸZ>£\£ø°6 ÇEƒìÔÔ©Õܳ°Œ¼rQ9A‹ZÞeÍ „x´½:9~S‰†|Þ°*”6³d‰×äî4©àEsÿ]zX4ÊS­¿:~´â´¼*ùÜS"!- ËXBbQÈš%5gŽl##³‰ÙóBdÊÙšu4zãòÊüwÐE ‡EÃmûßþñÿ=S „=Ñ–EJXrIŽº;O÷)cö«û5q?ÏeÅ}Wº³Râ9+G-Ç¥›^K|ÞØ>²ÓC7€ ÁL½êžz³.D£¢>¢­]TœÔ𤪠n3r‚&y#„%G¾tZ™uÊ Ñ‚“Ùh‘µ–ííF7€Þ j.¸žùòɦ´4!)£O‰†´*nUM·µÍœz¬éÖ…ˆ„Ïs£Ai+­n×y‹ŠÅ MÙ‰n½,5ï+û³ ¹£í7…¥Ñ§ÜQrk(!¡X(Z~ƒ ÃVSoe°Ü2™Øß¦j½E7Þ=,ã÷Œì´ÐU wëi4 ‹=ò!5²X†ˆ… ýüÀUâ`95WΠ’-–¦¶×$fpñ\ŠjímØ6D¬aÈ\T¿Š®=\„©2ÕúÒsOO5^UÝ—q‹@Ï¢jùu5kJÞo ‘ˆœAåpWüåB@l! -+’¾ü~tèaÑðÜà›Ï?=U—«¿e,ÃÖ†šzK\Yre¸Œm¸¾§7™%n·Åcâ¶!o;”*aiªæîAW€Þ.÷Zn7¼™ù™yA[XYeeHpÅ}%FJ¹«¤HKCÖÚ #ñ}"+c÷é=è*Ðã5Ây@_}ùof•e!cRÔêpaEp•TÄ&_ì$BæªR+ÙO¦¾Í…Êô­³)hð5#;­AtD£‡©Î´¿þÊg«í )¬‡”P¦‚Þ2aè²²Bq£­Ãö„p˜a\X!…uYòCÕMè.€ëë·P­ sem¼¡\SẠ¦,ŽÐÚƒäRL²i#Œ}ø.eÓĸª{ÃEŽMî0¢-7¹ ½…®€h¼KdóÖGûŠ©ÿþ[_¸{ð¾G·RÚì§óÕS”™ë£±÷n2úˆYüëoýäágþìÔÏN¿:}«x‰½Ö´çN¿Z¾etXŒìÂÒâà¡+J&3”˜ê¶ †§ÓL=æÊÛ})"Oí:Ú}\FšÝSÉ}±QoÝf 1Æ‹d¸éÀ M¯Ÿâ-ú1º¢ñK$—·?4°&ógûÿ÷£CÃÃdý4×zCŒØ>• ƒÔn™tºr‚vL¼-Lñ±š1ÿÊËίE¯oTÜÿwêå¹]÷ÞÏ™tOJ,Œ0(®­ Ÿû2ÜÇ7l;O¨‹™V³§$…äq¥Jæï¤Íûþ³½X¸@óí 5—fMj×üBë'ü{ìôëÁ,ÿ&º W¸ÚákÓ9ó|á/( )c Q¥}R ò¶•¥RÚÆi2Yš|Ï ÷ýÃ~âóìCõ>5ЪyGÎüb¡ê®J‹.ã‘8¯RœfDÍ 2™°J8¹žOVÖ·•{ª?>i)vÿÍÛ6ööß*ÎöŸ••þT¶iR)—‘¥ï5Ót'}½0nnF7@4~ ­Ë~iïçîÉRŸµž*î)%Ò,(Øë©Ü>EV: bz˜¦ëg©Úô莇†É™á2²ÓŠ>Û‰é¢! «Hä /§Ûª@8ÔB¿@=æ©öÅøO¾°4–Fèž²£ã²ûÍw~úƼiÙÔpÔôšTHuêvÈ¿Ìmlg¦gñ&Ž «ÄÖü@êû?|¥ŒµüªZ¤'-Yû[¦8—iÍå=.öº³@–G[î$«m®¯T·3S/»Ü箪äð(à Ghyøú6-Ãää¸rŸÿÈGÆ=~»7Ò œW1’óB°F²kU»¦°JRV8e×4¨ÝÇ׉—|] ÑX]+ã÷>õ™mýÒHýT÷fÂx7„h PÍÄ rãyÂZð_¼nˆÒ\ÕÁx$jËwO΄2È\d DiEâµú¶P!DŽ'ÄÄazznLÁÌ1cÁ©ª*aÀšZóÎÎâTȦ…˜1¡¤&êzmú º¢±ŠÇøü#÷L¬VÆ€²*äl&9 §…`Ô½¹8ù ! €j»B~ –ëÑÚáÊ­$¸%jLh@ÓS±ØÊÅ¢3{*tOñpu¸l×à2ž°4BÇT]7çÉå ²铖†¶Pf[34.Åm§R¡µÁ„}Ò‚m#;­Qt7Dcu¸çŽûF Ó2„h©á—c·‘,ÕZ÷ÊZ@òT©UÕÔXOˆF)³†ÎÍsH•âÖ5Zv·ˆÚ’j E ­ŒN\Zžï“ïPdi¸ºµfàD<Z.¡ðÌ4g¨_ˆFÓ±sù7ÃÈK©îEw@4VÒHfç½m(1J‘œõpO æ2S­L6(WpËû6+ÐùÊtle¤ÌMŸ¿@ÜR–F¼ÀÎ0Y³Yw‰Ë‘<€‡ÏqÞYÔZ¾ðMbfh‘82…ˆ©v®$Κ+¥¥!«þYYõú–×Ru8Ô¬,Õ˜a¥ø)õª»ÐÝÕ8(“íÜñèz! }Ô ª±e6…ÕáÍÇ+¸k 6UUee ¤‡h¦už¦_­SV¢q>jOyŸÌ0Ø-ÓÊ©¶Qü" „KÑ ôL*•ƒÊ9ª\µ’%œqKsQ{–iÚrß·FYU66ŠºÛ ¬¹ÆÃ ”pÈ×s[‰ÎÍènˆÆÊ“Ïæ­á\¿M– Yy/Z?a±œ¸¢_з³dX-üöÅý¬]ã~ŽM–É S¯E /˜·ÐâuR((Šuh AVðSâ‘¶¢Å}Ñ*óuw߻ݖûÔ…¥‘±sq[28žµú¤ˆn(>*ÁW³x× » +Ï;&F3á€k©iµšÐd„iÌyh%¤Œ<‘]'K\É÷YE*·f)—2höL“Ìœ2 âä‚¢©¼‘2k4ðÈ5¥ƒäÒõ%ß‹Œ<©Y!6mÕ^NþO3@7þúÚ´œB«V—kK£åÉúãvÂêH$@”ÐÇè(!›Ew@4VË6 9]Õu™Z/ÄK䆒õ¾mi¤í>5kÉ7…ÀôÅÍü,º1ºaôãcïÛ KºòDŽ© 1ƒ*!Z,ÂôéAœ"½á5(£ƒÜr1¡ÉLmi´ÉRVGèFó#ñ'db”.(ÑxÝ ÑXqKƒŒ0å‡ÈÉc>u‚↠WXL®È–Ïøy™€ŠëŠ*†0ý”¥üØbeÙpvÈîÊ3ÅãExQ,CðBdP\ ‡¬¯!þÉzá2i¡#¬ ¦sW…sÃÕåòq3ßPn*!zx wÅ ~…“ŠÆÑÝF.ÄSnŸ¶O3³B4Ré:¼Øêc޼ÂgYòYCY)!$ï}ÿ­äa4²Ó꧇(]gÿÅöO­+vòLQ,ŽeÈÇ=½ÂœYnÃ~^³A±"åÌ"%ÅD¶%- SWT‚&þyM½°ïUN¹a™µªbû6º¢±â¦ù2-¹‰…ºO媫,_¥ m•xP¨‹ed(#, ieä̵d1$Òu*¸¡rB%Ö*»¯(®›‘\—Á»¬ %%:®͘"ß*OäSÕGUñ«5]š¯9T®4i¡âˆ­MnÓ'£"ÞïKâõ¯{dl«ÉÙRD³ ÁøóUŠx¢hû[·¹wñk_昞ÛØeì·o™}ÆWàX'´ûð…é%åvè¶±;ñÚ2®E¯Ž¼Ë¿ƒ_žƒ&¼Ð‘c¾ëN4<7øîä·ÏÕ3Ù0]“Äg+­„Ȭµžv ùº.wZ­Ìބŗõ7ˆw¥ Iæ›ê ×.¦X€tÝpekÈ¿~g˜’ù©â}Fî‚OÞ±€êÙ¤“_}JºÈßføÌ¤ÿ&ö¾CÆ3«uŽÄqî“›¨&õSƒ‰Ákð*ø:“ñ-ò‡\ºÌýïúlrŸ=+ p”8‡Ë1©ß{7Æb°B\“}êjL¢·à{|òü+ój&“gæ›Tov¬H¢­YäùnÂ…ev­þîX<ŽqqêHXd‹r:m¸¡³}‹ éåê;8O£ Zxv¦¿{Ž o4t³IöfwÚÈÐÅî· ±ø§bÃêï·r\ú¥·è/e¿²þ¡ÒVBé Ž«„¯€k[4hî\sß¡ÿøR5“õÈ6Ó*Îpæ|“f"‹ƒx¢`R8ëÉån'^¡+ýq÷ôt]¢äŒ)Q–Û0U K,þÏZ`h™B@Þ$ª|ï<[ÜïÏÑ›f¡õ-{˜ý¾xÉâáõB(þ•ØŽ]Åßµ¼zºË½ÓÍ®®}ŽèÇVòÊêRêKÝï°ÞçrŽqNÆÈœ2ñ¹w]Ä5öä œ‡ý]m>qmIa=–hk9÷D÷w{lQë:sË´9ÞÕ§ËŸ%x$qìo÷Yº÷yš»)“.ÏqÝ?ø2ßí;a©÷]Ê…Úm!?½D¿¹Ô>UÒ}cY×mäªN´±?[;r݈†à¹Úœóů|þ9w¸Ð¯ÏÒž8q®J/¼>Cg/Ôh®Ú$7èX~ئxðE•’± bÒk7êä¸ (ˆã"í–OÌ‚!Î’sÁ'aMHþXˆÃbû°Ø>'¶ï‰Í¿.ä±W›Ãôg_×óQÇ‹\EÇõc+t ã Ka%ö›ìÚÿ0˜8D‹ã‡–píX¡s¹Ôv'ÚôwÊ.=¨N¸ív-!¶ãK|·‡õk÷t ÆýwKâüìïê+%}¼%Z쥋ˆÖ¥0‘xßÃú}'ºÛýúûIº)“ødâx&ubtùñ*ÒçI¾ïÁÄû&ÏAÔOvë}úøw¹ .µO=­¿Ï]Ÿ)þÎ"Wu¢ýÇ#×µØv¬Æ@rÕÖx¨\h}öü‰Úg¿ùïOøî™úÒj`o:mšÇKÓ3ôÒÔ4=zŠNÎVij¾FåZ“æmjµ=Y­/QÒ•ÇAœ%ãl‘ûJÚ2¯Tä¯jÉ…zFÔð¦2s±ûäZä`âØ&~¤É¤|þ±Äc»õn%Ö™Œ%Þãà ì—•kÅÅ´O*ƒ×¤¾?qWÁ{ô9Ø›8/󾔨/º}¼k\}{}å€ôö%Îó„¾=Ù%ì'DørH¾öÐ{îËäç-]¡X½ÝÌ}<ºÞw¬ë}÷ês5¡üýúx/'fQÒï]¦Åñ¶Ë|Ç×·{*â•£oìŸ_hŽÿŸÿôÒ™?ÿíïSõGM¶²´f¨ ʘaì¢ÒhÒLµEoœŸ§“ç*tjªJÇOΓãúÔ˜qÃ5±»*œ1å«Âá†ÇÐî)®áš=g†«¿ýj@FZ]L½qŠÆñ‹ ¶úpx™×_æÀ¼¯ËRÒWMåËÜïZg¢k@ìþnÆ/c@›\ÂeW^b¿ò<“ú{Kßñ%ÚœÔßÉD×{ìÑ–Éþ´'/ÒG£ã\êØÊ+h /÷^æX»ßw·>‡Ô‰½]N?.'¾Ÿ9}ޝŠEÂÖÕþ+{éÈ+GÅŸüÏï¼ðׯ>÷­ó›sF\«NwlÏÑl«AnÉRÁðÊ”°2ª.¹Ù“ôÚ‹è§ÂâØtƒCC2ºù#™EÓoULƒ’AòD¬C-ü³È—kóL–š]Cј¢Þ£”¸’Û³‚í&¯Šö%:þÞËÜo¹ã._cçùØ µUºÄÏ^z ¹ÔµñKÐöê¾2‘»]+èÆ[îÜ›çWë}Ÿ K‹=•õEÁ>=èO^Á{ïÖ¿ƒ¤+y>ÇïšÇãš)A:ÿÿ©ù£î˜ùwkûιßuohýÕs§^˜9yn–Žþü=ÿó×è|¥LóFN¯QzÜ£üƒT/ŒeÎxmîË`7Q²^%òMZ(Le]Äq™KY!šz˳5݃¢QN¸Ø2Û•Ì‘KfÏÛ\Q_ê~É+óÉkè<—/rŽ¿Œ¶J—¸ïØ%´U¦N|d©íP—ûè1êøæ'®œÕì£coóüj½ïcËœ“KX&û–¸}¹Þ(ö5H‰ûÞÍN|ÍÕ­ž~Ê{Elûç¾ã ò¬?’ZËréõlsj=»ËfÛ­¶Ýìc›Åiîûå·˜Û>oج+çT”=tG¹ÇÖÄJì7‘¸²»š„¡t‘ó\ZÁó<¹„°N,ñþ‘{il Ñ=ž¸jÚ+]ÆqXå+þè8Ç—ø %ZÚµºRç˜.ÑýÍGîÀ¥Vä?Ýu¼Otí³'ñùW‹ƒú=÷w}Þ2-€ÄrÏ~Ÿõ9Ø×%Ot=ö¤~¿ÇuÿÝÛu®ß©[ìizëôïå,ëÉÄwѸüÀOÚ-•Œ]‹Ò¡ºN‡©+ïé”%ÌÍhBaµ‡OÕA}%Ó=¯hegkºD+b©ý¢õ Qjˆôö3¬®„ä¹8’øQ^l]ÂãúÍéïáú³%çßG³s&/c@Û«¯‚£órh L\¥Fï9¡_{°ëj>ò—'×$ŒwõCÔ™Žì'»iu]…QìkWW?xŒ–öñ?N©ÅW²Nco×ûFë4Ž'Ä*ýƒ‰Ç¢ï§””KíS‘½§ëØ—œ¡&Æ«ãú½ÆV{‹® ¯V: ׯ}ìƒû¶žØ·þ¡"mÌßB/;@5w6oQec>óÉ<ç﹇ި£3 ghǺèÔÂ)úÙÔË´±ïfškOÑ…ÏÍRés^X—{,WÛ¹X]´ÝÖÕÇ•÷¢Þ\eÑM.ú‹¬W•v ã2=I˜x*Ô4tD£‡q|gÄì3º†©Ñ£XFgš­¹Èm%'M©@¸\ž©"º ¢ÑË¢á:k\´È;±.#au„)H:¥_ÈFOˆ-xMD×Ȉ, ƒÂûj}Ýî)»µH[)&×–FÛ!›Ù*e¡¿@FvZcèBˆÆ5NàònÅ×Ö‹§ÑŬ¢™Ráâ?_¥ sRE'GŒ¦L- WXB4Âä…ãèBˆÆ5ŽW Ž4N{n§fF¸Â›± /ÝW† eytfX©UàΚò]?„Ë5Ì·å¼)¥.Èx €h\ópÿ¢qÜ­%ƒÞñú‹„eÑ)ÆÖÐ`zj-EÖ†Ü| ãú¾²:Än†Åä^¨€hô/7ßðˆû wç]ë6H[:0î»±EÅ7L2UΩd0Üõ\²š™ýj—t!D£Œ #E?¨¿æêȽ%“­²4¨ãžJÆ2d\YLˆˆÆ6"Ñhϵ);m“UT–Æ«èBˆFà•ƒ?ª<ÓªD‹Ó£Ç9¦üDZtç˜RÖE$ Rî)i€Èuì%¢ãßz•2£®Üã'bû.º¢Ñ ¦F@Ï4_õf¼)_Ç/B%èNPH:Ï”².¤>ŒYGC†å¥è#uŸýQnÞ þ­†‘gÅ®œ~Êk  ®'¬^þpÜáÿ¨òe÷k3ÍúšþGò ‘ZéÍy'­ãP–…#¶y!é@•w•÷Ùw„uÑzÞcF.©ÿ,¶-ÃA÷@4zˆ Å4ùýŸŽÞg~®üõÊ¿|õ{'2çi–œ}²Ö ñÈ ‹Ã ­ ßñ•ÝŪŒjS5šýþ y'ÚT¼Á¤Ôš¦´A^ÿûŒ‹Ãè6€ëͺjˆ±Uiwd§eqŸ>îÎðßôêü¯EÙõ…Qš¾0MÍzKM¡íè£Õ)]4Èad¤•ý!E⿊í+B0‚+²|®²s K «ïÉm«ØÖŠ­ Ÿ.‹í„ؤeñ¬й•z_ˆ¢àºÁÀ)ÑÑÑÑÑÑ      DDDDDD€h€h€h€h€h€h€h      ¢¢¢¢¢¢@4@4@4@4@4ô&ÿ_€û"Hô;IEND®B`‚cacti-release-1.2.19/images/server.png000066400000000000000000000010221413633772300175720ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¤IDAT8Ë¥“?OÂ@Æ_þTÒXÔFC¢NJHŒ~‰†Á¥ƒ&Ž|?º;t×ÐÕo@˜Ù4’6è„‹“‹A –öî|ß+%ã%——–{žç÷Þ]cBøÏHF½l·Û¦çyg®ë&±V9‡Ã!Õ[]×O# lÛžGÁªªz:=Š€sŒHšÍªÐl6Nðé·eY‡$Îår«™Lº/¯@éœ à‚£‘†fŽãD·€‹…BAþ ¾ÀEñ£ý€|<ÊG²Hê1•JA¯×ó“ƒíâŽL£tÚð‰äÌPD‹è`ݶî±2™Nÿi•ãéþ^ ¹˜ Š¥]™Pˆˆ=ˆ‡ iBÉÌïýMéBýÝZÙÂX<éõçkøüðäóDB n%‰ø™ã»óÅ à DÇÇ­FÐ)$ ?™q) ŸÄßÜŸñÁ]«Õ‚~¿Š¢ÀÌlo`L1áÓáD‚jµºoF¥Óé\jš¶·¾± Kù5)Z[YÎË;±¨¯±V«•Qx…³|LTiâ?™¦¹5Õà/ãoül¨}aIEND®B`‚cacti-release-1.2.19/images/server_chart.png000066400000000000000000000012411413633772300207560ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<3IDAT8Ë¥S»kSQÿݛۛ¤iLŠ¢-ÑA,…¶Kg«bA º™Á1 “ÁÝÉ®‚ƒ‹ÿ@º6”†\„,ZQ•Û4ç>ÎÃïœÛÔBcçæüßãXJ)üÏÏ9{èt:o8ç›q;”AÙDE:¿«T*ÇxžW Àëb±XI§§RÂx#‡³³Eìì´ªt:OÐívïhp©TšÏår88ü­.¥‚T’ˆ‘…a8¾ºÜ*—ËæÀX€˜À½}"§qký®)c,®Ñu]ø¾Ÿ( ‹ËF]¨ëFÿÓfÒ—ô@´u¯û²0êú¿K÷îOvôJ™Ëš`qiÕ¨\¨ =°G̉m™HÄIýv_ýDúûžÍB½z¬ÄÓ ÿÁ)Xümœ&Úú´‚»ç_Ö€©,pq”ì©G½ê Ŧ!ÐÖFÛ¨-›ñÉ$ÏÍeq­`Á͸ ñűÐWÙ–ó¶ê=øaè)¤R©¤î³." Nò!}g*$ðƒñØ) € .hïÛí6ƒòù<2Ù4m eˆbòJ;&‡5›éà ÉLL{fìZ­¶Öï÷7šÍæþÞÞ.Ò®…«WP.ÏC Ii r ° ÀQ4@ÅÉ[¨×ëÛ”¶Æz¯×{I£]ÒK%.¿ÏQo'#ûÓDÂ¥ÙXß> ¬IÏyåÉge)óžpó÷®Ê:°¾°s]8ʦdœåŸÞ¯¨Ò©÷IEND®B`‚cacti-release-1.2.19/images/server_chart_curve.png000066400000000000000000000013061413633772300221640ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<XIDAT8Ëcøÿÿ?%L˜”û=ýnEØ×KóŸtw9²äûˆ¨. ~ð><ò2Çá6 ôè‹öÆö÷þ:öÜã‰}ô 8üÉ?èŸú|ˆñ# VÂ4 äȵ†GÌ:õ~4>ØöÕαý‹ƒó¿ÏÎn60…ŸÝ<•>zx|çðÍ{òƒŒ‹ÿWro•.{Ø•ž°þ×W#‹ïßÌ,§"Ûd\ÿ ×¼ñþ_˦û¿mÚîÿ´ë¸ÿn€Qñ¡ÿ0…¯µ,ÿ=4tý‰¬Y!ÿÁ •¢{¿Õ‹ïÍÿndªúÍØìÿ²èŽéŠ€ ø-&µô§¤Ìo[¿]ß¹LâMzÈ,t‡`â½¢Iwë`þÔÒ=ð][ï܃Â}ÿ« ôÿò þûÃ'ÔÆñ …!üÁ¦ð™Ãüc »Žú?U~! Èßûÿ?#«ÿ&¶;(!p§Ük‘Ãtï%6g<—Xu[l7è·¸ô¸úy»ÿÿd` ùÍÀ"Sà5ÓÒËc¦å YæÜf[¬uk¶Ïe¾é§Æñ y k¥àèåîü?GTæٱÃhšc§ÑG‡.ÃE=†<0q‡~ûIúï1Ònööÿ–%:’¥Ú3ÍKué·e:èþ¶¨×æ°hÒ¹gÖ¢=Õ€¬mÿ24ý 3ÔÝÔ,]485 kxÈ ©:ÙFùêRQ:¦Åモ@ô aE¸.*D.branchesR1bE#‹085ADD~1.88モ@bE#‹*E.0.8.8P1bE-images:モ@bE-*¨.imagest2C“@ RELOAD~1.GIFXモ@|Aò*Ù.reload_icon_small.gifXYܘ PàOÐ ê:i¢Ø+00/D:\J1)E•vdata6ï¾=@¯|)E•v*%dataR1NEòbde´òäIDATxœ¥’Kk“Q†Ÿ¯¸P)^ÒhI\$ŠÔ ET¼€‚Etå¦.êÖ? B‘F‹ˆàJp­¸÷]µ…¤ŒF­RŒ1UHĦ)Éw™s¦‹bI"B†sÎÀyæ‹“ÉdØŠ lé7°íïÇØØ˜c:§ˆP­Vi4Ôj5’É$ÅbÑé ‚€D"€ªnÄ;wUezzº¿`f¡]™Q0¬ZŒ«GÏóú|ßGU91üUírØó€ü½Xµˆm+Ö*7Ò‚ëºÿœŠÖº²?Ëß&_Zã°³?ÀóÐÙàÑÙ¿ÀÅ*œo´Ãéï‚'x¿Ò!$‡z—”jEøf·´òèÌE¥1¿k îÚsXûú¢ECeÕA¸kž²ƒm‡ÐÈLÌßÃù¼Áv¨‹}+,ø&%QT´¬"çÏ–e±Q*8õZjux¯AÉ<ƒUÔaw×c_az¹·µŸº÷&Ŭ=Û'’Yf)ì(ŽY‡çðu*~ «]‡– b%>¶aÈ…ŽÖè¸TîsÀº B)ïÕ÷h¨ù‰ýá«Ð–z!ˆÊz=ãã´ò…ã¡èøÂv­[&FFFÏç±‘Ž£ÁGÛIê°8ý&l®ÕaytÏgEÇþ<ÐÝÝ}fnn®£¿¿2“|‰æ¶8¾¿Eêõ;Hƒk˜úgÛde뮃dÙyöÓïß¹+Àj@~…ùtŸÄ6dUkq2‹5ýpãBµÜzè€ítSÄ®ŽÊ?Vnw<ú<ÿ·ëüS¶‡¦„…’åIEND®B`‚cacti-release-1.2.19/images/server_graph_template.png000066400000000000000000000014671413633772300226630ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÉIDAT8Ë¥kL’aÇ_ÅLÚÌt3§–Šó‚ ÊÅ ˜×9Is–…iÓЉ¨3—·å̉XŠ–y)ÅVFæ(Ë•–ff—™¦5]}ék«kyÉ”yO¯4ÖÚÚüð{Îvžóÿ=gÈv0!Ó!ŸKÝ– ¦zZÄkŸ»gy¹”–Þ„ƒ. N~ÂÉü· | Ø (+¦Qeˆ»¬"nöVó'¿óŽêpf–SŽÍáèqp¼ÿ”½?É!°ÕÒkÑ‘µè¸†±ñØj<7Ò4¸ÊMò^IL^Y<Ä_O¾ŠJþ°J'Áû d¿{Å|SÞéÝ“­YãtX¾ÄªA›ÃkÕŽT­¬Wk£ejÌ,`–N€ið+…ƒÍ3´–a¯b´Ï§D¥÷/U)4ÌPßuVÜÍÉ·%ãF~¯›RëºOudL³Kˆ¶ÛgÏöd«G…ªŸùw"t¹ duÓˆZ m\C Z6 èg_Cl°wÄ6v;Õ#ièD€‚µ5(f{B-ÈQ0Öj‡ÒAÐE^‡'QKòÑm Š_XíàµígÓÚÅÊ((êecy=,LØ çŽÃƒÙ6(ëçAB‹‹aÑÓmØ,>ó´ˆMª±q1 {Ãaðc'<üpÍì›m…Ö—eÐó® ÄJ.„6ì4ÐꬌÃAEÏá¦39ÖŽ“1;ñ•á+cÅÐ8ZGD ‚ôitMÔÁ©Û‘à[ƒl´ÂgÀ) te—S¯‡—Óðú-ãFÜŸiåûfè™n‚[S2\Rò )ˆ”‰@ªF¾¸W"ôß‚‚`Šx ±?ןÏIÀ+1ENÂ’ÚܱøgìÀ%,So$ÝËÏ*ësv!æ? æU<ñœÇ@ â @À&¹€ŒC•ÚAVOAÔƒku ®Ö&¸R›À8Ca¼”®Ñ‹&@Dw*p QÞüÂ÷¡õÅYœBBŽä–PZpŠ¥`…ÖÞ*²y¶ ŠsŽ,.Ì£olÑ å·°N±jQ?þLs¢°å0ÍÈ÷&*3&jFŽïEè› 딩ùqŒ ¢c ‹kKTaÙ¬òa²Þ‘Œœ¯Šõ!±B~N19Ç8|0I–#/û(£Ó|œøÊjHÍ–ÎQQ|€Ÿ¿ÓÏ‘–5:jH !ÉxuÉF†§ú£"öT{Ú[>¯?$7ÐÞ=^ZÝoÄbÄ“n¢V+äŸf‰x1Æ¿P²ç +‰·‘Ý~çd[dŪ¿/­6™zä&7òýOìBëIEND®B`‚cacti-release-1.2.19/images/shadow.gif000066400000000000000000000001321413633772300175330ustar00rootroot00000000000000GIF89a¢ÿÿÿêêêàààòòò¢¢¢³³³ÊÊÊ!ù,HºÜT0ÊYŒ½8Á»ÿB Žd hª®à¾p,Ïp;cacti-release-1.2.19/images/shadow_gray.gif000066400000000000000000000001321413633772300205550ustar00rootroot00000000000000GIF89a¢ïïïÞÞÞÕÕÕÄÄÄäää°°°¢¢¢!ù,hºÜV0ÊY†½8Á»ÿB Ždhª®à¾p,Ïp;cacti-release-1.2.19/images/site.png000066400000000000000000000010541413633772300172350ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<¾IDAT8Ë“MKQ†ßÇ¢L¢¤°t¡µZ¹ˆ lÓºU¸ ú- Z´í¸j$‚mÚ´)!Jh1•Ù‡:ãýhî¥!éÀáîÜóœ÷œ¹œsôãÏÑ(ï´¯¢O;ÙÜ츯JËòù<§”‚‚Ö*\×ud³Yøý~„B!Äãq¥•£ý¦5 ƒAÿ‹8‹É5“ÉØØ¢š°‹B³3j1(g–"`y†À0ŒîÓ4e•ðX¹ã ¡þ¹Ò°¬JXS±ª3Æ‘˜#¨×ë½ÂÆ_ºüÎáÞ ÄGqðòÁkõÏ¥F›³à–‚ùFoú.‹“z^|ñÏ΀\rÊ5äÁ _µúeH¥RPUŠ¢È5‘H b¼ãq¼h´o¢•4­:ÈWne5MÓ‡‰Dd, åZ®ÖŽ–×m€íìÖ ¨r>âôᬔ–‡E’ð–Š©bÿj_ĤK‡±Ù6€š4L“ßé|¿V‘¹9s28Ž6$}†VwáíãE\8?%l·=zìÙ“Ãò*( ¸—òJÅ’­_¯2Š×§2&Ì€ÛmzâÓìJð9î4IEND®B`‚cacti-release-1.2.19/images/spikekill.gif000066400000000000000000000016211413633772300202410ustar00rootroot00000000000000GIF89a÷  & , 7 W 9 /+%#-5.Su5kž:z¶>ƒÄ@‰ÌBŒÑDÔF‘ÖH’×J”ØL•ÙM–ÙN—ÙO—ÙP˜ÚQ˜ÚQ™ÚQ™ÚQ™ÚQ˜ÚP˜ÚN–ÙK•ÙF’ØC×@Ž×:‹Ö7ˆÕ4‡Ô2…Ô1„Ô0„Ó/ƒÓ/ƒÓ.ƒÓ.ƒÓ.‚Ó.‚Ó-‚Ó-‚Ò-Ò-Ñ-Ñ-Ñ-Ð-€Ï.€Î0€Ì2€Ê5€Ç7~Â9|»;y´>v«ArŸFl‘Eh‹Cg‰Be‡@c…>a‚=_;\|*VQƒP‡ LˆI‡G…FƒDEƒF„G†GˆI‹KL‘M“M”N”O“ Q’WŽ7a‰Pk…csƒv{€€€€€€ƒxx†rr‰llŒggŽcc``^^‘]]‘\\__Žbbffˆnn„vv||€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚„„„†††‰‰‰“““ššš¡¡¡©©©²²²···¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù £,nG H° Áƒ6%cÔ„ y1bE…/.âðâ(Ž6Y°!Ã!28Â!håÇ!0e¬˜Rà)á3dæÇ yö„C4È‘;ƒê„Ó†)œ3(wÎ<Í™«h¬‚æ©G‚;cacti-release-1.2.19/images/stop.png000066400000000000000000000012741413633772300172620ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<NIDAT8Ë¥’=OTA†ŸÝ»€  ò¹zAPITÐÂJ :cé?°5FƒšHŠ@Œ¿ÀJ~VaÈ¢|¹ DäCvï½3sgÆb—åC-Œ'99'“9ÏûÎäD¬µüOĬ¾º).z‰F]«µÀ¬Ñ%VÈÉ<²Z×?x(ÿX|Ùy¨®jðHS]Üq,¨ŒkÐÒ´¦“©·ÙùÔ= wg&²ó„•W/:Šk*û¶¸ÎÆ<¬‡Ð@¨@H8ZIXÕÌÏñ©o.u§¡·o¤XxÞYRU9T~æDÜÙ˜‡ÕeÐyJåjàCE5a] ë‰ä’?÷õvcÿë‘(@ÔqzÊOÕÄÓ°œ‚@ïçÒ Àós.槉}þHeS<q¢=…?°F»!,¥rÊaRåÕȼ)`6I¬¦Œq #D€/Ê (}`Pæ{•ë…?À~°ë@H‹”õóê{ °| Rb„°»”¢lme‒ày`4VÊR€(€Édµ±㰵 Ùlî¢çA6_}¶ÒP{%5z{{±PëëÝ«cÉåнµ°™ÎA²ùAÏǤӘzÿâU¾Ž/‡kkÝûiúÖÍe n_õ¥sEcïaf ¬ÁÊP¬ÛŒº|•£³™É‰»m‰/ÃûSí]å§›ªÏŸ…V cLn§ ¬~š “HÜo›œ}öÛ*ïD²ýJ—SvøI$æ¸6 …Ñšˆ5%Ú÷ôææc´y×:1#ÿ ø×øtõgàùâIEND®B`‚cacti-release-1.2.19/images/tab_cacti.gif000066400000000000000000000042211413633772300201620ustar00rootroot00000000000000GIF89aX%÷×  !!!"""###$$$***000CCCRRR]]]kkksssxxx{{{}}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€|}ov…bm‰TeH^===<<<<<<<<<<<<<<<<<==>‘>‘@“A” C• D–!E—"F˜$G™%I›'K(Lž)Mž)Mž)Mž*NŸ,P¡/R£0S¤1T¥1T¥1T¥2U¥2U¦3V¦4V§4W§5X¨7Y¨7Y©8Z©9[ª:\«;]ª;]«<^¬<^¬=_¬>`­>`¯?b°@c²Ad³Ad³Ad³Be´Cf´DgµEgµFhµGhµHi´Jj³Kk´Kk´KlµLl·LmºKm»Km»Ln¼Mo½Np½Pr¿StÁTuÃUwÄVxÅVxÆWyÆXzÇXzÇY{Æ[{Ã^}ÄcÀhƒÀk…ÁoˆÁs‹ÃuŽÆz’É~•ʃ™Ì…šÉˆ›Åœ¾” º—¢¼˜¥Ã—©Ðœ­Ó¡±Õ¦µÖ¬¹Ø´ÀÛ¹ÄÞÂÌãÌÕèÙßííðö÷øûûûýúûü!ù G,X%þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠéÞ»wîÜ¡CW®¥KpßbvûF®¦ÍsçRž„GÒáIwçÈJthL™Ý’vÓ¶T›Ó§Ú®9µ¦j8séܽë)Ð$˘à’=úMiR¦P¡RµÆV›4ko¥Å• ÷ª;žM¦+W´ï̲Ji–C—®pºuˆå)VŒ¸âuéX–#÷­ª\hÒ’AK–,›¹»ßë ó¨Rpå·[¬xžëy¬å¹¦G›¶½Û¸ëÕ£rÐo›‹ /†ŒèˆðÔ‘ëfÔ´ØÔëäE\X29q1ÃE½&õÚ·p4Éþµ,œx={øÒߦ'=è5d»â33‡—! qä–MIµ–5×°—\&˜™4ÅpÆ4ׄCÎ9éȆ^>ùàcÏ<íœ34»Ø² 9ðÔw;HµTjÿQön±…à "¸4 —ÌpÄíÌÈ !Vò\˜!{ç„SŒˆôôÎrK5Å”K.vW Œqa©`2™íÈã—Åìf|Àü²Ë/"Šèc1Ø”³N=ùè£>õ¬3»0câ–TäŒÓvWÂeh:˜cŽ^÷£ñAz¦.¶Tj©-²Ì²‹/ϘÓÎ=rêS:á ãËV]ù9U3m'£–þˆr¹(˜Âýhë™fŸ™—Z ‹-¯¼ÂŠ,²°2¬-Èd£Ž=úì“<áøâ ^éTÅw®¾k—6Ê£­¿”iæ/fRÚk¥¯ÀK°Âkì)¬œ"ï)²ì’M;ùì£O;ÏœBŽ@(M˜IS°\\*J«£’{æÃæöúkºì¶ë.¼¢Ì«±¼ªøbÎ=ûÔóŒ'k|¨—9¸£·ßóã¸ä:L)¥¿ú Ë<üœ,+òøƒÏ»ñn<¯(D“A2Ñ»„“Ï<Ëxâ‰@±*ʲ£.ë*„(ñ¯ê² >þÈó.6øÈ³qÆDMÆÚl;M²-ò´£Š't@­²p+i«þÕþrÍ>þŽO¥üîÏ>ÐÈ¢nÏóƒÍ9†óc¶9ý˜}JÚ¢‘9Ûœ»M·'`¨“¤ 4ë·{û¨ë®¶˜[xÙúðc ,üØ#O>þèS,ã²…ýLás¶sJ;>«Í9r¬-‡tðAúó¤›c|bºÞVóÍë.WŽ?ü«x±<Ïv?ðêöÆ` ÊÄãã´òdб<éÎS¯?õ–T/}#ý3Ý£t•«ií\²Ö+z†b½‹†ë‡?Ðw ž D[ÃÚG2øùÌiöcþš·?þYâ„ý3G8шFäaåêÞ¥^¡À«gúؘ=r'¯ M‚þ¾ÅÑ6èv¸-~Ð#áþPÈD¶ð-|áÌzEÊY hñ 2N‘yœ¢}Û 'DQzBÌðIG¼{(±MŒ£%ZHGÒQ 6ëš/´¡‚qä‡'ža¸ÀõÃi¾(dé@<Á1Ò÷àC%G:Z²æ  ]xuéцñê£Ð.G4fàãòðÅMyO™zò¸G+ù€ FÊr…»P2Aˆ&^ò——Ìä@>>ŽrhEËœ2=ÇÌ$6t DõªÇKB`¢š¼¤ãÉÍ'®0ŠG¥Æ2FÊÍ/yÌóèFB%NSš¼äC#°™ÍnÚó—™sܤ@„†¹ã!Oyè¼_©OyÒQž,Üä=jO;‚S^Éô'òº<>OýkÄ4[hP†z”¡ù§DéWÑ’Þ£”ôåGWºRfS Ç£›IŠÒI2‘¥8õhH9I:æQ¯yî”dJå¸Íœ¤+dá;cacti-release-1.2.19/images/tab_clog.png000066400000000000000000000024601413633772300200450ustar00rootroot00000000000000‰PNG  IHDRX%ñ÷ÞMPLTE€€€‚—Éæêôfº€–ÈÌÔ诽ÛÊÓç`{¸åéó{‘Ääèó¯¼ÛyÃÈÑæ­ºÙ\v´wÀZu²”Åtоäéó¬ºØvŒ¿ÇÐåÅÎão…¹”¦Ï’¤Íãçò¬¹ØŒžÇ¨¶Õâæñ¨µÕ‹Çn…¹ãèòÞäðÓÚëÍÕéÉÒçÄÎå¾ÉâºÆâ·Ä⭼౾ܩ¹Ý£´Ü¡±×™­ÚŸ¯Ó’¨Ø–¨Ñ£Ð™ªÏ¢ÑˆžÒƒœÔ‹žÉ‚˜É•Â’¸<}—Òv’Ðx“ÏrŽÎuÅjˆÌoŠÆdƒÈ|»u‹½p†ºp…·n†½i€¶bÄ\}ÈXyÆRtÁ`}¾h|ª]y¹^y·\w·PpºUq°Np¾Km¼Eh¶Ad³Nj¨IfªFc©C`¤=`¯8Zª:Z¤4W¨3U£,P¡2SŸ*NŸ&I›$G™"E—ÿÿÿ=zí¸tRNS@æØf‘IDATxœíÓÙwÒPpWªU[«µZ·.ŠJ T,Ú¤P j°¡b•$“’˜eøÿ¹Y¸‰à±ÇüR=¾øó›¹ã©Sÿó?ÿPÚí=™>…Efi·ÿÜSöƒ(Qºôñ9xw"r; •$›Õ®Š?ý¾Š_ÿóŸ¡1‰­fcgG’¤­jµZÁ_Õ­­-©Þh¶èS1𦩇~;}+éS”ý掄T¥Rª”J–R©X*‹‚ <üC¹R«ï¶z]åÓ¶5î¹ß”$êV•¤F³IåØ*pÇŠò±%7õÚëJ¹( AØ|Ykt5Ã0Ž&”%2P› ÁpTJŸB ¢©ª®ÑÏ—^k¯^- …|¾ ”k»ªiš)70±î3 û!¨±‰ûÔô8†1ÐÔž\!66ž /w{ó;¿„°šNÝï&I}º¦ó¦n˜†©›”úE®mæs¹ü曃£ñB¢Kj±¦c³?.™ì‰M bãXLj˵ç¹Ç9áíá`¸=¶Gz–_‹ji•‘|†¦5´,˶¬ãÁá[áñ£PFŽ6Ú÷Ô¢eªãáÃ’F‚d±Ã8¶58|“Ï>©¹äÆ Úg7SM‡VEã:?òóG›_]’£CÒxTãLÓ4Ì_{r&vu—â¹Îq'_þæúÇEÕ‰¢pÚbh%À@d*Æ÷ÝãWµ>ƒéÒçÞQ€ë›˜œ%6I¥8Ûmß!Ì'{#þ‰N?8sÖBضggff©çK»¬däûïäшÁ)r¼ÐáðÀùÌÌ`ÖžÈd\û.Àåy 8IŽ‚¼ïİ¡§H+x!û"dØà;7 ã9óuÝ,̻ޚ!;⃰H0ãøšÜ£SSz"€+•uónúÞM€°'²¡,²Èü a3Õ“õKp™ž‡¡YXò°gÖóîÁ}ß¿p\RŒPJGpxœ6÷¿ˆ=ù€¹ù¹«Øx*.áü‹¾¿°ºŠ;æ\‘Ëû°q8{âÜé>:ú…9€ì5„=ñÀòm‚VÖ`y%‚Åt¢Uð÷æøŽâWŸ=šÖ& ü*&Ü{ú擯>—׬<œÈŠâ‡°1©8<‡z®RT£ño­¯áR¦¹ñ*œ)£ói“Ö9eÌOîÅ=}®¦(þ!™Ü1ÿ>ÉYÏ“˜,ÑŽ95•“|㟤Z5šÌ¾&IEND®B`‚cacti-release-1.2.19/images/tab_clog_down.png000066400000000000000000000022241413633772300210720ustar00rootroot00000000000000‰PNG  IHDRX%ñ÷ÞPLTE€€€Õ——îÓÓöééÌ{{Ô‘‘彽ьŒõèè͇᷷‡ëÏÏÃooôççÁoo×––ˇ‡ìÑÑà··êÏÏÇ}}ןŸÖŸŸÝ±±óååèËËÒ——õççñÜÜíÐÐëÉÉèÇÇçÆÆèººè°°ã¸¸çµµåªªä¦¦âܪªÙ¤¤ÝœœÞ‘‘Ô˜˜Ó‘‘؈ˆÜ‚‚ÖÖ€€É’’×—ψˆÊ„„ĉ‰¹½‘‘¼††±……ÚÖxxÐooÈÈuuÄvvÎnnÈccÁhhÀffÃ\\ÀWW¶zz¸ee­vv¼YY»PPµYY¶QQºNN¶HH°@@°??­??ÿÿÿ¨22¦//÷hjtRNS@æØf@IDATxœíÓí_ÒPp³Ò,³ yr ŽÉÜ”²6ÌêÎÚvÏøÿÿ•ιwO ÌôU/ü ýìÕ—ß¹÷°¶ö”§ü7¹ºº¸ì]ăÁàòòêêÑäE_3¤>"£ÑP<"Ÿ>yy™çú9e˜$EÆ£ÑÛú'=1e†¨êº¦u)''Î Eíö4ÝÐÍÑÈžˆ8ëëýêy]VçÓ9>nµÛŠÒjµ-|kwÔžf˜ÖÄ¡Lï²SsHæI—ºu»š¦‰sNÀ4MAëáW*J£ÑP”¶Ú3L{:sÝé·ås•,¤.G.¹)”Û•3ÇB¯¬Ç\ sûSï´^«5Ô3kÆ~$®ïgf Rf¥™¢Ìe"s§ÖY³vT;íÛ3»K§g(²Îê:1—#{2ŒÙ}å¨ZW-v+àüÆ–Í“nl ö†‰Çc1éù^¾ï³i¿Q­Í‚Ÿ‰;ÁÏ8=Í“ÀÌd(²Ìô=äü ?³”êé”s‚iò×^<3M[J2¯†Çÿ¿¬æé­€ïX$7ϼÅÓü}“ þ"bxÈe|õÌÏà7¥É=€—…ž …‰h¢Rƒ(Š^MÊ[¶ðü…„7ñý݉{U(ï„RÍgÎçÑgK«M,Š“¿XßX'xÓß(•¶Ð•o€f¸ˆ’Yö|>ðòèt˜´žÏaCLpP…R– †ø†»yÑ$Öµ„³šÂLw“ΓšÒYbÑþÂ-âv8ß‘ð<§ò"¼b“¼@\Ï+lIWD(öä¼ÛœoÃ.çØXξ;†jÆ·ž¬,—ʯEG¬¸»+ÊîTð –Í…ÆKïgËn•¶ßÄÿxÿß?€ÃwÂ×1œÕ¤'¿ñK›”Ÿ»÷4ö/!ã}/.g²IéýV>V>ÜÓ8ù¡§æònS98¼ËM'ÇYìqÙpŽÿ=icN? °0y„σÉÅÆ…ÃŒŒ„ûØ\ày<úãÅ…Æ s¸¡›bIEND®B`‚cacti-release-1.2.19/images/tab_console.gif000066400000000000000000000043041413633772300205430ustar00rootroot00000000000000GIF89aX%÷ó|~‚qyŠiu\o™Pi¡If¨Cc¬Ab­@a®?a®>`®>`®>`®>`­>_­=_­=_­=_­<^­;^­:]­:]­:\¬9\¬9\¬9\¬9\¬9\¬9[¬8Z«8Z«6Y©5W¨3U¦1T¥/R¤.Q¢-P¢-P¡,O¡,O +N +NŸ*Mž(K'Jœ%Hš$Hš$G™#G™#G™#G™#G™#F˜"F˜"F˜"F˜"F˜!E—!E—!E—!E—!E— D– D– D– D–C•C•B”B”A”A“A“A“A“@’?‘>‘==<<<<<<<<<<<<<<<<===>‘@“ C•"E—$Gš(K*Mž+NŸ+N -P¢0S¤1T¥2U¦2U¦2U¦3V§4W§6Y©:\¬>`¯Ac±Df³Eg´Eg´Eg´EgµFhµGh¶Gh¶Gh¶Gi·Ik¸LmºLnºMnºMoºNo»Np»Pq¼SuÁUvÃUwÃUwÄVwÄVwÄWxÄXyÃZyÁ\z¿^{½`}¾b~¿f¿iƒÀl†ÁnˆÁrŠÃtŒÃwŽÄyÅ{‘Å|“Æ~•Ç–Ç„™Ç‹Ç¢Ë”¦Î–¨Ñš«Ó®Õ ±Ö¡²×£´Ø¨¸Ú¯½Ý¸ÄàÁËäÇÐæÏ×êÙßíàåðæêóìïõñóøùúûýýýýýýýýýýýý!ù ,X%þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ9¸nÝ´¥ìV­Ú4—Ó´Éœi’¤EpÚ\ê|ùZ5hÓ€…F´¨QhÌBKÆ [7q6 ŠcùsšÕ«X±=z4ÙR¦É’- K¶,6p"§…y•íK•àÄÉWî\º»xÏÕÝ[œ7mت1KV¬p1a¾3C«ÜVŸ<«Â|Z¯ºËì2³SgY3»vìà‰ý®t;Ðéʉù4qâ+¾°U,‡¨U·VÁÕÅ›N¯ê“)sþ„¶Œ™qŸÕœ®T]9]æxòäÅ‹W:5NfH®8¹RÌDp’yþZ…F™98l9m/#ÎllÙ°ËÜ +–,1b_÷‹ïæMœówòÌ3uì”ã 6Ål†l ¹õØSr¥ÔRQIÅ'Ö…ï%3Ÿ0vhŸk¯sÛù‚D1èU=ôH‡Ž7̈ˆ„wuóXQÓ $aPËLS–{ S_~Þ÷š/°içÄvÙ]ᤓ`Œˆ3Ú”óÎ<ôÔ3Ï;´‰XÌAÃØpñYdYB©&ˆ‰9ä’Ú=ùd”rÖâd-µ ‘gwçÄS=ô´CHT[…í gÜ™ï¥)$~E²é‹›KnWévrÞy…›âéé§xNi¥=÷Г6„„”q¬NSæ™þŽª‰˜‘mNziœ™æZ'¨µ”Q˵ÀG°½ŠJO©ç“Ç@ð½ZfaãË‘ºæ„0—VŠ«®`Ø *°gôV̯e +,g´G+uÀQHhÏ=ï0“ǽ·L´†&©µ¶f«ëÝnÚé·¿&üÏ?Ø{Æè¦ËîÄuÔ‘G+ñÎÃàKYóõ+k­ÙbŠi¦`tÛ-¯ž¶’°¹Á±pÃÁžQñÍ8[|ïW°sNˆxÌá´zX«0òèó>ê,¹Ì< ã“NÊ`°c*<ÿèSÎÊéà³°=ÚÔÒ 6ö,|OÃéÎ,l1ñ| ÎÍÇ7]ˆ "‰@øHiþÀN$S¶=V׆0^Ï“ŽÒéàYÏÂõxý0µ ³4:ìàƒÌ,ÌN: cñÂÌÔ„>ú°óÎÂ`wݦ˜òÇyußM@›%/ †`ˆ“µˆWˆSË9K <>ÀÒó:g81s+ÆÛãM1·‚õ;päq:<Ÿÿà XÇcÜ=ÿœS·ÝvKò‡$’ $É&²×%î·sNÏÊxr^°Ý,\üñi3\Gþ ûÇ= µsT¬ÿ Gþº:/€ +‡)È' S }ÝÀÆúd·­9Q-e’»‡§„QÉÙãaùÓ»wv-Otçx‡Òà‘yüƒAcÇ?âñD€þm{‡$Ê×: ^}›Ø`Ö· ÐéNTÃÓÀp†b(íÚH=Ê ¥•CecG+Î` ÞpÜ?à¡®n(mañ°Y ø‡:4ðt¤z¼JpŽÚC8™5$ôñ”JÔ`’0O+acŒEÔÕ$´â–íÂ6œ€³< bgA«Ã/1‡!±ăˆÄMÇ”¨<åWIW èjEÀ`ˆ[Þòby§6Ø1aÖÁ;ëØøêæK»µ®‚ð<"û¢IÏh.‘š¦‹˜ÄòP‹n‚S›â çÒ)·_®sˆxgzÁz:ô¡Ól"Ì•®‚3œy0DÅ*·Õo‚ILh—ɾ=>ô¤öT¥DÝe³‹b£ç̨/ïµÎ!¢›hNMÑÇ ¢ô§¨@zùR‹¡ó¨íLhùlŠ>’š¨P…¨J‡ ·Ž…s†0ë&hÁ¥23ª`ªP ÐÑ*U¤9m]NÃÊÖ¶Þ³‰;cacti-release-1.2.19/images/tab_console_down.gif000066400000000000000000000040101413633772300215640ustar00rootroot00000000000000GIF89aX%÷ðÇffÇffÇffÇggÈggÈggÊiiÊkkËkkËllÌmmÌnnÌooÊooÉppÉqqÉssÊttÍvvÐwwÐwwÏxxÍyyÔzzÕ{{Ö||×}}Ù€€ÙÙÙ‚‚Ù‚‚؃ƒ×„„Õ……Ô……Ó††ÓˆˆÒ‰‰ÒŒŒÒŽŽÒÑÑ’’Д”Ж–ј˜ÓššÕœœ×ŸŸÛ££Þ¥¥ß¦¦ß§§à¨¨àªªá¬¬â®®â±±ãµµä¹¹æ½½çÂÂèÆÆêÉÉìÐÐîÖÖïÙÙðÜÜñÞÞóââõçç÷îîúóóû÷÷ýûûýýýýýýýýýýýýýýýýüüüùùúööõïïæÞÞ×ÏÏž¾«§§‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚zz„vv‰ii“SS›AA 55¢//£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--£--¤--¤..¥//¦00¦22§33§33§33§33§33§33§33§33§33§33§33§33§33§33¨44¨44¨44¨44¨55©55©66ª77ª88ª88ª88«88«99«99«99«99«99«99¬::¬::¬::¬::¬::¬::¬::¬::­;;­;;­<<®<<®==¯??°@@²CC³DD³EE´FF´FF´FFµGGµGGµGGµGGµGGµHH¶II·JJ¸LL¹MM¹NNºOOºOOºOOºOOºPP»PP»PP»QQ»QQ¼SS¼TT¼TT¼TT¼TT¼TT¼TT½UU½UU½UU½VV½XX½YY½YY½YY½YY¾YY¾YY¾ZZ¾ZZ¿[[À[[À\\Á]]Â]]Â^^Â^^!ù g,X%þÏH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç Cб…É(RªÁ²% $b¢@I’¢É(ZêÔ¹aŸ=1Ý€¡¨Ñ¢’¾¬iÐdÎP[öœJ”èÑ«I³fM@!W "FëŠ/^ M[£­[·+Ú®ÀCWx»& àÇc¡¢xñ¶†Ç¿ÕÁ81Çuð0ì6%ˆ h& €…Š(³\û–pZœsAqµ( 0cÎ{ãF <~øÀÍã0Ýð ÷ pÔžgk¤Uk«Ö¤vñJ÷:8ðx%¼\a;7?&þ×@_»vŸ¶àIõìi–V‘>OÊÕ+uéÕpÞ¯¹spÿ\‘Wnàù C (w^z‘0T{–±fÔ|ôé…W}zy¥ß~øÐá çaˆçá$„Bü C  ×`UG±ôš|ÏÕw_}xñµÙ}¨Y‡øüãáˆæ§ä’ø<"B!D +0`^A7ß|:^ØÕ]>n¦> ˜h&gEùO‘í$¹ä›á„“ÍyÓ´)A\FÄ 7Ð 8R0a…;Þ•Ù^@zXfD)\;ÿ@ú¦’á´SiœqN#ç4ÓdÓéœwq„/PÌ@Ò·#~aþ¨h‡þGŽøÏ¬‘ºé&¥–ÆI%šrêë¯Ól6øÀƒ7 hÕ­N ݦH0º²yŠéY{²‘®õÙOm7ˆÒ• D¯¼ÄÙ¬Äá%¡3,  ñvo«WæBXûR9…M#„øP×ÏÀb°B^i+X4e¼0Ìâê:=ðü"°ö+a)ÌaÓÈÅ—´ÓÍuô£$%i@Þð žä¹r¬†urt£#ïf½IšÒ”¼¤&ƒ•Èb(Ò•‹t£(G ÉRžò–¨´$Y¹,Eâñ•‹¥é"‰ËbÞ²’ŒåÏð(LêÙҘмeê’ÌY^B€ŽŒ¦6£™J.Æ­™|æ$ŹÍh†p{;cacti-release-1.2.19/images/tab_graphs.gif000066400000000000000000000041461413633772300203710ustar00rootroot00000000000000GIF89aX%÷?&Z3y8‡;Œ;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž;Ž<<<<<<<<<<<<<<<<<<==========>‘>‘?‘?’?’?’@’@’@’A“A“B”C•!E–#G˜#G˜#G˜#G˜#G˜#G˜#G˜$H™$H™$H™$H™$H™%Iš%Iš&J›&J›'Kœ(K(L)Lž*MŸ*MŸ*MŸ+NŸ+N +N +N +N ,O ,O ,O ,O¡.Q¢/R£1T¤2U¦3V¦3V¦4V¦4W§4W§4W§5X§6Y¨8Zª:\¬;^®;^®;^®;^®<_®<_¯<_¯<_¯>a°@c±Ad²Be²Be³Be³Be´Be´Be´Cf´CfµCfµCfµDfµEgµFh¶Gi·Jk¸Lm¹MnºNo»No»No»Np»Np»Np»Np»Oq¼Pr½Rs¿TuÂTvÄUwÄUwÄUwÄVxÄWyÄWyÄWyÄXyÄYzÄZ{Ã\|Ã^}ÂbÂd€ÂeÂg‚ÂhƒÂi„Âj…Âk†Âm†Án‡Àp‡¾p†¹s…±u…¨zƒ–~‡€€€€€€€€€€€€€€€€€€€€€€€€€€ƒ~…“}ˆ¡}‹­|Ž·|¼}’Á}’Ã~”ƕȀ–ɗʃ˜Ê„šË†›Ë‰ËŠÌ‹žÌŒŸÍŒ ÍŽ¡Î¢Ï“¥Ñ˜ªÓ›­Õž¯Õ °Ö¢³×§¶Ù­»Û±¿Ü¶ÂÞ¹Äß»Æà½Çá¾ÉáÀÊâÁËãÃÍãÅÏäÈÑæÊÒæÌÔçÍÕèÎÖéÐ×éÑØêÓÚëÖÜìÚßíàäïåèðêìóíïôðñöóôøõöù÷øúùúûûûüýýýýýýýýýýýýýýýýýý!ù ·,X%þo H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ‘1aÂR©\y©¥ËR0K¥*ÅJ˜I’‰±Juɓϟž\ õÙS¨ÑI—%½$ª•0œ‰¥ JèPªF³*}ĵ«×¯@¹)µ'Ъ-­Êd…¬mÛeФQ£&M\hÈ–µ]YêÒ$®28P¤±Yý4k”jª¼Ó¦Í¥v­òµÉ“+cÃvó¶ÏŸ5WžÖvç¥H…Ñ¡#ª"1Q‹±þ|¼l´iËrëE¦²TP¡H‘^ui¦JbmçvÞæ­yhjÈvF2´šN Ä…5.Zü­^V0…þrõÛ©¡I†¥O¯þ‘`C…RJ%2hט‹çmÛ5h¬€Bt¼Â1f-ÖÒc{õ%^R`y5Ø„¦f¡uv¨F‡tœ— 1ÔèÇß6ÒHl`gP_¿ Õ›ƒ-!!W…æ…7Êg¡†Õõèãj‘¤² 6⨣Ž8Ø$# u”UK¢Àè×"3v5Ÿ…ñMX˜u<þXhÐhŒ9&‘ Ò 7ê´£Î5Æ€b‰âRpHý¶•^]éÞ#VãŽÕÙa¨—_žX¦˜e6Zæh„Q¦‘³M;ïˆC *xÐ9_2"Êžþ9Ÿ{‚íh!‡®Æ¡—þ`’éè¬hdñÅ­_d¡«¤lD’Œ8ñ¨ÓŒI T%Wé ¦^²…¡za—ˆÆÚ¨(Ò$óh£ºæjkµêêmÜÚ 7ñ` ÅÞÖ•Zj©ªuð"Ú£™´–)Í?ê ©·Ûò î¿IœEŠÞ\C¬ YùÞ{„é¸%´ò’I¤õ6 )4ÿˆÓ/¿ºþ›EÀ 'ÁƒÈ³M3a$Ñ‚@ÍæìÃÕ•¢Î?ñ‰Íjר—9¡ qM<ÿÐ M£9CƒÍ?õ£+ÆíHSÏ?×tŒJ;AdzLÈ$gÝB'µ`·¤J膯®fÈÓêPCµ:Îüô?© Ñ4ÛML®â lþÐtdqï?íPý1I€‚ô5Ä´#É<Ø r *{mƒ+©|½rØ0ËKÇ54‡‰±8eæ½M­ 4@CsëÌÒpû44Y4“qÀT'“„ìõ°2IlDÞ¸ Kþ5+®´`¼@šWG/Æù¢Á|™æü£ú­YpøÓÒ|EÞÍœ74<|.rÞ¶³ñ6Ò´ÀÃúëKn¼ñ¥ˆò>ò‰(q™²¢qo=bbl·ßëV$‚‰/äíjIàíþѽdÌ. üZ„Ñ  ÕÃx60Þ×t ®…;@¿0ÑŠbŽ2DÕf–±Z}ïcYx„ÝJñº€ÍÌ\¸ë12öµr ŽþÍÀ("!»w¼ÏxLbEáŠ$ ¤bŽòV·X´šýãYPàÇ’p4ÀQ |<ÈÛÛê‘>ÈN_;` \´ ½#T¢AX 'Þ¢^¸ÂU·tÅŠHdT»Ö°6’A‚Æ0„Õ—Á#:²‘ˆæHɺ‚v,“­¨—Gmu,‹m¤±°¹‘ùN}êûÞ#WÇJº„ž¡@²µ1(h/ è Xx h$£­äJyÈ#²}-`1&±ÊW:“’®…=ùÉAŒ» Ø0U¦²à©oƒíc%ŸINJ¶¢‰À¬ ²‘m›ÃüðÚ·AT±ƒåHÌç+[ ;²Sd#3@#‡ÊõYΞ÷l¥>:ÇÊòX[Ÿ!¿IQdÖ3ƒ¼'C7êJ~>T›¬ç1ë‰P$*”£(}e4;cacti-release-1.2.19/images/tab_graphs_down.gif000066400000000000000000000041521413633772300214150ustar00rootroot00000000000000GIF89aX%÷DƒŠ„„‘††–‰‰šŠŠŸ§’’­––°™™±››²œœ²žž²ŸŸ²  ²¢¢²££²¤¤³¦¦¹¬¬ÂµµË¿¿ß××ïêêúøøýûûþýýþþþþþþþþþþþþþüüüùùûööùññ÷ììõççòßßïØØíÓÓëÍÍêÊÊêÈÈêÇÇéÄÄèÁÁ罽湹䲲㭭⪪ᨨ॥ޢ¢Ý  ÚØššÖ˜˜Ô––Ò””Б‘ÒŽŽÒŽŽÓÔ‹‹ÓˆˆÕ††Õ……Ö„„Ø„„ÙƒƒÚ‚‚Û‚‚ÛÛÙØ}}Ò{{ÌxxÐwwÐvvÑuuÑssÐqqÏooÎmmÍmmÍllÎllÎmmÍllËkkÊjjÈhhÈhhÈggÈffÈeeÆddÅccÅccÅbbÄaaÄ``Ä__Ä__Ä^^Ä^^Ã^^À]]¾[[¼YYºXX»WW½VV½VV¾UU¾UU¾UU¾UU¾TT¼RR¹OO·LL´HH°CC¯AA®@@®@@®??®??®??®??®??®>>­>>«<<¨44¥//¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤..¤..¤..¤..¤..¤..¥//¥00§22¨33¨55©66©66©66©66©66©66ª77ª77ª77ª77«99¬::­;;®<<®==¯??°@@±AA²BB³CC³DD´FF´FF´FF´FF´FF´FF´GGµGGµGGµGGµGGµHHµII¶JJ¶KK¶LL·LL·MM·MM·MM·MM·MM¸NN¹OO¹OO¹OO¹OO¹OO¹OO¹OO¹OOºPPºPPºPPºPPºPPºPPºPPºQQ!ù ,X%þ9H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠùP…Š%®\Ù²¥˜—0¿t™9ó ”&I–D‰e ÌŸ0ËS†h4G‘¢YÊt)›§2oêè"¥O X_ Ý*´©W4OÊe‡,8jº”øXueÖ¬CÅd±beŠ]»Pòê _+Y²|ù– ³pè(ÞÃFmFXÞb«JËL˜@ar9o“ÏK@3Y¢¤´’&¡/?‰˜ðâ=€`§)áB¢ À’_f™RÊÝ)s³Èý’´©1ƒ‘Å/ê$Г(Yeõ°€ iæ¡‹+Aþ ÌÛnà—LÙ”+¶,²ŠãÓɳX14j¶di¾äÈèKXÇFŠ˜fÊÎ#аaBQ„j(²HŒ`QXXN…E¦þ‰&*d‘ÙE*i#”VúÈ¥™bÊίá,;‹äQE@ A…Ó¨!И=VkšŒÒº¡­êê¢QX±+;½†³O8ìkn8š »ÈKñD €ò¬«†ùX&µ‹Z{m¤Jjë"¯ûD‘Ãà{î¹Ó„Ê4ñÆK®V. 3%†(kéæ›K6â﮽ö*ðåì4(£¼0à 331(‹HAE9ÌPÌA¬¯­ùh!_ ‘G ÁD’P(KÅj4Ò9üÅ>à>qDMäàÃÁR‘ƒ²>äE8 «áóÏV4ìrÍg× ÊLh „fµF H×C<ÄÖ.úÜuþ_<’ÄT7ÔG4=Ó9ŽÖ9!DÓ]h’‡ÕÝQÄÄi£­yj0ËÍoŒ$®QàÈ»¾Ä#³ãGR0ýu8…SAn×T€¢õš€âsîVXÝÌ,¢y0h£>Gñk¹O4-îÁÖžní 9(Iä`Eñˆ _³òô/ /Á¨¡ôqü±‹R°š"ö¡µ!«vš\ò  ô50¹óûÒ—ƒ"Ô¬9ÀBÍ4Ñ*0 ž£þ =çñ¹ÒÀ~処­i£…ÕÂtá ¸‹WᘇàùÀxþXÈAjÖ> v  "HÈDšy©¦@–)qYñ ,ÜÊÁ†Mƒ â{&V¸½ù  ŸëB‰˜Af¨±i?[aAÇ:¢yσ"¨._‘Ëd_ðC8ñ¸'hâ Kd¼ü µ¡­pX(–&ûÉÐK:¯Žý&Úä9Ïù峜aÊÑtªå@EwÏûet£M)CÕZr ;cacti-release-1.2.19/images/tab_list.gif000066400000000000000000000015221413633772300200530ustar00rootroot00000000000000GIF89a÷|€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ¤,/I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ;cacti-release-1.2.19/images/tab_mode_list.gif000066400000000000000000000027241413633772300210640ustar00rootroot00000000000000GIF89a*%÷„€ƒ…Œ…‹™‰‘¤—­“Ÿ¸™¥Áž«Ê¥²Ñ«¸Ø±¿Þ¶Ãá¹ÅãºÇä»Çå»Èå¼ÈåºÇ幯ä¸Åä¶Ãã´ÂⱿ᭼ߩ¹Ý£´Ù¯Ö˜ªÔ“¦Ò£ÐŒ Ï‰žÍ‡œÊ„˜Ç–Å”Ä}’Ã{‘ÃzÂyÁxŽÀw¿vŒ¾v‹½uмtмr‰¼qˆ¼o…¹l„ºjƒºi‚ºiºh»f€»c~»_{»\y»YwºVt¸Qp·Nm¶KkµJjµIi´Gh²Fg²Ef±Cd±Ac°@b°>a¯=`¯=`¯=`¯=`¯=`®=`®<_®<_­<_­9\«4W§.R¢-P¡,P¡,P¡,O ,O ,O ,O +NŸ+NŸ*Mž)Lž)L)L)L(K(Kœ'Jœ&Jœ%I›$Hš$G™#F˜#F˜#F˜"E—!D– C•B”@“?‘>=========<<<<<<<<<<<<=>‘?’@“@“A”A”A”A”A”B•B• C–!D—"F˜#G™%Hš&J›'Kœ*Mž.Q¡3V¥4W¥5W¦5W¦5X¦5X§6Y¨6Y©6Y©7Yª7Zª8[ª9\«;^­=`®>a¯?b°@c²Ad³Be´CfµCfµCfµCfµDg¶Eh¶Fh·Gj¸IkºJlºKm»Kn¼Ln¼Lo½Mo½Np¾Np¾Oq¿PrÀRtÂTvÄUwÅVxÅVxÆWyÆYzÅ\|Å`ÅeƒÅj†Çn‰ÈsŽÊx’Ì~–Ï…œÒ’§×ž±Û°¿áÁÍçÌÖëÓÛíÙàðßåòìï÷ùúüýýþþþþ!ù ,*%þH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹’PÒ®#ºtÛ)É8PIºtêN¦3·ÒœË—æ¢T$¢NË•-aŽ3'®'Ož#!Ö´ SHxò|øØAo‡yòÚ±ë)Îa”—â~Š{—´éŽz8nЀqïŒ:æ½Ë"îÊB¢Y㾃÷î]»š(Õµ{7oÇ{ùòÝ»áã–, ³ð¤*N;uT½Iöâ²dqìà퀡o¾ñ²l98•±iq’³yËæ…rµ×Õ(ky·ãÞ>}7âmMP‰äß—·´ö;ÛëlÒ’WKÎÜK!4nçˆ" AÔÀ]¯fü5óïÒØþ0cC^Z#5öÝ“'† ÁÕ^¤Å‡ <3iÌÆ“ßÏßË;ÀÒa¥•u óÃyì²Ë‘ûEhâ‰)Fi&½\©flÖ±ËFxù%%Ž)¥”:æ‰#›»â§ F(±È (å™j®É§›rúiÈ£*…!„2€b”>¦‰é•m â埠B é"²HJª,%Ê)›z¶*Ë©³²Ä*i¬¨2 (Ÿ}þ)꣋ò*­ÀûD²HRk§u²ë®²øJ+¬ÁklSH"‰(麬!­ê)‹(Ö†K-¸Ø2 j¯ƒ."‰º±k-°î† ®µ¨ "ɸ¢”;h´Ñ+-½’ØKo½ùŒo¹üûo¸ \/*Glð Ôo¼ 3,ñÆOAq¾‹ ÀL0Ç({\1 ?ì²Ë(Çœ¯Ê 3€ÉÉ2çóTT;cacti-release-1.2.19/images/tab_mode_list_down.gif000066400000000000000000000026771413633772300221220ustar00rootroot00000000000000GIF89a*%÷Ȥ--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤--¤..¥..¥..¥..¦00§22§33§33§33§33§33§33¨44¨55©55©66©66©66©66©66©66©66ª66ª77ª77ª88«88¬::­<<®==®==¯>>¯>>¯>>¯>>¯>>¯>>¯>>°??°@@±AA²BB³DD³DD´EEµFFµFFµFFµFFµFFµFFµGG¶HH¶HH·JJ¸KK¹MMºNNºNNºOO»OOºOOºOOºOOºOOºOOºOOºOO¸QQ²VV¢ccŒuu~~€€€€€€€€€€€€€€€€€€€€€€€€‚~~‡zzŠxxtt›ll¦dd¬``³[[·XX¹VVºVVºUUºUU»UU»UU»UU»UU»UU¼UU¼VV½VV¾WW¿WW¿XXÀXXÀYYÁYYÁYYÁZZÂ[[Â]]Â]]Ã^^Ã^^Ä^^Ä__Ä__Ä__Ä__Å__Å__Å__Å__Å``Å``ÆaaÇbbÈddÈeeÈffÉggÊhhÊhhÊhhÊhhÊhhÉhhÉiiÊjjÌllÌnnÎnnÎooÎooÎooÎooÍooÊqqÊssÌttÏvvÑwwÑwwÎwwÑxxÒxxÓxxÓyyÒyyÓzzÕ{{Ö{{×||×}}Ø}}Ø}}Ù}}Ù~~ÚÙØÖ€€Ï€€Õ€€Õ‚‚Ó„„ц†ÐˆˆÐ‰‰ÑŠŠÒŠŠÓ‹‹ÕŒŒÕÓÒŽŽÒÓ‘‘Ñ““Ô””Ó––Ó——Ò™™Õšš×œœÜŸŸÜ  Þ££à¥¥â©©ä¬¬å¯¯æ´´ç··è»»é¾¾êÁÁëÆÆìÉÉíÌÌíÎÎîÐÐïÓÓðÖÖñØØòÛÛôßßôááõää÷èèùîîûõõýüüþþþþþþþþþþþþÿÿÿ!ù k,*%þ×H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹rí#1bÑœE³Æ-ãšSªÆ2XËgµ9S™’¥Í`8ƒáÒ¹³DnÎXªÌ9MÛ7qä’’'NÛ4g¸pÅÂ֙͛ÁŒ"Mj]ºtîºCGîÛ´`±- zgÑiÓˆÅ9Ó(9tîèу‡.\´`µòä¹3g¬¨¬p¹bÅ*–«ÃÁ®‘Ë{ž9m»bdµ³gÇŠ]‰ÍJ”+Ó£‘ƒwºh±´†+1cV®Bãmº·¨ß¢.]2ëZº{÷Ì1k¤v èÅŒGŸ> ¼úðF×/aMݽv×DþXM:ïêÀ‡ ×Þ¨½û÷¦¢µ£ÎÔžæÈ|£Õˆ?vìÚØž!¸Ç˜â <äØ×‰@û]×_{ì¹gH#f˜Ä†$±á.ê„“ÉCt¶÷ÏŠ,¶èâŠƘÄ%äx³‰&Vø†rxàʘ„öDCô°‡7Ø$iƒ@ï]Øc‡ )£‘=d©¥–×<Óƒ O®!‡†ìEI¼¨f‹[‚ùÂ3̼ §@vè¡W™d’ZÎЃŸ/ô ç /0³‹œ%Ð)$‘Gnéh–¾0à „Z3È” ©@‰å–k†úB /dP‚©»dzª@:)¥ž•’*«¦´Òš¦d«m¾`C¥±Ö*¬®ºæš2µ< ,«¿+g¨kfë´ «ì9Kª©µë­´Ò^îµÈ˜rm¶£Ž*¬¦ß‚«ì¸Ô^û€µ$k€uËî·ñÊ믿÷V[˽ø®Ñî´ðþ«ð¼\K, Tl¸ / pÃ?ñïZ|1Æ g ñ½y¬lÈ(£ŒÌÈø;cacti-release-1.2.19/images/tab_mode_preview.gif000066400000000000000000000027351413633772300215740ustar00rootroot00000000000000GIF89a*%÷£<<<<<<<<<<<<<<<<<<=>‘@’A“B”B”B”B”B•B•B•B•B•C•C•C•C• C–!E—"F˜#F˜#F˜$G™$G™$H™$H™%Iš%Iš&J›'Kœ)Mž*NŸ+NŸ+NŸ+O ,O -P¡-P¡-P¡.Q¢.Q¢.Q¢/Q¢/R£0S¤1S¤1T¥2T¥2U¦3U¦3V§4V§4W§4W¨5X¨5X¨7Y©7Zª8Zª8[ª8[ª9[ª:\ª:\ª:\ª;]¬;^­<^­<_®<_®=_®=`¯>a°>a°?b°?b±@c²Ad³Be³Ce³De³Cf´Cf´Cf´DgµEh¶Fh·Gi¶Gi¸Gj¸Hj¸Ik¹Jl¹Km¹KmºKm»Ln¼Ln¼Mo½Np¾Np¾Np¾Oq¿Qr¿RsÁSuÃUwÅUwÅUwÅVxÅVxÅWxÅXyÄXyÃZyÁ]z½d|´m}¤y~}…€€€€€€€€€€€€€€€€€€€€„}‚zƒ˜x…¢v†ªu‡¯vˆ²tˆµt‰·t‰¹t‰ºtŠ»tŠ»s‰¼pˆ½n‡¾m…½l„¼k„¼k„¾k…ÁmˆÅoŠÆq‹ÇrŒÈtÈvÈxÆy‘Æ{’Ç}”Ç•Ɨƃ˜Ç„™É†›ËˆžÏ‹ Ñ¢Ñ¤Ò“§Ó•¨Ô—ªÕš¬Õœ®× ±Ù¤µÛªºÞ¯½à±¿á³ÁáµÃâ¸ÅãºÆä¼Èå¿ËæÁÌçÂÎçÃÎçÄÏçÅÐçÇÑèÉÓèÌÕèÏ×éÓÚéÖÜêÙÞêÛàêÞâëàäëãæìçéíêëïíîñòóô÷÷÷úúúüüüýýýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿ!ù ,*%þ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹öB ,@<ÂBÅ+£@T J¨OË>0cöqU‘— A.[¾”™§žŸ>}ŽŠxs'L>¯>>¯??°??°@@±BB³DD³EE´EE´FF´FF´FF´FF´GG¶II¸LL¹MMºNNºNNºNNºOOºOO»PP»QQ»RR»SS»TT»TT»UU»UU¼UU½VV¾VV¿VV¿WW¿WWÀWWÀXXÂ[[Ã]]Ä^^Ä__Ä__Å__Å__Å__Å__Å``ÇbbÈeeÈffÊggÊggÊggÊhhÉhhÊhhÉiiËkkÌmmÌnnÍnnÍnnÎnnÎooÎooÍppÊqqÈrrÇrrÉttÌuuÐvvÓwwÔwwÔwwÔwwÔxxÔxxÕyyÖzz×{{×||Ø}}×}}Ø}}Ù~~Ù~~ÚÚÚÚØ€€ÖÓÑ‚‚΂‚É‚‚‚‚¹®¡•‰€€ƒ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„Œ‚‚©††Â‰‰Ë‰‰Î‰‰ÑŠŠÒ‹‹Ô‹‹ÖŒŒÖÖÔŽŽÓÒÑ‘‘Ñ’’Ò““Ó““Ô””Õ——Õ™™×ššÙœœÛÜŸŸÝ  Þ¢¢à¤¤â§§ã¨¨ã©©ãªªã««ä¬¬ä­­å®®å¯¯æ²²ç´´è¸¸é»»é¾¾êÀÀêÁÁêÃÃëÅÅëÆÆìÉÉíËËîÍÍîÎÎîÏÏîÐÐïÐÐïÑÑïÑÑïÒÒîÒÒîÓÓíÔÔìÖÖëØØêÚÚêÜÜêÝÝëÞÞêÞÞéßßçßßçááéããêääíææïèèðëëòîîôóó÷÷÷úúúüüüýýýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþÿÿÿ!ù ’,*%þ% H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹ÂZ5ª# @£BB•QàÆ(SÞYÉòÎ§Š®B¥DÙ²¦œ;rnF„j¥Ê•¦^ÑÂÅ«(/\¸^™ •sCP5Y¾šE´¨°aÆŒ9Ûêl¯Y¦î¬)´°gÔ ¦L2{GæT^ÄœqãFØ­Qbâ¼™ó&Ë59ËÈ)CxMÀwTñ’KŽš0UvœÕ·rSÁ„3gÖR†óáQ¼¨•#÷xš‚¨μZsç×ZbÇž2…óUÈÊ…  "‚†[»æ,»¸–ÚP Ðž¢|Í(d䜩Ңd 'ׄˮ½<¹÷ïP”þtŌۭ.A~K*D\ûq-Éi+Jý øƒ(ŸEz+i‡xôÙ‡A ˜`‚9¡D!ÈÌ2Å 3„|zwßvˆ_ †˜Ã J|Ä /XÈÜwõmøO‚ 6(âŒ/äð AÄ²Ê < ä~0vˆà?ÿÌH£<&ÉcG/ €‚@JÀ¸`Œ9I¤ˆ5*©å 'œ€Â' Œ ¦@ ±ƒ‘UZ™ä?Z²y—'ŒÐå Ø!æd¢‰¤•jZùf—DÆyç ÒÁ¡…˜¥’|úɧ˜VŽÐ¤‡j‡¡T Жk6êé§•VZA!…,P¦’lù槬zzè‹,ÐA!j˜ºÀ¦]æ*¨¤”†êk¬À.°ÀÄ kG­Â $ç “þꫬÃÂ*¬­L»­Ó*+f³Î¾+´ÒZ+®°Ø.0€@ÝzKl±ã¶kíjÔ:À¹’T*íºÅ®ëî¸óö{­¼ôV[-´ï+l¿' /À <°Áï*,ñ´ö+ÄüN¬q¼æž;cacti-release-1.2.19/images/tab_mode_tree.gif000066400000000000000000000027611413633772300210510ustar00rootroot00000000000000GIF89a*%÷Z<<<<<<<<=======>>‘?‘@“B”B”B”B”B”B”B”B”C• D–!D–"E—"E—"E—"E—"E—"E—"F˜#F˜#F˜$G™$H™%Hš&I›&I›&J›'Jœ'Jœ'Jœ'Jœ(K*Mž+NŸ+NŸ+NŸ,O ,O -P¡-Q¢.R£/R£/S¤0T¤1T¥2U¦2U¦3V¦3V¦4W§4W§5W§5X§6Y¨7Z©8Z©8[ª8[ª8[ª9\«:]¬:]­;^­;^­<_®=`¯=`°>a°?b±@b±Bd³Ce´Ce´De³Ef³Ef³Ef³Ef´Eg¶Eg¶Eh¶Eh¶Eh¶Fi·Hj¶Il¹KmºKn»Kn¼Kn¼Ln¼Lo¼Mo½Np¾Np¾Np¾Oq¾Pr¾Qr¿Ss¾Rs¿StÀTuÁTvÂUvÃUwÄUwÅVxÅVxÅVxÅWxÅXyÄZyÁ[zÁ]{À_}¿b~¾d¾f€¼h¼i¹i¸j·l‚³q¨w—}€…€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~„~ƒ}†™}Š¥~Œ­~޳~¶|ºx¾uŒÁsŒÃr‹Äq‹Åq‹ÆrŒÆsÇtŽÇvÇy‘È|”É~•Ê€—Ë‚˜Ì„šÍ†œÎˆžÏŠŸÐ¢Ñ¤Ò’¦Ó”¨Ô–ªÖš­×¯Ù ²Ú¤µÜ©¹Þ­¼ß±¿àµÃâ·Äã»Çä¾ÉåÀÌæÂÎçÄÏèÆÐèÈÒéÌÕëÐÙíÔÜîØßïÛâñßäòäéôëï÷óõúûüýþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ!ù ›,*%þ7 H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹ªb•¨ã@±R•Q +@€¡ć%Ÿ—0ë(JEqU @-Yº„ɇ9u|ÊáS‡æCU7qò¬Ã'-]¿~ ›ú‹®Dêu¨(&Q¢± ›ZìX²eΠAs–¬¯XƒäZ¨”iЦ´bÅ*tsPÊD²xKÍš5iÉ~Å$(á ¢t"ÓI‰“Ž9rÜhf£ÙM@¸†9ÖMš±Zƒê4d9sæ:ZåpvcÆÍ˜ÛlnÆMXæi֬삩àt^î&·í1fnKÿBýKêlåZ6ܘ¢/ŽþffþÅÍnéc¨§§nź+U¢\g‹»4\^ª LEÛL™2Ô˜Þzì}_"Å‚ VáE-ÏX F $Ènf|`uVñχ 2ÈàQ,a‰hübšF˜!‡Õµ÷^‚ Öøá8±„BìØã!Ë ã…8¼h ïI¡$ƒ66Éã“Bð¥^ óË8¹I‚QHÑ¥ˆK4)f”<”Éà <Ð`„/¹à@ ‰X"Ž9†)f“<¸ùæž4àb )À¹Éœtê(<ÞÙ$Ÿ4¸à( ¶°RB %d(”Sš©(ˆŽvêi ¬(R¨Aif™hÞ°ç¦R:ê¨Ð„ «@f¦zí|ºÐh“¯–°A¯«" ¤*®Œzê( $|è+ ¾ú*ì´ÃB`­@¹6ê žr[´þJí´l`­"ŠXû€@Ê2Ë-´âëk¸ãZk¯½Š,òÀ¾ìºð­»ÌF;î‡åÚKÀ½<@°rÈÂÔë«ã ˆß«°Â/¼È" T¯¹æ"líÂt¬²Ês,2ÉÇŒðÊ4¯œoÈ›X»Á&'ÌqÍ@CÜò©»/ÃH­tÇ7½ÉÑKGMóÐ;cacti-release-1.2.19/images/tab_mode_tree_down.gif000066400000000000000000000026521413633772300220770ustar00rootroot00000000000000GIF89a*%÷®¤--¤--¤--¤--¤--¤--¤--¥..¥..¥..¥..¥..¥..¥..¥..¥..¥//¦//¦//¦//¦//¦00¦11¦11¦11¦11¦11¦11¦11§11§22§22§22§22§33©55©66©66©66©66©66©66©66ª66ª77ª77«88¬::®==¯>>¯>>¯>>¯>>¯>>¯>>¯??°??°@@°@@°AA±AA²CC³DD³EE³EE´FF´FF´GGµHH¶JJ·KK¸LL¸LL¸LL¹MM¹NNºOO»PP»QQ»QQ¼RR¼SS½TT¾UU¿WWÀYYÁZZÂ[[Â\\Ã]]Ä^^Ä__Ä__Å__Å``ÆaaÇbbÈddÉffÉggÊggÉhhÉiiÊjjËkkÍmmÍmmÍmmÍmmÍnnÍooËqqËssÍttÑvvÒwwÑwwÎxxÑxxÓyyÖ{{×||×}}Ø~~Ù~~ÙØ×Ô€€ÐуƒÒ……Ó‡‡ÕˆˆÕ‰‰×‰‰×ŠŠÖ‹‹Ô‹‹Ò‹‹ÏŠŠÃˆˆ¬……‹‚‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„„„¢ŠŠ¯»’’À””Ä••È––Í––И˜Õ™™ØššÛ››ÛœœÛÜžžÞ  ß¢¢á¤¤â¥¥â§§â¨¨ã««ã®®å³³æ··çººè½½è¿¿éÁÁêÄÄëÈÈìÊÊíÍÍîÐÐïÓÓð××òÝÝôààõããöççøììùððûööþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ!ù ’,*%þ% H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹Â’µ¨cŸ>„:Ê‚•QÒÆ(Sòᣧ%KF¯(Æ"”åÊ•-sÚÑcgġ°­D)´e¢[»~[ºt×­D„zÆù¹pÐMœzø$úÅué°bÇ–‰m¶¬Ø°\‹xZHÈeËGAm«§­\]ÀŽ5ƒ­Y1]ië$|Û³gÝ–qz¶±Ó¦Mdžo[mš³a·êÄ98¨°gÅ‹]¦L›3Žk6-Z1Eq”ŸvãУG—Þ Lé3ur!k lPG3έ»Íîç]zƒ‰ÞûÌ¢áÍ•±2ðsçÏwþw)Ó¥¼ùéå­tQo}´`g  —¨±éðe¤wùÇ¿¿y+Ba…€ž¡K3ðA!†@ÏI×[tö'!P@ÑE…V(` ÈèòHä ~æ•7á‰jÈH0ÑE0¹°¢$–¸Þ€Vœ¨#L€è#B0‘‹,@ò Pz^Hà…:ê¢PF)DGŒŒ¢ÔLr¼lŠÌÄÒä4Z¬dz´¬ºÜ„–ÄLf¬d‚¼”®Üäêô|’¼,NœTzÄt†¬Df¬ÜÞì¼Æäd‚ÄœªÌ|Ž´¤®Ô$F”\v´Db¤”ªÔ„žÔLn¼ôöüt’ÌTr´tмÔÚìdz¼´ÂÜ4V¤\z¼l‚Ä”¢Ô”Œ¦Ôìîô|’Ä,N¤t†´Df´Üâì¼Êäd‚ÌœªÔ|޼$Fœ\v¼Db¬”ªÜôúüt’ÔTr¼tŠÄÔÞì´Âä\zÄ4R¤¤¶ÜTvÄ\~Ì óEט1‹&=“”)”¦O¨С­Û&¾ˆ´ G+L:AÁ‚•2F‹5„Ñ Á!À–Ai¶XÌ¡1 .œÛjôÁ±9ƒ\=èÔÝú¨K:ÖÐ0Œ8Í‚;°ÓlD%MØ~²øñ#çÀ=@|Ë‘ãçUP0ÁŒóç?*6ôÓôƒ—¨/þ€ Bþ¢@A ¤OÂ1O^P›UhüÙpG7oHÌ8…  °a)\!•1Úu0¹4Ç,â].BÙQ-0GZjuÐÂ[na¶Y FpFÔ À´QE7ð†b¼qÀ M´EWôh@Cæ]wÞ G ØÊIÞ†>Õ[‚XC œ¡hĉÏ9Ç)ˆF `$ÐÁSTQÁè Ã‡ Ôq‚µ$Rp2€r•15‡S~¥”T’hå•`Ôå–z™B=Fz˜l`Á‡bXQˆJ …¤dYsŒ1†y-@Áá“JÙÖ”þ(r†¨¢Ï1ak—B*éupEÀÊPBu MÌPˆ1€œhRKµÐçYºÈ«™u€C¡8`æ¢]6ú褻öH,°À[»ïQu¤¸†TD†ý¨† bf8x‹¢¢ˆfÉ¥¹çî*çºìº o qÌDḻ¼WdÀ‡xÒ„ Ä¡ Oº +߂Ѱ–`@L ®’RÌn¿›ñÇ@{á€Ð8°ƒDD€Å 9(Âfdpˆ°RY"– ,Z3®âÌ«º½VÌ3¼DZ±Ç^tìPE>$/é4ߊ+º²+Ã\4Á.a¨1 høÜ†<Ʋ—σ€ˆÀÄܲ“aÅy|Þ¡‡žüþ=|áƒZÈ¢ F¸Õ•o… Ðpá"à6VÙÅ@1°Cd§%\` z À.ö•À åã”BG¼ý¹ZðŠ`- €†€˜×"¥3Ù¡þh]ˆ€A J݈ȃxáhF¢å2Є l6@!H ¿þ/y´!±`ƒ@ ;›Øà%;lLv]ˆÃÌ'»<8`ŽI°ÜdרaàtäA| Ääé/Œˆ4£ €=,R =ê•$yö:ØÉŽƒ£Àƒ$¬ ”Ë·¼É.À <À2` ²¤ì°€H1ŠfÄ¥ ÉhFìlldÃXÇ€&» MŠ|`ß ¤ÇƒÌ%ƒÐÌÀÉ0Ü€ >ðpm ’‚Ìå-uIN1*À‘¸HÏà5Ì áNˆo«#åºà†'¨Aþ¸¬> Ãyà!ˆà xÀÂ,µ0KrŠS‘¸4£ÊhCu mµ[ÛŒ¶»Êùñ~Àóö×ÅýÅð¤ç"o9ΖB}¤!‚¦Ñ¢Qóýò6¼ýµ°‹6”¡-ºÈ—Õ¥µaôÐKCàn£ÍéïvJ¼þÔ¤`L$K“úR¢Ft«‚ dZ´¨^j;iU ÉV“ÖÒ«+íêVãêR—е©qÓ)UÍÀžºð‹µDj\ËÉU£æÒ°-]ªL¼To¤ìÿÞ:XºBô¨„ÅìC ëлVÔ©iIÙŠRʬš+WëQ¸@¬ ;cacti-release-1.2.19/images/tab_nectar_down.gif000066400000000000000000000034471413633772300214130ustar00rootroot00000000000000GIF89aX%Ƥ.,Ôšœ¼fd´†„ìÎÌä¶´´JLÔ‚„¼z|ܪ¬´Z\ôîìÔŽŒÌfdÔvt¼’”äÆÄ¬><Ü¢¤ôÞÜ´RT쮬ÌvtÄZ\䖔̂„ä¾¼ÔŠŒÜ²´üúüÔ–”Ìnl¬64äšœÄnlìÖÔì¶´¼JLÜ‚„Ä~|䪬üöôÜŽŒÔ~|Ì’”ìÊÌ´FD䢤ÄVTÄbdÄŠŒÔnl¬24ÜšœÄfdÄvt¼Z\üîìÄ’”ìÂÄ´><ôæä¼RTÌ~|ôÚܤ24¼ŠŒìÒÔ亼´NLÔ†„Ü®¬Ô’”ÌjlÔz|ܦ¤ôâäì²´Ìz|Ä^\̆„쾼܊Œä²´üþüÜ–”Ìrt¬:<äžœÄrtìÚÜ캼¼NL܆„䮬ܒ”Ü~|䦤ÌbdÌŠŒÔrtÜžœÄjlÄz|¼^\üòôÄ–”ìÆÄ´BD¼VT!ùn,X%þ€n‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£“,,c ª&­®cFPFc2:¤–,]&¼¾½®Á`&``+Æ`JÅJÌÍ2¸†j»À]¿Á®ÃÈÇJÞÉÊÌäådèdVdgB¢Õ¿¼ÚóR_5XùX/a(þ(a^|QK/*¤0¡ÄÂŒg$™Øn‹xóZuQ‚ /¼4™RaŠ/þ@N!Q€e-D¢ÈŒ“„É0ª¨8 ÄJ’@m4@P ^F:†YK U`3á­³c+º‘¢âK•2eÂx‰¹cÍŽ(D¦„)Ãà€þ1ž<13 `Ú†qÔWƒ)Äš3wŽLa+~˜˜dñÄVžm¨"aìš-vñRƒ“$8.\ ÊÈÈ6bÅT$Åj8%`›3¬Nˆ¸3žh 1¿cÄhÄÂa ¬!@`M nØhƒ£.¢ ÜŠ;Ð5áo²gŸ;œxñÃ$yÿô ¸ð'qŸ\xúB V2˜aÄ5^x „ 8pÈÈ|“ŒØ$a´¥ƒn¹1FPb4œp¿É%—h ¶qA0´Ñ†>À€F?”AÄ@P7œˆ¢\PÉEm ‘hÑC Kœ†„8Û`ãÕ¶NDE¹žo¾×á‡ó…hb‰SNÉÅž{À…”h 8dQ= @ l âcšAÞ¦˜n»½©aœqÅGgˆ#šHbž(òy¥ €º`€ ¨ºÀªàð=x!RB~ Xziƒ¿r¸ä¦¢‘èi”zRie E”zꩨ²!­´°Q-8Áh\q… A*¶˜c?Y*”’šÛé±'1D¢ h©©ªªê´ÔÒJë\Á` ¢+¥ê!§\é‚X, 8ày" ¡þZI :o½ÑN˃µ´F ²·$ƒp0AìF¯G'pÃ^<Å)äPFÄmxÀD9hð„•PŒBLˆpñÒT¸`Ã9tÆ"||ñ#tE¿ÞšÜ5Á,œÁ ,Ó HBÁ×{ÃÖyÁÒ;q±>Ô@EŒ@ÅEpÁÀÅp0ÄG\Ü °qCàG AE ED°ô¶Yœ|2Ø4´¬yAœpA Hpð‰1±Ošx1>àp1\ô@ÅáS\l ²Q/C‘¯,‘ÀÅ7\±:ØkžyË3Ïü 7Ѐènxèð—¥”>\ŒÄžþ¯ÐÓáÂø HK+ïTlíïðägBïasžùò™O¯??Ü ¿ §¸W1>½NPÛ€d·há@ZL BDFÁ‹e€d) Â®`€‹ý`~Tøç˜ºý™Pgðßôq,P)‹Oòê ÆPU>6xàqDhD6Ã%€Å“Ý–°„ D ÐÂÅN„%Jï„PÔŸTH=P‰ªEÐØ³\PC.RÁÕƒ:-HÀ_ øÎ: Ð @€†1öàÀÅ>Å>¦ðnà5fªT­ _lX_Bæ/’}­~»Ÿý8WÂé=±˜”"‰¡± ª‡D¤µ¬µH®9ÒdÈÓ\ý&IÂLºÒ›tC!í…ÈjQ°_¦<%ØTÉËü]ò•ÀŒ¢øH½{ò–#kd×.·K–m®y• ¦41y†,R_¥\¤·xà5ä5s’øÛß/§IÎ<%3“·Êp†®œð f5¹ÌT:ó™ö‹§>ÉyÎ;cacti-release-1.2.19/images/tab_preview.gif000066400000000000000000000015411413633772300205620ustar00rootroot00000000000000GIF89a÷   !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù D,>‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@;cacti-release-1.2.19/images/tab_settings.gif000066400000000000000000000042621413633772300207440ustar00rootroot00000000000000GIF89aX%÷õ‡‡‡–––µµ¶×רêêìôôöùúúýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýüüýúúü÷øûõöúòôùñóøðòøðòøïñ÷ïñ÷îð÷ìïöêíõçêôàåñÚàîÔÛìÌÔèÆÐæÂÍäÁÌä¿Êã¾Éâ½Èâ¼Èá»Çá¹Åà¶Ãß´ÁÞ±¿Ý­»Û¨·Ù£³Ø¡±×ž¯Öœ®Õ›­Õ™«Ô–©Ó”§Ò“¦Ò‘¥Ò£Ð¡ÏŒ Î‹ŸÍŠžËˆœË†šÉ„™Ëƒ˜Ê‚—Ê—Ê€•Ç~”Ç|’Æ{‘ÄzÁxÀu‹¿sоqˆ¿oˆÁl‡Âk…Âi„ÂhƒÁf¾e»c}»_{¹ZvµVr²Qm®KhªA_¥7VŸ*L™@’>‘====<<<<<<<<<===>‘>‘?’@’@“A“A“A“A“A“A“B”B”C• D–!E—"F—"F—#F—$G˜%H˜&I˜&I˜&I™&I™'Jš(K›)L*Mž+NŸ+NŸ+NŸ+NŸ,O ,O -P¡.Q¢0S£2U¥3V¦3V¦4W§4W§5X¨7Z©8[ª8[ª9[ª9\ª:\ª:\ª;]ª;]«<]«=_¬@b¯Bc±Cd²Ce³Df´Df´DgµEgµEgµEgµEhµEh¶Fi·Jm»Ln¼Ln¼Mo½Mo½Np¾Np¾Oq¿RtÂSuÃUwÄVxÅWyÅWyÅXzÅXzÅXzÅXzÅ!ù 5,X%þkH° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠQB„©\ùïß>—ûÉœiÈI’õbÔ²gÏ—@÷ ݇(¾£H‘Ö÷´Þ¿Cƒôà,˜ÒeË—?‡j%j4éѦõÂÊ«7VžÙ³f#Ù 9h‘OŸ[µ2BDH]?‚üر3gÎÞ<~ûL‘L¢fÙÉSÌ®±¤CR3z së?DyùÎyÃÙg7œßlö¼¦té4eÒ¨^“fç9ƒ1Â7‰¹ÛßÒ9ª8ˆgP˘ýÀž#oa•X¿6ŠïŸìEtûeúŒuÕl`®Gé9o” þA$Ty+¾EyÛE®”©X²hͶ“7qãû÷ëÅD¤×Íš0–Á†~ ò%ÞPãÍn ™WÔyv ‚ˆ[F…eaYñÕΆ‹Ù‡ŸmìxÓ˜7éˆ(b:O —F,†‘†ˆìƒ 7â!äˆKµtì…åž…bÅǘ}öÝÖØm"~÷M8áxçÍ“PBù<“,â]lÁ"‚wŽHɃL8 _†ŒÝ×Î‡äØ†¤’!2Ùä“ÖDù¤‚ÖP£ ‰“bG[d±…DBI%i–~žyfb6¶áš÷‘ó ;N:)'”ÖXN§&¨ ž¤6C©z’3Éht‘Eþq8R ¢½çã…hFŠ¥•zÓ$¦!†H§7u *¨¤žÚ̲Ì6“̳ÉXâ$x„q¬” S«™¸ùá·]ºä7Þˆë+”xÒyl§§ZÓ,³Ê2 í³ÃDK‰#edÁ†$¶h[®ò¤C¤¤jâ'nœáøÅ&zÅuRcMD ›§žïšºl¼É43L½¾øòñǶø’Ì‚a¼AIÉì2c¼l›‰˜ÎŽ7sF‚u²n„qj¼ð6óÌ3Ëv<òÒÉ„œLÉ%ûbKÉ–¼‡%S·Lð·ß±AÄ×QüóÂ_áGÏ`wáM`G¡gQ,‹HW”=Ç0ËRvþ]ŒÌö×W@=ÌÔRO=Ì„°’u lšx3;Œ|=ÇDÌá<_³áuÅÖdáslPóÆ×e„±,ŦæLD£‘Ì0ì|ý†×Q ³KÎYäÁv¿»ô;õï¶r+ª¨"Ðmß}‡°¯9_1 ºikžÏA:£ÚŒÏÍRüz«?KñÇ£³²Ï»ìRÆêÀ‹b‹(Š-ª8rHñÆ×ðÍþq>yóeÓ™‚ÂÀ¯Å¡qX]Ò¶h c|ÃÀ^¤F1[¨x˜šÏ¦F‰½á!~ï“þqø‰B •Å:!t볃² …½0ÌËg"ûØø|áö=þS[_m±Á÷ycsüBhBø9B‰ðCá¨Öu1|¸áT Ú"¾F‰dP" ÏJ`šv>"äÐFÏ0µ ÚÂDÈ‚7h7¿?|P¼cMX?G¨"Š5 b©–¥:ŠaÎòœÏ¾Ö´Jì-d†â{‡ö¡ˆSûØà·†îñ“Oüã k¬Œ*ˆCj&a “%Ãa8&2_PÂ:ôÅ4µØAq–ÀC%Þç;ˆò€cDQÇ3œ!–øäC H¢mL^Ð2Ù0L–C© Nj…ž-X¡¸ßÍO~ôcbñ¢ÊáÒŒg©9Jg½ki” ÙÈ|NpŠóŸS#þþHPø‰Rvˆ;!Ï†Š‚žy–Ç–VŒb,Mpü¨8ç7Ð:”™ý(Dkð:Š~l¶KŸJUªQúu´£!iLGzÒ”®ô¦¿sŸ9]Z<žâO¦@©yÓ›Šb ŒŸA_JЃõ©©§Ö»÷Yõ¨X]"EéT¨zÕ¡‡ê ;cacti-release-1.2.19/images/tab_settings_down.gif000066400000000000000000000036651413633772300220010ustar00rootroot00000000000000GIF89aX%÷’  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000:66E==OCCYIIbNNkTTsXX{]]‚aa‰eeii•ll›pp rr¥uu©xx­zz°||µ~~º€€À„„Á‡‡Á‰‰¼‰‰§††–ƒƒˆ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒyy•NN¡11£--£--£--£--£--£--£--£--£--£--£--£--¤--¤--¤--¤--¥//§22¨44¨55¨55¨55¨55¨55¨55¨55¨55¨55¨55¨55¨55¨55©66©66ª88«::¬<<¬==¬==¬==¬==¬==¬==¬==¬==­==­>>­>>®@@±DD³FF³FF³FF³FF³FF´GG´GG´HHµJJ¶KK·LL·MM¸NN¹OO¹PPºRR»SS¼UU¼UU½VV½VV½VV½WW¾WWÁ\\Ã^^Ä__Ä__Ä__Ä__Ä__Ä__Ä__Ä``ÅbbÆddÇeeÇffÇffÇffÈggÈggÈggÉhhËkkÌllÌmmÍmmÍnnÎqqÏssÏuuÐuuÒxxÕ{{Ö||×~~××××ׂ‚Ö„„Ô††ÓˆˆÓ‰‰ÒŠŠÑŒŒÑÐŽŽÐГ“Ж–ј˜ÓÖ¡¡Ø¤¤Û©©Þ¬¬à°°á±±â³³ä¹¹æ¿¿çÂÂèÅÅêÊÊîÔÔóãã÷ííùôôú÷÷ûúúüüüüüüüüü!ù ],X%þ»H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ1]ºsçÈ©\Ù­¥Krß¾Á$—å:’O’sɳ'Olݰ Jt(µ£1Ïá,¨Ó§Ó–@‹J¥&ô¨Õ«GŸQ{ö¬Ú·MŸ>•‰Ò¤ÉvëÞ©E‹v[”*»}ö•«ÝgÉžIûšñ¤Øž4ѪL¸°áwò×KL¸];•ßê& 69XµŠ)ÿv#Çö]»woSΜ;·*6iB¿m–©’ígyï/†í8&×`½z“ès®ÜoíΡ…K´UºØžÑÍZWš]çw“ååêµ5âzا#‡-Y/Z´.þ/LçT¨ÊšÜžÆÊ\ëݻҤËÏM¿~/ïz¿»nÏ^=Ðß<ó- ©VQ¬Åd{V½ç W½(Ÿt÷ÑÌ…ÒwËw¹í•Î;öÜs=ïœS ‡XÔN¥Q# {îÕå^tyÑçwöY˜!-‚磷CÎ:ò܃Ï=%JsË-x6-2× Œæe%…æh?Ù -­„ÙŠ)¦Üb xÒó>øØ³N5KDÕUË]ãƒ\]9¡–îÈe—`Òræ `Ž9&™d~Ù ‘ùÜ“N0 Ä`ƒxê9áZê˜Û-€J¨)b"*ê¨Ù 5òäÓÎ3DÚ…þTVy)…8öBŽ>ïÔ§Ï=à}§Ï?>–ù© ‚:*©­&[ª)ÕÔÓ-­ T)^³b™i;ÿÔÓã?úüØN=„†z츦(kn²ŽtÒÊ:é˜âˆ#ÒÒ8ë;ÿÔ«5Þók½çðX/·õÐRÏ¿úœyO·¦ÜšÏ¿ë JοùÔ“ìÀõæÓjºïbœ®JÇ{)†¹}Sï‡ÿäúL½jÕ ž=¿C ¶Ùlʯd®ƒ2Ì¥ÒRï:ØêÓªÍùœ3pÆDýM5Žèo“UÖ'n‹þ“^bkO;é,œ-6Ë&·¢ÒlŠÍò”ûëÏÿ´Ój½8"OÉmtÒzÔMM5uë!Pþ†Pë†Û†:ÿ°Àÿ2Ü ¶e#ZoØÿ´zܰÝÉÛç´ý>mÎ-9s×Mw'vã]·@[öøã:»I§”ôÀœ?üQÇw$xbŠi3·õNo >ö²}fá­ZX½Ò…;Gòñ@rððŠï£à…(DQë‹[";E,¦CúÈÇ7°ÈF=øPo@DÔ¿h®0Ž1cel£÷è¾7 ¤ˆt¼˜ǘÇ(Jˆl£4„÷C:Þ‘he¤II>º(~èz$%é¹D²’”\$&5IPšò”yeÒº;cacti-release-1.2.19/images/tab_template_blue.gif000066400000000000000000000043741413633772300217320ustar00rootroot00000000000000GIF89aX%÷ÿ<_®>‘ª¹Ý{•Ñ8Zª­¼à+N :]­¾ÉãBd´…›Ëš­ÚHj¹vŒ¼UvÄLk³^~Æb~¼Š¡Öi„ŠžÌ'Jœz»Rt”©ÙXzǵÃâYzÇ™ÒFh·®Õc‚ÈÍÖét‡²1T¥WxÆÕÜì]y½nŠÍ/R£ ²ÙâçòGi¸v†«3V§)LžEg¶6X©–ÅAd³XyÆ“§Ö5X¨*Mž*NŸMj«£²×,O YxÃÅÎæg|­RtÀVxÅ„Ôp†ºi€¶–¨Ò[vµvËb€Äf‚Ái‡ÊuÊFg²(LBc­sŽÎšÔ@`© ²Ü“¨Ø^|Â4W§j‚¹±¾Ý2U¦-P¡Vtº»Çã}–Í4V§fƒÅˆžÒPq¿TvÃYw¼6Y©–Ë C–¦·Ý£µÝ&JštÆ=^©;[¤†žÔEh·w’ÐTuÁRsÁQq»kˆÍ0S£g¿XxÄOp½@b±\}ÈWwÁ<=C•?’ D–B”!E—.Q¢0S¤"F˜@“#G™7Zª(KA“Np¾&I›Dfµ9\¬Ln¼$Hš%Hš@’Oq¿PrÀ#F˜Mo½$G™?a±A”IkºKm»2U¥Jl»>a°B•;^®@c²@b²QsÁA”Jlº?b±%I›>`°"E—!D—=_¯B•?’Ac³Ce´Km¼@“=`°%Iš;]­Ac²$H™Ln½"E˜!D–SuÃNo¾=QrÀQsÀkˆËOq¾Mo¾8[«Ilº­»ÛLm¸*MœGh³C–Ifª™ªÏ<^­g‚¿g„Çn†½Y{È>a±”§ÕiƒÂ—¬ÚFdªzÀC`¤No»x“Ð{”ÏQo´k…¿p‹Ç~º£ÐFc©ÉÒç!E–bÄUwÄUq°,Nž^y¸¥×3U£[|Ç[{ų©¸Úp…¹\{Äj†Ç£Ö]{Ã2SŸc€ÁGe­Bc²’§ØÞäðž°ÜMn½}—Ò„œÕnŠÉ(J™Op¿Š Ò#F™Pm¯¢Ñ<ÿÿÿ!ùÿ,X%ÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ9Ñ‚kRNh¦,C22›y,α HZl0A™ÏŸ>7lp æ>¼)uàÅK­§.´ñ”ëQtætÄ6¡P B‰=št©S¨Q=yÂõè‘#G† ÙŠI‘"iáBˆäú5èЗEGûð†É´õêqø!A\<(âÖIÀ…KÔÜCV„9˜@UªÄ€ CôjlàìߢuÞ¬iÒ gÎèv†ŠíÜóž'3F@ãŒ!ódÁ .Y®m)á"Uª$áQ[¿baÖÿ11ÀÞäÉišÔ›ÆÄÄ‘ ¤“æ®6l줋¥Ûuבṵ́ÀTh   ÀŒHq…0“dÒÊ +@d2¯æƒlMØÃÁLèòA9ÞÔ2•'muñV\tÉ¢È*–`‚‰/£•vZ§âÆî\F? h €˜Á›$rw AYÞ±Æk˜Ÿ^°1[nÁc]3Ö(i¦©ÐA.¸`v Ä 'pOÀ|1AB€Å;`qN6f„“Ä gdˆX.%ƒ.&˜8Ÿj‘ù¢!¼DB]–¨™c›oÆ9gv1À‚g(¶b ÆlÿòÊ&ÆÐ!ÌÖ(€ €€ 0ÂÁ»p‰ŒŠ„ª0µnZë0©rBÇ$Ë|ûj¬¯`lîÆ`¼à1È!_"‚üq ~øa…ã81„¤ü2P[oåWÎ2&¼&Ð=g DÜ­ÒáŽÿ›1ºêÒ05 U_­5×^[‘CPC -€Ç3ÉP!ß0²ˆ@rÑe—Ü »Ùð©¯:q+á6HÆPw,…!Œõá][¡8ã6<Þ‚„RA‡” S à1€Ì"¢Òm÷ÃEí-¸L;­±ºRLxVc ÇÖµßn@îóî{‡ˆ¢¹$‚IhCA;{ˆ!Ý£C¯÷é¯n"îêæœë¨Æ½Ù/q‹kœîZлߡÏës AŠ>”bÜÀ  !>|B ¥ªög!ÔU€ãØàbg8Ú!wº3ßïÒ§¹X°ÉëChQ¿<äá|àƒ&ÿ€Ž@4Þ¶öF=qYcÙ#`÷þð=ĉÏq1l úÔ·öI°‚ì¡&€ø J‚FD¦€6 ÄtÓëßÿþ¦ÂÁ‰¬…´]±¸»ï좡à ŠÁ‡š¢ #êá‘m ‚€‡J ¤‰ªc]º¢¸½)ºP0,Ÿi¸~Q‡{èá=hF4ñ‘zˆd%+éIúã–ñ[먽ÂyÏŠW\  ·Á}LŒ©<äYÉHGBR–³¼¥4ki ¤u‚ÓÞ Ì’¯¾ûc o8AòðyH$ÙÈFÀ2’·˜%¦IÏ[Ú—ÿèe¹Ù>ofñ|¤ŒEûpXÁ>$Ó‡dleßÙFyÖó¡Ó¼§?2Å<r å8‰Ì= #A,c3Ýù̆F¢(h5ñÙÍP‚s†¢Ø(gaNUª“ i,ÛÏJÞ!¥@­§DâOQ”‹^$¨ºJ‘º% €CƒJÕ‡õ-ȨARp©{@dH 1R†š”–UM+D¯ <.šr¦5E'×yÆ…–´§óT«^SzÕ¤~5ŒÊLh]_¹Ó³æu¯ˆåëJ'úBÚT‘dm§Y¥zÒÄZ¨C ;cacti-release-1.2.19/images/tab_template_red.gif000066400000000000000000000044371413633772300215550ustar00rootroot00000000000000GIF89aX%÷ÿÖzzôääá™™ÆaaÖ}}Êgg¿VVØ||ÎmmÃ\\ê¾¾ÞŽŽß’’͈ˆ¨33Ý——媪妦т‚»PPĉ‰æ²²ÒssñÚÚ·JJÉ’’¬99ÕxxØ~~Ë‚‚Ý„„ݬ¬Úˆˆá®®ÁhhÐssº{{½\\ÖƒƒÚÖxx㤤赵Åeeà––ã¸¸´„„Ävv㢢ÆÖ••躺Ç}}³DDÇffÍllÕ™™ãžžÖçµµîÔÔÖ„„ÈzzÚ„„êÂÂ縸׉‰â¶¶Æqq篯ÁeeÎ{{ÚÕ{{½YYÚ††è±±ÐˆˆÙƒƒ×€€Ò{{✜ݜœÅxxÉvvà  Þ¡¡êÇÇÆ••݉‰ä¢¢½TTéÇÇëÄÄ»^^Íuuç­­Ú¤¤±BB·QQ¦00ª66«88¥..®<<­;;©55¯>>§22¥//±AA°??µGG§11²BBÜ‚‚¹MM©44´EEÂ[[ÌjjÅ__ÇbbÁYYÉee¶HH½SSÛ¸KKºOO«77ÀXXÈddÄ^^°@@ÐppËhh¼QQ¾TT¾UU­::®==Íkk¸LL¼RR²CCºNN¯==´FFÏnn¬::Ñqq±@@Ôvvª77¶IIÓttÓuuÂZZ܃ƒËiiÀWWÏooÚ¤..·II³CCÓ‹‹Çcc¨44Ä]]Ècc¦11ÕwwÛ€€µFFÁZZÅ``݃ƒ¦//ÔwwÚ€€ÐooÌii¹NN»OO¹LL½RRª55Ðqq¿UUÔuuÎnnÌkkÒttЇ‡ÁXXÓvvíÎÎ䯯嬬⨨溺µHHÜ×{{ÎqqÅ^^àµYY¿^^任؅…×—µJJÆbbØ™™Êhh常㡡íÐÐÓ‘‘Ã[[ÙÒ‰‰ÈÍÊllÛ¡¡Ðww¸eeÄ]^á±±¾ˆˆÙ••Ü““®;;ÐÔ’’ìÊÊéÅÅ­??误ëÍͲHHëÉÉÛƒƒà§§ÇjjçÆÆµFGÃ``Êqq½‘‘¤--ÿÿÿ!ùÿ,X%ÿÿ H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CŠ91C†v§R¦´7§åŸ?àš46¬IŒ$-f8å¡§O²d}j9ç¥+WµFâÀá€ÓÍš˜ `Æúå4ˆåÔŸ>…ÃÌhR¥LŸB•JuC«V™2uêÄÉ‚…K—FøH'²+X B‰¾üãêG,DYœFAˆ" U =XwD'P,ØU ‚Ž‚Má«1Ã×°ŸÆýãa€mÁ‘Ǥ7“"` #+Âd‡ŠãAfÌPÀ\ÁŒ ;*KVåÁ‰Pœ!*P€$*Vÿ8v˲´DÑ¡=åQX0XÐy‰“'ªÒ¢µ! 'O˜@'¬ó€U$sL Ñ (SÁ=Rè Á6Ä’G"¸Qæ¹d–m9l“ƒóð l¡à-™üB—0váÕË!£•vZjxôˆ€3åH „:V„ LïÔ„2! ¡ÃøÜ±,á1DÍlGµ@b,,…M%1•UpÉEWxriÀœ†Z  ’ wÞ² *z\£‡ ã|! ÷hs…1ÆÀ39§P±‚Jxˆ8H)µµ,"˜ùUÕ ŒrqR×]—ܘ£i¨9‚Ç-qÒÉ!„à©ÇæÿQˆ* $pÇ­û¬ÀØ sâ 1 p3„;THãEA8ÕT¬(m\s}Š×%j²é¦©x¤ú-¸z¼‹†³Òz.,{¬Ëî»[ø± $‰LK (o! Ý´pAó„áC ÑD•‹­ˆ¹A1ž¢)*i¤:b*ªÞÖÙª¸±–k+º³kÀ»~øArÉH‚ º<¥lRÊ#J!ð€ƒn ôbŒtCcškVRÚ oFÜ­ªvâ +ÆåÞÿÊñ ë¶ õÈ%OP5th½u)}ôÇ+”ØQC vXS‚8Ó‚kL"Й 2w›t-±w[¼aÆKÿÊÇŠ„<µÉ‡g½5›8þ¸’›‰n¸‰!†D2†ù|àEŒ*Ž@ïÌ©§¯zôã>£ô¹{4mÀÓŠDMò†[8 ‹ç‘Oî;ðnòÆ7‚i¬1F8Ðc† ™[ÝâT4péíb²:‡Æîð·À¹+|„#ßáηµÜ9r’«Áï€7<úÕ̳„Ì@Âx´£šPCB½²j—¬hÕº¦ÁNv‰(ÙÉ$5­awº‹\ïÿ~â2ׯ O~H¤ãEˆG(JQ…©ø#âV r4˜ÂÎ@ ̰Vb øpH5óÙNA䉿#&ñ~iHƒ(ON±¡Äâ(ã0H2Ì¢ mX%)hðXS ÜS»XF ò‚\k%3hÉÎÑ~ì°#1õÈGQŽÒ”ƒ„æ*Ï`ÍzúƒšõÈ EæüÈ F2w“Äà.å †KzpÀ´c'£xÌdf‘”ð|f4YiÏŠZŸ×ü‡ÔrX¾«Ý²k¹"üäøAü1b˜ ý$2EIÊfJTši=1êø}á¼`%áhÐLÚ/˜'½£ ò¨Ò>*óÍ”ç*eÊÔŠÒT ·SßîDZDLv.¡L$¦1AÉÒRžR©¤hªX-úÔ¬¯ï I5iR”>± {¬ÃJ•ÙÒx‚u¬xiY5ÈÓút“Ze(WêU»Â4¯ˆ•iYèÁ:2ïŽoU©C—Ñ»&ö²L-kƒºN¸¶³«Iµ,fG›Ùjf”“‘mhW+;Ѱ’öµc}j@;cacti-release-1.2.19/images/tab_tree.gif000066400000000000000000000015421413633772300200410ustar00rootroot00000000000000GIF89a÷   !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ¥,?K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€;cacti-release-1.2.19/images/table.png000066400000000000000000000010661413633772300173630ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ÈIDAT8Ë¥SÍ+DQÿ½ß,È̲‘ä›Ò4bAYXJ‘,í­Ä¢”(JìX(d"E)‰X(3“o™æÝç¾Ç{odANÝwî¹ïœßùÝsÎÕ¤”ø˜ê3·õ8I8c\Š2!¸˜Ò\í%ioqp&é\ìÏŒT†m!åø@¸ ø/™§Î\„f¯\ÌRfFY,Ò·nîßQÊÁåí«ûjK3í ¿!…¯ rgzþ¬)ÅEžê¯ZœêbÙ‡ý8L/ÉU¥µÿ>ç¿”(puMÑIEND®B`‚cacti-release-1.2.19/images/table_go.png000066400000000000000000000012531413633772300200460ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<=IDAT8Ë¥“ÍK•A‡Ÿû¾×âVÉõj¥7\ø‘ˆ)ö±)kcQB-¢e䲕$d«mú¤L ”¢–îR´DËhg(¦Þ4̯ûúΙ3-®Ÿ;£a8çpžó›3çÿ³¢Ïß/´9Çë´PU± ¢ŠµŠU‡Xݶ-VVu¸ãfIm@»Û\›ÿ—É^~«ÜT`Uão&:Ä FcÍÖie³v¿¾cìÞm€Œ-e·w5}%ŒØ-¬UºûS»\®É%ÜuÀÓ ^ Ìr½!3×34KsÝV<·ìT`¬¢Îõ¡g0…ï{ô¥ˆxà­7Ýë:GÚ,ÑTþšŠ¢C„&ð6®à€¨¡¹>AÔƒku ®Ö&¸R›À8Ca¼”®Ñ‹&@Dw*p QÞüÂ÷¡õÅYœBBŽä–PZpŠ¥`…ÖÞ*²y¶ ŠsŽ,.Ì£olÑ å·°N±jQ?þLs¢°å0ÍÈ÷&*3&jFŽïEè› 딩ùqŒ ¢c ‹kKTaÙ¬òa²Þ‘Œœ¯Šõ!±B~N19Ç8|0I–#/û(£Ó|œøÊjHÍ–ÎQQ|€Ÿ¿ÓÏ‘–5:jH !ÉxuÉF†§ú£"öT{Ú[>¯?$7ÐÞ=^ZÝoÄbÄ“n¢V+äŸf‰x1Æ¿P²ç +‰·‘Ý~çd[dŪ¿/­6™zä&7òýOìBëIEND®B`‚cacti-release-1.2.19/images/timeview.png000066400000000000000000000022261413633772300201240ustar00rootroot00000000000000‰PNG  IHDRóÿaPLTEÿÿRVER=\\DADSPCNUMBER_OF_PROCESSORS=8OS=Windows_NTPath=C:\Windows\SYSTEM32;C:\Windows;C:\Windows\SYSTEM32\WBEM;C:\Windows\SYSTEM32\WINDOWSPOWERSHELL\V1.0\;C:\PROGRAM FILES (X86)\INTEL\OPENCL SDK\3.0\BIN\X86;C:\PROGRAM FILES (X86)\INTEL\OPENCL SDK\3.0\BIN\X64;C:\PROGRAM FILES (X86)\PUTTY\;C:\PROGRAM FILES (X86)\SKYPE\PHONE\;C:\PROGRAM FILES\TORTOISESVN\BIN;C:\PROGRAM FILES (X86)\CJÀ9‰QIDATxœ•’;KA…¿Y¦ bâ­,„ÐÂN°°¶°µ³·¶ ;-,-üBÐÞÂÂ* B,DAI¡¢$((dç^‹ÝÉ‹5š¯Ù3³Ü3ç쬙ɮêæöŸ’BAEpâPQDuQEÉÒŽwÙX[2f§x¯ét?½òpsËPíÜØ¯Ð–L¯ß}Ë `ÕicÓ¬äõ׉=+:Ui¼œÌ¨“ÖN"ÛºY9)4ªT:Nî\{lôé#ÞsÏ:?ãê± @’,ñ|è¦ÄEÕ­J3wÿ"°Ò’ ?z­ OA5nœ  ¯sQ‰a½Þn]­ü­°Æ\ó½ûÐ8õQ¶Ö_43²@íí€$½_‹*Ä·t:ûnº•¶É»÷‚½8=bbvÉW"@äïçÓ]‰ìâ?SGÀ‹w jIEND®B`‚cacti-release-1.2.19/images/transparent_line.gif000066400000000000000000000000671413633772300216250ustar00rootroot00000000000000GIF89a‘ÿÿÿÿÿÿ!ù,”©Ëíc+;cacti-release-1.2.19/images/tree.png000066400000000000000000000007431413633772300172340ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<uIDAT¥Á±jTAÇáßœ™»Újë;l± …ż€MK+±²k±1Èb Ûm®¯a ±H»U²Š÷žówG \‚Â~_’Ä.Ò£çŸ=x¸x»Þh&(G!BÜ ¹ãÜÞ.NOÏ^|zwp\÷GÝþÌîìs³‹Çe3È6ësnêç £yùþ«þçÕ‡oºÎ“7ŸµE‘‚fµZÑuµV¦Öç¿ðQø(\Áo÷îÞÂÃi M×uÔZ¹ªäBJNÊ"‡QFÑÄè4ÅùÔ÷=M­•KÙÀR¦$ð$Ü‚&§ÖÊU9%šÌ?9Ó„DSξÿ8yz8„;á»ø0ðøõBBáÈE(P4'l%IìÂØÑ¨“ùÿ³ýK IEND®B`‚cacti-release-1.2.19/images/uninstall_icon.gif000066400000000000000000000017501413633772300212760ustar00rootroot00000000000000GIF89a÷N  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???A??C??D??F@@H??J>>M<‘ ˜×ÄÆ´fÇÔï÷§N¨ rÎÁZ ­µß]€sî}È‘ecå[Õ¢( ¾x ”B·Û f‘ÝëõèÏ<Ά§d…õò¯:7¥Š“‡C’FBHåC >~,ë[뤤†Ñp„†±æö÷¡}^Ahvs­år)ëºò—¹¹²†íÕ ?[L7žÌ¢È+äB"U ˜û\Ôõbr¡ØùÕé“Ààîý¶\¡hÔ^öý[ éW(¢‚³„§×TÖýï!Í‚vÍãc|•¯IEND®B`‚cacti-release-1.2.19/images/view_none.gif000066400000000000000000000015001413633772300202370ustar00rootroot00000000000000GIF89a÷  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```dddhhhnnntttyyy}}}~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚†††‹‹‹‘‘‘———›››   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù Œ, H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å;cacti-release-1.2.19/images/view_page.png000066400000000000000000000007401413633772300202400ustar00rootroot00000000000000‰PNG  IHDRóÿagAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<rIDAT¥Á;kTAÇáß'G8°S¨A¶ðV+ˆÄ”ö‚¤NŠ|ÁV¬¬µÄ/`g!VÚ¥ÕBðFÀ`!(’ Ù=93ïßwÐ…E7ÉóIFÄ­<|s 8\.„˜¨ª@À̰ÌöLÔúùÓÇ.câöÍ I,?xýXÿéþÓwrD~YÄ=YÛdLìouaŽ_¶[\¤0â·³'ŽR„ÀT¿µÃQWã"NRƒðé{ËA(瀋8™"nuaŽƒ²l'SÀ-Ý}ÉÈ <¿wÏ_w˜¦??‹,ST8™Qüv\¹x’Íab¬×Ôôšš^SÓkjÆ”2E…“‰b0Êt»mbR—E—Å$³DQá‚EÛv »Luü‹ÒEÄ 1&ñ—™#?I‰"â,™€€{±¶Á¤ÁîÓÈ$\Äe³  ÿöÑ &õçgÙ¤-\¤ÈöléΫs’®bvÜ, YF–@™! ÀP½ÇIÆO¤áôÄ(!IEND®B`‚cacti-release-1.2.19/include/000077500000000000000000000000001413633772300157415ustar00rootroot00000000000000cacti-release-1.2.19/include/auth.php000066400000000000000000000266071413633772300174260ustar00rootroot00000000000000 '500', 'statusText' => __('Not Logged In'), 'responseText' => __('You must be logged in to access this area of Cacti.') ) ); } elseif (isset($auth_text) && $auth_text == true) { print __('FATAL: You must be logged in to access this area of Cacti.'); } else { require_once($config['base_path'] . '/auth_login.php'); } exit; } elseif (!empty($_SESSION['sess_user_id'])) { $realm_id = 0; if (isset($user_auth_realm_filenames[get_current_page()])) { $realm_id = $user_auth_realm_filenames[get_current_page()]; } /* Are we upgrading from a version before 1.2 which has the Install/Upgrade realm 26 */ if ($realm_id == 26) { /* See if we can find any users that are allowed to upgrade */ $install_sql_query = ' SELECT COUNT(*) FROM ( SELECT realm_id FROM user_auth_realm AS uar WHERE uar.realm_id = ?'; $install_sql_params = array($realm_id); /* See if the group realms exist and if so, check if permission exists there too */ if (db_table_exists('user_auth_group_realm') && db_table_exists('user_auth_group') && db_table_exists('user_auth_group_members')) { $install_sql_query .= ' UNION SELECT realm_id FROM user_auth_group_realm AS uagr INNER JOIN user_auth_group_members AS uagm ON uagr.group_id=uagm.group_id INNER JOIN user_auth_group AS uag ON uag.id=uagr.group_id WHERE uag.enabled="on" AND uagr.realm_id = ?'; $install_sql_params = array_merge($install_sql_params, array($realm_id)); } $install_sql_query .= ' ) AS authorized'; $has_install_user = db_fetch_cell_prepared($install_sql_query, $install_sql_params); if (!$has_install_user) { /* We did not find any existing users who can upgrade/install so add any admin * * who has access to the system settings (realm 15) by default */ db_execute('INSERT INTO `user_auth_realm` (realm_id, user_id) SELECT 26 as realm_id, ua.id FROM user_auth ua INNER JOIN user_auth_realm uar ON uar.user_id=ua.id LEFT JOIN user_auth_realm uar2 ON uar2.user_id=ua.id AND uar2.realm_id=26 WHERE uar.realm_id=15 AND uar2.user_id IS NULL'); } } if ($realm_id > 0) { $auth_sql_query = ' SELECT COUNT(*) FROM ( SELECT realm_id FROM user_auth_realm AS uar WHERE uar.user_id = ? AND uar.realm_id = ?'; $auth_sql_params = array($_SESSION['sess_user_id'], $realm_id); /* Because we now expect installation to be done by authorized users, check the group_realm * * exists before using it as this may not be present if upgrading from pre-1.x */ if (db_table_exists('user_auth_group_realm') && db_table_exists('user_auth_group') && db_table_exists('user_auth_group_members')) { $auth_sql_query .= ' UNION SELECT realm_id FROM user_auth_group_realm AS uagr INNER JOIN user_auth_group_members AS uagm ON uagr.group_id=uagm.group_id INNER JOIN user_auth_group AS uag ON uag.id=uagr.group_id WHERE uag.enabled="on" AND uagm.user_id = ? AND uagr.realm_id = ?'; $auth_sql_params = array_merge($auth_sql_params, array($_SESSION['sess_user_id'], $realm_id)); } $auth_sql_query .= ' ) AS authorized'; $authorized = db_fetch_cell_prepared($auth_sql_query, $auth_sql_params); if (!$authorized) { auth_login_redirect(); } } else { $authorized = false; } if ($realm_id != -1 && !$authorized) { if (api_plugin_hook_function('custom_denied', OPER_MODE_NATIVE) == OPER_MODE_RESKIN) { exit; } if (isset($_SERVER['HTTP_REFERER'])) { $goBack = "[" . __('Return') . " | " . __('Login Again') . "]"; } else { $goBack = "[" . __('Login Again') . "]"; } raise_ajax_permission_denied(); $title_header = __('Permission Denied'); $title_body = '

    ' . __('You are not permitted to access this section of Cacti.') . '

    ' . __('If you feel that this is an error. Please contact your Cacti Administrator.'); if ($realm_id == 26) { $title_header = __('Installation In Progress'); $title_body = '

    ' . __('There is an Installation or Upgrade in progress.') . '

    ' . __('Only Cacti Administrators with Install/Upgrade privilege may login at this time') . '

    '; } print "\n"; print "\n"; print "\n"; html_common_header($title_header); print "\n"; print "
    " . $title_header . "
    " . $title_body . "

    " . $goBack . "
    " . __('Version') . ' ' . $version . " | " . COPYRIGHT_YEARS_SHORT . "
    \n"; include_once('global_session.php'); print " \n"; exit; } $current_user = db_fetch_row_prepared('SELECT * FROM user_auth WHERE id = ?', array($_SESSION['sess_user_id'])); } } cacti-release-1.2.19/include/bottom_footer.php000066400000000000000000000032541413633772300213400ustar00rootroot00000000000000\n\t\t\n\t\n"; if (!isset_request_var('pagecontent')) { api_plugin_hook('page_bottom'); print "\t\n\n"; } cacti-release-1.2.19/include/cacti_version000066400000000000000000000000071413633772300205110ustar00rootroot000000000000001.2.19 cacti-release-1.2.19/include/cli_check.php000066400000000000000000000041101413633772300203520ustar00rootroot00000000000000= 0) { ini_set('max_execution_time', $default_time); } include(__DIR__ . '/global.php'); cacti-release-1.2.19/include/config.php.dist000066400000000000000000000120631413633772300206630ustar00rootroot00000000000000This is the content of my page

    This can be any HTML

    cacti-release-1.2.19/include/content/iframe-example.html000066400000000000000000000004071413633772300231760ustar00rootroot00000000000000

    A quick example of using iframes to embed another site (e.g. your Nagios, or some other app?). IFRAME docs

    cacti-release-1.2.19/include/content/index.php000066400000000000000000000000501413633772300212260ustar00rootroot00000000000000
    cacti-release-1.2.19/include/csrf.php000066400000000000000000000020201413633772300174010ustar00rootroot00000000000000This script is only meant to run at the command line.'); } // define documentation table of contents define('CACTI_DOCUMENTATION_TOC', 'docs/Table-of-Contents.html'); /* Default database settings*/ $database_type = 'mysql'; $database_default = 'cacti'; $database_hostname = 'localhost'; $database_username = 'cactiuser'; $database_password = 'cactiuser'; $database_port = '3306'; $database_retries = 2; $database_ssl = false; $database_ssl_key = ''; $database_ssl_cert = ''; $database_ssl_ca = ''; $database_persist = true; /* Default session name - Session name must contain alpha characters */ $cacti_session_name = 'Cacti'; /* define default url path */ $url_path = '/cacti/'; /* disable log rotation setting */ $disable_log_rotation = false; $config = array(); /* Include configuration, or use the defaults */ if (file_exists(dirname(__FILE__) . '/config.php')) { if (!is_readable(dirname(__FILE__) . '/config.php')) { die('Configuration file include/config.php is present, but unreadable.' . PHP_EOL); } include(dirname(__FILE__) . '/config.php'); } if (isset($config['cacti_version'])) { die('Invalid include/config.php file detected.' . PHP_EOL); exit; } /* Set the poller_id */ if (isset($poller_id)) { $config['poller_id'] = $poller_id; } else { $config['poller_id'] = 1; } $db_var_defaults = array( 'database_type' => 'mysql', 'database_default' => NULL, 'database_hostname' => NULL, 'database_username' => NULL, 'database_password' => NULL, 'database_port' => '3306', 'database_retries' => 2, 'database_ssl' => false, 'database_ssl_key' => '', 'database_ssl_cert' => '', 'database_ssl_ca' => '', ); $db_var_prefixes = array(''); if ($config['poller_id'] > 1 || isset($rdatabase_hostname)) { $db_var_prefixes[] = 'r'; } $db_missing_vars = ''; foreach ($db_var_prefixes as $db_var_prefix) { foreach ($db_var_defaults as $db_var_name => $db_var_default) { $db_var_full = $db_var_prefix . $db_var_name; if (!isset($$db_var_full)) { if ($db_var_default !== NULL) { $$db_var_full = $db_var_default; } else { $db_missing_vars .= (($db_missing_vars == '') ? 'missing ' : ', ') . $db_var_full; } } } } if (!empty($db_missing_vars)) { die("config.php is $db_missing_vars" . PHP_EOL); } if (empty($url_path)) { /* define default url path */ $url_path = '/'; } /* set the local for international users */ setlocale(LC_CTYPE, 'en_US.UTF-8'); /* Files that do not need http header information - Command line scripts */ $no_http_header_files = array( 'add_device.php', 'add_graphs.php', 'add_perms.php', 'add_tree.php', 'boost_rrdupdate.php', 'cmd.php', 'cmd_realtime.php', 'copy_user.php', 'host_update_template.php', 'poller_automation.php', 'poller_boost.php', 'poller_commands.php', 'poller_dsstats.php', 'poller_export.php', 'poller_graphs_reapply_names.php', 'poller_maintenance.php', 'poller_output_empty.php', 'poller.php', 'poller_realtime.php', 'poller_recovery.php', 'poller_reindex_hosts.php', 'poller_reports.php', 'poller_spikekill.php', 'query_host_cpu.php', 'query_host_partitions.php', 'rebuild_poller_cache.php', 'repair_database.php', 'script_server.php', 'snmpagent_mibcachechild.php', 'snmpagent_mibcache.php', 'snmpagent_persist.php', 'sql.php', 'ss_host_cpu.php', 'ss_host_disk.php', 'ss_sql.php', 'structure_rra_paths.php', ); $colors = array(); /* this should be auto-detected, set it manually if needed */ $config['cacti_server_os'] = (strstr(PHP_OS, 'WIN')) ? 'win32' : 'unix'; if (!empty($path_csrf_secret)) { $config['path_csrf_secret'] = $path_csrf_secret; } /* built-in snmp support */ if (isset($php_snmp_support) && !$php_snmp_support) { $config['php_snmp_support'] = false; } else { $config['php_snmp_support'] = class_exists('SNMP'); } /* PHP binary location */ if (isset($php_path)) { $config['php_path'] = $php_path; } /* Set various debug fields */ $config['DEBUG_READ_CONFIG_OPTION'] = defined('DEBUG_READ_CONFIG_OPTION'); $config['DEBUG_READ_CONFIG_OPTION_DB_OPEN'] = defined('DEBUG_READ_CONFIG_OPTION_DB_OPEN'); $config['DEBUG_SQL_CMD'] = defined('DEBUG_SQL_CMD'); $config['DEBUG_SQL_FLOW'] = defined('DEBUG_SQL_FLOW'); /* check for an empty database port */ if (empty($database_port)) { $database_port = '3306'; } /* set URL path */ if (!isset($url_path)) { $url_path = ''; } $config['url_path'] = $url_path; define('URL_PATH', $url_path); /* used for includes */ if ($config['cacti_server_os'] == 'win32') { $config['base_path'] = str_replace("\\", "/", substr(dirname(__FILE__),0,-8)); $config['library_path'] = $config['base_path'] . '/lib'; } else { $config['base_path'] = preg_replace("/(.*)[\/]include/", "\\1", dirname(__FILE__)); $config['library_path'] = preg_replace("/(.*[\/])include/", "\\1lib", dirname(__FILE__)); } $config['include_path'] = dirname(__FILE__); $config['rra_path'] = $config['base_path'] . '/rra'; /* for multiple pollers, we need to know this location */ if (!isset($scripts_path)) { $config['scripts_path'] = $config['base_path'] . '/scripts'; } else { $config['scripts_path'] = $scripts_path; } if (!isset($resource_path)) { $config['resource_path'] = $config['base_path'] . '/resource'; } else { $config['resource_path'] = $resource_path; } if (isset($input_whitelist)) { $config['input_whitelist'] = $input_whitelist; } /* include base modules */ include_once($config['library_path'] . '/database.php'); include_once($config['library_path'] . '/functions.php'); include_once($config['include_path'] . '/global_constants.php'); include_once($config['library_path'] . '/html.php'); include_once($config['library_path'] . '/html_utility.php'); include_once($config['library_path'] . '/html_validate.php'); $filename = get_current_page(); $config['is_web'] = !defined('CACTI_CLI_ONLY'); if ((isset($no_http_headers) && $no_http_headers == true) || in_array($filename, $no_http_header_files, true)) { $config['is_web'] = false; } /* set poller mode */ global $local_db_cnn_id, $remote_db_cnn_id; $config['connection'] = 'online'; if ($config['poller_id'] > 1 || isset($rdatabase_hostname)) { $local_db_cnn_id = db_connect_real($database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port, $database_retries, $database_ssl, $database_ssl_key, $database_ssl_cert, $database_ssl_ca); if (!isset($rdatabase_retries)) $rdatabase_retries = 2; if (!isset($rdatabase_ssl)) $rdatabase_ssl = false; if (!isset($rdatabase_ssl_key)) $rdatabase_ssl_key = false; if (!isset($rdatabase_ssl_cert)) $rdatabase_ssl_cert = false; if (!isset($rdatabase_ssl_ca)) $rdatabase_ssl_ca = false; // Check for recovery if (is_object($local_db_cnn_id)) { $boost_records = db_fetch_cell('SELECT COUNT(*) FROM poller_output_boost', '', true, $local_db_cnn_id); if ($boost_records > 0) { $config['connection'] = 'recovery'; } } /* gather the existing cactidb version */ $config['cacti_db_version'] = db_fetch_cell('SELECT cacti FROM version LIMIT 1', false, $local_db_cnn_id); // We are a remote poller also try to connect to the remote database $remote_db_cnn_id = db_connect_real($rdatabase_hostname, $rdatabase_username, $rdatabase_password, $rdatabase_default, $rdatabase_type, $rdatabase_port, $database_retries, $rdatabase_ssl, $rdatabase_ssl_key, $rdatabase_ssl_cert, $rdatabase_ssl_ca); if ($config['is_web'] && is_object($remote_db_cnn_id) && $config['connection'] != 'recovery' && $config['cacti_db_version'] != 'new_install') { // Connection worked, so now override the default settings so that it will always utilize the remote connection $database_default = $rdatabase_default; $database_hostname = $rdatabase_hostname; $database_username = $rdatabase_username; $database_password = $rdatabase_password; $database_port = $rdatabase_port; $database_ssl = $rdatabase_ssl; $database_ssl_key = $rdatabase_ssl_key; $database_ssl_cert = $rdatabase_ssl_cert; $database_ssl_ca = $rdatabase_ssl_ca; } elseif (is_object($remote_db_cnn_id)) { if ($config['connection'] != 'recovery') { $config['connection'] = 'online'; } } else { $config['connection'] = 'offline'; } } else { if (!isset($database_ssl)) $database_ssl = false; if (!isset($database_ssl_key)) $database_ssl_key = false; if (!isset($database_ssl_cert)) $database_ssl_cert = false; if (!isset($database_ssl_ca)) $database_ssl_ca = false; if (!db_connect_real($database_hostname, $database_username, $database_password, $database_default, $database_type, $database_port, $database_retries, $database_ssl, $database_ssl_key, $database_ssl_cert, $database_ssl_ca)) { $ps = $config['is_web'] ? '

    ' : ''; $sp = $config['is_web'] ? '

    ' : PHP_EOL; $ul = $config['is_web'] ? '
      ' : PHP_EOL; $li = $config['is_web'] ? '
    • ' : PHP_EOL . ' - '; $lu = $config['is_web'] ? '
    ' : ''; $il = $config['is_web'] ? '' : ''; print $ps . 'FATAL: Connection to Cacti database failed. Please ensure: ' . $ul; print $li . 'the PHP MySQL module is installed and enabled.' . $il; print $li . 'the database is running.' . $il; print $li . 'the credentials in config.php are valid.' . $il; print $lu . $sp; if (isset($_REQUEST['display_db_errors']) & !empty($config['DATABASE_ERROR'])) { print $ps . 'The following database errors occurred: ' . $ul; foreach ($config['DATABASE_ERROR'] as $e) { print $li . $e['Code'] . ': ' . $e['Error'] . $il; } print $lu . $sp; } exit; } else { /* gather the existing cactidb version */ $config['cacti_db_version'] = db_fetch_cell('SELECT cacti FROM version LIMIT 1'); } } /* check cacti log is available */ $log_filename = cacti_log_file(); if (!is_resource_writable($log_filename)) { die('System log file is not available for writing, please enable write access' . PHP_EOL . 'Log: ' . $log_filename . PHP_EOL); } if ($config['poller_id'] > 1) { $timezone = db_fetch_cell_prepared('SELECT timezone FROM poller WHERE id = ?', array($config['poller_id'])); if ($timezone != '') { db_execute_prepared('SET time_zone = ?', array($timezone)); } } if (isset($cacti_db_session) && $cacti_db_session && db_table_exists('sessions')) { include(dirname(__FILE__) . '/session.php'); } else { $cacti_db_session = false; } if (!defined('IN_CACTI_INSTALL')) { set_error_handler('CactiErrorHandler'); register_shutdown_function('CactiShutdownHandler'); } /* verify the cacti database is initialized before moving past here */ db_cacti_initialized($config['is_web']); if ($config['is_web']) { if (read_config_option('force_https') == 'on') { if (!isset($_SERVER['HTTPS']) && isset($_SERVER['HTTP_HOST']) && isset($_SERVER['REQUEST_URI'])) { header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] . PHP_EOL . PHP_EOL); exit; } } /* set the maximum post size */ ini_set('post_max_size', '8M'); /* add additional cookie directives */ ini_set('session.cookie_httponly', true); ini_set('session.cookie_path', $config['url_path']); ini_set('session.use_strict_mode', true); $options = array( 'cookie_httponly' => true, 'cookie_path' => $config['url_path'], 'use_strict_mode' => true ); if (isset($cacti_cookie_domain) && $cacti_cookie_domain != '') { ini_set('session.cookie_domain', $cacti_cookie_domain); $options['cookie_domain'] = $cacti_cookie_domain; } // SameSite php7.3+ behavior if (version_compare(PHP_VERSION, '7.3', '>=')) { ini_set('session.cookie_samesite', 'Strict'); $options['cookie_samesite'] = 'Strict'; } if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { ini_set('session.cookie_secure', true); $options['cookie_secure'] = true; } $config['cookie_options'] = $options; $config['cacti_session_name'] = $cacti_session_name; /* we don't want these pages cached */ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('X-Frame-Options: SAMEORIGIN'); /* increased web hardening */ $script_policy = read_config_option('content_security_policy_script'); if ($script_policy == 'unsafe-eval') { $script_policy = "'$script_policy'"; } else { $script_policy = ''; } $alternates = html_escape(read_config_option('content_security_alternate_sources')); header("Content-Security-Policy: default-src *; img-src 'self' $alternates data: blob:; style-src 'self' 'unsafe-inline' $alternates; script-src 'self' $script_policy 'unsafe-inline' $alternates; frame-ancestors 'self'; worker-src 'self' $alternates;"); /* prevent IE from silently rejects cookies sent from third party sites. */ header('P3P: CP="CAO PSA OUR"'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: max-age=31536000'); cacti_session_start(); /* we never run with magic quotes on */ if (version_compare(PHP_VERSION, '5.4', '<=')) { if (get_magic_quotes_gpc()) { $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); foreach ($process as $key => $val) { foreach ($val as $k => $v) { unset($process[$key][$k]); if (is_array($v)) { $process[$key][stripslashes($k)] = $v; $process[] = &$process[$key][stripslashes($k)]; } else { $process[$key][stripslashes($k)] = stripslashes($v); } } } unset($process); } } /* make sure to start only only Cacti session at a time */ if (!isset($_SESSION['cacti_cwd'])) { $_SESSION['cacti_cwd'] = $config['base_path']; } else { if ($_SESSION['cacti_cwd'] != $config['base_path']) { cacti_session_destroy(); } } /* Sanitize the http referer */ if (isset($_SERVER['HTTP_REFERER'])) { $_SERVER['HTTP_REFERER'] = sanitize_uri($_SERVER['HTTP_REFERER']); } } /* emulate 'register_globals' = 'off' if turned on */ if ((bool)ini_get('register_globals')) { $not_unset = array('_GET', '_POST', '_COOKIE', '_SERVER', '_SESSION', '_ENV', '_FILES', 'database_type', 'database_default', 'database_hostname', 'database_username', 'database_password', 'config', 'colors'); /* Not only will array_merge give a warning if a parameter is not an array, it will * actually fail. So we check if HTTP_SESSION_VARS has been initialised. */ if (!isset($_SESSION)) { $_SESSION = array(); } /* Merge all into one extremely huge array; unset this later */ $input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_SESSION, $_ENV, $_FILES); unset($input['input']); unset($input['not_unset']); foreach ($input as $var => $val) { if (!in_array($var, $not_unset)) { unset($$var); } } unset($input); } define('CACTI_DATE_TIME_FORMAT', date_time_format()); include_once($config['include_path'] . '/global_languages.php'); include_once($config['library_path'] . '/auth.php'); include_once($config['library_path'] . '/plugins.php'); include_once($config['include_path'] . '/plugins.php'); include_once($config['include_path'] . '/global_arrays.php'); include_once($config['include_path'] . '/global_settings.php'); include_once($config['include_path'] . '/global_form.php'); include_once($config['library_path'] . '/html_form.php'); include_once($config['library_path'] . '/html_filter.php'); include_once($config['library_path'] . '/variables.php'); include_once($config['library_path'] . '/mib_cache.php'); include_once($config['library_path'] . '/poller.php'); include_once($config['library_path'] . '/snmpagent.php'); include_once($config['library_path'] . '/aggregate.php'); include_once($config['library_path'] . '/api_automation.php'); include_once($config['include_path'] . '/csrf.php'); if ($config['is_web']) { if (isset_request_var('newtheme')) { unset($_SESSION['selected_theme']); } if (isset_request_var('csrf_timeout')) { raise_message('csrf_ptimeout'); } /* check for save actions using GET */ if (isset_request_var('action')) { $action = get_nfilter_request_var('action'); $bad_actions = array('save', 'update_data', 'changepassword'); foreach($bad_actions as $bad) { if ($action == $bad && !isset($_POST['__csrf_magic'])) { cacti_log('WARNING: Attempt to use GET method for POST operations from IP ' . get_client_addr(), false, 'WEBUI'); exit; } } } if (isset($_COOKIE['CactiTimeZone'])) { $gmt_offset = $_COOKIE['CactiTimeZone']; cacti_time_zone_set($gmt_offset); } } api_plugin_hook('config_insert'); /* set config cacti_version for plugins */ $config['cacti_version'] = CACTI_VERSION;; cacti-release-1.2.19/include/global_arrays.php000066400000000000000000002366301413633772300213050ustar00rootroot00000000000000 'NaN', '0.8.1' => 'NaN', '0.8.2' => 'NaN', '0.8.2a' => 'NaN', '0.8.3' => 'NaN', '0.8.3a' => 'NaN', '0.8.4' => '0000', '0.8.5' => '0001', '0.8.5a' => '0002', '0.8.6' => '0003', '0.8.6a' => '0004', '0.8.6b' => '0005', '0.8.6c' => '0006', '0.8.6d' => '0007', '0.8.6e' => '0008', '0.8.6f' => '0009', '0.8.6g' => '0010', '0.8.6h' => '0011', '0.8.6i' => '0012', '0.8.6j' => '0013', '0.8.7' => '0014', '0.8.7a' => '0015', '0.8.7b' => '0016', '0.8.7c' => '0017', '0.8.7d' => '0018', '0.8.7e' => '0019', '0.8.7f' => '0020', '0.8.7g' => '0021', '0.8.7h' => '0022', '0.8.7i' => '0023', '0.8.8' => '0024', '0.8.8a' => '0024', '0.8.8b' => '0024', '0.8.8c' => '0025', '0.8.8d' => '0025', '0.8.8e' => '0025', '0.8.8f' => '0025', '0.8.8g' => '0025', '0.8.8h' => '0025', '1.0.0' => '0100', '1.0.1' => '0100', '1.0.2' => '0100', '1.0.3' => '0100', '1.0.4' => '0100', '1.0.5' => '0100', '1.0.6' => '0100', '1.1.0' => '0100', '1.1.1' => '0100', '1.1.2' => '0100', '1.1.3' => '0100', '1.1.4' => '0100', '1.1.5' => '0100', '1.1.6' => '0101', '1.1.7' => '0101', '1.1.8' => '0101', '1.1.9' => '0101', '1.1.10' => '0101', '1.1.11' => '0101', '1.1.12' => '0101', '1.1.13' => '0101', '1.1.14' => '0101', '1.1.15' => '0101', '1.1.16' => '0101', '1.1.17' => '0101', '1.1.18' => '0101', '1.1.19' => '0101', '1.1.20' => '0101', '1.1.21' => '0101', '1.1.22' => '0101', '1.1.23' => '0101', '1.1.24' => '0101', '1.1.25' => '0101', '1.1.26' => '0101', '1.1.27' => '0101', '1.1.28' => '0101', '1.1.29' => '0101', '1.1.30' => '0101', '1.1.31' => '0101', '1.1.32' => '0101', '1.1.33' => '0101', '1.1.34' => '0101', '1.1.35' => '0101', '1.1.36' => '0101', '1.1.37' => '0101', '1.1.38' => '0101', '1.2.0' => '0101', '1.2.1' => '0101', '1.2.2' => '0101', '1.2.3' => '0102', '1.2.4' => '0102', '1.2.5' => '0102', '1.2.6' => '0102', '1.2.7' => '0102', '1.2.8' => '0102', '1.2.9' => '0102', '1.2.10' => '0102', '1.2.11' => '0102', '1.2.12' => '0102', '1.2.13' => '0102', '1.2.14' => '0102', '1.2.15' => '0102', '1.2.16' => '0102', '1.2.17' => '0102', '1.2.18' => '0102', '1.2.19' => '0103', ); $messages = array( 1 => array( 'message' => __('Save Successful.'), 'level' => MESSAGE_LEVEL_INFO), 2 => array( 'message' => __('Save Failed.'), 'level' => MESSAGE_LEVEL_ERROR), 3 => array( 'message' => __('Save Failed due to field input errors (Check red fields).'), 'level' => MESSAGE_LEVEL_ERROR), 4 => array( 'message' => __('Passwords do not match, please retype.'), 'level' => MESSAGE_LEVEL_ERROR), 5 => array( 'message' => __('You must select at least one field.'), 'level' => MESSAGE_LEVEL_ERROR), 6 => array( 'message' => __('You must have built in user authentication turned on to use this feature.'), 'level' => MESSAGE_LEVEL_ERROR), 7 => array( 'message' => __('XML parse error.'), 'level' => MESSAGE_LEVEL_ERROR), 8 => array( 'message' => __('The directory highlighted does not exist. Please enter a valid directory.'), 'level' => MESSAGE_LEVEL_ERROR), 9 => array( 'message' => __('The Cacti log file must have the extension \'.log\''), 'level' => MESSAGE_LEVEL_ERROR), 10 => array( 'message' => __('Data Input for method does not appear to be whitelisted.'), 'level' => MESSAGE_LEVEL_ERROR), 11 => array( 'message' => __('Data Source does not exist.'), 'level' => MESSAGE_LEVEL_ERROR), 12 => array( 'message' => __('Username already in use.'), 'level' => MESSAGE_LEVEL_ERROR), 13 => array( 'message' => __('The SNMP v3 Privacy Passphrases do not match'), 'level' => MESSAGE_LEVEL_ERROR), 14 => array( 'message' => __('The SNMP v3 Authentication Passphrases do not match'), 'level' => MESSAGE_LEVEL_ERROR), 15 => array( 'message' => __('XML: Cacti version does not exist.'), 'level' => MESSAGE_LEVEL_ERROR), 16 => array( 'message' => __('XML: Hash version does not exist.'), 'level' => MESSAGE_LEVEL_ERROR), 17 => array( 'message' => __('XML: Generated with a newer version of Cacti.'), 'level' => MESSAGE_LEVEL_ERROR), 18 => array( 'message' => __('XML: Cannot locate type code.'), 'level' => MESSAGE_LEVEL_ERROR), 19 => array( 'message' => __('Username already exists.'), 'level' => MESSAGE_LEVEL_ERROR), 20 => array( 'message' => __('Username change not permitted for designated template or guest user.'), 'level' => MESSAGE_LEVEL_ERROR), 21 => array( 'message' => __('User delete not permitted for designated template or guest user.'), 'level' => MESSAGE_LEVEL_ERROR), 22 => array( 'message' => __('User delete not permitted for designated graph export user.'), 'level' => MESSAGE_LEVEL_ERROR), 23 => array( 'message' => __('Data Template includes deleted Data Source Profile. Please resave the Data Template with an existing Data Source Profile.'), 'level' => MESSAGE_LEVEL_ERROR), 24 => array( 'message' => __('Graph Template includes deleted GPrint Prefix. Please run database repair script to identify and/or correct.'), 'level' => MESSAGE_LEVEL_ERROR), 25 => array( 'message' => __('Graph Template includes deleted CDEFs. Please run database repair script to identify and/or correct.'), 'level' => MESSAGE_LEVEL_ERROR), 26 => array( 'message' => __('Graph Template includes deleted Data Input Method. Please run database repair script to identify.'), 'level' => MESSAGE_LEVEL_ERROR), 27 => array( 'message' => __('Data Template not found during Export. Please run database repair script to identify.'), 'level' => MESSAGE_LEVEL_ERROR), 28 => array( 'message' => __('Device Template not found during Export. Please run database repair script to identify.'), 'level' => MESSAGE_LEVEL_ERROR), 29 => array( 'message' => __('Data Query not found during Export. Please run database repair script to identify.'), 'level' => MESSAGE_LEVEL_ERROR), 30 => array( 'message' => __('Graph Template not found during Export. Please run database repair script to identify.'), 'level' => MESSAGE_LEVEL_ERROR), 31 => array( 'message' => __('Graph not found. Either it has been deleted or your database needs repair.'), 'level' => MESSAGE_LEVEL_ERROR), 32 => array( 'message' => __('SNMPv3 Auth Passphrases must be 8 characters or greater.'), 'level' => MESSAGE_LEVEL_ERROR), 33 => array( 'message' => __('Some Graphs not updated. Unable to change device for Data Query based Graphs.'), 'level' => MESSAGE_LEVEL_ERROR), 34 => array( 'message' => __('Unable to change device for Data Query based Graphs.'), 'level' => MESSAGE_LEVEL_ERROR), 35 => array( 'message' => __('Some settings not saved. Check messages below. Check red fields for errors.'), 'level' => MESSAGE_LEVEL_ERROR), 36 => array( 'message' => __('The file highlighted does not exist. Please enter a valid file name.'), 'level' => MESSAGE_LEVEL_ERROR), 37 => array( 'message' => __('All User Settings have been returned to their default values.'), 'level' => MESSAGE_LEVEL_INFO), 38 => array( 'message' => __('Suggested Field Name was not entered. Please enter a field name and try again.'), 'level' => MESSAGE_LEVEL_ERROR), 39 => array( 'message' => __('Suggested Value was not entered. Please enter a suggested value and try again.'), 'level' => MESSAGE_LEVEL_ERROR), 40 => array( 'message' => __('You must select at least one object from the list.'), 'level' => MESSAGE_LEVEL_ERROR), 41 => array( 'message' => __('Device Template updated. Remember to Sync Devices to push all changes to Devices that use this Device Template.'), 'level' => MESSAGE_LEVEL_INFO), 42 => array( 'message' => __('Save Successful. Settings replicated to Remote Data Collectors.'), 'level' => MESSAGE_LEVEL_INFO), 43 => array( 'message' => __('Save Failed. Minimum Values must be less than Maximum Value.'), 'level' => MESSAGE_LEVEL_ERROR), 44 => array( 'message' => __('Unable to change password. User account not found.'), 'level' => MESSAGE_LEVEL_ERROR), 'input_save_wo_ds' => array( 'message' => __('Data Input Saved. You must update the Data Templates referencing this Data Input Method before creating Graphs or Data Sources.'), 'level' => MESSAGE_LEVEL_INFO), 'input_save_w_ds' => array( 'message' => __('Data Input Saved. You must update the Data Templates referencing this Data Input Method before the Data Collectors will start using any new or modified Data Input Input Fields.'), 'level' => MESSAGE_LEVEL_INFO), 'input_field_save_wo_ds' => array( 'message' => __('Data Input Field Saved. You must update the Data Templates referencing this Data Input Method before creating Graphs or Data Sources.'), 'level' => MESSAGE_LEVEL_INFO), 'input_field_save_w_ds' => array( 'message' => __('Data Input Field Saved. You must update the Data Templates referencing this Data Input Method before the Data Collectors will start using any new or modified Data Input Input Fields.'), 'level' => MESSAGE_LEVEL_INFO), 'clog_invalid' => array( 'message' => __('Log file specified is not a Cacti log or archive file.'), 'level' => MESSAGE_LEVEL_INFO), 'clog_remove' => array( 'message' => __('Log file specified was Cacti archive file and was removed.'), 'level' => MESSAGE_LEVEL_INFO), 'clog_purged' => array( 'message' => __('Cacti log purged successfully'), 'level' => MESSAGE_LEVEL_INFO), 'password_change' => array( 'message' => __('If you force a password change, you must also allow the user to change their password.'), 'level' => MESSAGE_LEVEL_ERROR), 'nopassword' => array( 'message' => __('You are not allowed to change your password.'), 'level' => MESSAGE_LEVEL_ERROR), 'nopasswordlen' => array( 'message' => __('Unable to determine size of password field, please check permissions of db user'), 'level' => MESSAGE_LEVEL_ERROR), 'nopasswordinc' => array( 'message' => __('Unable to increase size of password field, pleas check permission of db user'), 'level' => MESSAGE_LEVEL_ERROR), 'nodomainpassword' => array( 'message' => __('LDAP/AD based password change not supported.'), 'level' => MESSAGE_LEVEL_ERROR), 'password_success' => array( 'message' => __('Password successfully changed.'), 'level' => MESSAGE_LEVEL_INFO), 'clog_permissions' => array( 'message' => __('Unable to clear log, no write permissions'), 'level' => MESSAGE_LEVEL_ERROR), 'clog_missing' => array( 'message' => __('Unable to clear log, file does not exist'), 'level' => MESSAGE_LEVEL_ERROR), 'csrf_timeout' => array( 'message' => __('CSRF Timeout, refreshing page.'), 'level' => MESSAGE_LEVEL_CSRF), 'csrf_ptimeout' => array( 'message' => __('CSRF Timeout occurred due to inactivity, page refreshed.'), 'level' => MESSAGE_LEVEL_ERROR), 'mg_mailtime_invalid' => array( 'message' => __('Invalid timestamp. Select timestamp in the future.'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_sync' => array( 'message' => __('Data Collector(s) synchronized for offline operation'), 'level' => MESSAGE_LEVEL_INFO), 'poller_notfound' => array( 'message' => __('Data Collector(s) not found when attempting synchronization'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_noconnect' => array( 'message' => __('Unable to establish MySQL connection with Remote Data Collector.'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_nosync' => array( 'message' => __('Data Collector synchronization must be initiated from the main Cacti server.'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_nomain' => array( 'message' => __('Synchronization does not include the Central Cacti Database server.'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_nodupe' => array( 'message' => __('When saving a Remote Data Collector, the Database Hostname must be unique from all others.'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_dbhost' => array( 'message' => __('Your Remote Database Hostname must be something other than \'localhost\' for each Remote Data Collector.'), 'level' => MESSAGE_LEVEL_ERROR), 'poller_paths' => array( 'message' => __('Path variables on this page were only saved locally.'), 'level' => MESSAGE_LEVEL_INFO), 'reports_save' => array( 'message' => __('Report Saved'), 'level' => MESSAGE_LEVEL_INFO), 'reports_save_failed' => array( 'message' => __('Report Save Failed'), 'level' => MESSAGE_LEVEL_ERROR), 'reports_item_save' => array( 'message' => __('Report Item Saved'), 'level' => MESSAGE_LEVEL_INFO), 'reports_item_save_failed' => array( 'message' => __('Report Item Save Failed'), 'level' => MESSAGE_LEVEL_ERROR), 'reports_graph_not_found' => array( 'message' => __('Graph was not found attempting to Add to Report'), 'level' => MESSAGE_LEVEL_ERROR), 'reports_not_owner' => array( 'message' => __('Unable to Add Graphs. Current user is not owner'), 'level' => MESSAGE_LEVEL_ERROR), 'reports_add_error' => array( 'message' => __('Unable to Add all Graphs. See error message for details.'), 'level' => MESSAGE_LEVEL_ERROR), 'reports_no_graph' => array( 'message' => __('You must select at least one Graph to add to a Report.'), 'level' => MESSAGE_LEVEL_ERROR), 'reports_graphs_added' => array( 'message' => __('All Graphs have been added to the Report. Duplicate Graphs with the same Timespan were skipped.'), 'level' => MESSAGE_LEVEL_INFO), 'resource_cache_rebuild' => array( 'message' => __('Poller Resource Cache cleared. Main Data Collector will rebuild at the next poller start, and Remote Data Collectors will sync afterwards.'), 'level' => MESSAGE_LEVEL_INFO), 'permission_denied' => array( 'message' => __('Permission Denied. You do not have permission to the requested action.'), 'level' => MESSAGE_LEVEL_ERROR), 'page_not_defined' => array( 'message' => __('Page is not defined. Therefore, it can not be displayed.'), 'level' => MESSAGE_LEVEL_ERROR), 'custom_error' => array( 'message' => __('Unexpected error occurred'), 'level' => MESSAGE_LEVEL_ERROR) ); $cdef_operators = array(1 => '+', '-', '*', '/', '%' ); $cdef_functions = array(1 => 'SIN', 'COS', 'LOG', 'EXP', 'FLOOR', 'CEIL', 'LT', 'LE', 'GT', 'GE', 'EQ', 'IF', 'MIN', 'MAX', 'LIMIT', 'DUP', 'EXC', 'POP', 'UN', 'UNKN', 'PREV', 'INF', 'NEGINF', 'NOW', 'TIME', 'LTIME' ); if (cacti_version_compare(get_rrdtool_version(), '1.8.0', '>=')) { $cdef_functions[] = 'ROUND'; } $vdef_functions = array(1 => 'MAXIMUM', 'MINIMUM', 'AVERAGE', 'STDEV', 'LAST', 'FIRST', 'TOTAL', 'PERCENT', 'PERCENTNAN', 'LSLSLOPE', 'LSLINT', 'LSLCORREL' ); $vdef_item_types = array( CVDEF_ITEM_TYPE_FUNCTION => __('Function'), CVDEF_ITEM_TYPE_SPEC_DS => __('Special Data Source'), CVDEF_ITEM_TYPE_STRING => __('Custom String'), ); $custom_vdef_data_source_types = array( // this may change as soon as RRDtool supports math in VDEF, until then only reference to CDEF may help 'CURRENT_DATA_SOURCE' => __('Current Graph Item Data Source'), ); $input_types = array( DATA_INPUT_TYPE_SNMP => __('SNMP Get'), // Action 0: DATA_INPUT_TYPE_SNMP_QUERY => __('SNMP Query'), DATA_INPUT_TYPE_SCRIPT => __('Script/Command'), // Action 1: DATA_INPUT_TYPE_SCRIPT_QUERY => __('Script Query'), // Action 1: DATA_INPUT_TYPE_PHP_SCRIPT_SERVER => __('Script Server'), DATA_INPUT_TYPE_QUERY_SCRIPT_SERVER => __('Script Server Query') ); $input_types_script = array( DATA_INPUT_TYPE_SCRIPT => __('Script/Command'), // Action 1: DATA_INPUT_TYPE_PHP_SCRIPT_SERVER => __('Script Server'), ); $reindex_types = array( DATA_QUERY_AUTOINDEX_NONE => __('None'), DATA_QUERY_AUTOINDEX_BACKWARDS_UPTIME => __('Uptime'), DATA_QUERY_AUTOINDEX_INDEX_NUM_CHANGE => __('Index Count'), DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION => __('Verify All') ); $reindex_types_tips = array( DATA_QUERY_AUTOINDEX_NONE => __('All Re-Indexing will be manual or managed through scripts or Device Automation.'), DATA_QUERY_AUTOINDEX_BACKWARDS_UPTIME => __('When the Devices SNMP uptime goes backward, a Re-Index will be performed.'), DATA_QUERY_AUTOINDEX_INDEX_NUM_CHANGE => __('When the Data Query index count changes, a Re-Index will be performed.'), DATA_QUERY_AUTOINDEX_FIELD_VERIFICATION => __('Every polling cycle, a Re-Index will be performed. Very expensive.') ); $snmp_query_field_actions = array(1 => __('SNMP Field Name (Dropdown)'), __('SNMP Field Value (From User)'), __('SNMP Output Type (Dropdown)') ); $consolidation_functions = array(1 => 'AVERAGE', 'MIN', 'MAX', 'LAST' ); $data_source_types = array( 1 => 'GAUGE', 2 => 'COUNTER', 3 => 'DERIVE', 4 => 'ABSOLUTE', 5 => 'COMPUTE' ); if (cacti_version_compare(get_rrdtool_version(), '1.5', '>=')) { $data_source_types[6] = 'DCOUNTER'; $data_source_types[7] = 'DDERIVE'; } $rrd_font_render_modes = array( RRD_FONT_RENDER_NORMAL => __('Normal'), RRD_FONT_RENDER_LIGHT => __('Light'), RRD_FONT_RENDER_MONO => __('Mono'), ); $rrd_graph_render_modes = array( RRD_GRAPH_RENDER_NORMAL => __('Normal'), RRD_GRAPH_RENDER_MONO => __('Mono'), ); $rrd_legend_position = array( RRD_LEGEND_POS_NORTH => __('North'), RRD_LEGEND_POS_SOUTH => __('South'), RRD_LEGEND_POS_WEST => __('West'), RRD_LEGEND_POS_EAST => __('East'), ); $rrd_textalign = array( RRD_ALIGN_NONE => __('None'), RRD_ALIGN_LEFT => __('Left'), RRD_ALIGN_RIGHT => __('Right'), RRD_ALIGN_JUSTIFIED => __('Justified'), RRD_ALIGN_CENTER => __('Center'), ); $rrd_legend_direction = array( RRD_LEGEND_DIR_TOPDOWN => __('Top -> Down'), RRD_LEGEND_DIR_BOTTOMUP => __('Bottom -> Up'), ); $rrd_axis_formatters = array( 'numeric' => __('Numeric'), 'timestamp' => __('Timestamp'), 'duration' => __('Duration') ); $graph_item_types = array( GRAPH_ITEM_TYPE_COMMENT => 'COMMENT', GRAPH_ITEM_TYPE_HRULE => 'HRULE', GRAPH_ITEM_TYPE_VRULE => 'VRULE', GRAPH_ITEM_TYPE_LINE1 => 'LINE1', GRAPH_ITEM_TYPE_LINE2 => 'LINE2', GRAPH_ITEM_TYPE_LINE3 => 'LINE3', GRAPH_ITEM_TYPE_AREA => 'AREA', GRAPH_ITEM_TYPE_STACK => 'AREA:STACK', GRAPH_ITEM_TYPE_GPRINT => 'GPRINT', GRAPH_ITEM_TYPE_GPRINT_AVERAGE => 'GPRINT:AVERAGE', GRAPH_ITEM_TYPE_GPRINT_LAST => 'GPRINT:LAST', GRAPH_ITEM_TYPE_GPRINT_MAX => 'GPRINT:MAX', GRAPH_ITEM_TYPE_GPRINT_MIN => 'GPRINT:MIN', GRAPH_ITEM_TYPE_LEGEND => 'LEGEND', GRAPH_ITEM_TYPE_LEGEND_CAMM => 'LEGEND_CAMM', GRAPH_ITEM_TYPE_LINESTACK => 'LINE:STACK', GRAPH_ITEM_TYPE_TIC => 'TICK', GRAPH_ITEM_TYPE_TEXTALIGN => 'TEXTALIGN', ); asort($graph_item_types); $image_types = array( 1 => 'PNG', 3 => 'SVG' ); $snmp_security_levels = array( 'noAuthNoPriv' => 'noAuthNoPriv', 'authNoPriv' => 'authNoPriv', 'authPriv' => 'authPriv' ); $snmp_versions = array(0 => __('Not In Use'), __('Version %d', 1), __('Version %d', 2), __('Version %d', 3) ); $snmp_auth_protocols = array( '[None]' => __('[None]'), 'MD5' => __('MD5'), 'SHA' => __('SHA'), 'SHA224' => __('SHA-224'), 'SHA256' => __('SHA-256'), 'SHA392' => __('SHA-392'), 'SHA512' => __('SHA-512'), ); $snmp_priv_protocols = array( '[None]' => __('[None]'), 'DES' => __('DES'), 'AES128' => __('AES-128'), 'AES192' => __('AES-192'), 'AES256' => __('AES-256') ); $banned_snmp_strings = array( 'End of MIB', 'No Such' ); $logfile_options = array(1 => __('Logfile Only'), __('Logfile and Syslog/Eventlog'), __('Syslog/Eventlog Only') ); $availability_options = array( AVAIL_NONE => __('None'), AVAIL_SNMP_AND_PING => __('Ping and SNMP Uptime'), AVAIL_SNMP_OR_PING => __('Ping or SNMP Uptime'), AVAIL_SNMP => __('SNMP Uptime'), AVAIL_SNMP_GET_SYSDESC => __('SNMP Desc'), AVAIL_SNMP_GET_NEXT => __('SNMP getNext'), AVAIL_PING => __('Ping') ); $ping_methods = array( PING_ICMP => __('ICMP Ping'), PING_TCP => __('TCP Ping'), PING_UDP => __('UDP Ping') ); $logfile_verbosity = array( POLLER_VERBOSITY_NONE => __('NONE - Syslog Only if Selected'), POLLER_VERBOSITY_LOW => __('LOW - Statistics and Errors'), POLLER_VERBOSITY_MEDIUM => __('MEDIUM - Statistics, Errors and Results'), POLLER_VERBOSITY_HIGH => __('HIGH - Statistics, Errors, Results and Major I/O Events'), POLLER_VERBOSITY_DEBUG => __('DEBUG - Statistics, Errors, Results, I/O and Program Flow'), POLLER_VERBOSITY_DEVDBG => __('DEVEL - Developer DEBUG Level') ); $poller_options = array( 1 => 'cmd.php', 2 => 'spine' ); if (!file_exists(read_config_option('path_spine')) || !is_executable(read_config_option('path_spine'))) { unset($poller_options[2]); } $aggregation_levels = array( 1 => __('Selected Poller Interval'), 30 => __('%d Seconds', 30), 60 => __('1 Minute'), 300 => __('%d Minutes', 5), 600 => __('%d Minutes', 10), 900 => __('%d Minutes', 15), 1800 => __('%d Minutes', 30), 3600 => __('1 Hour'), 7200 => __('%d Hours', 2), 10800 => __('%d Hours', 3), 14400 => __('%d Hours', 4), 21600 => __('%d Hours', 6), 43200 => __('%d Hours', 12), 86400 => __('%d Day', 1), 604800 => __('%d Week', 1) ); $sampling_intervals = array( 10 => __('Every %d Seconds', 10), 15 => __('Every %d Seconds', 15), 20 => __('Every %d Seconds', 20), 30 => __('Every %d Seconds', 30), 60 => __('Every Minute'), 300 => __('Every %d Minutes', 5), 600 => __('Every %d Minutes', 10), 900 => __('Every %d Minutes', 15), 1200 => __('Every %d Minutes', 20), 1800 => __('Every %d Minutes', 30), 3600 => __('Every Hour'), 7200 => __('Every %d Hours', 2), 14400 => __('Every %d Hours', 4), 28800 => __('Every %d Hours', 8), 43200 => __('Every %d Hours', 12), 86400 => __('Every %d Day', 1) ); $heartbeats = array( 20 => __('%d Seconds', 20), 30 => __('%d Seconds', 30), 40 => __('%d Seconds', 40), 60 => __('%d Minute', 1), 120 => __('%d Minutes', 2), 300 => __('%d Minutes', 5), 600 => __('%d Minutes', 10), 1200 => __('%d Minutes', 20), 1800 => __('%d Minutes', 30), 2400 => __('%d Minutes', 40), 3600 => __('%d Hour', 1), 7200 => __('%d Hours', 2), 14400 => __('%d Hours', 4), 28800 => __('%d Hours', 8), 57600 => __('%d Hours', 16), 86400 => __('%d Day', 1), 172800 => __('%d Days', 2) ); $timespans = array( 3600 => __('%d Hour', 1), 7200 => __('%d Hours', 2), 14400 => __('%d Hours', 4), 21600 => __('%d Hours', 6), 43200 => __('%d Hours', 12), 86400 => __('%d Day', 1), 172800 => __('%d Days', 2), 345600 => __('%d Days', 4), 604800 => __('%d Week', 1), 1209600 => __('%d Weeks', 2), 1814400 => __('%d Weeks', 3), 2618784 => __('%d Month', 1), 5237568 => __('%d Months', 2), 7856352 => __('%d Months', 3), 10475136 => __('%d Months', 4), 15712704 => __('%d Months', 6), 31536000 => __('%d Year', 1), 63072000 => __('%d Years', 2), 94608000 => __('%d Years', 3), 126144000 => __('%d Years', 4), 157680000 => __('%d Years', 5), 189216000 => __('%d Years', 6), 220752000 => __('%d Years', 7), 252288000 => __('%d Years', 8), 283824000 => __('%d Years', 9), 315360000 => __('%d Years', 10) ); $poller_intervals = array( 10 => __('Every %d Seconds', 10), 15 => __('Every %d Seconds', 15), 20 => __('Every %d Seconds', 20), 30 => __('Every %d Seconds', 30), 60 => __('Every Minute'), 300 => __('Every %d Minutes', 5) ); $poller_sync_intervals = array( 0 => __('Disabled/Manual'), 1800 => __('Every %d Minutes', 30), 3600 => __('Every Hour'), 7200 => __('Every %d Hours', 2), 14400 => __('Every %d Hours', 4), 28800 => __('Every %d Hours', 8), 57600 => __('Every %d Hours', 16), 86400 => __('Every day'), ); $device_threads = array( 1 => __('1 Thread (default)'), 2 => __('%d Threads', 2), 3 => __('%d Threads', 3), 4 => __('%d Threads', 4), 5 => __('%d Threads', 5), 6 => __('%d Threads', 6), 7 => __('%d Threads', 7), 8 => __('%d Threads', 8), 9 => __('%d Threads', 9), 10 => __('%d Threads', 10) ); $cron_intervals = array( 60 => __('Every Minute'), 300 => __('Every %d Minutes', 5) ); $registered_cacti_names = array( 'path_cacti' ); $graph_views = array(1 => __('Tree View'), __('List View'), __('Preview View') ); $auth_methods = array( 1 => __('Builtin Authentication'), 2 => __('Web Basic Authentication') ); if (function_exists('ldap_connect')) { $auth_methods[3] = __('LDAP Authentication'); $auth_methods[4] = __('Multiple LDAP/AD Domains'); } $domain_types = array( '1' => __('LDAP'), '2' => __('Active Directory') ); $auth_realms = get_auth_realms(); $ldap_versions = array( 2 => __('Version %d', 2), 3 => __('Version %d', 3) ); $ldap_encryption = array( 0 => __('None'), 1 => __('LDAPS'), 2 => __('LDAP + TLS') ); $ldap_tls_cert_req = array( LDAP_OPT_X_TLS_NEVER => __('Never'), LDAP_OPT_X_TLS_HARD => __('Hard'), LDAP_OPT_X_TLS_DEMAND => __('Demand'), LDAP_OPT_X_TLS_ALLOW => __('Allow'), LDAP_OPT_X_TLS_TRY => __('Try') ); $ldap_modes = array( 0 => __('No Searching'), 1 => __('Anonymous Searching'), 2 => __('Specific Searching') ); $rrdtool_versions = array( '1.3.0' => 'RRDtool 1.3+', '1.4.0' => 'RRDtool 1.4+', '1.5.0' => 'RRDtool 1.5+', '1.6.0' => 'RRDtool 1.6+', '1.7.0' => 'RRDtool 1.7+', '1.7.1' => 'RRDtool 1.7.1+', '1.7.2' => 'RRDtool 1.7.2+', '1.8.0' => 'RRDtool 1.8+' ); $i18n_modes = array( 0 => __('Disabled'), 1 => __('Enabled'), 2 => __('Enabled (strict mode)'), ); $cdef_item_types = array( CVDEF_ITEM_TYPE_FUNCTION => __('Function'), CVDEF_ITEM_TYPE_OPERATOR => __('Operator'), CVDEF_ITEM_TYPE_SPEC_DS => __('Special Data Source'), CVDEF_ITEM_TYPE_CDEF => __('Another CDEF'), CVDEF_ITEM_TYPE_STRING => __('Custom String') ); $graph_color_alpha = array( '00' => ' 0%', '19' => ' 10%', '33' => ' 20%', '4C' => ' 30%', '66' => ' 40%', '7F' => ' 50%', '99' => ' 60%', 'B2' => ' 70%', 'CC' => ' 80%', 'E5' => ' 90%', 'FF' => '100%' ); $tree_sort_types = array( TREE_ORDERING_INHERIT => __('Inherit Parent Sorting'), TREE_ORDERING_NONE => __('Manual Ordering (No Sorting)'), TREE_ORDERING_ALPHABETIC => __('Alphabetic Ordering'), TREE_ORDERING_NATURAL => __('Natural Ordering'), TREE_ORDERING_NUMERIC => __('Numeric Ordering') ); $tree_item_types = array( TREE_ITEM_TYPE_HEADER => __('Header'), TREE_ITEM_TYPE_GRAPH => __('Graph'), TREE_ITEM_TYPE_HOST => __('Device') ); $host_group_types = array( HOST_GROUPING_GRAPH_TEMPLATE => __('Graph Template'), HOST_GROUPING_DATA_QUERY_INDEX => __('Data Query Index') ); $custom_data_source_types = array( 'CURRENT_DATA_SOURCE' => __('Current Graph Item Data Source'), 'CURRENT_DATA_SOURCE_PI' => __('Current Graph Item Polling Interval'), 'ALL_DATA_SOURCES_NODUPS' => __('All Data Sources (Do not Include Duplicates)'), 'ALL_DATA_SOURCES_DUPS' => __('All Data Sources (Include Duplicates)'), 'SIMILAR_DATA_SOURCES_NODUPS' => __('All Similar Data Sources (Do not Include Duplicates)'), 'SIMILAR_DATA_SOURCES_NODUPS_PI' => __('All Similar Data Sources (Do not Include Duplicates) Polling Interval'), 'SIMILAR_DATA_SOURCES_DUPS' => __('All Similar Data Sources (Include Duplicates)'), 'CURRENT_DS_MINIMUM_VALUE' => __('Current Data Source Item: Minimum Value'), 'CURRENT_DS_MAXIMUM_VALUE' => __('Current Data Source Item: Maximum Value'), 'CURRENT_GRAPH_MINIMUM_VALUE' => __('Graph: Lower Limit'), 'CURRENT_GRAPH_MAXIMUM_VALUE' => __('Graph: Upper Limit'), 'COUNT_ALL_DS_NODUPS' => __('Count of All Data Sources (Do not Include Duplicates)'), 'COUNT_ALL_DS_DUPS' => __('Count of All Data Sources (Include Duplicates)'), 'COUNT_SIMILAR_DS_NODUPS' => __('Count of All Similar Data Sources (Do not Include Duplicates)'), 'COUNT_SIMILAR_DS_DUPS' => __('Count of All Similar Data Sources (Include Duplicates)') ); if ($config['poller_id'] == 1 || $config['connection'] == 'online') { $menu = array( __('Main Console') => array( 'index.php' => __('Console Page') ), __('Create') => array( 'graphs_new.php' => __('New Graphs'), 'host.php?action=edit&create=true' => __('New Device') ), __('Management') => array( 'host.php' => __('Devices'), 'sites.php' => __('Sites'), 'tree.php' => __('Trees'), 'graphs.php' => __('Graphs'), 'data_sources.php' => __('Data Sources'), 'aggregate_graphs.php' => __('Aggregates'), ), __('Data Collection') => array( 'pollers.php' => __('Data Collectors'), 'data_queries.php' => __('Data Queries'), 'data_input.php' => __('Data Input Methods') ), __('Templates') => array( 'host_templates.php' => __('Device'), 'graph_templates.php' => __('Graph'), 'data_templates.php' => __('Data Source'), 'aggregate_templates.php' => __('Aggregate'), 'color_templates.php' => __('Color') ), __('Automation') => array( 'automation_networks.php' => __('Networks'), 'automation_devices.php' => __('Discovered Devices'), 'automation_templates.php' => __('Device Rules'), 'automation_graph_rules.php' => __('Graph Rules'), 'automation_tree_rules.php' => __('Tree Rules'), 'automation_snmp.php' => __('SNMP Options'), ), __('Presets') => array( 'data_source_profiles.php' => __('Data Profiles'), 'cdef.php' => __('CDEFs'), 'vdef.php' => __('VDEFs'), 'color.php' => __('Colors'), 'gprint_presets.php' => __('GPRINTs') ), __('Import/Export') => array( 'templates_import.php' => __('Import Templates'), 'templates_export.php' => __('Export Templates') ), __('Configuration') => array( 'settings.php' => __('Settings'), 'user_admin.php' => __('Users'), 'user_group_admin.php' => __('User Groups'), 'user_domains.php' => __('User Domains') ), __('Utilities') => array( 'utilities.php' => __('System Utilities'), 'links.php' => __('External Links'), ), __('Troubleshooting') => array( 'data_debug.php' => __('Data Sources'), ) ); } else { $menu = array( __('Management') => array( 'host.php' => __('Devices') ), __('Data Collection') => array( 'pollers.php' => __('Data Collectors') ), __('Configuration') => array( 'settings.php' => __('Settings') ), __('Utilities') => array( 'utilities.php' => __('System Utilities') ) ); } $menu_glyphs = array( __('Main Console') => 'fa fa-map', __('Create') => 'fa fa-chart-area', __('Management') => 'fa fa-home', __('Data Collection') => 'fa fa-database', __('Templates') => 'fa fa-clone', __('Automation') => 'fab fa-superpowers', __('Presets') => 'fa fa-archive', __('Import/Export') => 'fa fa-exchange-alt', __('Configuration') => 'fa fa-sliders-h', __('Utilities') => 'fa fa-cogs', __('External Links') => 'fa fa-external-link-alt', __('Support') => 'fa fa-question-circle', __('Troubleshooting') => 'fa fa-bug' ); if ((isset($_SESSION['sess_user_id']))) { if (db_table_exists('external_links')) { $consoles = db_fetch_assoc('SELECT id, title, extendedstyle FROM external_links WHERE style="CONSOLE" AND enabled="on" ORDER BY extendedstyle, sortorder, id'); if (cacti_sizeof($consoles)) { foreach ($consoles as $page) { if (is_realm_allowed($page['id']+10000)) { $menuname = (isset($page['extendedstyle']) && $page['extendedstyle'] != '' ? $page['extendedstyle'] : __('External Links')); $menu[$menuname]['link.php?id=' . $page['id']] = $page['title']; } } } } } $log_tail_lines = array( -1 => __('All Lines'), 10 => __('%d Lines', 10), 15 => __('%d Lines', 15), 20 => __('%d Lines', 20), 50 => __('%d Lines', 50), 100 => __('%d Lines', 100), 200 => __('%d Lines', 200), 500 => __('%d Lines', 500), 1000 => __('%d Lines', 1000), 2000 => __('%d Lines', 2000), 3000 => __('%d Lines', 3000), 5000 => __('%d Lines', 5000), 10000 => __('%d Lines', 10000) ); $item_rows = array( 10 => '10', 15 => '15', 16 => '16', 17 => '17', 18 => '18', 19 => '19', 20 => '20', 21 => '21', 22 => '22', 23 => '23', 24 => '24', 25 => '25', 26 => '26', 27 => '27', 30 => '30', 40 => '40', 44 => '44', 45 => '45', 50 => '50', 100 => '100', 250 => '250', 500 => '500', 750 => '750', 1000 => '1000', 2000 => '2000', 3000 => '3000', 4000 => '4000', 5000 => '5000', ); // Adjust the number of items rows based upon max_input_vars $max_size = ini_get('max_input_vars') - 20; foreach($item_rows as $index => $row) { if ($index > $max_size) { unset($item_rows[$index]); } } $graphs_per_page = array( 4 => '4', 6 => '6', 8 => '8', 9 => '9', 10 => '10', 12 => '12', 14 => '14', 15 => '15', 16 => '16', 18 => '18', 20 => '20', 24 => '24', 25 => '25', 27 => '27', 28 => '28', 30 => '30', 32 => '32', 35 => '35', 40 => '40', 50 => '50', 100 => '100' ); $page_refresh_interval = array( 5 => __('%d Seconds', 5), 10 => __('%d Seconds', 10), 20 => __('%d Seconds', 20), 30 => __('%d Seconds', 30), 60 => __('1 Minute'), 300 => __('%d Minutes', 5), 600 => __('%d Minutes', 10), 9999999 => __('Never') ); $user_auth_realms = array( 8 => __('Console Access'), 7 => __('View Graphs'), 25 => __('Realtime Graphs'), 20 => __('Update Profile'), 24 => __('External Links'), 1 => __('Users/Groups'), 15 => __('Settings/Utilities'), 23 => __('Automation'), 26 => __('Installation/Upgrades'), 2 => __('Data Input Methods'), 13 => __('Data Queries'), 3 => __('Sites/Devices/Data'), 5 => __('Graphs'), 4 => __('Trees'), 1043 => __('Spike Handling'), 9 => __('Data Source Profiles'), 14 => __('Presets'), 10 => __('Graph Templates'), 11 => __('Data Templates'), 12 => __('Device Templates'), 16 => __('Export Templates'), 17 => __('Import Templates'), 18 => __('Log Administration'), 19 => __('Log Viewing'), 21 => __('Reports Administration'), 22 => __('Reports Creation'), 27 => __('Show Graph Action Icons'), 28 => __('Show User Help Links'), 101 => __('Plugin Administration') ); $user_auth_roles = array( __('Normal User') => array(7, 19, 20, 22, 24, 25, 27, 28), __('Template Editor') => array(8, 2, 9, 10, 11, 12, 13, 14, 16, 17), __('General Administration') => array(8, 3, 4, 5, 23, 1043), __('System Administration') => array(8, 15, 26, 1, 18, 21, 101) ); $user_auth_realm_filenames = array( 'about.php' => 8, 'cdef.php' => 14, 'clog.php' => 18, 'clog_user.php' => 19, 'color.php' => 5, 'data_debug.php' => 15, 'data_input.php' => 2, 'data_sources.php' => 3, 'data_source_profiles.php' => 9, 'data_templates.php' => 11, 'gprint_presets.php' => 5, 'graph.php' => 7, 'graph_image.php' => 7, 'graph_json.php' => 7, 'graph_xport.php' => 7, 'graph_templates.php' => 10, 'graph_templates_inputs.php' => 10, 'graph_templates_items.php' => 10, 'graph_view.php' => 7, 'graph_realtime.php' => 25, 'graphs.php' => 5, 'graphs_items.php' => 5, 'graphs_new.php' => 5, 'sites.php' => 3, 'pollers.php' => 3, 'host.php' => 3, 'host_templates.php' => 12, 'index.php' => 8, 'install.php' => 26, 'step_json.php' => 26, 'managers.php' => 15, 'rrdcleaner.php' => 15, 'settings.php' => 15, 'links.php' => 15, 'data_queries.php' => 13, 'templates_export.php' => 16, 'templates_import.php' => 17, 'tree.php' => 4, 'user_admin.php' => 1, 'user_domains.php' => 1, 'user_group_admin.php' => 1, 'utilities.php' => 15, 'vdef.php' => 14, 'smtp_servers.php' => 8, 'email_templates.php' => 8, 'event_queue.php' => 8, 'smtp_queue.php' => 8, 'logout.php' => -1, 'auth_profile.php' => 20, 'auth_changepassword.php' => -1, 'reports_user.php' => 21, 'reports_admin.php' => 22, 'automation_graph_rules.php' => 23, 'automation_tree_rules.php' => 23, 'automation_templates.php' => 23, 'automation_networks.php' => 23, 'automation_devices.php' => 23, 'automation_snmp.php' => 23, 'color_templates.php' => 5, 'color_templates_items.php' => 5, 'aggregate_templates.php' => 5, 'aggregate_graphs.php' => 5, 'aggregate_items.php' => 5, 'spikekill.php' => 1043, 'permission_denied.php' => -1 ); $hash_type_codes = array( 'round_robin_archive' => '15', 'cdef' => '05', 'cdef_item' => '14', 'gprint_preset' => '06', 'data_input_method' => '03', 'data_input_field' => '07', 'data_template' => '01', 'data_template_item' => '08', 'graph_template' => '00', 'graph_template_item' => '10', 'graph_template_input' => '09', 'data_query' => '04', 'data_query_graph' => '11', 'data_query_sv_graph' => '12', 'data_query_sv_data_source' => '13', 'host_template' => '02', 'vdef' => '18', 'vdef_item' => '19', 'data_source_profile' => '20' ); $hash_type_names = array( 'cdef' => __('CDEF'), 'cdef_item' => __('CDEF Item'), 'gprint_preset' => __('GPRINT Preset'), 'data_template' => __('Data Template'), 'data_input_method' => __('Data Input Method'), 'data_input_field' => __('Data Input Field'), 'data_source_profile' => __('Data Source Profile'), 'data_template_item' => __('Data Template Item'), 'graph_template' => __('Graph Template'), 'graph_template_item' => __('Graph Template Item'), 'graph_template_input' => __('Graph Template Input'), 'data_query' => __('Data Query'), 'host_template' => __('Device Template'), 'vdef' => __('VDEF'), 'vdef_item' => __('VDEF Item') ); $hash_system_data_inputs = array( '3eb92bb845b9660a7445cf9740726522', // Get SNMP Data 'bf566c869ac6443b0c75d1c32b5a350e', // Get SNMP Data (Indexed) '80e9e4c4191a5da189ae26d0e237f015', // Get Script Data (Indexed) '332111d8b54ac8ce939af87a7eac0c06' // Get Script Server Data (Indexed) ); $host_struc = array( 'host_template_id', 'description', 'hostname', 'site_id', 'poller_id', 'notes', 'snmp_community', 'snmp_version', 'snmp_username', 'snmp_password', 'snmp_auth_protocol', 'snmp_priv_passphrase', 'snmp_priv_protocol', 'snmp_context', 'snmp_engine_id', 'snmp_port', 'snmp_timeout', 'max_oids', 'bulk_walk_size', 'device_threads', 'availability_method', 'location', 'external_id', 'ping_method', 'ping_port', 'ping_timeout', 'ping_retries', 'disabled', 'status', 'status_event_count', 'status_fail_date', 'status_rec_date', 'status_last_error', 'min_time', 'max_time', 'cur_time', 'avg_time', 'total_polls', 'failed_polls', 'availability' ); $graph_timespans = array( GT_LAST_HALF_HOUR => __('Last Half Hour'), GT_LAST_HOUR => __('Last Hour'), GT_LAST_2_HOURS => __('Last %d Hours', 2), GT_LAST_4_HOURS => __('Last %d Hours', 4), GT_LAST_6_HOURS => __('Last %d Hours', 6), GT_LAST_12_HOURS => __('Last %d Hours', 12), GT_LAST_DAY => __('Last Day'), GT_LAST_2_DAYS => __('Last %d Days', 2), GT_LAST_3_DAYS => __('Last %d Days', 3), GT_LAST_4_DAYS => __('Last %d Days', 4), GT_LAST_WEEK => __('Last Week'), GT_LAST_2_WEEKS => __('Last %d Weeks', 2), GT_LAST_MONTH => __('Last Month'), GT_LAST_2_MONTHS => __('Last %d Months', 2), GT_LAST_3_MONTHS => __('Last %d Months', 3), GT_LAST_4_MONTHS => __('Last %d Months', 4), GT_LAST_6_MONTHS => __('Last %d Months', 6), GT_LAST_YEAR => __('Last Year'), GT_LAST_2_YEARS => __('Last %d Years', 2), GT_DAY_SHIFT => __('Day Shift'), GT_THIS_DAY => __('This Day'), GT_THIS_WEEK => __('This Week'), GT_THIS_MONTH => __('This Month'), GT_THIS_YEAR => __('This Year'), GT_PREV_DAY => __('Previous Day'), GT_PREV_WEEK => __('Previous Week'), GT_PREV_MONTH => __('Previous Month'), GT_PREV_YEAR => __('Previous Year') ); // ***** MUST BE KEPT IN SYNC WITH graph_timeshifts_vals ********* $graph_timeshifts = array( GTS_HALF_HOUR => __('%d Min', 30), GTS_1_HOUR => __('%d Hour', 1), GTS_2_HOURS => __('%d Hours', 2), GTS_4_HOURS => __('%d Hours', 4), GTS_6_HOURS => __('%d Hours', 6), GTS_12_HOURS => __('%d Hours', 12), GTS_1_DAY => __('%d Day', 1), GTS_2_DAYS => __('%d Days', 2), GTS_3_DAYS => __('%d Days', 3), GTS_4_DAYS => __('%d Days', 4), GTS_1_WEEK => __('%d Week', 1), GTS_2_WEEKS => __('%d Weeks', 2), GTS_1_MONTH => __('%d Month', 1), GTS_2_MONTHS => __('%d Months', 2), GTS_3_MONTHS => __('%d Months', 3), GTS_4_MONTHS => __('%d Months', 4), GTS_6_MONTHS => __('%d Months', 6), GTS_1_YEAR => __('%d Year', 1), GTS_2_YEARS => __('%d Years', 2) ); // ***** MUST BE KEPT IN SYNC WITH graph_timeshifts ********* $graph_timeshifts_vals = array( GTS_HALF_HOUR => sprintf('%d Min', 30), GTS_1_HOUR => sprintf('%d Hour', 1), GTS_2_HOURS => sprintf('%d Hours', 2), GTS_4_HOURS => sprintf('%d Hours', 4), GTS_6_HOURS => sprintf('%d Hours', 6), GTS_12_HOURS => sprintf('%d Hours', 12), GTS_1_DAY => sprintf('%d Day', 1), GTS_2_DAYS => sprintf('%d Days', 2), GTS_3_DAYS => sprintf('%d Days', 3), GTS_4_DAYS => sprintf('%d Days', 4), GTS_1_WEEK => sprintf('%d Week', 1), GTS_2_WEEKS => sprintf('%d Weeks', 2), GTS_1_MONTH => sprintf('%d Month', 1), GTS_2_MONTHS => sprintf('%d Months', 2), GTS_3_MONTHS => sprintf('%d Months', 3), GTS_4_MONTHS => sprintf('%d Months', 4), GTS_6_MONTHS => sprintf('%d Months', 6), GTS_1_YEAR => sprintf('%d Year', 1), GTS_2_YEARS => sprintf('%d Years', 2) ); $graph_weekdays = array( WD_SUNDAY => date('l', strtotime('Sunday')), WD_MONDAY => date('l', strtotime('Monday')), WD_TUESDAY => date('l', strtotime('Tuesday')), WD_WEDNESDAY => date('l', strtotime('Wednesday')), WD_THURSDAY => date('l', strtotime('Thursday')), WD_FRIDAY => date('l', strtotime('Friday')), WD_SATURDAY => date('l', strtotime('Saturday')) ); $dateformats = array( GD_MO_D_Y => __('Month Number, Day, Year'), GD_MN_D_Y => __('Month Name, Day, Year'), GD_D_MO_Y => __('Day, Month Number, Year'), GD_D_MN_Y => __('Day, Month Name, Year'), GD_Y_MO_D => __('Year, Month Number, Day'), GD_Y_MN_D => __('Year, Month Name, Day') ); $datechar = array( GDC_HYPHEN => '-', GDC_SLASH => '/', GDC_DOT => '.' ); $dsstats_refresh_interval = array( 'boost' => __('After Boost'), '60' => __('1 Hour'), '120' => __('%d Hours', 2), '180' => __('%d Hours', 3), '240' => __('%d Hours', 4), '300' => __('%d Hours', 5), '360' => __('%d Hours', 6) ); $dsstats_max_memory = array( '32' => __('%d MBytes', 32), '64' => __('%d MBytes', 64), '128' => __('%d MBytes', 128), '256' => __('%d MBytes', 256), '512' => __('%d MBytes', 512), '1024' => __('1 GByte'), '1536' => __('%s GBytes', '1.5'), '2048' => __('%d GBytes', 2), '3072' => __('%d GBytes', 3) ); $dsstats_hourly_avg = array( '60' => __('1 Hour'), '120' => __('%d Hours', 2), '180' => __('%d Hours', 3), '240' => __('%d Hours', 4), '300' => __('%d Hours', 5), '360' => __('%d Hours', 6) ); $boost_max_rows_per_select = array( '2000' => __('2,000 Data Source Items'), '5000' => __('5,000 Data Source Items'), '10000' => __('10,000 Data Source Items'), '15000' => __('15,000 Data Source Items'), '25000' => __('25,000 Data Source Items'), '50000' => __('50,000 Data Source Items (Default)'), '100000' => __('100,000 Data Source Items'), '200000' => __('200,000 Data Source Items'), '400000' => __('400,000 Data Source Items') ); $boost_utilities_interval = array( '999999' => __('Disabled'), '5' => __('%d Seconds', 5), '10' => __('%d Seconds', 10), '15' => __('%d Seconds', 15), '20' => __('%d Seconds', 20), '30' => __('%d Seconds', 30), '60' => __('1 Minute'), '300' => __('%d Minutes', 5) ); $boost_refresh_interval = array( '30' => __('%d Minutes', 30), '60' => __('1 Hour'), '120' => __('2 Hours', 2), '240' => __('4 Hours', 4), '360' => __('6 Hours', 6) ); $boost_max_runtime = array( '1200' => __('%d Minutes', 20), '2400' => __('%d Minutes', 40), '3600' => __('1 Hour'), '4800' => __('%s Hours', '1.5') ); $boost_max_memory = array( '256' => __('%d MBytes', 256), '512' => __('%d MBytes', 512), '1024' => __('%d GByte', 1), '1536' => __('%s GBytes', '1.5'), '2048' => __('%d GBytes', 2), '3072' => __('%d GBytes', 3), '4096' => __('%d GBytes', 4), '5120' => __('%d GBytes', 5), '6144' => __('%d GBytes', 6), '8192' => __('%d GBytes', 8), '-1' => __('Infinity') ); $realtime_window = array( 30 => __('%d Seconds', 30), 45 => __('%d Seconds', 45), 60 => __('1 Minute'), 90 => __('%s Minutes', '1.5'), 120 => __('%d Minutes', 2), 300 => __('%d Minutes', 5), 600 => __('%d Minutes', 10), 1200 => __('%d Minutes', 20), 1800 => __('%d Minutes', 30), 3600 => __('1 Hour') ); $realtime_refresh = array( 1 => __('%d Seconds', 1), 2 => __('%d Seconds', 2), 5 => __('%d Seconds', 5), 10 => __('%d Seconds', 10), 15 => __('%d Seconds', 15), 20 => __('%d Seconds', 20), 30 => __('%d Seconds', 30), 60 => __('1 Minute'), 120 => __('%d Minutes', 2) ); $attachment_sizes = array( 1048576 => __('1 Megabyte'), 2097152 => __('%d Megabytes', 2), 4194304 => __('%d Megabytes', 4), 10485760 => __('%d Megabytes', 10), 20971520 => __('%d Megabytes', 20), 52428800 => __('%d Megabytes', 50), 104857600 => __('%d Megabytes', 100), ); $reports_actions = array( REPORTS_SEND_NOW => __('Send Now'), REPORTS_DUPLICATE => __('Duplicate'), REPORTS_ENABLE => __('Enable'), REPORTS_DISABLE => __('Disable'), REPORTS_DELETE => __('Delete'), ); if (is_realm_allowed(22)) { $reports_actions[REPORTS_OWN] = __('Take Ownership'); } $attach_types = array( REPORTS_TYPE_INLINE_PNG => __('Inline PNG Image'), #REPORTS_TYPE_INLINE_JPG => 'Inline JPEG Image' ); if (extension_loaded(REPORTS_EXTENSION_GD)) { $attach_types[REPORTS_TYPE_INLINE_JPG] = __('Inline JPEG Image'); $attach_types[REPORTS_TYPE_INLINE_GIF] = __('Inline GIF Image'); } $attach_types[REPORTS_TYPE_ATTACH_PNG] = __('Attached PNG Image'); if (extension_loaded(REPORTS_EXTENSION_GD)) { $attach_types[REPORTS_TYPE_ATTACH_JPG] = __('Attached JPEG Image'); $attach_types[REPORTS_TYPE_ATTACH_GIF] = __('Attached GIF Image'); } if (read_config_option('reports_allow_ln') != '') { $attach_types[REPORTS_TYPE_INLINE_PNG_LN] = __('Inline PNG Image, LN Style'); if (extension_loaded(REPORTS_EXTENSION_GD)) { $attach_types[REPORTS_TYPE_INLINE_JPG_LN] = __('Inline JPEG Image, LN Style'); $attach_types[REPORTS_TYPE_INLINE_GIF_LN] = __('Inline GIF Image, LN Style'); } } $item_types = array( REPORTS_ITEM_TEXT => __('Text'), REPORTS_ITEM_TREE => __('Tree'), REPORTS_ITEM_GRAPH => __('Graph'), REPORTS_ITEM_HR => __('Horizontal Rule') ); $alignment = array( REPORTS_ALIGN_LEFT => __('left'), REPORTS_ALIGN_CENTER => __('center'), REPORTS_ALIGN_RIGHT => __('right') ); $reports_interval = array( REPORTS_SCHED_INTVL_MINUTE => __('Minute(s)'), REPORTS_SCHED_INTVL_HOUR => __('Hour(s)'), REPORTS_SCHED_INTVL_DAY => __('Day(s)'), REPORTS_SCHED_INTVL_WEEK => __('Week(s)'), REPORTS_SCHED_INTVL_MONTH_DAY => __('Month(s), Day of Month'), REPORTS_SCHED_INTVL_MONTH_WEEKDAY => __('Month(s), Day of Week'), REPORTS_SCHED_INTVL_YEAR => __('Year(s)'), ); $agg_graph_types = array( AGGREGATE_GRAPH_TYPE_KEEP => __('Keep Graph Types'), AGGREGATE_GRAPH_TYPE_KEEP_STACKED => __('Keep Type and STACK'), GRAPH_ITEM_TYPE_STACK => __('Convert to AREA/STACK Graph'), GRAPH_ITEM_TYPE_LINE1 => __('Convert to LINE1 Graph'), GRAPH_ITEM_TYPE_LINE2 => __('Convert to LINE2 Graph'), GRAPH_ITEM_TYPE_LINE3 => __('Convert to LINE3 Graph'), AGGREGATE_GRAPH_TYPE_LINE1_STACK => __('Convert to LINE1/STACK Graph'), AGGREGATE_GRAPH_TYPE_LINE2_STACK => __('Convert to LINE2/STACK Graph'), AGGREGATE_GRAPH_TYPE_LINE3_STACK => __('Convert to LINE3/STACK Graph'), ); $agg_totals = array( AGGREGATE_TOTAL_NONE => __('No Totals'), AGGREGATE_TOTAL_ALL => __('Print All Legend Items'), AGGREGATE_TOTAL_ONLY => __('Print Totaling Legend Items Only'), ); $agg_totals_type = array( AGGREGATE_TOTAL_TYPE_SIMILAR => __('Total Similar Data Sources'), AGGREGATE_TOTAL_TYPE_ALL => __('Total All Data Sources'), ); $agg_order_types = array( AGGREGATE_ORDER_NONE => __('No Reordering'), AGGREGATE_ORDER_DS_GRAPH => __('Data Source, Graph'), AGGREGATE_ORDER_GRAPH_DS => __('Graph, Data Source'), AGGREGATE_ORDER_BASE_GRAPH => __('Base Graph Order') ); # operators for use with SQL/pattern matching $automation_op_array = array( 'display' => array( AUTOMATION_OP_NONE => __('None'), AUTOMATION_OP_CONTAINS => __('contains'), AUTOMATION_OP_CONTAINS_NOT => __('does not contain'), AUTOMATION_OP_BEGINS => __('begins with'), AUTOMATION_OP_BEGINS_NOT => __('does not begin with'), AUTOMATION_OP_ENDS => __('ends with'), AUTOMATION_OP_ENDS_NOT => __('does not end with'), AUTOMATION_OP_MATCHES => __('matches'), AUTOMATION_OP_MATCHES_NOT => __('is not equal to'), AUTOMATION_OP_LT => __('is less than'), AUTOMATION_OP_LE => __('is less than or equal'), AUTOMATION_OP_GT => __('is greater than'), AUTOMATION_OP_GE => __('is greater than or equal'), AUTOMATION_OP_UNKNOWN => __('is unknown'), AUTOMATION_OP_NOT_UNKNOWN => __('is not unknown'), AUTOMATION_OP_EMPTY => __('is empty'), AUTOMATION_OP_NOT_EMPTY => __('is not empty'), AUTOMATION_OP_REGEXP => __('matches regular expression'), AUTOMATION_OP_NOT_REGEXP => __('does not match regular expression'), ), 'op' => array( AUTOMATION_OP_NONE => '', AUTOMATION_OP_CONTAINS => 'LIKE', AUTOMATION_OP_CONTAINS_NOT => 'NOT LIKE', AUTOMATION_OP_BEGINS => 'LIKE', AUTOMATION_OP_BEGINS_NOT => 'NOT LIKE', AUTOMATION_OP_ENDS => 'LIKE', AUTOMATION_OP_ENDS_NOT => 'NOT LIKE', AUTOMATION_OP_MATCHES => '<=>', AUTOMATION_OP_MATCHES_NOT => '<>', AUTOMATION_OP_LT => '<', AUTOMATION_OP_LE => '<=', AUTOMATION_OP_GT => '>', AUTOMATION_OP_GE => '>=', AUTOMATION_OP_UNKNOWN => 'IS NULL', AUTOMATION_OP_NOT_UNKNOWN => 'IS NOT NULL', AUTOMATION_OP_EMPTY => "LIKE ''", AUTOMATION_OP_NOT_EMPTY => "NOT LIKE ''", AUTOMATION_OP_REGEXP => 'REGEXP', AUTOMATION_OP_NOT_REGEXP => 'NOT REGEXP', ), 'binary' => array( AUTOMATION_OP_NONE => false, AUTOMATION_OP_CONTAINS => true, AUTOMATION_OP_CONTAINS_NOT => true, AUTOMATION_OP_BEGINS => true, AUTOMATION_OP_BEGINS_NOT => true, AUTOMATION_OP_ENDS => true, AUTOMATION_OP_ENDS_NOT => true, AUTOMATION_OP_MATCHES => true, AUTOMATION_OP_MATCHES_NOT => true, AUTOMATION_OP_LT => true, AUTOMATION_OP_LE => true, AUTOMATION_OP_GT => true, AUTOMATION_OP_GE => true, AUTOMATION_OP_UNKNOWN => false, AUTOMATION_OP_NOT_UNKNOWN => false, AUTOMATION_OP_EMPTY => false, AUTOMATION_OP_NOT_EMPTY => false, AUTOMATION_OP_REGEXP => true, AUTOMATION_OP_NOT_REGEXP => true, ), 'pre' => array( AUTOMATION_OP_NONE => '', AUTOMATION_OP_CONTAINS => '%', AUTOMATION_OP_CONTAINS_NOT => '%', AUTOMATION_OP_BEGINS => '', AUTOMATION_OP_BEGINS_NOT => '', AUTOMATION_OP_ENDS => '%', AUTOMATION_OP_ENDS_NOT => '%', AUTOMATION_OP_MATCHES => '', AUTOMATION_OP_MATCHES_NOT => '', AUTOMATION_OP_LT => '', AUTOMATION_OP_LE => '', AUTOMATION_OP_GT => '', AUTOMATION_OP_GE => '', AUTOMATION_OP_UNKNOWN => '', AUTOMATION_OP_NOT_UNKNOWN => '', AUTOMATION_OP_EMPTY => '', AUTOMATION_OP_NOT_EMPTY => '', AUTOMATION_OP_REGEXP => '', AUTOMATION_OP_NOT_REGEXP => '', ), 'post' => array( AUTOMATION_OP_NONE => '', AUTOMATION_OP_CONTAINS => '%', AUTOMATION_OP_CONTAINS_NOT => '%', AUTOMATION_OP_BEGINS => '%', AUTOMATION_OP_BEGINS_NOT => '%', AUTOMATION_OP_ENDS => '', AUTOMATION_OP_ENDS_NOT => '', AUTOMATION_OP_MATCHES => '', AUTOMATION_OP_MATCHES_NOT => '', AUTOMATION_OP_LT => '', AUTOMATION_OP_LE => '', AUTOMATION_OP_GT => '', AUTOMATION_OP_GE => '', AUTOMATION_OP_UNKNOWN => '', AUTOMATION_OP_NOT_UNKNOWN => '', AUTOMATION_OP_EMPTY => '', AUTOMATION_OP_NOT_EMPTY => '', AUTOMATION_OP_REGEXP => '', AUTOMATION_OP_NOT_REGEXP => '', ) ); $automation_oper = array( AUTOMATION_OPER_NULL => '', AUTOMATION_OPER_AND => 'AND', AUTOMATION_OPER_OR => 'OR', AUTOMATION_OPER_LEFT_BRACKET => '(', AUTOMATION_OPER_RIGHT_BRACKET => ')', ); $automation_tree_item_types = array( TREE_ITEM_TYPE_GRAPH => __('Graph'), TREE_ITEM_TYPE_HOST => __('Device') ); $automation_tree_header_types = array( AUTOMATION_TREE_ITEM_TYPE_STRING => __('Fixed String'), ); $automation_frequencies = array( 'disabled' => __('Disabled'), '60' => __('Every 1 Hour'), '120' => __('Every %d Hours', 2), '240' => __('Every %d Hours', 4), '360' => __('Every %d Hours', 6), '480' => __('Every %d Hours', 8), '720' => __('Every %d Hours', 12), '1440' => __('Every Day'), '10080' => __('Every Week'), '20160' => __('Every %d Weeks', 2), '40320' => __('Every %d Weeks', 4) ); $logrotate_frequency = array( '1' => __('Daily'), '7' => __('Weekly'), '30' => __('Monthly') ); $no_session_write = array( 'graph_xport.php', 'graph_image.php', 'graph_json.php' ); $i18n_months = array( 'January' => __('January'), 'February' => __('February'), 'March' => __('March'), 'Arpil' => __('April'), 'May' => __('May'), 'June' => __('June'), 'July' => __('July'), 'August' => __('August'), 'September' => __('September'), 'October' => __('October'), 'November' => __('November'), 'December' => __('December'), ); $i18n_months_short = array( 'Jan' => __x('A short textual representation of a month, three letters', 'Jan'), 'Feb' => __x('A short textual representation of a month, three letters', 'Feb'), 'Mar' => __x('A short textual representation of a month, three letters', 'Mar'), 'Arp' => __x('A short textual representation of a month, three letters', 'Apr'), 'May' => __x('A short textual representation of a month, three letters', 'May'), 'Jun' => __x('A short textual representation of a month, three letters', 'Jun'), 'Jul' => __x('A short textual representation of a month, three letters', 'Jul'), 'Aug' => __x('A short textual representation of a month, three letters', 'Aug'), 'Sep' => __x('A short textual representation of a month, three letters', 'Sep'), 'Oct' => __x('A short textual representation of a month, three letters', 'Oct'), 'Nov' => __x('A short textual representation of a month, three letters', 'Nov'), 'Dec' => __x('A short textual representation of a month, three letters', 'Dec'), ); $i18n_weekdays = array( 'Sunday' => __('Sunday'), 'Monday' => __('Monday'), 'Tuesday' => __('Tuesday'), 'Wednesday' => __('Wednesday'), 'Thursday' => __('Thursday'), 'Friday' => __('Friday'), 'Saturday' => __('Saturday') ); $i18n_weekdays_short = array( 'Sun' => __x('A textual representation of a day, three letters', 'Sun'), 'Mon' => __x('A textual representation of a day, three letters', 'Mon'), 'Tue' => __x('A textual representation of a day, three letters', 'Tue'), 'Wed' => __x('A textual representation of a day, three letters', 'Wed'), 'Thu' => __x('A textual representation of a day, three letters', 'Thu'), 'Fri' => __x('A textual representation of a day, three letters', 'Fri'), 'Sat' => __x('A textual representation of a day, three letters', 'Sat') ); $i18n_languages = array( __('Arabic'), __('Bulgarian'), __('Chinese (China)'), __('Chinese (Taiwan)'), __('Dutch'), __('English'), __('French'), __('German'), __('Greek'), __('Hebrew'), __('Hindi'), __('Italian'), __('Japanese'), __('Korean'), __('Polish'), __('Portuguese'), __('Portuguese (Brazil)'), __('Russian'), __('Spanish'), __('Swedish'), __('Turkish'), __('Vietnamese') ); $i18n_themes = array( __('Classic'), __('Modern'), __('Dark'), __('Paper-plane'), __('Paw'), __('Sunrise'), ); $database_statuses = array( 0 => __('[Fail]'), 1 => __('[Warning]'), 2 => __('[Success]'), 3 => __('[Skipped]'), ); $phperrors = array ( E_ERROR => 'ERROR', E_WARNING => 'WARNING', E_PARSE => 'PARSE', E_NOTICE => 'NOTICE', E_CORE_ERROR => 'CORE_ERROR', E_CORE_WARNING => 'CORE_WARNING', E_COMPILE_ERROR => 'COMPILE_ERROR', E_COMPILE_WARNING => 'COMPILE_WARNING', E_USER_ERROR => 'USER_ERROR', E_USER_WARNING => 'USER_WARNING', E_USER_NOTICE => 'USER_NOTICE', E_STRICT => 'STRICT', E_RECOVERABLE_ERROR => 'RECOVERABLE_ERROR', E_DEPRECATED => 'DEPRECATED', E_USER_DEPRECATED => 'USER_DEPRECATED', E_ALL => 'ALL' ); $navigation = array( 'auth_profile.php:' => array( 'title' => __('User Profile (Edit)'), 'mapping' => '', 'url' => '', 'level' => '0' ), 'auth_profile.php:edit' => array( 'title' => __('User Profile (Edit)'), 'mapping' => '', 'url' => '', 'level' => '0' ), 'graph_view.php:' => array( 'title' => __('Graphs'), 'mapping' => '', 'url' => 'graph_view.php', 'level' => '0' ), 'graph_view.php:tree' => array( 'title' => __('Tree Mode'), 'mapping' => 'graph_view.php:', 'url' => 'graph_view.php?action=tree', 'level' => '0' ), 'graph_view.php:tree_content' => array( 'title' => __('Tree Mode'), 'mapping' => 'graph_view.php:', 'url' => 'graph_view.php?action=tree', 'level' => '0' ), 'graph_view.php:list' => array( 'title' => __('List Mode'), 'mapping' => '', 'url' => 'graph_view.php?action=list', 'level' => '0' ), 'graph_view.php:preview' => array( 'title' => __('Preview Mode'), 'mapping' => '', 'url' => 'graph_view.php?action=preview', 'level' => '0' ), 'graph.php:' => array( 'title' => '|current_graph_title|', 'mapping' => 'graph_view.php:', 'level' => '1' ), 'graph.php:view' => array( 'title' => '|current_graph_title|', 'mapping' => 'graph_view.php:', 'level' => '1' ), 'graph.php:zoom' => array( 'title' => '|current_graph_title|', 'mapping' => 'graph_view.php:', 'level' => '1' ), 'graph.php:update_timespan' => array( 'title' => '|current_graph_title|', 'mapping' => 'graph_view.php:', 'level' => '1' ), 'index.php:' => array( 'title' => __('Console'), 'mapping' => '', 'url' => $config['url_path'] . 'index.php', 'level' => '0' ), 'index.php:login' => array( 'title' => __('Console'), 'mapping' => '', 'url' => $config['url_path'] . 'index.php', 'level' => '0' ), 'graphs.php:' => array( 'title' => __('Graph Management'), 'mapping' => 'index.php:', 'url' => 'graphs.php', 'level' => '1' ), 'graphs.php:graph_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,graphs.php:', 'url' => '', 'level' => '2' ), 'graphs.php:graph_diff' => array( 'title' => __('Change Graph Template'), 'mapping' => 'index.php:,graphs.php:,graphs.php:graph_edit', 'url' => '', 'level' => '3' ), 'graphs.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,graphs.php:', 'url' => '', 'level' => '2' ), 'graphs_items.php:item_edit' => array( 'title' => __('Graph Items'), 'mapping' => 'index.php:,graphs.php:,graphs.php:graph_edit', 'url' => '', 'level' => '3' ), 'graphs_new.php:' => array( 'title' => __('Create New Graphs'), 'mapping' => 'index.php:', 'url' => 'graphs_new.php', 'level' => '1' ), 'graphs_new.php:save' => array( 'title' => __('Create Graphs from Data Query'), 'mapping' => 'index.php:,graphs_new.php:', 'url' => '', 'level' => '2' ), 'gprint_presets.php:' => array( 'title' => __('GPRINT Presets'), 'mapping' => 'index.php:', 'url' => 'gprint_presets.php', 'level' => '1' ), 'gprint_presets.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,gprint_presets.php:', 'url' => '', 'level' => '2' ), 'gprint_presets.php:remove' => array( 'title' => __('(Remove)'), 'mapping' => 'index.php:,gprint_presets.php:', 'url' => '', 'level' => '2' ), 'cdef.php:' => array( 'title' => __('CDEFs'), 'mapping' => 'index.php:', 'url' => 'cdef.php', 'level' => '1' ), 'cdef.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,cdef.php:', 'url' => '', 'level' => '2' ), 'cdef.php:remove' => array( 'title' => __('(Remove)'), 'mapping' => 'index.php:,cdef.php:', 'url' => '', 'level' => '2' ), 'cdef.php:item_edit' => array( 'title' => __('CDEF Items'), 'mapping' => 'index.php:,cdef.php:,cdef.php:edit', 'url' => '', 'level' => '3' ), 'cdef.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,cdef.php:', 'url' => '', 'level' => '2' ), 'clog.php:' => array( 'title' => __('View Log'), 'mapping' => '', 'url' => 'clog.php', 'level' => '0' ), 'clog.php:preview' => array( 'title' => __('View Log'), 'mapping' => '', 'url' => 'clog.php', 'level' => '0' ), 'clog_user.php:' => array( 'title' => __('View Log'), 'mapping' => '', 'url' => 'clog_user.php', 'level' => '0' ), 'clog_user.php:preview' => array( 'title' => __('View Log'), 'mapping' => '', 'url' => 'clog_user.php', 'level' => '0' ), 'tree.php:' => array( 'title' => __('Graph Trees'), 'mapping' => 'index.php:', 'url' => 'tree.php', 'level' => '1' ), 'tree.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,tree.php:', 'url' => '', 'level' => '2' ), 'color.php:' => array( 'title' => __('Colors'), 'mapping' => 'index.php:', 'url' => 'color.php', 'level' => '1' ), 'color.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,color.php:', 'url' => '', 'level' => '2' ), 'graph_templates.php:' => array( 'title' => __('Graph Templates'), 'mapping' => 'index.php:', 'url' => 'graph_templates.php', 'level' => '1' ), 'graph_templates.php:template_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,graph_templates.php:', 'url' => '', 'level' => '2' ), 'graph_templates.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,graph_templates.php:', 'url' => '', 'level' => '2' ), 'graph_templates_items.php:item_edit' => array( 'title' => __('Graph Template Items'), 'mapping' => 'index.php:,graph_templates.php:,graph_templates.php:template_edit', 'url' => '', 'level' => '3' ), 'graph_templates_inputs.php:input_edit' => array( 'title' => __('Graph Item Inputs'), 'mapping' => 'index.php:,graph_templates.php:,graph_templates.php:template_edit', 'url' => '', 'level' => '3' ), 'graph_templates_inputs.php:input_remove' => array( 'title' => __('(Remove)'), 'mapping' => 'index.php:,graph_templates.php:,graph_templates.php:template_edit', 'url' => '', 'level' => '3' ), 'host_templates.php:' => array( 'title' => __('Device Templates'), 'mapping' => 'index.php:', 'url' => 'host_templates.php', 'level' => '1' ), 'host_templates.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,host_templates.php:', 'url' => '', 'level' => '2' ), 'host_templates.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,host_templates.php:', 'url' => '', 'level' => '2' ), 'data_templates.php:' => array( 'title' => __('Data Templates'), 'mapping' => 'index.php:', 'url' => 'data_templates.php', 'level' => '1' ), 'data_templates.php:template_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,data_templates.php:', 'url' => '', 'level' => '2' ), 'data_templates.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,data_templates.php:', 'url' => '', 'level' => '2' ), 'data_sources.php:' => array( 'title' => __('Data Sources'), 'mapping' => 'index.php:', 'url' => 'data_sources.php', 'level' => '1' ), 'data_sources.php:ds_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,data_sources.php:', 'url' => '', 'level' => '2' ), 'data_sources.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,data_sources.php:', 'url' => '', 'level' => '2' ), 'host.php:' => array( 'title' => __('Devices'), 'mapping' => 'index.php:', 'url' => 'host.php', 'level' => '1' ), 'host.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,host.php:', 'url' => '', 'level' => '2' ), 'host.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,host.php:', 'url' => '', 'level' => '2' ), 'rra.php:' => array( 'title' => __('Round Robin Archives'), 'mapping' => 'index.php:', 'url' => 'rra.php', 'level' => '1' ), 'rra.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,rra.php:', 'url' => '', 'level' => '2' ), 'rra.php:remove' => array( 'title' => __('(Remove)'), 'mapping' => 'index.php:,rra.php:', 'url' => '', 'level' => '2' ), 'data_input.php:' => array( 'title' => __('Data Input Methods'), 'mapping' => 'index.php:', 'url' => 'data_input.php', 'level' => '1' ), 'data_input.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,data_input.php:', 'url' => '', 'level' => '2' ), 'data_input.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,data_input.php:', 'url' => '', 'level' => '2' ), 'data_input.php:remove' => array( 'title' => __('(Remove)'), 'mapping' => 'index.php:,data_input.php:', 'url' => '', 'level' => '2' ), 'data_input.php:field_edit' => array( 'title' => __('Data Input Fields'), 'mapping' => 'index.php:,data_input.php:,data_input.php:edit', 'url' => '', 'level' => '3' ), 'data_input.php:field_remove' => array( 'title' => __('(Remove Item)'), 'mapping' => 'index.php:,data_input.php:,data_input.php:edit', 'url' => '', 'level' => '3' ), 'data_queries.php:' => array( 'title' => __('Data Queries'), 'mapping' => 'index.php:', 'url' => 'data_queries.php', 'level' => '1' ), 'data_queries.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,data_queries.php:', 'url' => '', 'level' => '2' ), 'data_queries.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,data_queries.php:', 'url' => '', 'level' => '2' ), 'data_queries.php:item_edit' => array( 'title' => __('Associated Graph Templates'), 'mapping' => 'index.php:,data_queries.php:,data_queries.php:edit', 'url' => '', 'level' => '3' ), 'data_queries.php:item_remove' => array( 'title' => __('(Remove Item)'), 'mapping' => 'index.php:,data_queries.php:,data_queries.php:edit', 'url' => '', 'level' => '3' ), 'rrdcleaner.php:' => array( 'title' => __('RRD Cleaner'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'rrdcleaner.php', 'level' => '2' ), 'rrdcleaner.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,rrdcleaner.php:', 'url' => 'rrdcleaner.php?action=actions', 'level' => '2' ), 'rrdcleaner.php:restart' => array( 'title' => __('List unused Files'), 'mapping' => 'rrdcleaner.php:', 'url' => 'rrdcleaner.php?action=restart', 'level' => '2' ), 'utilities.php:' => array( 'title' => __('Utilities'), 'mapping' => 'index.php:', 'url' => 'utilities.php', 'level' => '1' ), 'utilities.php:view_poller_cache' => array( 'title' => __('View Poller Cache'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_snmp_cache' => array( 'title' => __('View Data Query Cache'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:clear_poller_cache' => array( 'title' => __('View Poller Cache'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_logfile' => array( 'title' => __('View Log'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:clear_logfile' => array( 'title' => __('Clear Log'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_user_log' => array( 'title' => __('View User Log'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:clear_user_log' => array( 'title' => __('Clear User Log'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_tech' => array( 'title' => __('Technical Support'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_boost_status' => array( 'title' => __('Boost Status'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_snmpagent_cache' => array( 'title' => __('View SNMP Agent Cache'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'utilities.php:view_snmpagent_events' => array( 'title' => __('View SNMP Agent Notification Log'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'utilities.php', 'level' => '2' ), 'vdef.php:' => array( 'title' => __('VDEFs'), 'mapping' => 'index.php:', 'url' => 'vdef.php', 'level' => '1' ), 'vdef.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,vdef.php:', 'url' => 'vdef.php', 'level' => '2' ), 'vdef.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,vdef.php:', 'url' => 'vdef.php', 'level' => '2' ), 'vdef.php:remove' => array( 'title' => __('(Remove)'), 'mapping' => 'index.php:,vdef.php:', 'url' => 'vdef.php', 'level' => '2' ), 'vdef.php:item_edit' => array( 'title' => __('VDEF Items'), 'mapping' => 'index.php:,vdef.php:,vdef.php:edit', 'url' => '', 'level' => '3' ), 'managers.php:' => array( 'title' => __('View SNMP Notification Receivers'), 'mapping' => 'index.php:,utilities.php:', 'url' => 'managers.php', 'level' => '2' ), 'managers.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,utilities.php:,managers.php:', 'url' => '', 'level' => '3' ), 'settings.php:' => array( 'title' => __('Cacti Settings'), 'mapping' => 'index.php:', 'url' => 'settings.php', 'level' => '1' ), 'link.php:' => array( 'title' => __('External Link'), 'mapping' => 'index.php:', 'url' => 'link.php', 'level' => '1' ), 'user_admin.php:' => array( 'title' => __('Users'), 'mapping' => 'index.php:', 'url' => 'user_admin.php', 'level' => '1' ), 'user_admin.php:user_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,user_admin.php:', 'url' => '', 'level' => '2' ), 'user_admin.php:actions' => array( 'title' => __('(Action)'), 'mapping' => 'index.php:,user_admin.php:', 'url' => '', 'level' => '2' ), 'user_domains.php:' => array( 'title' => __('User Domains'), 'mapping' => 'index.php:', 'url' => 'user_domains.php', 'level' => '1' ), 'user_domains.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'user_domains.php:,index.php:', 'url' => 'user_domains.php:edit', 'level' => '2' ), 'user_group_admin.php:' => array( 'title' => __('User Groups'), 'mapping' => 'index.php:', 'url' => 'user_group_admin.php', 'level' => '1' ), 'user_group_admin.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,user_group_admin.php:', 'url' => '', 'level' => '2' ), 'user_group_admin.php:actions' => array( 'title' => __('(Action)'), 'mapping' => 'index.php:,user_group_admin.php:', 'url' => '', 'level' => '2' ), 'about.php:' => array( 'title' => __('About Cacti'), 'mapping' => 'index.php:', 'url' => 'about.php', 'level' => '1' ), 'templates_export.php:' => array( 'title' => __('Export Templates'), 'mapping' => 'index.php:', 'url' => 'templates_export.php', 'level' => '1' ), 'templates_export.php:save' => array( 'title' => __('Export Results'), 'mapping' => 'index.php:,templates_export.php:', 'url' => 'templates_export.php', 'level' => '2' ), 'templates_import.php:' => array( 'title' => __('Import Templates'), 'mapping' => 'index.php:', 'url' => 'templates_import.php', 'level' => '1' ), 'reports_admin.php:' => array( 'title' => __('Reporting'), 'mapping' => '', 'url' => 'reports_admin.php', 'level' => '0' ), 'reports_admin.php:actions' => array( 'title' => __('Report Add'), 'mapping' => 'reports_admin.php:', 'url' => 'reports_admin.php', 'level' => '1' ), 'reports_admin.php:delete' => array( 'title' => __('Report Delete'), 'mapping' => 'reports_admin.php:', 'url' => 'reports_admin.php', 'level' => '1' ), 'reports_admin.php:edit' => array( 'title' => __('Report Edit'), 'mapping' => 'reports_admin.php:', 'url' => 'reports_admin.php?action=edit', 'level' => '1' ), 'reports_admin.php:item_edit' => array( 'title' => __('Report Edit Item'), 'mapping' => 'reports_admin.php:,reports_admin.php:edit', 'url' => '', 'level' => '2' ), 'reports_user.php:' => array( 'title' => __('Reporting'), 'mapping' => '', 'url' => 'reports_user.php', 'level' => '0' ), 'reports_user.php:actions' => array( 'title' => __('Report Add'), 'mapping' => 'reports_user.php:', 'url' => 'reports_user.php', 'level' => '1' ), 'reports_user.php:delete' => array( 'title' => __('Report Delete'), 'mapping' => 'reports_user.php:', 'url' => 'reports_user.php', 'level' => '1' ), 'reports_user.php:edit' => array( 'title' => __('Report Edit'), 'mapping' => 'reports_user.php:', 'url' => 'reports_user.php?action=edit', 'level' => '1' ), 'reports_user.php:item_edit' => array( 'title' => __('Report Edit Item'), 'mapping' => 'reports_user.php:,reports_user.php:edit', 'url' => '', 'level' => '2' ), 'color_templates.php:' => array( 'title' => __('Color Templates'), 'mapping' => 'index.php:', 'url' => 'color_templates.php', 'level' => '1' ), 'color_templates.php:template_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,color_templates.php:', 'url' => '', 'level' => '2' ), 'color_templates.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,color_templates.php:', 'url' => '', 'level' => '2' ), 'color_templates_items.php:item_edit' => array( 'title' => __('Color Template Items'), 'mapping' => 'index.php:,color_templates.php:,color_templates.php:template_edit', 'url' => '', 'level' => '3' ), 'aggregate_templates.php:' => array( 'title' => __('Aggregate Templates'), 'mapping' => 'index.php:', 'url' => 'aggregate_templates.php', 'level' => '1' ), 'aggregate_templates.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,aggregate_templates.php:', 'url' => '', 'level' => '2' ), 'aggregate_templates.php:actions'=> array( 'title' => __('Actions'), 'mapping' => 'index.php:,aggregate_templates.php:', 'url' => '', 'level' => '2' ), 'aggregate_graphs.php:' => array( 'title' => __('Aggregate Graphs'), 'mapping' => 'index.php:', 'url' => 'aggregate_graphs.php', 'level' => '1' ), 'aggregate_graphs.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,aggregate_graphs.php:', 'url' => '', 'level' => '2' ), 'aggregate_graphs.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,aggregate_graphs.php:', 'url' => '', 'level' => '2' ), 'aggregate_items.php:' => array( 'title' => __('Aggregate Items'), 'mapping' => 'index.php:', 'url' => 'aggregate_items.php', 'level' => '1' ), 'aggregate_items.php:item_edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,aggregate_graphs.php:,aggregate_items.php:', 'url' => '', 'level' => '2' ), 'aggregate_items.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,aggregate_items.php:', 'url' => '', 'level' => '2' ), 'automation_graph_rules.php:' => array( 'title' => __('Graph Rules'), 'mapping' => 'index.php:', 'url' => 'automation_graph_rules.php', 'level' => '1' ), 'automation_graph_rules.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,automation_graph_rules.php:', 'url' => '', 'level' => '2' ), 'automation_graph_rules.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,automation_graph_rules.php:', 'url' => '', 'level' => '2' ), 'automation_graph_rules.php:item_edit' => array( 'title' => __('Graph Rule Items'), 'mapping' => 'index.php:,automation_graph_rules.php:,automation_graph_rules.php:edit', 'url' => '', 'level' => '3' ), 'automation_tree_rules.php:' => array( 'title' => __('Tree Rules'), 'mapping' => 'index.php:', 'url' => 'automation_tree_rules.php', 'level' => '1' ), 'automation_tree_rules.php:edit' => array( 'title' => __('(Edit)'), 'mapping' => 'index.php:,automation_tree_rules.php:', 'url' => '', 'level' => '2' ), 'automation_tree_rules.php:actions' => array( 'title' => __('Actions'), 'mapping' => 'index.php:,automation_tree_rules.php:', 'url' => '', 'level' => '2' ), 'automation_tree_rules.php:item_edit' => array( 'title' => __('Tree Rule Items'), 'mapping' => 'index.php:,automation_tree_rules.php:,automation_tree_rules.php:edit', 'url' => '', 'level' => '3' ) ); $snmpagent_event_severity = array( SNMPAGENT_EVENT_SEVERITY_LOW => 'low', SNMPAGENT_EVENT_SEVERITY_MEDIUM => 'medium', SNMPAGENT_EVENT_SEVERITY_HIGH => 'high', SNMPAGENT_EVENT_SEVERITY_CRITICAL => 'critical' ); $days_from_time_settings = array( 'mods' => array( 'd' => 86400, 'h' => 3600, 'm' => '60', 's' => 0, ), 'text' => array( DAYS_FORMAT_SHORT => array( 'd' => 'd', 'h' => 'h', 'm' => 'm', 's' => 's', 'suffix' => ':', 'prefix' => '', ), DAYS_FORMAT_MEDIUM => array( 'd' => __('days'), 'h' => __('hrs'), 'm' => __('mins'), 's' => __('secs'), 'suffix' => ', ', 'prefix' => ' ', ), DAYS_FORMAT_MEDIUM_LOG => array( 'd' => 'days', 'h' => 'hrs', 'm' => 'mins', 's' => 'secs', 'suffix' => ', ', 'prefix' => ' ', ), DAYS_FORMAT_LONG => array( 'd' => __('days'), 'h' => __('hours'), 'm' => __('minutes'), 's' => __('seconds'), 'suffix' => ', ', 'prefix' => ' ', ), DAYS_FORMAT_LONG_LOG => array( 'd' => 'days', 'h' => 'hours', 'm' => 'minutes', 's' => 'seconds', 'suffix' => ', ', 'prefix' => ' ', ), ), ); $graph_sources = array( 0 => __('Not Templated'), 1 => __('Data Query'), 2 => __('Template'), 3 => __('Aggregate'), ); api_plugin_hook('config_arrays'); cacti-release-1.2.19/include/global_constants.php000066400000000000000000000362651413633772300220220ustar00rootroot00000000000000 array( 'method' => 'drop_array', 'friendly_name' => __('SNMP Version'), 'description' => __('Choose the SNMP version for this host.'), 'on_change' => 'setSNMP()', 'value' => '|arg1:snmp_version|', 'default' => read_config_option('snmp_version'), 'array' => $snmp_versions ), 'snmp_community' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Community String'), 'description' => __('Fill in the SNMP read community for this device.'), 'value' => '|arg1:snmp_community|', 'default' => read_config_option('snmp_community'), 'max_length' => '100', 'size' => '20' ), 'snmp_security_level' => array( 'method' => 'drop_array', 'friendly_name' => __('SNMP Security Level'), 'description' => __('SNMP v3 Security Level to use when querying the device.'), 'on_change' => 'setSNMP()', 'value' => '|arg1:snmp_security_level|', 'form_id' => '|arg1:id|', 'default' => read_config_option('snmp_security_level'), 'array' => $snmp_security_levels ), 'snmp_auth_protocol' => array( 'method' => 'drop_array', 'friendly_name' => __('SNMP Auth Protocol (v3)'), 'description' => __('Choose the SNMPv3 Authorization Protocol.'), 'on_change' => 'setSNMP()', 'value' => '|arg1:snmp_auth_protocol|', 'default' => read_config_option('snmp_auth_protocol'), 'array' => $snmp_auth_protocols, ), 'snmp_username' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Username (v3)'), 'description' => __('SNMP v3 username for this device.'), 'value' => '|arg1:snmp_username|', 'default' => read_config_option('snmp_username'), 'max_length' => '50', 'size' => '40' ), 'snmp_password' => array( 'method' => 'textbox_password', 'friendly_name' => __('SNMP Password (v3)'), 'description' => __('SNMP v3 password for this device.'), 'value' => '|arg1:snmp_password|', 'default' => read_config_option('snmp_password'), 'max_length' => '50', 'size' => '40' ), 'snmp_priv_protocol' => array( 'method' => 'drop_array', 'friendly_name' => __('SNMP Privacy Protocol (v3)'), 'description' => __('Choose the SNMPv3 Privacy Protocol.'), 'on_change' => 'setSNMP()', 'value' => '|arg1:snmp_priv_protocol|', 'default' => read_config_option('snmp_priv_protocol'), 'array' => $snmp_priv_protocols, ), 'snmp_priv_passphrase' => array( 'method' => 'textbox_password', 'friendly_name' => __('SNMP Privacy Passphrase (v3)'), 'description' => __('Choose the SNMPv3 Privacy Passphrase.'), 'value' => '|arg1:snmp_priv_passphrase|', 'default' => read_config_option('snmp_priv_passphrase'), 'max_length' => '200', 'size' => '80' ), 'snmp_context' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Context (v3)'), 'description' => __('Enter the SNMP Context to use for this device.'), 'value' => '|arg1:snmp_context|', 'default' => '', 'max_length' => '64', 'size' => '40' ), 'snmp_engine_id' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Engine ID (v3)'), 'description' => __('Enter the SNMP v3 Engine Id to use for this device. Leave this field empty to use the SNMP Engine ID being defined per SNMPv3 Notification receiver.'), 'value' => '|arg1:snmp_engine_id|', 'default' => '', 'max_length' => '64', 'size' => '40' ), 'snmp_port' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Port'), 'description' => __('Enter the UDP port number to use for SNMP (default is 161).'), 'value' => '|arg1:snmp_port|', 'max_length' => '5', 'default' => read_config_option('snmp_port'), 'size' => '12' ), 'snmp_timeout' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Timeout'), 'description' => __('The maximum number of milliseconds Cacti will wait for an SNMP response (does not work with php-snmp support).'), 'value' => '|arg1:snmp_timeout|', 'max_length' => '8', 'default' => read_config_option('snmp_timeout'), 'size' => '12' ), ); $fields_snmp_item_with_oids = $fields_snmp_item + array( 'max_oids' => array( 'method' => 'drop_array', 'friendly_name' => __('Maximum OIDs Per Get Request'), 'description' => __('The number of SNMP OIDs that can be obtained in a single SNMP Get request.'), 'value' => '|arg1:max_oids|', 'default' => read_config_option('max_get_size'), 'array' => array( 1 => __('%d OID', 1), 2 => __('%d OID\'s', 2), 3 => __('%d OID\'s', 3), 4 => __('%d OID\'s', 4), 5 => __('%d OID\'s', 5), 10 => __('%d OID\'s', 10), 15 => __('%d OID\'s', 15), 20 => __('%d OID\'s', 20), 25 => __('%d OID\'s', 25), 30 => __('%d OID\'s', 30), 35 => __('%d OID\'s', 35), 40 => __('%d OID\'s', 40), 45 => __('%d OID\'s', 45), 50 => __('%d OID\'s', 50), 55 => __('%d OID\'s', 55), 60 => __('%d OID\'s', 60) ) ), 'bulk_walk_size' => array( 'method' => 'drop_array', 'friendly_name' => __('Bulk Walk Maximum Repititions'), 'description' => __('For SNMPv2 and SNMPv3 Devices, the SNMP Bulk Walk max-repetitions size. The default is to \'Auto Detect on Re-Index\'. For very large switches, high performance servers, Jumbo Frame Networks or for high latency WAN connections, increasing this value may increase poller performance. More data is packed into a single SNMP packet which can reduce data query run time. However, some devices may completely refuse to respond to packets with a max-repetition size which is set too large. This can be especially true for lower-powered IoT type devices or smaller embedded IT appliances. Special attention to the overall network path MTU should also be considered since setting a value which is too high could lead to packet fragmentation.'), 'value' => '|arg1:bulk_walk_size|', 'default' => '-1', 'array' => array( -1 => __('Auto Detect on Re-Index'), 0 => __('Auto Detect/Set on first Re-Index'), 1 => __('%d Repitition', 1), 2 => __('%d Repititions', 2), 3 => __('%d Repititions', 3), 4 => __('%d Repititions', 4), 5 => __('%d Repititions', 5), 10 => __('%d Repititions', 10), 15 => __('%d Repititions', 15), 20 => __('%d Repititions', 20), 25 => __('%d Repititions', 25), 30 => __('%d Repititions', 30), 35 => __('%d Repititions', 35), 40 => __('%d Repititions', 40), 45 => __('%d Repititions', 45), 50 => __('%d Repititions', 50), 55 => __('%d Repititions', 55), 60 => __('%d Repititions', 60) ) ) ); $fields_snmp_item_with_retry = $fields_snmp_item_with_oids + array( 'snmp_retries' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Retries'), 'description' => __('The maximum number of attempts to reach a device via an SNMP readstring prior to giving up.'), 'value' => '|arg1:snmp_retries|', 'max_length' => '8', 'default' => read_config_option('snmp_retries'), 'size' => '12' ), ); /* file: profiles.php, action: edit */ $fields_profile_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this Data Storage and Polling Profile.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80', 'default' => __('New Profile') ), 'step' => array( 'method' => 'drop_array', 'friendly_name' => __('Polling Interval'), 'description' => __('The frequency that data will be collected from the Data Source?'), 'array' => $sampling_intervals, 'value' => '|arg1:step|', 'default' => read_config_option('poller_interval'), ), 'heartbeat' => array( 'method' => 'drop_array', 'friendly_name' => __('Heartbeat'), 'description' => __('How long can data be missing before RRDtool records unknown data. Increase this value if your Data Source is unstable and you wish to carry forward old data rather than show gaps in your graphs. This value is multiplied by the X-Files Factor to determine the actual amount of time.'), 'array' => $heartbeats, 'value' => '|arg1:heartbeat|', 'default' => (read_config_option('poller_interval') * 2), ), 'x_files_factor' => array( 'method' => 'textbox', 'friendly_name' => __('X-Files Factor'), 'description' => __('The amount of unknown data that can still be regarded as known.'), 'value' => '|arg1:x_files_factor|', 'max_length' => '10', 'size' => '7', 'default' => '0.5' ), 'consolidation_function_id' => array( 'method' => 'drop_multi', 'friendly_name' => __('Consolidation Functions'), 'description' => __('How data is to be entered in RRAs.'), 'array' => $consolidation_functions, 'sql' => 'SELECT consolidation_function_id AS id, data_source_profile_id FROM data_source_profiles_cf WHERE data_source_profile_id="|arg1:id|"', ), 'default' => array( 'method' => 'checkbox', 'friendly_name' => __('Default'), 'description' => __('Is this the default storage profile?'), 'value' => '|arg1:default|', 'default' => '', ), 'size' => array( 'method' => 'other', 'friendly_name' => __('RRDfile Size (in Bytes)'), 'description' => __('Based upon the number of Rows in all RRAs and the number of Consolidation Functions selected, the size of this entire in the RRDfile.'), 'value' => '' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_profile' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: rra.php, action: edit */ $fields_profile_rra_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('How data is to be entered in RRAs.'), 'value' => '|arg1:name|', 'max_length' => '100', 'size' => '60', 'default' => __('New Profile RRA') ), 'steps' => array( 'method' => 'drop_array', 'friendly_name' => __('Aggregation Level'), 'description' => __('The number of samples required prior to filling a row in the RRA specification. The first RRA should always have a value of 1.'), 'array' => $aggregation_levels, 'value' => '|arg1:steps|', 'default' => read_config_option('poller_interval'), ), 'rows' => array( 'method' => 'textbox', 'friendly_name' => __('Rows'), 'description' => __('How many generations data is kept in the RRA.'), 'value' => '|arg1:rows|', 'max_length' => '12', 'size' => '10', 'default' => '600' ), 'timespan' => array( 'method' => 'drop_array', 'friendly_name' => __('Default Timespan'), 'description' => __('When viewing a Graph based upon the RRA in question, the default Timespan to show for that Graph.'), 'value' => '|arg1:timespan|', 'array' => $timespans ), 'retention' => array( 'method' => 'other', 'friendly_name' => __('Data Retention'), 'description' => __('Based upon the Aggregation Level, the Rows, and the Polling Interval the amount of data that will be retained in the RRA'), 'value' => '' ), 'size' => array( 'method' => 'other', 'friendly_name' => __('RRA Size (in Bytes)'), 'description' => __('Based upon the number of Rows and the number of Consolidation Functions selected, the size of this RRA in the RRDfile.'), 'value' => '' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_rra' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: cdef.php, action: edit */ $fields_cdef_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this CDEF.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_cdef' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: color.php, action: edit */ $fields_color_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('The name of this Color.'), 'value' => '|arg1:name|', 'max_length' => '40', 'size' => '40' ), 'hex' => array( 'method' => 'textbox', 'friendly_name' => __('Hex Value'), 'description' => __('The hex value for this color; valid range: 000000-FFFFFF.'), 'value' => '|arg1:hex|', 'max_length' => '6', 'size' => '5' ), 'read_only' => array( 'method' => 'hidden', 'friendly_name' => __('Read Only'), 'description' => __('Any named color should be read only.'), 'value' => '|arg1:read_only|', 'default' => '' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'hidden_name' => array( 'method' => 'hidden', 'value' => '|arg1:name|', 'max_length' => '40', 'size' => '40' ), 'save_component_color' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: data_input.php, action: edit */ $fields_data_input_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('Enter a meaningful name for this data input method.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80' ), 'type_id' => array( 'method' => 'drop_array', 'friendly_name' => __('Input Type'), 'description' => __('Choose the method you wish to use to collect data for this Data Input method.'), 'value' => '|arg1:type_id|', 'array' => $input_types_script, ), 'input_string' => array( 'method' => 'textarea', 'friendly_name' => __('Input String'), 'description' => __('The data that is sent to the script, which includes the complete path to the script and input sources in <> brackets.'), 'value' => '|arg1:input_string|', 'textarea_rows' => '4', 'textarea_cols' => '60', 'class' => 'textAreaNotes', 'max_length' => '255', ), 'whitelist_verification' => array( 'method' => 'other', 'value' => '', 'friendly_name' => __('White List Check'), 'description' => __('The result of the Whitespace verification check for the specific Input Method. If the Input String changes, and the Whitelist file is not update, Graphs will not be allowed to be created.') ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_data_input' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: data_input.php, action: field_edit (dropdown) */ $fields_data_input_field_edit_1 = array( 'data_name' => array( 'method' => 'drop_array', 'friendly_name' => __('Field [%s]', '|arg1:|'), 'description' => __('Choose the associated field from the %s field.', '|arg1:|'), 'value' => '|arg3:data_name|', 'array' => '|arg2:|', ) ); /* file: data_input.php, action: field_edit (textbox) */ $fields_data_input_field_edit_2 = array( 'data_name' => array( 'method' => 'textbox', 'friendly_name' => __('Field [%s]', '|arg1:|'), 'description' => __('Enter a name for this %s field. Note: If using name value pairs in your script, for example: NAME:VALUE, it is important that the name match your output field name identically to the script output name or names.', '|arg1:|'), 'value' => '|arg2:data_name|', 'max_length' => '50', 'size' => '40' ) ); /* file: data_input.php, action: field_edit */ $fields_data_input_field_edit = array( 'fname' => array( 'method' => 'textbox', 'friendly_name' => __('Friendly Name'), 'description' => __('Enter a meaningful name for this data input method.'), 'value' => '|arg1:name|', 'max_length' => '200', 'size' => '80' ), 'update_rra' => array( 'method' => 'checkbox', 'friendly_name' => __('Update RRDfile'), 'description' => __('Whether data from this output field is to be entered into the RRDfile.'), 'value' => '|arg1:update_rra|', 'default' => 'on', 'form_id' => '|arg1:id|' ), 'regexp_match' => array( 'method' => 'textbox', 'friendly_name' => __('Regular Expression Match'), 'description' => __('If you want to require a certain regular expression to be matched against input data, enter it here (preg_match format).'), 'value' => '|arg1:regexp_match|', 'max_length' => '200', 'size' => '80' ), 'allow_nulls' => array( 'method' => 'checkbox', 'friendly_name' => __('Allow Empty Input'), 'description' => __('Check here if you want to allow NULL input in this field from the user.'), 'value' => '|arg1:allow_nulls|', 'default' => '', 'form_id' => false ), 'type_code' => array( 'method' => 'textbox', 'friendly_name' => __('Special Type Code'), 'description' => __('If this field should be treated specially by host templates, indicate so here. Valid keywords for this field are %s', str_replace(")", "'", str_replace("(", "'", str_replace("|", ", ", $valid_host_fields))) ), 'value' => '|arg1:type_code|', 'max_length' => '40', 'size' => '20' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'input_output' => array( 'method' => 'hidden', 'value' => '|arg2:|' ), 'sequence' => array( 'method' => 'hidden_zero', 'value' => '|arg1:sequence|' ), 'data_input_id' => array( 'method' => 'hidden_zero', 'value' => '|arg3:data_input_id|' ), 'save_component_field' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: data_templates.php, action: template_edit */ $fields_data_template_template_edit = array( 'template_name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('The name given to this data template.'), 'value' => '|arg1:name|', 'max_length' => '150', 'size' => '80' ), 'data_template_id' => array( 'method' => 'hidden_zero', 'value' => '|arg2:data_template_id|' ), 'data_template_data_id' => array( 'method' => 'hidden_zero', 'value' => '|arg2:id|' ), 'current_rrd' => array( 'method' => 'hidden_zero', 'value' => '|arg3:view_rrd|' ), 'save_component_template' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: (data_sources.php|data_templates.php), action: (ds|template)_edit */ if (db_table_exists('data_source_profiles')) { $def_profile = db_fetch_cell('SELECT id FROM data_source_profiles ORDER BY `default` DESC LIMIT 1'); } else { $def_profile = '1'; } $struct_data_source = array( 'name' => array( 'friendly_name' => __('Name'), 'method' => 'textbox', 'max_length' => '250', 'size' => '80', 'default' => '', 'description' => __('Choose a name for this data source. It can include replacement variables such as |host_description| or |query_fieldName|. For a complete list of supported replacement tags, please see the Cacti documentation.'), 'flags' => '' ), 'data_source_path' => array( 'friendly_name' => __('Data Source Path'), 'method' => 'textbox', 'max_length' => '255', 'size' => '80', 'default' => '', 'description' => __('The full path to the RRDfile.'), 'flags' => 'NOTEMPLATE' ), 'data_input_id' => array( 'friendly_name' => __('Data Input Method'), 'method' => 'drop_sql', 'sql' => 'SELECT id, name FROM data_input ORDER BY name', 'default' => '', 'none_value' => __('None'), 'description' => __('The script/source used to gather data for this data source.'), 'flags' => 'ALWAYSTEMPLATE' ), 'data_source_profile_id' => array( 'friendly_name' => __('Data Source Profile'), 'method' => 'drop_sql', 'description' => __('Select the Data Source Profile. The Data Source Profile controls polling interval, the data aggregation, and retention policy for the resulting Data Sources.'), 'sql' => 'SELECT "0" AS id, "' . __('External') . '" AS name UNION SELECT id, name FROM data_source_profiles ORDER BY name', 'default' => $def_profile, 'flags' => '' ), 'rrd_step' => array( 'friendly_name' => __('Step'), 'method' => 'hidden', 'max_length' => '10', 'size' => '10', 'default' => '300', 'description' => __('The amount of time in seconds between expected updates.'), 'flags' => '' ), 'active' => array( 'friendly_name' => __('Data Source Active'), 'method' => 'checkbox', 'default' => 'on', 'description' => __('Whether Cacti should gather data for this data source or not.'), 'flags' => '' ) ); /* file: (data_sources.php|data_templates.php), action: (ds|template)_edit */ $struct_data_source_item = array( 'data_source_name' => array( 'friendly_name' => __('Internal Data Source Name'), 'method' => 'textbox', 'max_length' => '19', 'size' => '30', 'default' => '', 'description' => __('Choose unique name to represent this piece of data inside of the RRDfile.') ), 'rrd_minimum' => array( 'friendly_name' => __('Minimum Value ("U" for No Minimum)'), 'method' => 'textbox', 'max_length' => '30', 'size' => '20', 'default' => '0', 'description' => __('The minimum value of data that is allowed to be collected.') ), 'rrd_maximum' => array( 'friendly_name' => __('Maximum Value ("U" for No Maximum)'), 'method' => 'textbox', 'max_length' => '30', 'size' => '20', 'default' => '0', 'description' => __('The maximum value of data that is allowed to be collected.') ), 'data_source_type_id' => array( 'friendly_name' => __('Data Source Type'), 'method' => 'drop_array', 'array' => $data_source_types, 'default' => '', 'description' => __('How data is represented in the RRA.') ), 'rrd_heartbeat' => array( 'friendly_name' => __('Heartbeat'), 'method' => 'hidden', 'max_length' => '20', 'size' => '10', 'default' => '600', 'description' => __('The maximum amount of time that can pass before data is entered as \'unknown\'. (Usually 2x300=600)') ), 'data_input_field_id' => array( 'friendly_name' => __('Output Field'), 'method' => 'drop_sql', 'default' => '0', 'none_value' => __('Not Selected'), 'description' => __('When data is gathered, the data for this field will be put into this data source.') ) ); /* file: grprint_presets.php, action: edit */ $fields_grprint_presets_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('Enter a name for this GPRINT preset, make sure it is something you recognize.'), 'value' => '|arg1:name|', 'max_length' => '50', 'size' => '40', ), 'gprint_text' => array( 'method' => 'textbox', 'friendly_name' => __('GPRINT Text'), 'description' => __('Enter the custom GPRINT string here.'), 'value' => '|arg1:gprint_text|', 'max_length' => '50', 'size' => '40', ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_gprint_presets' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: (graphs.php|graph_templates.php), action: (graph|template)_edit */ $struct_graph = array( 'general_header' => array( 'friendly_name' => __('Common Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'title' => array( 'friendly_name' => __('Title (--title)'), 'method' => 'textbox', 'max_length' => '255', 'default' => '', 'description' => __('The name that is printed on the graph. It can include replacement variables such as |host_description| or |query_fieldName|. For a complete list of supported replacement tags, please see the Cacti documentation.'), 'size' => '80' ), 'vertical_label' => array( 'friendly_name' => __('Vertical Label (--vertical-label)'), 'method' => 'textbox', 'max_length' => '255', 'default' => '', 'description' => __('The label vertically printed to the left of the graph.'), 'size' => '30' ), 'image_format_id' => array( 'friendly_name' => __('Image Format (--imgformat)'), 'method' => 'drop_array', 'array' => $image_types, 'default' => read_config_option('default_image_format'), 'description' => __('The type of graph that is generated; PNG, GIF or SVG. The selection of graph image type is very RRDtool dependent.') ), 'height' => array( 'friendly_name' => __('Height (--height)'), 'method' => 'textbox', 'max_length' => '50', 'default' => read_config_option('default_graph_height'), 'description' => __('The height (in pixels) of the graph area within the graph. This area does not include the legend, axis legends, or title.'), 'size' => '7' ), 'width' => array( 'friendly_name' => __('Width (--width)'), 'method' => 'textbox', 'max_length' => '50', 'default' => read_config_option('default_graph_width'), 'description' => __('The width (in pixels) of the graph area within the graph. This area does not include the legend, axis legends, or title.'), 'size' => '7' ), 'base_value' => array( 'friendly_name' => __('Base Value (--base)'), 'method' => 'textbox', 'max_length' => '50', 'default' => '1000', 'description' => __('Should be set to 1024 for memory and 1000 for traffic measurements.'), 'size' => '12' ), 'slope_mode' => array( 'friendly_name' => __('Slope Mode (--slope-mode)'), 'method' => 'checkbox', 'default' => 'on', 'description' => __('Using Slope Mode evens out the shape of the graphs at the expense of some on screen resolution.') ), 'scaling_header' => array( 'friendly_name' => __('Scaling Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'auto_scale' => array( 'friendly_name' => __('Auto Scale'), 'method' => 'checkbox', 'default' => 'on', 'description' => __('Auto scale the y-axis instead of defining an upper and lower limit. Note: if this is check both the Upper and Lower limit will be ignored.'), 'size' => '7' ), 'auto_scale_opts' => array( 'friendly_name' => __('Auto Scale Options'), 'method' => 'radio', 'default' => '2', 'description' => __('Use
    --alt-autoscale to scale to the absolute minimum and maximum
    --alt-autoscale-max to scale to the maximum value, using a given lower limit
    --alt-autoscale-min to scale to the minimum value, using a given upper limit
    --alt-autoscale (with limits) to scale using both lower and upper limits (RRDtool default)
    '), 'items' => array( 0 => array( 'radio_value' => '1', 'radio_caption' => __('Use --alt-autoscale (ignoring given limits)') ), 1 => array( 'radio_value' => '2', 'radio_caption' => __('Use --alt-autoscale-max (accepting a lower limit)') ), 2 => array( 'radio_value' => '3', 'radio_caption' => __('Use --alt-autoscale-min (accepting an upper limit)') ), 3 => array( 'radio_value' => '4', 'radio_caption' => __('Use --alt-autoscale (accepting both limits, RRDtool default)') ) ) ), 'auto_scale_log' => array( 'friendly_name' => __('Logarithmic Scaling (--logarithmic)'), 'method' => 'checkbox', 'default' => '', 'on_change' => 'changeScaleLog()', 'description' => __('Use Logarithmic y-axis scaling') ), 'scale_log_units' => array( 'friendly_name' => __('SI Units for Logarithmic Scaling (--units=si)'), 'method' => 'checkbox', 'default' => '', 'description' => __('Use SI Units for Logarithmic Scaling instead of using exponential notation.
    Note: Linear graphs use SI notation by default.') ), 'auto_scale_rigid' => array( 'friendly_name' => __('Rigid Boundaries Mode (--rigid)'), 'method' => 'checkbox', 'default' => '', 'description' => __('Do not expand the lower and upper limit if the graph contains a value outside the valid range.') ), 'upper_limit' => array( 'friendly_name' => __('Upper Limit (--upper-limit)'), 'method' => 'textbox', 'max_length' => '50', 'default' => '100', 'description' => __('The maximum vertical value for the graph.'), 'size' => '12' ), 'lower_limit' => array( 'friendly_name' => __('Lower Limit (--lower-limit)'), 'method' => 'textbox', 'max_length' => '255', 'default' => '0', 'description' => __('The minimum vertical value for the graph.'), 'size' => '12' ), 'grid_header' => array( 'friendly_name' => __('Grid Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'unit_value' => array( 'friendly_name' => __('Unit Grid Value (--unit/--y-grid)'), 'method' => 'textbox', 'max_length' => '50', 'default' => '', 'description' => __('Sets the exponent value on the Y-axis for numbers. Note: This option is deprecated and replaced by the --y-grid option. In this option, Y-axis grid lines appear at each grid step interval. Labels are placed every label factor lines.'), 'size' => '12' ), 'unit_exponent_value' => array( 'friendly_name' => __('Unit Exponent Value (--units-exponent)'), 'method' => 'textbox', 'max_length' => '50', 'default' => '', 'description' => __('What unit Cacti should use on the Y-axis. Use 3 to display everything in "k" or -6 to display everything in "u" (micro).'), 'size' => '12' ), 'unit_length' => array( 'friendly_name' => __('Unit Length (--units-length <length>)'), 'method' => 'textbox', 'max_length' => '50', 'default' => '', 'size' => '30', 'description' => __('How many digits should RRDtool assume the y-axis labels to be? You may have to use this option to make enough space once you start fiddling with the y-axis labeling.'), ), 'no_gridfit' => array( 'friendly_name' => __('No Gridfit (--no-gridfit)'), 'method' => 'checkbox', 'default' => '', 'description' => __('In order to avoid anti-aliasing blurring effects RRDtool snaps points to device resolution pixels, this results in a crisper appearance. If this is not to your liking, you can use this switch to turn this behavior off.
    Note: Gridfitting is turned off for PDF, EPS, SVG output by default.'), ), 'alt_y_grid' => array( 'friendly_name' => __('Alternative Y Grid (--alt-y-grid)'), 'method' => 'checkbox', 'default' => '', 'description' => __('The algorithm ensures that you always have a grid, that there are enough but not too many grid lines, and that the grid is metric. This parameter will also ensure that you get enough decimals displayed even if your graph goes from 69.998 to 70.001.
    Note: This parameter may interfere with --alt-autoscale options.'), ), 'axis_header' => array( 'friendly_name' => __('Axis Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'right_axis' => array( 'friendly_name' => __('Right Axis (--right-axis <scale:shift>)'), 'method' => 'textbox', 'max_length' => '20', 'default' => '', 'size' => '20', 'description' => __('A second axis will be drawn to the right of the graph. It is tied to the left axis via the scale and shift parameters.'), ), 'right_axis_label' => array( 'friendly_name' => __('Right Axis Label (--right-axis-label <string>)'), 'method' => 'textbox', 'max_length' => '200', 'default' => '', 'size' => '30', 'description' => __('The label for the right axis.'), ), 'right_axis_format' => array( 'friendly_name' => __('Right Axis Format (--right-axis-format <format>)'), 'method' => 'drop_sql', 'sql' => 'SELECT id, name FROM graph_templates_gprint WHERE gprint_text NOT LIKE "%\%s%" ORDER BY name', 'default' => '', 'none_value' => __('None'), 'description' => __('By default, the format of the axis labels gets determined automatically. If you want to do this yourself, use this option with the same %lf arguments you know from the PRINT and GPRINT commands.'), ), 'right_axis_formatter' => array( 'friendly_name' => __('Right Axis Formatter (--right-axis-formatter <formatname>)'), 'method' => 'drop_array', 'array' => $rrd_axis_formatters, 'default' => '0', 'none_value' => __('None'), 'description' => __('When you setup the right axis labeling, apply a rule to the data format. Supported formats include "numeric" where data is treated as numeric, "timestamp" where values are interpreted as UNIX timestamps (number of seconds since January 1970) and expressed using strftime format (default is "%Y-%m-%d %H:%M:%S"). See also --units-length and --right-axis-format. Finally "duration" where values are interpreted as duration in milliseconds. Formatting follows the rules of valstrfduration qualified PRINT/GPRINT.'), ), 'left_axis_formatter' => array( 'friendly_name' => __('Left Axis Formatter (--left-axis-formatter <formatname>)'), 'method' => 'drop_array', 'array' => $rrd_axis_formatters, 'default' => '0', 'none_value' => __('None'), 'description' => __('When you setup the left axis labeling, apply a rule to the data format. Supported formats include "numeric" where data is treated as numeric, "timestamp" where values are interpreted as UNIX timestamps (number of seconds since January 1970) and expressed using strftime format (default is "%Y-%m-%d %H:%M:%S"). See also --units-length. Finally "duration" where values are interpreted as duration in milliseconds. Formatting follows the rules of valstrfduration qualified PRINT/GPRINT.'), ), 'legend_header' => array( 'friendly_name' => __('Legend Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'auto_padding' => array( 'friendly_name' => __('Auto Padding'), 'method' => 'checkbox', 'default' => 'on', 'description' => __('Pad text so that legend and graph data always line up. Note: this could cause graphs to take longer to render because of the larger overhead. Also Auto Padding may not be accurate on all types of graphs, consistent labeling usually helps.') ), 'dynamic_labels' => array( 'friendly_name' => __('Dynamic Labels (--dynamic-labels)'), 'method' => 'checkbox', 'default' => '', 'description' => __('Draw line markers as a line.'), ), 'force_rules_legend' => array( 'friendly_name' => __('Force Rules Legend (--force-rules-legend)'), 'method' => 'checkbox', 'default' => '', 'description' => __('Force the generation of HRULE and VRULE legends.'), ), 'tab_width' => array( 'friendly_name' => __('Tab Width (--tabwidth <pixels>)'), 'method' => 'textbox', 'max_length' => '50', 'default' => '', 'size' => '10', 'description' => __('By default the tab-width is 40 pixels, use this option to change it.') ), 'legend_position' => array( 'friendly_name' => __('Legend Position (--legend-position=<position>)'), 'method' => 'drop_array', 'array' => $rrd_legend_position, 'none_value' => __('None'), 'description' => __('Place the legend at the given side of the graph.'), ), 'legend_direction' => array( 'friendly_name' => __('Legend Direction (--legend-direction=<direction>)'), 'method' => 'drop_array', 'array' => $rrd_legend_direction, 'none_value' => __('None'), 'description' => __('Place the legend items in the given vertical order.'), ), ); /* file: (graphs.php|graph_templates.php), action: item_edit */ $struct_graph_item = array( 'graph_type_id' => array( 'friendly_name' => __('Graph Item Type'), 'method' => 'drop_array', 'array' => $graph_item_types, 'default' => '4', 'description' => __('How data for this item is represented visually on the graph.') ), 'task_item_id' => array( 'friendly_name' => __('Data Source'), 'method' => 'drop_sql', 'sql' => 'SELECT CONCAT_WS("",case when host.description is null then "No Device" when host.description is not null then host.description end," - ",data_template_data.name," (",data_template_rrd.data_source_name,")") AS name, data_template_rrd.id FROM (data_template_data,data_template_rrd,data_local) LEFT JOIN host ON (data_local.host_id=host.id) WHERE data_template_rrd.local_data_id=data_local.id AND data_template_data.local_data_id=data_local.id ORDER BY name', 'default' => '0', 'none_value' => __('None'), 'description' => __('The data source to use for this graph item.') ), 'color_id' => array( 'friendly_name' => __('Color'), 'method' => 'drop_color', 'default' => '0', 'on_change' => 'changeColorId()', 'description' => __('The color to use for the legend.') ), 'alpha' => array( 'friendly_name' => __('Opacity/Alpha Channel'), 'method' => 'drop_array', 'default' => 'FF', 'array' => $graph_color_alpha, 'description' => __('The opacity/alpha channel of the color.') ), 'consolidation_function_id' => array( 'friendly_name' => __('Consolidation Function'), 'method' => 'drop_array', 'array' => $consolidation_functions, 'default' => '0', 'description' => __('How data for this item is represented statistically on the graph.') ), 'cdef_id' => array( 'friendly_name' => __('CDEF Function'), 'method' => 'drop_sql', 'sql' => 'SELECT id, name FROM cdef ORDER BY name', 'default' => '0', 'none_value' => __('None'), 'description' => __('A CDEF (math) function to apply to this item on the graph or legend.') ), 'vdef_id' => array( 'friendly_name' => __('VDEF Function'), 'method' => 'drop_sql', 'sql' => 'SELECT id, name FROM vdef ORDER BY name', 'default' => '0', 'none_value' => __('None'), 'description' => __('A VDEF (math) function to apply to this item on the graph legend.') ), 'shift' => array( 'friendly_name' => __('Shift Data'), 'method' => 'checkbox', 'default' => '', 'description' => __('Offset your data on the time axis (x-axis) by the amount specified in the \'value\' field.'), ), 'value' => array( 'friendly_name' => __('Value'), 'method' => 'textbox', 'max_length' => '255', 'size' => '80', 'default' => '', 'description' => __('[HRULE|VRULE]: The value of the graph item.
    [TICK]: The fraction for the tick line.
    [SHIFT]: The time offset in seconds.') ), 'gprint_id' => array( 'friendly_name' => __('GPRINT Type'), 'method' => 'drop_sql', 'sql' => 'SELECT id, name FROM graph_templates_gprint ORDER BY name', 'default' => '2', 'description' => __('If this graph item is a GPRINT, you can optionally choose another format here. You can define additional types under "GPRINT Presets".') ), 'textalign' => array( 'friendly_name' => __('Text Alignment' . ' (TEXTALIGN)'), 'method' => 'drop_array', 'value' => '|arg1:textalign|', 'array' => $rrd_textalign, 'default' => '', 'description' => __('All subsequent legend line(s) will be aligned as given here. You may use this command multiple times in a single graph. This command does not produce tabular layout.
    Note: You may want to insert a <HR> on the preceding graph item.
    Note: A <HR> on this legend line will obsolete this setting!'), ), 'text_format' => array( 'friendly_name' => __('Text Format'), 'method' => 'textbox', 'max_length' => '255', 'size' => '80', 'default' => '', 'description' => __('Text that will be displayed on the legend for this graph item.') ), 'hard_return' => array( 'friendly_name' => __('Insert Hard Return'), 'method' => 'checkbox', 'default' => '', 'description' => __('Forces the legend to the next line after this item.') ), 'line_width' => array( 'friendly_name' => __('Line Width (decimal)'), 'method' => 'textbox', 'max_length' => '5', 'default' => '1.00', 'size' => '5', 'description' => __('In case LINE was chosen, specify width of line here. You must include a decimal precision, for example 2.00'), ), 'dashes' => array( 'friendly_name' => __('Dashes (dashes[=on_s[,off_s[,on_s,off_s]...]])'), 'method' => 'textbox', 'max_length' => '40', 'default' => '', 'size' => '30', 'description' => __('The dashes modifier enables dashed line style.'), ), 'dash_offset' => array( 'friendly_name' => __('Dash Offset (dash-offset=offset)'), 'method' => 'textbox', 'max_length' => '4', 'default' => '', 'size' => '4', 'description' => __('The dash-offset parameter specifies an offset into the pattern at which the stroke begins.'), ), 'sequence' => array( 'friendly_name' => __('Sequence'), 'method' => 'textbox', 'max_length' => '4', 'default' => '', 'size' => '4', 'description' => __('The dash-offset parameter specifies an offset into the pattern at which the stroke begins.'), ) ); /* file: graph_templates.php, action: template_edit */ $fields_graph_template_template_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('The name given to this graph template.'), 'value' => '|arg1:name|', 'max_length' => '150', 'size' => '80' ), 'multiple' => array( 'method' => 'checkbox', 'friendly_name' => __('Multiple Instances'), 'description' => __('Check this checkbox if there can be more than one Graph of this type per Device.'), 'value' => '|arg1:multiple|', 'default' => '', 'form_id' => false ), 'test_source' => array( 'method' => 'checkbox', 'friendly_name' => __('Test Data Sources'), 'description' => __('Check this checkbox if you wish to test the Data Sources prior to their creation. With Test Data Sources enabled, if the Data Source does not return valid data, the Graph will not be created. This setting is important if you wish to have a more generic Device Template that can include more Graph Templates that can be selectively applied depending on the characteristics of the Device itself. Note: If you have a long running script as a Data Source, the time to create Graphs will be increased.'), 'value' => '|arg1:test_source|', 'default' => '', 'form_id' => false ), 'graph_template_id' => array( 'method' => 'hidden_zero', 'value' => '|arg2:graph_template_id|' ), 'graph_template_graph_id' => array( 'method' => 'hidden_zero', 'value' => '|arg2:id|' ), 'save_component_template' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: graph_templates.php, action: input_edit */ $fields_graph_template_input_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('Enter a name for this graph item input, make sure it is something you recognize.'), 'value' => '|arg1:name|', 'max_length' => '50', 'size' => '40', ), 'description' => array( 'method' => 'textarea', 'friendly_name' => __('Description'), 'description' => __('Enter a description for this graph item input to describe what this input is used for.'), 'value' => '|arg1:description|', 'textarea_rows' => '5', 'textarea_cols' => '40' ), 'column_name' => array( 'method' => 'drop_array', 'friendly_name' => __('Field Type'), 'description' => __('How data is to be represented on the graph.'), 'value' => '|arg1:column_name|', 'array' => '|arg2:|', ), 'graph_template_id' => array( 'method' => 'hidden_zero', 'value' => '|arg3:graph_template_id|' ), 'graph_template_input_id' => array( 'method' => 'hidden_zero', 'value' => '|arg3:id|' ), 'save_component_input' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: host.php, action: edit */ $fields_host_edit = array( 'host_gen_head' => array( 'method' => 'spacer', 'collapsible' => 'true', 'friendly_name' => __('General Device Options') ), 'description' => array( 'method' => 'textbox', 'friendly_name' => __('Description'), 'description' => __('Give this host a meaningful description.'), 'value' => '|arg1:description|', 'max_length' => '150', ), 'hostname' => array( 'method' => 'textbox', 'friendly_name' => __('Hostname'), 'description' => __('Fully qualified hostname or IP address for this device.'), 'value' => '|arg1:hostname|', 'max_length' => '100', 'size' => '60', ), 'location' => array( 'method' => 'drop_callback', 'friendly_name' => __('Location'), 'description' => __('The physical location of the Device. This free form text can be a room, rack location, etc.'), 'none_value' => __('None'), 'sql' => 'SELECT DISTINCT location AS id, location AS name FROM host ORDER BY location', 'action' => 'ajax_locations', 'id' => '|arg1:location|', 'value' => '|arg1:location|', ), 'poller_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Poller Association'), 'description' => __('Choose the Cacti Data Collector/Poller to be used to gather data from this Device.'), 'value' => '|arg1:poller_id|', 'default' => read_config_option('default_poller'), 'sql' => 'SELECT id, name FROM poller ORDER BY name', ), 'site_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Device Site Association'), 'description' => __('What Site is this Device associated with.'), 'value' => '|arg1:site_id|', 'none_value' => __('None'), 'default' => read_config_option('default_site'), 'sql' => 'SELECT id, name FROM sites ORDER BY name', ), 'host_template_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Device Template'), 'description' => __('Choose the Device Template to use to define the default Graph Templates and Data Queries associated with this Device.'), 'value' => '|arg1:host_template_id|', 'none_value' => __('None'), 'default' => read_config_option('default_template'), 'sql' => 'SELECT id, name FROM host_template ORDER BY name', ), 'device_threads' => array( 'method' => 'drop_array', 'friendly_name' => __('Number of Collection Threads'), 'description' => __('The number of concurrent threads to use for polling this device. This applies to the Spine poller only.'), 'value' => '|arg1:device_threads|', 'default' => '1', 'array' => $device_threads ), 'disabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Disable Device'), 'description' => __('Check this box to disable all checks for this host.'), 'value' => '|arg1:disabled|', 'default' => '', 'form_id' => false ), 'host_snmp_head' => array( 'method' => 'spacer', 'friendly_name' => __('SNMP Options'), ), ) + $fields_snmp_item_with_oids + array( 'host_avail_head' => array( 'method' => 'spacer', 'friendly_name' => __('Availability/Reachability Options'), 'collapsible' => 'true', ), 'availability_method' => array( 'friendly_name' => __('Downed Device Detection'), 'description' => __('The method Cacti will use to determine if a host is available for polling.
    NOTE: It is recommended that, at a minimum, SNMP always be selected.'), 'on_change' => 'changeHostForm()', 'value' => '|arg1:availability_method|', 'method' => 'drop_array', 'default' => read_config_option('availability_method'), 'array' => $availability_options ), 'ping_method' => array( 'friendly_name' => __('Ping Method'), 'description' => __('The type of ping packet to sent.
    NOTE: ICMP on Linux/UNIX requires root privileges.'), 'on_change' => 'changeHostForm()', 'value' => '|arg1:ping_method|', 'method' => 'drop_array', 'default' => read_config_option('ping_method'), 'array' => $ping_methods ), 'ping_port' => array( 'method' => 'textbox', 'friendly_name' => __('Ping Port'), 'value' => '|arg1:ping_port|', 'description' => __('TCP or UDP port to attempt connection.'), 'default' => read_config_option('ping_port'), 'max_length' => '50', 'size' => '7' ), 'ping_timeout' => array( 'friendly_name' => __('Ping Timeout Value'), 'description' => __('The timeout value to use for host ICMP and UDP pinging. This host SNMP timeout value applies for SNMP pings.'), 'method' => 'textbox', 'value' => '|arg1:ping_timeout|', 'default' => read_config_option('ping_timeout'), 'max_length' => '10', 'size' => '7' ), 'ping_retries' => array( 'friendly_name' => __('Ping Retry Count'), 'description' => __('After an initial failure, the number of ping retries Cacti will attempt before failing.'), 'method' => 'textbox', 'value' => '|arg1:ping_retries|', 'default' => read_config_option('ping_retries'), 'max_length' => '10', 'size' => '7' ), 'host_add_head' => array( 'method' => 'spacer', 'collapsible' => 'true', 'friendly_name' => __('Additional Options') ), 'notes' => array( 'method' => 'textarea', 'friendly_name' => __('Notes'), 'description' => __('Enter notes to this host.'), 'class' => 'textAreaNotes', 'value' => '|arg1:notes|', 'textarea_rows' => '5', 'textarea_cols' => '50' ), 'external_id' => array( 'friendly_name' => __('External ID'), 'description' => __('External ID for linking Cacti data to external monitoring systems.'), 'method' => 'textbox', 'value' => '|arg1:external_id|', 'default' => '', 'max_length' => '40', 'size' => '20' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_host' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: host_templates.php, action: edit */ $fields_host_template_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this host template.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_template' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: data_queries.php, action: edit */ $fields_data_query_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A name for this data query.'), 'value' => '|arg1:name|', 'max_length' => '100', 'size' => '60' ), 'description' => array( 'method' => 'textbox', 'friendly_name' => __('Description'), 'description' => __('A description for this data query.'), 'value' => '|arg1:description|', 'max_length' => '255', 'size' => '80', ), 'xml_path' => array( 'method' => 'textbox', 'friendly_name' => __('XML Path'), 'description' => __('The full path to the XML file containing definitions for this data query.'), 'value' => '|arg1:xml_path|', 'default' => '/resource/', 'max_length' => '255', 'size' => '80', ), 'data_input_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Data Input Method'), 'description' => __('Choose the input method for this Data Query. This input method defines how data is collected for each Device associated with the Data Query.'), 'value' => '|arg1:data_input_id|', 'sql' => 'SELECT id, name FROM data_input WHERE type_id IN(3,4,6) ORDER BY name', ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|', ), 'save_component_snmp_query' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: data_queries.php, action: item_edit */ $fields_data_query_item_edit = array( 'graph_template_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Graph Template'), 'description' => __('Choose the Graph Template to use for this Data Query Graph Template item.'), 'value' => '|arg1:graph_template_id|', 'sql' => 'SELECT DISTINCT gt.id, gt.name FROM graph_templates AS gt WHERE gt.id IN( SELECT DISTINCT gti.graph_template_id FROM ( SELECT DISTINCT graph_template_id, task_item_id FROM graph_templates_item WHERE local_graph_id=0 ) AS gti INNER JOIN ( SELECT id, data_template_id FROM data_template_rrd AS dtr WHERE dtr.local_data_id = 0 ) AS dtr ON gti.task_item_id=dtr.id INNER JOIN ( SELECT DISTINCT data_template_id FROM data_template_data AS dtd WHERE local_data_id = 0 AND dtd.data_input_id IN (2,11,12) ) AS dtd ON dtd.data_template_id=dtr.data_template_id ) ORDER BY gt.name', ), 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A name for this associated graph.'), 'value' => '|arg1:name|', 'max_length' => '100', 'size' => '60', ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'snmp_query_id' => array( 'method' => 'hidden_zero', 'value' => '|arg2:snmp_query_id|' ), 'graph_template_id_prev' => array( 'method' => 'hidden_zero', 'value' => '|arg1:graph_template_id|' ), 'save_component_snmp_query_item' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: tree.php, action: edit */ $fields_tree_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this graph tree.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80', ), 'sort_type' => array( 'method' => 'drop_array', 'friendly_name' => __('Sorting Type'), 'description' => __('Choose how items in this tree will be sorted.'), 'value' => '|arg1:sort_type|', 'array' => $tree_sort_types, ), 'enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Publish'), 'description' => __('Should this Tree be published for users to access?'), 'value' => '|arg1:enabled|', 'default' => 'on' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'sequence' => array( 'method' => 'hidden', 'value' => '|arg1:sequence|' ), 'save_component_tree' => array( 'method' => 'hidden', 'value' => '1' ) ); /* file: user_admin.php, action: user_edit (host) */ $fields_user_user_edit_host = array( 'username' => array( 'method' => 'textbox', 'friendly_name' => __('User Name'), 'description' => __('The login name for this user.'), 'value' => '|arg1:username|', 'max_length' => '255', 'size' => '40', ), 'full_name' => array( 'method' => 'textbox', 'friendly_name' => __('Full Name'), 'description' => __('A more descriptive name for this user, that can include spaces or special characters.'), 'value' => '|arg1:full_name|', 'max_length' => '128', 'size' => 60 ), 'email_address' => array( 'method' => 'textbox', 'friendly_name' => __('Email Address'), 'description' => __('An Email Address where the User can be reached.'), 'value' => '|arg1:email_address|', 'max_length' => '128', 'size' => 60 ), 'password' => array( 'method' => 'textbox_password', 'friendly_name' => __('Password'), 'description' => __('Enter the password for this user twice. Remember that passwords are case sensitive!'), 'value' => '', 'max_length' => '255', 'size' => 60 ), 'enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Enabled'), 'description' => __('Determines if user is able to login.'), 'value' => '|arg1:enabled|', 'default' => '' ), 'locked' => array( 'method' => 'checkbox', 'friendly_name' => __('Locked'), 'description' => __('Determines if the user account is locked.'), 'value' => '|arg1:locked|', 'default' => '' ), 'grp1' => array( 'friendly_name' => __('Account Options'), 'method' => 'checkbox_group', 'description' => __('Set any user account specific options here.'), 'items' => array( 'must_change_password' => array( 'value' => '|arg1:must_change_password|', 'friendly_name' => __('Must Change Password at Next Login'), 'form_id' => '|arg1:id|', 'default' => '' ), 'password_change' => array( 'value' => '|arg1:password_change|', 'friendly_name' => __('Change Password'), 'form_id' => '|arg1:id|', 'default' => 'on' ), 'graph_settings' => array( 'value' => '|arg1:graph_settings|', 'friendly_name' => __('Maintain Custom Graph and User Settings'), 'form_id' => '|arg1:id|', 'default' => 'on' ) ) ), 'grp2' => array( 'friendly_name' => __('Graph Options'), 'method' => 'checkbox_group', 'description' => __('Set any graph specific options here.'), 'items' => array( 'show_tree' => array( 'value' => '|arg1:show_tree|', 'friendly_name' => __('User Has Rights to Tree View'), 'form_id' => '|arg1:id|', 'default' => 'on' ), 'show_list' => array( 'value' => '|arg1:show_list|', 'friendly_name' => __('User Has Rights to List View'), 'form_id' => '|arg1:id|', 'default' => 'on' ), 'show_preview' => array( 'value' => '|arg1:show_preview|', 'friendly_name' => __('User Has Rights to Preview View'), 'form_id' => '|arg1:id|', 'default' => 'on' ) ) ), 'login_opts' => array( 'friendly_name' => __('Login Options'), 'method' => 'radio', 'default' => '1', 'description' => __('What to do when this user logs in.'), 'value' => '|arg1:login_opts|', 'items' => array( 0 => array( 'radio_value' => '1', 'radio_caption' => __('Show the page that user pointed their browser to.') ), 1 => array( 'radio_value' => '2', 'radio_caption' => __('Show the default console screen.') ), 2 => array( 'radio_value' => '3', 'radio_caption' => __('Show the default graph screen.') ) ) ), 'realm' => array( 'method' => 'drop_array', 'friendly_name' => __('Authentication Realm'), 'description' => __('Only used if you have LDAP or Web Basic Authentication enabled. Changing this to a non-enabled realm will effectively disable the user.'), 'value' => '|arg1:realm|', 'default' => 0, 'array' => $auth_realms, ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ), 'save_component_user' => array( 'method' => 'hidden', 'value' => '1' ) ); $export_types = array( 'host_template' => array( 'name' => __('Device Template'), 'title_sql' => 'SELECT name FROM host_template WHERE id=|id|', 'dropdown_sql' => 'SELECT id, name FROM host_template ORDER BY name' ), 'graph_template' => array( 'name' => __('Graph Template'), 'title_sql' => 'SELECT name FROM graph_templates WHERE id=|id|', 'dropdown_sql' => 'SELECT id, name FROM graph_templates ORDER BY name' ), 'data_template' => array( 'name' => __('Data Template'), 'title_sql' => 'SELECT name FROM data_template WHERE id=|id|', 'dropdown_sql' => 'SELECT id, name FROM data_template ORDER BY name' ), 'data_query' => array( 'name' => __('Data Query'), 'title_sql' => 'SELECT name FROM snmp_query WHERE id=|id|', 'dropdown_sql' => 'SELECT id, name FROM snmp_query ORDER BY name' ), // 'automation_devices' => array( // 'name' => __('Discovery Rules'), // 'title_sql' => 'SELECT CONCAT(ht.name, " (", at.sysDescr, ")") AS name FROM automation_templates AS at INNER JOIN host_template AS ht ON ht.id=at.host_template WHERE at.id=|id|', // 'dropdown_sql' => 'SELECT at.id, CONCAT(ht.name, " (", at.sysDescr, ")") AS name FROM automation_templates AS at INNER JOIN host_template AS ht ON ht.id=at.host_template ORDER BY name' // ), // 'automation_graphs' => array( // 'name' => __('Graph Rules'), // 'title_sql' => 'SELECT name FROM automation_graph_rules WHERE id=|id|', // 'dropdown_sql' => 'SELECT id, name FROM automation_graph_rules ORDER BY name' // ), // 'automation_trees' => array( // 'name' => __('Tree Rules'), // 'title_sql' => 'SELECT name FROM automation_tree_rules WHERE id=|id|', // 'dropdown_sql' => 'SELECT id, name FROM automation_tree_rules ORDER BY name' // ) ); $fields_template_import = array( 'import_file' => array( 'friendly_name' => __('Import Template from Local File'), 'description' => __('If the XML file containing template data is located on your local machine, select it here.'), 'accept' => '.xml', 'method' => 'file' ), 'import_text' => array( 'method' => 'hidden', 'friendly_name' => __('Import Template from Text'), 'description' => __('If you have the XML file containing template data as text, you can paste it into this box to import it.'), 'value' => '', 'default' => '', 'textarea_rows' => '10', 'textarea_cols' => '50', 'class' => 'textAreaNotes' ), 'preview_only' => array( 'friendly_name' => __('Preview Import Only'), 'method' => 'checkbox', 'description' => __('If checked, Cacti will not import the template, but rather compare the imported Template to the existing Template data. If you are acceptable of the change, you can them import.'), 'value' => '', 'default' => 'on' ), 'remove_orphans' => array( 'friendly_name' => __('Remove Orphaned Graph Items'), 'method' => 'checkbox', 'description' => __('If checked, Cacti will delete any Graph Items from both the Graph Template and associated Graphs that are not included in the imported Graph Template.'), 'value' => '', 'default' => '' ), 'import_data_source_profile' => array( 'friendly_name' => __('Data Source Profile'), 'method' => 'drop_sql', 'description' => __('Select the Data Source Profile. The Data Source Profile controls polling interval, the data aggregation, and retention policy for the resulting Data Sources.'), 'sql' => "SELECT id, name FROM data_source_profiles ORDER BY name", 'none_value' => __('Create New from Template'), 'value' => '', 'default' => '1' ), ); $fields_manager_edit = array( 'host_header' => array( 'method' => 'spacer', 'friendly_name' => __('General SNMP Entity Options'), 'collapsible' => 'true' ), 'description' => array( 'method' => 'textbox', 'friendly_name' => __('Description'), 'description' => __('Give this SNMP entity a meaningful description.'), 'value' => '|arg1:description|', 'max_length' => '250', 'size' => 80 ), 'hostname' => array( 'method' => 'textbox', 'friendly_name' => __('Hostname'), 'description' => __('Fully qualified hostname or IP address for this device.'), 'value' => '|arg1:hostname|', 'max_length' => '250', 'size' => 80 ), 'disabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Disable SNMP Notification Receiver'), 'description' => __('Check this box if you temporary do not want to send SNMP notifications to this host.'), 'value' => '|arg1:disabled|', 'default' => '', 'form_id' => false ), 'max_log_size' => array( 'method' => 'drop_array', 'friendly_name' => __('Maximum Log Size'), 'description' => __('Maximum number of day\'s notification log entries for this receiver need to be stored.'), 'value' => '|arg1:max_log_size|', 'default' => 31, 'array' => array_combine( range(1,31), range(1,31) ) ), 'snmp_options_header' => array( 'method' => 'spacer', 'friendly_name' => __('SNMP Options'), 'collapsible' => 'true' ), ) + $fields_snmp_item + array( 'snmp_message_type' => array( 'friendly_name' => __('SNMP Message Type'), 'description' => __('SNMP traps are always unacknowledged. To send out acknowledged SNMP notifications, formally called "INFORMS", SNMPv2 or above will be required.'), 'method' => 'drop_array', 'value' => '|arg1:snmp_message_type|', 'default' => '1', 'array' => array(1 => 'NOTICATIONS', 2 => 'INFORMS') ), 'addition_header' => array( 'method' => 'spacer', 'friendly_name' => __('Additional Options'), 'collapsible' => 'true' ), 'notes' => array( 'method' => 'textarea', 'friendly_name' => __('Notes'), 'description' => __('Enter notes to this host.'), 'class' => 'textAreaNotes', 'value' => '|arg1:notes|', 'textarea_rows' => '5', 'textarea_cols' => '50' ), 'id' => array( 'method' => 'hidden_zero', 'value' => '|arg1:id|' ) ); # ------------------------------------------------------------ # Main Aggregate Parameters # ------------------------------------------------------------ /* file: aggregate.php */ $struct_aggregate = array( 'title_format' => array( 'friendly_name' => __('Title'), 'description' => __('The new Title of the aggregated Graph.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:title_format|', 'size' => '80' ), 'gprint_prefix' => array( 'friendly_name' => __('Prefix'), 'description' => __('A Prefix for all GPRINT lines to distinguish e.g. different hosts.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:gprint_prefix|', 'size' => '40' ), 'gprint_format' => array( 'friendly_name' => __('Include Prefix Text'), 'description' => __('Include the source Graphs GPRINT Title Text with the Aggregate Graph(s).'), 'method' => 'checkbox', 'value' => '|arg1:gprint_format|', 'default' => '' ), 'aggregate_graph_type' => array( 'friendly_name' => __('Graph Type'), 'description' => __('Use this Option to create e.g. STACKed graphs.
    AREA/STACK: 1st graph keeps AREA/STACK items, others convert to STACK
    LINE1: all items convert to LINE1 items
    LINE2: all items convert to LINE2 items
    LINE3: all items convert to LINE3 items'), 'method' => 'drop_array', 'value' => '|arg1:aggregate_graph_type|', 'array' => $agg_graph_types, 'default' => GRAPH_ITEM_TYPE_STACK, ), 'aggregate_total' => array( 'friendly_name' => __('Totaling'), 'description' => __('Please check those Items that shall be totaled in the "Total" column, when selecting any totaling option here.'), 'method' => 'drop_array', 'value' => '|arg1:aggregate_total|', 'array' => $agg_totals, 'default' => AGGREGATE_TOTAL_NONE ), 'aggregate_total_type' => array( 'friendly_name' => __('Total Type'), 'description' => __('Which type of totaling shall be performed.'), 'method' => 'drop_array', 'value' => '|arg1:aggregate_total_type|', 'array' => $agg_totals_type, 'default' => AGGREGATE_TOTAL_TYPE_SIMILAR ), 'aggregate_total_prefix' => array( 'friendly_name' => __('Prefix for GPRINT Totals'), 'description' => __('A Prefix for all totaling GPRINT lines.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:aggregate_total_prefix|', 'size' => '40' ), 'aggregate_order_type' => array( 'friendly_name' => __('Reorder Type'), 'description' => __('Reordering of Graphs.'), 'method' => 'drop_array', 'value' => '|arg1:aggregate_order_type|', 'array' => $agg_order_types, 'default' => AGGREGATE_ORDER_NONE, ), 'graph_template_id' => array( 'method' => 'hidden', 'value' => '|arg1:graph_template_id|', 'default' => 0 ) ); $struct_aggregate_graph = array( 'spacer0' => array( 'friendly_name' => __('General Settings'), 'method' => 'spacer' ), 'title_format' => array( 'friendly_name' => __('Graph Name'), 'description' => __('Please name this Aggregate Graph.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:title_format|', 'size' => '80' ), 'template_propogation' => array( 'friendly_name' => __('Propagation Enabled'), 'description' => __('Is this to carry the template?'), 'method' => 'checkbox', 'default' => '', 'value' => '|arg1:template_propogation|' ), 'spacer1' => array( 'friendly_name' => __('Aggregate Graph Settings'), 'method' => 'spacer' ), 'gprint_prefix' => array( 'friendly_name' => __('Prefix'), 'description' => __('A Prefix for all GPRINT lines to distinguish e.g. different hosts. You may use both Host as well as Data Query replacement variables in this prefix.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:gprint_prefix|', 'size' => '40' ), 'gprint_format' => array( 'friendly_name' => __('Include Prefix Text'), 'description' => __('Include the source Graphs GPRINT Title Text with the Aggregate Graph(s).'), 'method' => 'checkbox', 'value' => '|arg1:gprint_format|', 'default' => '' ), 'graph_type' => array( 'friendly_name' => __('Graph Type'), 'description' => __('Use this Option to create e.g. STACKed graphs.
    AREA/STACK: 1st graph keeps AREA/STACK items, others convert to STACK
    LINE1: all items convert to LINE1 items
    LINE2: all items convert to LINE2 items
    LINE3: all items convert to LINE3 items'), 'method' => 'drop_array', 'value' => '|arg1:graph_type|', 'array' => $agg_graph_types, 'default' => GRAPH_ITEM_TYPE_STACK, ), 'total' => array( 'friendly_name' => __('Totaling'), 'description' => __('Please check those Items that shall be totaled in the "Total" column, when selecting any totaling option here.'), 'method' => 'drop_array', 'value' => '|arg1:total|', 'array' => $agg_totals, 'default' => AGGREGATE_TOTAL_NONE, 'on_change' => 'changeTotals()', ), 'total_type' => array( 'friendly_name' => __('Total Type'), 'description' => __('Which type of totaling shall be performed.'), 'method' => 'drop_array', 'value' => '|arg1:total_type|', 'array' => $agg_totals_type, 'default' => AGGREGATE_TOTAL_TYPE_SIMILAR, 'on_change' => 'changeTotalsType()', ), 'total_prefix' => array( 'friendly_name' => __('Prefix for GPRINT Totals'), 'description' => __('A Prefix for all totaling GPRINT lines.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:total_prefix|', 'size' => '40' ), 'order_type' => array( 'friendly_name' => __('Reorder Type'), 'description' => __('Reordering of Graphs.'), 'method' => 'drop_array', 'value' => '|arg1:order_type|', 'array' => $agg_order_types, 'default' => AGGREGATE_ORDER_NONE, ), 'id' => array( 'method' => 'hidden', 'value' => '|arg1:id|', 'default' => 0 ), 'local_graph_id' => array( 'method' => 'hidden', 'value' => '|arg1:local_graph_id|', 'default' => 0 ), 'aggregate_template_id' => array( 'method' => 'hidden', 'value' => '|arg1:aggregate_template_id|', 'default' => 0 ), 'graph_template_id' => array( 'method' => 'hidden', 'value' => '|arg1:graph_template_id|', 'default' => 0 ) ); $struct_aggregate_template = array( 'spacer0' => array( 'friendly_name' => __('General Settings'), 'method' => 'spacer' ), 'name' => array( 'friendly_name' => __('Aggregate Template Name'), 'description' => __('Please name this Aggregate Template.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:name|', 'size' => '80' ), 'graph_template_id' => array( 'friendly_name' => __('Source Graph Template'), 'description' => __('The Graph Template that this Aggregate Template is based upon.'), 'method' => 'drop_sql', 'value' => '|arg1:graph_template_id|', 'sql' => 'SELECT id, name FROM graph_templates ORDER BY name', 'default' => 0, 'none_value' => 'None' ), 'spacer1' => array( 'friendly_name' => __('Aggregate Template Settings'), 'method' => 'spacer' ), 'gprint_prefix' => array( 'friendly_name' => __('Prefix'), 'description' => __('A Prefix for all GPRINT lines to distinguish e.g. different hosts. You may use both Host as well as Data Query replacement variables in this prefix.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:gprint_prefix|', 'size' => '40' ), 'gprint_format' => array( 'friendly_name' => __('Include Prefix Text'), 'description' => __('Include the source Graphs GPRINT Title Text with the Aggregate Graph(s).'), 'method' => 'checkbox', 'value' => '|arg1:gprint_format|', 'default' => '' ), 'graph_type' => array( 'friendly_name' => __('Graph Type'), 'description' => __('Use this Option to create e.g. STACKed graphs.
    AREA/STACK: 1st graph keeps AREA/STACK items, others convert to STACK
    LINE1: all items convert to LINE1 items
    LINE2: all items convert to LINE2 items
    LINE3: all items convert to LINE3 items'), 'method' => 'drop_array', 'value' => '|arg1:graph_type|', 'array' => $agg_graph_types, 'default' => GRAPH_ITEM_TYPE_STACK, ), 'total' => array( 'friendly_name' => __('Totaling'), 'description' => __('Please check those Items that shall be totaled in the "Total" column, when selecting any totaling option here.'), 'method' => 'drop_array', 'value' => '|arg1:total|', 'array' => $agg_totals, 'default' => AGGREGATE_TOTAL_NONE, 'on_change' => 'changeTotals()', ), 'total_type' => array( 'friendly_name' => __('Total Type'), 'description' => __('Which type of totaling shall be performed.'), 'method' => 'drop_array', 'value' => '|arg1:total_type|', 'array' => $agg_totals_type, 'default' => AGGREGATE_TOTAL_TYPE_SIMILAR, 'on_change' => 'changeTotalsType()', ), 'total_prefix' => array( 'friendly_name' => __('Prefix for GPRINT Totals'), 'description' => __('A Prefix for all totaling GPRINT lines.'), 'method' => 'textbox', 'max_length' => '255', 'value' => '|arg1:total_prefix|', 'size' => '40' ), 'order_type' => array( 'friendly_name' => __('Reorder Type'), 'description' => __('Reordering of Graphs.'), 'method' => 'drop_array', 'value' => '|arg1:order_type|', 'array' => $agg_order_types, 'default' => AGGREGATE_ORDER_NONE, ), 'graph_template_id_prev' => array( 'method' => 'hidden', 'value' => '|arg1:graph_template_id|', 'default' => 0 ) ); # ------------------------------------------------------------ # Color Templates # ------------------------------------------------------------ /* file: color_templates.php, action: template_edit */ $struct_color_template = array( 'title' => array( 'friendly_name' => __('Title'), 'method' => 'textbox', 'max_length' => '255', 'default' => '', 'description' => __('The name of this Color Template.'), 'size' => '80' ) ); /* file: color_templates.php, action: item_edit */ $struct_color_template_item = array( 'color_id' => array( 'friendly_name' => __('Color'), 'method' => 'drop_color', 'default' => '0', 'description' => __('A nice Color'), 'value' => '|arg1:color_id|', ) ); /* file: color_templates.php, action: template_edit */ $fields_color_template_template_edit = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this Template.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80' ) ); # ------------------------------------------------------------ # Automation Rules # ------------------------------------------------------------ /* file: automation_graph_rules.php, automation_tree_rules.php, action: edit */ $fields_automation_match_rule_item_edit = array( 'operation' => array( 'method' => 'drop_array', 'friendly_name' => __('Operation'), 'description' => __('Logical operation to combine rules.'), 'array' => $automation_oper, 'value' => '|arg1:operation|', 'on_change' => 'toggle_operation()', ), 'field' => array( 'method' => 'drop_array', 'friendly_name' => __('Field Name'), 'description' => __('The Field Name that shall be used for this Rule Item.'), 'array' => array(), # to be filled dynamically 'value' => '|arg1:field|', 'none_value' => __('None'), ), 'operator' => array( 'method' => 'drop_array', 'friendly_name' => __('Operator'), 'description' => __('Operator.'), 'array' => $automation_op_array['display'], 'value' => '|arg1:operator|', 'on_change' => 'toggle_operator()', ), 'pattern' => array( 'method' => 'textbox', 'friendly_name' => __('Matching Pattern'), 'description' => __('The Pattern to be matched against.'), 'value' => '|arg1:pattern|', 'max_length' => '255', 'size' => '50', ), 'sequence' => array( 'method' => 'view', 'friendly_name' => __('Sequence'), 'description' => __('Sequence.'), 'value' => '|arg1:sequence|', ) ); /* file: automation_graph_rules.php, action: edit */ $fields_automation_graph_rule_item_edit = array( 'operation' => array( 'method' => 'drop_array', 'friendly_name' => __('Operation'), 'description' => __('Logical operation to combine rules.'), 'array' => $automation_oper, 'value' => '|arg1:operation|', 'on_change' => 'toggle_operation()', ), 'field' => array( 'method' => 'drop_array', 'friendly_name' => __('Field Name'), 'description' => __('The Field Name that shall be used for this Rule Item.'), 'array' => array(), # later to be filled dynamically 'value' => '|arg1:field|', 'none_value' => __('None'), ), 'operator' => array( 'method' => 'drop_array', 'friendly_name' => __('Operator'), 'description' => __('Operator.'), 'array' => $automation_op_array['display'], 'value' => '|arg1:operator|', 'on_change' => 'toggle_operator()', ), 'pattern' => array( 'method' => 'textbox', 'friendly_name' => __('Matching Pattern'), 'description' => __('The Pattern to be matched against.'), 'value' => '|arg1:pattern|', 'max_length' => '255', 'size' => '50', ), 'sequence' => array( 'method' => 'view', 'friendly_name' => __('Sequence'), 'description' => __('Sequence.'), 'value' => '|arg1:sequence|', ) ); $fields_automation_graph_rules_edit1 = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this Rule.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80' ), 'snmp_query_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Data Query'), 'description' => __('Choose a Data Query to apply to this rule.'), 'value' => '|arg1:snmp_query_id|', 'on_change' => 'applySNMPQueryIdChange()', 'sql' => 'SELECT id, name FROM snmp_query ORDER BY name' ) ); $fields_automation_graph_rules_edit2 = array( 'graph_type_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Graph Type'), 'description' => __('Choose any of the available Graph Types to apply to this rule.'), 'value' => '|arg1:graph_type_id|', 'on_change' => 'applySNMPQueryTypeChange()', 'sql' => 'SELECT snmp_query_graph.id, snmp_query_graph.name FROM snmp_query_graph WHERE snmp_query_graph.snmp_query_id=|arg1:snmp_query_id| ORDER BY snmp_query_graph.name' ) ); $fields_automation_graph_rules_edit3 = array( 'enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Enable Rule'), 'description' => __('Check this box to enable this rule.'), 'value' => '|arg1:enabled|', 'default' => '', 'form_id' => false ) ); /* file: automation_tree_rules.php, action: edit */ $fields_automation_tree_rules_edit1 = array( 'name' => array( 'method' => 'textbox', 'friendly_name' => __('Name'), 'description' => __('A useful name for this Rule.'), 'value' => '|arg1:name|', 'max_length' => '255', 'size' => '80' ), 'tree_id' => array( 'method' => 'drop_sql', 'friendly_name' => __('Tree'), 'description' => __('Choose a Tree for the new Tree Items.'), 'value' => '|arg1:tree_id|', 'on_change' => 'applyTreeChange()', 'sql' => 'SELECT id, name FROM graph_tree ORDER BY name' ), 'leaf_type' => array( 'method' => 'drop_array', 'friendly_name' => __('Leaf Item Type'), 'description' => __('The Item Type that shall be dynamically added to the tree.'), 'value' => '|arg1:leaf_type|', 'on_change' => 'applyItemTypeChange()', 'array' => $automation_tree_item_types ), 'host_grouping_type' => array( 'method' => 'drop_array', 'friendly_name' => __('Graph Grouping Style'), 'description' => __('Choose how graphs are grouped when drawn for this particular host on the tree.'), 'array' => $host_group_types, 'value' => '|arg1:host_grouping_type|', 'default' => HOST_GROUPING_GRAPH_TEMPLATE, ) ); $fields_automation_tree_rules_edit2 = array( 'tree_item_id' => array( 'method' => 'drop_tree', 'friendly_name' => __('Optional: Sub-Tree Item'), 'description' => __('Choose a Sub-Tree Item to hook in.
    Make sure, that it is still there when this rule is executed!'), 'tree_id' => '|arg1:tree_id|', 'value' => '|arg1:tree_item_id|', ) ); $fields_automation_tree_rules_edit3 = array( 'enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Enable Rule'), 'description' => __('Check this box to enable this rule.'), 'value' => '|arg1:enabled|', 'default' => '', 'form_id' => false ) ); $fields_automation_tree_rule_item_edit = array( 'field' => array( 'method' => 'drop_array', 'friendly_name' => __('Header Type'), 'description' => __('Choose an Object to build a new Sub-header.'), 'array' => array(), # later to be filled dynamically 'value' => '|arg1:field|', 'none_value' => $automation_tree_header_types[AUTOMATION_TREE_ITEM_TYPE_STRING], 'on_change' => 'applyHeaderChange()', ), 'sort_type' => array( 'method' => 'drop_array', 'friendly_name' => __('Sorting Type'), 'description' => __('Choose how items in this tree will be sorted.'), 'value' => '|arg1:sort_type|', 'default' => TREE_ORDERING_NONE, 'array' => $tree_sort_types, ), 'propagate_changes' => array( 'method' => 'checkbox', 'friendly_name' => __('Propagate Changes'), 'description' => __('Propagate all options on this form (except for \'Title\') to all child \'Header\' items.'), 'value' => '|arg1:propagate_changes|', 'default' => '', 'form_id' => false ), 'search_pattern' => array( 'method' => 'textbox', 'friendly_name' => __('Matching Pattern'), 'description' => __('The String Pattern (Regular Expression) to match against.
    Enclosing \'/\' must NOT be provided!'), 'value' => '|arg1:search_pattern|', 'max_length' => '255', 'size' => '50', ), 'replace_pattern' => array( 'method' => 'textbox', 'friendly_name' => __('Replacement Pattern'), 'description' => __('The Replacement String Pattern for use as a Tree Header.
    Refer to a Match by e.g. \${1} for the first match!'), 'value' => '|arg1:replace_pattern|', 'max_length' => '255', 'size' => '50', ), 'sequence' => array( 'method' => 'view', 'friendly_name' => __('Sequence'), 'description' => __('Sequence.'), 'value' => '|arg1:sequence|', ) ); api_plugin_hook('config_form'); cacti-release-1.2.19/include/global_languages.php000066400000000000000000000737421413633772300217550ustar00rootroot00000000000000 $paths) { l10n_debug("load_language($domain): " .$cacti_textdomains[$domain]['path2catalogue']); switch (CACTI_LANGUAGE_HANDLER) { case CACTI_LANGUAGE_HANDLER_PHPGETTEXT: $l10n[$domain] = load_gettext_original($domain); break; case CACTI_LANGUAGE_HANDLER_MOTRANSLATOR: $l10n[$domain] = load_gettext_motranslator($domain); break; case CACTI_LANGUAGE_HANDLER_OSCAROTERO: $l10n[$domain] = load_gettext_oscarotero($domain); break; } if (empty($l10n[$domain])) { die('Invalid language support or corrupt/missing file: ' . $cacti_textdomains[$domain]['path2catalogue'] . PHP_EOF); } } unset($input); } /* load standard wrappers */ define('CACTI_LOCALE', $cacti_locale); define('CACTI_COUNTRY', $cacti_country); define('CACTI_LANGUAGE', $lang2locale[CACTI_LOCALE]['language']); define('CACTI_LANGUAGE_FILE', $catalogue); function load_gettext_original($domain) { global $cacti_textdomains; l10n_debug("load_gettext_original($domain): " .$cacti_textdomains[$domain]['path2catalogue']); $input = new FileReader($cacti_textdomains[$domain]['path2catalogue']); if ($input == false) { die('Unable to read file: ' . $cacti_textdomains[$domain]['path2catalogue'] . PHP_EOF); } $l10n_domain = new gettext_reader($input); if ($l10n_domain == false) { die('Invalid language file: ' . $cacti_textdomains[$domain]['path2catalogue'] . PHP_EOF); } return $l10n_domain; } function load_gettext_motranslator($domain) { global $cacti_textdomains; l10n_debug("load_gettext_mostranslator($domain): " .$cacti_textdomains[$domain]['path2catalogue']); $input = new PhpMyAdmin\MoTranslator\Translator($cacti_textdomains[$domain]['path2catalogue']); if ($input == false) { die('Unable to read file: ' . $cacti_textdomains[$domain]['path2catalogue'] . PHP_EOF); } return $input; } function load_gettext_oscarotero($domain) { global $cacti_textdomains; l10n_debug("load_gettext_oscarotero($domain): " .$cacti_textdomains[$domain]['path2catalogue']); $input = Gettext\Translations::fromMoFile($cacti_textdomains[$domain]['path2catalogue']); if ($input == false) { die('Unable to read file: ' . $cacti_textdomains[$domain]['path2catalogue'] . PHP_EOF); } $l10n_domain = new Gettext\Translator(); $l10n_domain->loadTranslations($input); if ($l10n_domain == false) { die('Invalid language file: ' . $cacti_textdomains[$domain]['path2catalogue'] . PHP_EOF); } return $l10n_domain; } function apply_locale($language) { global $cacti_locale, $cacti_country, $lang2locale; $locale_set = false; if ($language != '') { $language = repair_locale($language); $locale_set = isset($lang2locale[$language]); } // If the users has not elected a language and autodetect is on if (!$locale_set && (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) && (read_config_option('i18n_auto_detection') == '' || read_config_option('i18n_auto_detection') == '1'))) { /* detect browser settings if auto detection is enabled */ $accepted = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); $accepted = $accepted[0]; $language = repair_locale($accepted); $locale_set = isset($lang2locale[$language]); } if (!$locale_set) { $language = repair_locale(read_config_option('i18n_default_language')); if ($language == false || $language == '') { $language = repair_locale(read_default_config_option('i18n_default_language')); } $locale_set = isset($lang2locale[$language]); } if ($locale_set) { $cacti_locale = $language; $cacti_country = $lang2locale[$cacti_locale]['country']; return $cacti_locale; } return false; } /* best effort function to repair locale */ function repair_locale($language) { global $lang2locale; /* Repair legacy language support */ $found_locale = ''; $locale = str_replace('_','-', $language); if (array_key_exists($locale, $lang2locale)) { $language = $locale; } else { $wanted_locale = substr($language, 0, 2); $language = ''; foreach ($lang2locale as $locale => $data) { if (substr($locale, 0, 2) == $wanted_locale) { $language = $locale; break; } } } return $language; } /** * Universal escaping wrappers */ function __esc() { return htmlspecialchars( call_user_func_array('__', func_get_args()), ENT_QUOTES); } function __esc_n() { return htmlspecialchars( call_user_func_array('__n', func_get_args()), ENT_QUOTES); } function __esc_x() { return htmlspecialchars( call_user_func_array('__x', func_get_args()), ENT_QUOTES); } function __esc_xn() { return htmlspecialchars( call_user_func_array('__xn', func_get_args()), ENT_QUOTES); } /** * load_fallback_procedure - loads wrapper package if native language (English) has to be used * * @return */ function load_fallback_procedure(){ global $cacti_textdomains, $cacti_locale, $cacti_country, $lang2locale; /* reset variables */ $_SESSION['sess_user_language'] = ''; $cacti_textdomains = array(); define('CACTI_LOCALE', 'en-US'); define('CACTI_COUNTRY', 'us'); define('CACTI_LANGUAGE', 'English'); define('CACTI_LANGUAGE_FILE', 'english_usa'); define('CACTI_LANGUAGE_HANDLER', CACTI_LANGUAGE_HANDLER_NONE); } function __gettext($text, $domain = 'cacti') { global $l10n; // Assume translation fails or is not defined if (isset($l10n[$domain])) { switch (CACTI_LANGUAGE_HANDLER) { case CACTI_LANGUAGE_HANDLER_PHPGETTEXT: $translated = $l10n[$domain]->translate($text); break; case CACTI_LANGUAGE_HANDLER_OSCAROTERO: case CACTI_LANGUAGE_HANDLER_MOTRANSLATOR: $translated = $l10n[$domain]->gettext($text); break; } } if (!isset($translated)) { $translated = $text; } else { l10n_debug("__gettext($domain):\n Original: $text\n Translated: $translated", FILE_APPEND); } return __uf($translated); } function __n($singular, $plural, $number, $domain = 'cacti') { global $l10n; if (isset($l10n[$domain])) { return __uf($l10n[$domain]->ngettext($singular, $plural, $number)); } else { return ($number == 1) ? __uf($singular) : __uf($plural); } } function __uf($text) { return str_replace('%%', '%', $text); } function __() { global $l10n; $args = func_get_args(); $num = func_num_args(); /* this should not happen */ if ($num < 1) { return false; /* convert pure text strings */ } elseif ($num == 1) { return __gettext($args[0]); /* convert pure text strings by using a different textdomain */ } elseif ($num == 2 && isset($l10n[$args[1]]) && $args[1] != 'cacti') { return __gettext($args[0], $args[1]); /* convert stings including one or more placeholders */ } else { /* only the last argument is allowed to initiate the use of a different textdomain */ /* get gettext string */ if (isset($l10n[$args[$num-1]]) && $args[$num-1] != 'cacti') { $args[0] = __gettext($args[0], $args[$num-1]); } else { $args[0] = __gettext($args[0]); } /* process return string against input arguments */ return __uf(call_user_func_array('sprintf', $args)); } } function __xn($context, $singular, $plural, $number, $domain = 'cacti') { $xsingular = $context . chr(4) . $singular; $xplural = $context . chr(4) . $plural; $msgstr = __n($xsingular, $xplural, $number, $domain); if ($number == 1 ) { return ( $msgstr == $xsingular ) ? __uf($singular) : __uf($msgstr); } else { return ( $msgstr == $xplural ) ? __uf($plural) : __uf($msgstr); } } function __x() { global $l10n; $args = func_get_args(); $num = func_num_args(); /* this should never happen */ if ($num < 2) { return false; } else { $context = array_shift($args); $num--; $msgid = reset($args); $xmsgid = $context . chr(4) . $msgid; $args[0] = $xmsgid; if ($num == 1) { /* pure text string without placeholders and a change of the default textdomain */ $msgstr = __gettext($args[0]); } else { /* get gettext string */ $msgstr = isset($l10n[$args[$num-1]]) && $args[$num-1] != 'cacti' ? __gettext($args[0], $args[$num-1]) : __gettext($args[0]); } /* use the raw message id if language catalogue does not contain a context specific message string */ $args[0] = ( $msgstr == $xmsgid ) ? $msgid : $msgstr; /* process return string against input arguments */ return __uf(call_user_func_array('sprintf', $args)); } } function __date($format, $timestamp = false, $domain = 'cacti') { global $i18n_date_placeholders; if (!$timestamp) { $timestamp = time(); } /* placeholders will allow to fill in the translated weekdays, month and so on.. */ $i18n_date_placeholders = array( '#1' => __(date('D', $timestamp), $domain), '#2' => __(date('M', $timestamp), $domain), '#3' => __(date('F', $timestamp), $domain), '#4' => __(date('l', $timestamp), $domain) ); /* if defined exchange the format string for the configured locale */ $format = __gettext($format, $domain); /* replace special date chars by placeholders */ $format = str_replace(array('D', 'M', 'F', 'l'), array('#1', '#2', '#3', '#4'), $format); /* get date string included placeholders */ $date = date($format, $timestamp); /* fill in specific translations */ $date = str_replace(array_keys($i18n_date_placeholders), array_values($i18n_date_placeholders), $date); return __uf($date); } /** * get_list_of_locales - returns the default settings being used for l10n * * @return - a multi-dimensional array with the locale code as main key */ function get_list_of_locales() { $lang2locale = array( 'sq-AL' => array('language' => 'Albanian', 'direction' => 'ltr', 'country' => 'al', 'filename' => 'albanian_albania'), 'ar-SA' => array('language' => 'Arabic', 'direction' => 'rtl', 'country' => 'sa', 'filename' => 'arabic_saudi_arabia'), 'hy-AM' => array('language' => 'Armenian', 'direction' => 'ltr', 'country' => 'am', 'filename' => 'armenian_armenia'), 'be-BY' => array('language' => 'Belarusian', 'direction' => 'ltr', 'country' => 'by', 'filename' => 'belarusian_belarus'), 'bg-BG' => array('language' => 'Bulgarian', 'direction' => 'ltr', 'country' => 'bg', 'filename' => 'bulgarian_bulgaria'), 'zh-CN' => array('language' => 'Chinese (China)', 'direction' => 'ltr', 'country' => 'cn', 'filename' => 'chinese_china_simplified'), 'zh-HK' => array('language' => 'Chinese (Hong Kong)', 'direction' => 'ltr', 'country' => 'hk', 'filename' => 'chinese_hong_kong'), 'zh-SG' => array('language' => 'Chinese (Singapore)', 'direction' => 'ltr', 'country' => 'sg', 'filename' => 'chinese_singapore'), 'zh-TW' => array('language' => 'Chinese (Taiwan)', 'direction' => 'ltr', 'country' => 'tw', 'filename' => 'chinese_taiwan'), 'hr-HR' => array('language' => 'Croatian', 'direction' => 'ltr', 'country' => 'hr', 'filename' => 'croatian_croatia'), 'cs-GZ' => array('language' => 'Czech', 'direction' => 'ltr', 'country' => 'cz', 'filename' => 'czech_czech_republic'), 'da-DK' => array('language' => 'Danish', 'direction' => 'ltr', 'country' => 'dk', 'filename' => 'danish_denmark'), 'nl-NL' => array('language' => 'Dutch', 'direction' => 'ltr', 'country' => 'nl', 'filename' => 'dutch_netherlands'), 'en-US' => array('language' => 'English', 'direction' => 'ltr', 'country' => 'us', 'filename' => 'english_usa'), 'en-GB' => array('language' => 'English (Britain)', 'direction' => 'ltr', 'country' => 'gb', 'filename' => 'english_gb'), 'et-EE' => array('language' => 'Estonian', 'direction' => 'ltr', 'country' => 'ee', 'filename' => 'estonian_estonia'), 'fi-FI' => array('language' => 'Finnish', 'direction' => 'ltr', 'country' => 'fi', 'filename' => 'finnish_finland'), 'fr-FR' => array('language' => 'French', 'direction' => 'ltr', 'country' => 'fr', 'filename' => 'french_france'), 'de-DE' => array('language' => 'German', 'direction' => 'ltr', 'country' => 'de', 'filename' => 'german_germany'), 'el-GR' => array('language' => 'Greek', 'direction' => 'ltr', 'country' => 'gr', 'filename' => 'greek_greece'), 'he-IL' => array('language' => 'Hebrew', 'direction' => 'rtl', 'country' => 'il', 'filename' => 'hebrew_israel'), 'hi-IN' => array('language' => 'Hindi', 'direction' => 'ltr', 'country' => 'in', 'filename' => 'hindi_india'), 'hu-HU' => array('language' => 'Hungarian', 'direction' => 'ltr', 'country' => 'hu', 'filename' => 'hungarian_hungary'), 'is-IS' => array('language' => 'Icelandic', 'direction' => 'ltr', 'country' => 'is', 'filename' => 'icelandic_iceland'), 'id-ID' => array('language' => 'Indonesian', 'direction' => 'ltr', 'country' => 'id', 'filename' => 'indonesian_indonesia'), 'ga-IE' => array('language' => 'Irish', 'direction' => 'ltr', 'country' => 'ie', 'filename' => 'irish_ireland'), 'it-IT' => array('language' => 'Italian', 'direction' => 'ltr', 'country' => 'it', 'filename' => 'italian_italy'), 'ja-JP' => array('language' => 'Japanese', 'direction' => 'ltr', 'country' => 'jp', 'filename' => 'japanese_japan'), 'ko-KR' => array('language' => 'Korean', 'direction' => 'ltr', 'country' => 'kr', 'filename' => 'korean_korea'), 'lv-LV' => array('language' => 'Lativan', 'direction' => 'ltr', 'country' => 'lv', 'filename' => 'latvian_latvia'), 'lt-LT' => array('language' => 'Lithuanian', 'direction' => 'ltr', 'country' => 'lt', 'filename' => 'lithuanian_lithuania'), 'mk-MK' => array('language' => 'Macedonian', 'direction' => 'ltr', 'country' => 'mk', 'filename' => 'macedonian_macedonia'), 'ms-MY' => array('language' => 'Malay', 'direction' => 'ltr', 'country' => 'my', 'filename' => 'malay_malaysia'), 'mt-LT' => array('language' => 'Maltese', 'direction' => 'ltr', 'country' => 'lt', 'filename' => 'maltese_malta'), 'no-NO' => array('language' => 'Norwegian', 'direction' => 'ltr', 'country' => 'no', 'filename' => 'norwegian_norway'), 'pl-PL' => array('language' => 'Polish', 'direction' => 'ltr', 'country' => 'pl', 'filename' => 'polish_poland'), 'pt-PT' => array('language' => 'Portuguese', 'direction' => 'ltr', 'country' => 'pt', 'filename' => 'portuguese_portugal'), 'pt-BR' => array('language' => 'Portuguese (Brazil)', 'direction' => 'ltr', 'country' => 'br', 'filename' => 'portuguese_brazil'), 'ro-RO' => array('language' => 'Romanian', 'direction' => 'ltr', 'country' => 'ro', 'filename' => 'romanian_romania'), 'ru-RU' => array('language' => 'Russian', 'direction' => 'ltr', 'country' => 'ru', 'filename' => 'russian_russia'), 'sr-RS' => array('language' => 'Serbian', 'direction' => 'ltr', 'country' => 'rs', 'filename' => 'serbian_serbia'), 'sk-SK' => array('language' => 'Slovak', 'direction' => 'ltr', 'country' => 'sk', 'filename' => 'slovak_slovakia'), 'sl-SI' => array('language' => 'Slovenian', 'direction' => 'ltr', 'country' => 'si', 'filename' => 'slovenian_slovenia'), 'es-ES' => array('language' => 'Spanish', 'direction' => 'ltr', 'country' => 'es', 'filename' => 'spanish_spain'), 'sv-SE' => array('language' => 'Swedish', 'direction' => 'ltr', 'country' => 'se', 'filename' => 'swedish_sweden'), 'th-TH' => array('language' => 'Thai', 'direction' => 'ltr', 'country' => 'th', 'filename' => 'thai_thailand'), 'tr-TR' => array('language' => 'Turkish', 'direction' => 'ltr', 'country' => 'tr', 'filename' => 'turkish_turkey'), 'vi-VN' => array('language' => 'Vietnamese', 'direction' => 'ltr', 'country' => 'vn', 'filename' => 'vietnamese_vietnam') ); return $lang2locale; } /** * get_installed_locales - finds all installed locales * * @return - an associative array of all installed locales (e.g. 'en' => 'English') */ function get_installed_locales() { global $config, $lang2locale; $locations = array(); $supported_languages['en-US'] = $lang2locale['en-US']['language']; foreach ($lang2locale as $locale => $properties) { $locations[$properties['filename'] . '.mo'] = array( 'locale' => $locale, 'language' => $properties['language'] ); $locations[$locale . '.mo'] = array( 'locale' => $locale, 'language' => $properties['language'] ); } /* create a list of all languages this Cacti system supports ... */ $dhandle = opendir($config['base_path'] . '/locales/LC_MESSAGES'); if (is_resource($dhandle)) { while (false !== ($filename = readdir($dhandle))) { if (isset($locations[$filename]['language'])) { $supported_languages[$locations[$filename]['locale']] = $locations[$filename]['language']; } } } asort($supported_languages); return $supported_languages; } /* read_user_i18n_setting - finds the current value of a i18n configuration setting @arg $config_name - the name of the configuration setting as specified $settings_user array in 'include/global_settings.php' @returns - the current value of the i18n configuration option or the system default value */ function read_user_i18n_setting($config_name) { global $config; /* users must have cacti user auth turned on to use this, or the guest account must be active */ if (isset($_SESSION['sess_user_id'])) { $effective_uid = $_SESSION['sess_user_id']; } elseif ((read_config_option('auth_method') == 0)) { if (isset($_SESSION['sess_config_array'])) { $config_array = $_SESSION['sess_config_array']; } elseif (isset($config['config_options_array'])) { $config_array = $config['config_options_array']; } if (!isset($config_array[$config_name])) { $effective_uid = db_fetch_cell_prepared('SELECT id FROM user_auth WHERE id = ?', array(get_guest_account())); } if ($effective_uid == '') { $effective_uid = 0; } } else { $effective_uid = 0; } if (db_table_exists('settings_user')) { $db_setting = db_fetch_row_prepared('SELECT value FROM settings_user WHERE name = ? AND user_id = ?', array($config_name, $effective_uid)); } if (isset($db_setting['value'])) { return $db_setting['value']; } else { return false; } } /** * number_format_i18n - local specific number format wrapper * * @return - formatted numer in the correct locale */ function number_format_i18n($number, $decimals = null, $baseu = 1024) { global $cacti_locale, $cacti_country; $country = strtoupper($cacti_country); if (function_exists('numfmt_create')) { $fmt_key = $cacti_locale . '_'. $country; $fmt = numfmt_create($fmt_key, NumberFormatter::DECIMAL); if ($fmt !== false && $fmt !== null) { numfmt_set_attribute($fmt, NumberFormatter::MAX_FRACTION_DIGITS, $decimals); return numfmt_format($fmt, $number); } cacti_log('DEBUG: Number format \'' . $fmt_key .'\' was unavailable, using older methods',false,'i18n',POLLER_VERBOSITY_HIGH); } $origlocales = explode(';', setlocale(LC_ALL, 0)); setlocale(LC_ALL, $cacti_locale); $locale = localeconv(); if (!isset($locale['decimal_point']) || $locale['decimal_point'] == '') { $locale['decimal_point'] = '.'; } if (!isset($locale['thousands_sep']) || $locale['thousands_sep'] == '') { $locale['thousands_sep'] = ','; } if ($decimals == -1 || $decimals == null) { $number = number_format($number, null, $locale['decimal_point'], $locale['thousands_sep']); } elseif ($number>=pow($baseu, 4)) { $number = number_format($number/pow($baseu, 4), $decimals, $locale['decimal_point'], $locale['thousands_sep']) . __(' T'); } elseif ($number>=pow($baseu, 3)) { $number = number_format($number/pow($baseu, 3), $decimals, $locale['decimal_point'], $locale['thousands_sep']) . __(' G'); } elseif ($number>=pow($baseu, 2)) { $number = number_format($number/pow($baseu, 2), $decimals, $locale['decimal_point'], $locale['thousands_sep']) . __(' M'); } elseif ($number>=$baseu) { $number = number_format($number/$baseu, $decimals, $locale['decimal_point'], $locale['thousands_sep']) . __(' K'); } else { $number = number_format($number, $decimals, $locale['decimal_point'], $locale['thousands_sep']); } foreach ($origlocales as $locale_setting) { if (strpos($locale_setting, '=') !== false) { list($category, $locale) = explode('=', $locale_setting); } else { $category = LC_ALL; $locale = $locale_setting; } switch($category) { case 'LC_ALL': case 'LC_COLLATE': case 'LC_CTYPE': case 'LC_MONETARY': case 'LC_NUMERIC': case 'LC_TIME': if (defined($category)) { setlocale(constant($category), $locale); } } } return $number; } function get_new_user_default_language() { $accepted = repair_locale(read_config_option('i18n_default_language')); if ($accepted == '') { $accepted = repair_locale(read_default_config_option('i18n_default_language')); } return $accepted; } function l10n_debug($text, $mode = FILE_APPEND, $eol = PHP_EOL) { if (is_dir('/share/') && is_writeable('/share/i18n.log')) { file_put_contents('/share/i18n.log', $text . $eol, $mode); } elseif (file_exists('/tmp/i18n.log') && is_writeable('/tmp/i18n.log')) { file_put_contents('/tmp/i18n.log', $text . $eol, $mode); } } cacti-release-1.2.19/include/global_session.php000066400000000000000000000135121413633772300214570ustar00rootroot00000000000000 $_SESSION['automation_message'], 'type' => 'info' ); kill_session_var('automation_message'); } if (isset($_SESSION['clog_message']) && $_SESSION['clog_message'] != '') { $messages['clog_message'] = array( 'message' => $_SESSION['clog_message'], 'type' => 'info' ); kill_session_var('clog_message'); } if (isset($_SESSION['clog_error']) && $_SESSION['clog_error'] != '') { $messages['clog_error'] = array( 'message' => $_SESSION['clog_error'], 'type' => 'error' ); kill_session_var('clog_error'); } $script = basename($_SERVER['SCRIPT_NAME']); if ($script == 'graph_view.php' || $script == 'graph.php') { if (isset($_SESSION['custom']) && $_SESSION['custom'] == true) { $refreshIsLogout = 'true'; } elseif (isset_request_var('action') && get_nfilter_request_var('action') == 'zoom') { $refreshIsLogout = 'true'; } else { $refresh = api_plugin_hook_function('top_graph_refresh', read_user_setting('page_refresh')); $refreshIsLogout = 'false'; } } elseif (strstr($_SERVER['SCRIPT_NAME'], 'plugins')) { $refresh = api_plugin_hook_function('top_graph_refresh', $refresh); if (empty($refresh)) { $refreshIsLogout = 'true'; } else { $refreshIsLogout = 'false'; } } if (isset($_SESSION['refresh'])) { if (isset($_SESSION['refresh']['seconds'])) { $myrefresh['seconds'] = $_SESSION['refresh']['seconds']; } else { $myrefresh['seconds'] = ini_get('session.gc_maxlifetime'); } if (isset($_SESSION['refresh']['logout'])) { $refreshIsLogout = $_SESSION['refresh']['logout']; } else { $refreshIsLogout = 'false'; } if (isset($_SESSION['refresh']['page'])) { $myrefresh['page'] = sanitize_uri($_SESSION['refresh']['page']); } else { $myrefresh['page'] = $config['url_path'] . 'logout.php?action=timeout'; $refreshIsLogout = 'true'; } unset($_SESSION['refresh']); } elseif (isset($refresh) && is_array($refresh)) { $myrefresh['seconds'] = $refresh['seconds']; $myrefresh['page'] = sanitize_uri(appendHeaderSuppression($refresh['page'])); $refreshIsLogout = 'false'; } elseif (isset($refresh)) { $myrefresh['seconds'] = $refresh; $myrefresh['page'] = sanitize_uri(appendHeaderSuppression($_SERVER['REQUEST_URI'])); $refreshIsLogout = 'false'; } elseif (read_config_option('auth_cache_enabled') == 'on' && isset($_SESSION['cacti_remembers']) && $_SESSION['cacti_remembers'] == true) { $myrefresh['seconds'] = 99999999; $myrefresh['page'] = sanitize_uri($_SERVER['REQUEST_URI']); $refreshIsLogout = 'false'; } elseif (read_user_setting('user_auto_logout_time') > 0 && is_realm_allowed(8)) { $myrefresh['seconds'] = read_user_setting('user_auto_logout_time'); $myrefresh['page'] = $config['url_path'] . 'logout.php?action=timeout'; $refreshIsLogout = 'true'; } elseif (read_config_option('auth_method') == 2) { $myrefresh['seconds'] = 99999999; $myrefresh['page'] = 'index.php'; $refreshIsLogout = 'false'; } elseif (!isset($_SESSION['sess_user_id']) && strpos($_SERVER['REQUEST_URI'], 'index.php') !== false) { $myrefresh['seconds'] = 99999999; $myrefresh['page'] = sanitize_uri($_SERVER['REQUEST_URI']); $refreshIsLogout = 'false'; } else { $myrefresh['seconds'] = ini_get('session.gc_maxlifetime'); $myrefresh['page'] = $config['url_path'] . 'logout.php?action=timeout'; $refreshIsLogout = 'true'; } /* guest account does not auto log off */ if (isset($_SESSION['sess_user_id']) && $_SESSION['sess_user_id'] == read_config_option('guest_user')) { $myrefresh['seconds'] = 99999999; $myrefresh['page'] = sanitize_uri($_SERVER['REQUEST_URI']); $refreshIsLogout = 'false'; } ?> cacti-release-1.2.19/include/global_settings.php000066400000000000000000003137071413633772300216450ustar00rootroot00000000000000read())) { if ($entry != '.' && $entry != '..') { if (is_dir($config['base_path'] . '/include/themes/' . $entry)) { $themes[$entry] = __(ucwords($entry)); } } } asort($themes); $dir->close(); /* tab information */ $tabs = array( 'general' => __('General'), 'path' => __('Paths'), 'snmp' => __('Device Defaults'), 'poller' => __('Poller'), 'data' => __('Data'), 'visual' => __('Visual'), 'authentication' => __('Authentication'), 'boost' => __('Performance'), 'spikes' => __('Spikes'), 'mail' => __('Mail/Reporting/DNS') ); $tabs_graphs = array( 'general' => __('General Settings'), 'timespan' => __('Time Spanning/Shifting'), 'thumbnail' => __('Graph Thumbnail Settings'), 'tree' => __('Tree Settings'), 'fonts' => __('Graph Fonts') ); if (db_table_exists('plugin_config')) { $logplugins = array_rekey(db_fetch_assoc('SELECT directory AS id, name FROM plugin_config WHERE status=1'), 'id', 'name'); } else { $logplugins = array(); } /* get the files for selective logging */ $realm_files = array_keys($user_auth_realm_filenames); $nohead_files = array_values($no_http_header_files); foreach($realm_files as $file) { $logfiles[$file] = $file; } foreach($nohead_files as $file) { $logfiles[$file] = $file; } $logfiles['poller_realtime.php'] = 'poller_realtime.php'; $logfiles['cmd_realtime.php'] = 'cmd_realtime.php'; asort($logfiles); $mail_methods = array( CACTI_MAIL_PHP => __('PHP Mail() Function'), CACTI_MAIL_SENDMAIL => __('Sendmail'), CACTI_MAIL_SMTP => __('SMTP') ); if ($config['cacti_server_os'] == 'win32') { unset($mail_methods[CACTI_MAIL_SENDMAIL]); } /* cache the admin account */ $admin_account = '0'; if (isset($_SESSION['admin_account']) && isset($_SESSION['sess_user_id'])) { $admin_account = $_SESSION['admin_account']; } elseif (isset($_SESSION['sess_user_id'])) { $admin_account = db_fetch_cell('SELECT value FROM settings WHERE name="admin_user"'); if (!empty($admin_account)) { $_SESSION['admin_account'] = db_qstr($admin_account) . ', ' . $_SESSION['sess_user_id']; } else { $_SESSION['admin_account'] = $_SESSION['sess_user_id']; } } /* setting information */ $settings = array( 'path' => array( 'dependent_header' => array( 'friendly_name' => __('Required Tool Paths'), 'collapsible' => 'true', 'method' => 'spacer', ), 'path_snmpwalk' => array( 'friendly_name' => __('snmpwalk Binary Path'), 'description' => __('The path to your snmpwalk binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'path_snmpget' => array( 'friendly_name' => __('snmpget Binary Path'), 'description' => __('The path to your snmpget binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'path_snmpbulkwalk' => array( 'friendly_name' => __('snmpbulkwalk Binary Path'), 'description' => __('The path to your snmpbulkwalk binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'path_snmpgetnext' => array( 'friendly_name' => __('snmpgetnext Binary Path'), 'description' => __('The path to your snmpgetnext binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'path_snmptrap' => array( 'friendly_name' => __('snmptrap Binary Path'), 'description' => __('The path to your snmptrap binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'path_rrdtool' => array( 'friendly_name' => __('RRDtool Binary Path'), 'description' => __('The path to the rrdtool binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'path_php_binary' => array( 'friendly_name' => __('PHP Binary Path'), 'description' => __('The path to your PHP binary file (may require a php recompile to get this file).'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255' ), 'logging_header' => array( 'friendly_name' => __('Logging'), 'collapsible' => 'true', 'method' => 'spacer', ), 'path_cactilog' => array( 'friendly_name' => __('Cacti Log Path'), 'description' => __('The path to your Cacti log file (if blank, defaults to <path_cacti>/log/cacti.log)'), 'method' => 'filepath', 'file_type' => 'ascii', 'default' => $config['base_path'] . '/log/cacti.log', 'max_length' => '255', 'install_check' => 'writable', 'install_blank' => true ), 'path_stderrlog' => array( 'friendly_name' => __('Poller Standard Error Log Path'), 'description' => __('If you are having issues with Cacti\'s Data Collectors, set this file path and the Data Collectors standard error will be redirected to this file'), 'method' => 'filepath', 'file_type' => 'ascii', 'default' => $config['base_path'] . '/log/cacti_stderr.log', 'max_length' => '255', 'install_check' => 'writable', 'install_optional' => true ), 'logrotate_enabled' => array( 'friendly_name' => __('Rotate the Cacti Log'), 'description' => __('This option will rotate the Cacti Log periodically.'), 'method' => 'checkbox', 'default' => 'on', ), 'logrotate_frequency' => array( 'friendly_name' => __('Rotation Frequency'), 'description' => __('At what frequency would you like to rotate your logs?'), 'method' => 'drop_array', 'default' => '1', 'array' => $logrotate_frequency ), 'logrotate_retain' => array( 'friendly_name' => __('Log Retention'), 'description' => __('How many log files do you wish to retain? Use 0 to never remove any logs. (0-365)'), 'method' => 'textbox', 'default' => '7', 'max_length' => 3, 'size' => 4 ), 'pollerpaths_header' => array( 'friendly_name' => __('Alternate Poller Path'), 'collapsible' => 'true', 'method' => 'spacer', ), 'path_spine' => array( 'friendly_name' => __('Spine Binary File Location'), 'description' => __('The path to Spine binary.'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => '255', 'install_optional' => true, ), 'path_spine_config' => array( 'friendly_name' => __('Spine Config File Path'), 'description' => __('The path to Spine configuration file. By default, in the cwd of Spine, or /etc if not specified.'), 'method' => 'filepath', 'file_type' => 'ascii', 'max_length' => '255', 'install_optional' => true, ), 'rrdclean_header' => array( 'friendly_name' => __('RRD Cleaner'), 'method' => 'spacer', 'collapsible' => 'true' ), 'rrd_autoclean' => array( 'friendly_name' => __('RRDfile Auto Clean'), 'description' => __('Automatically archive or delete RRDfiles when their corresponding Data Sources are removed from Cacti'), 'method' => 'checkbox', 'default' => '' ), 'rrd_autoclean_method' => array( 'friendly_name' => __('RRDfile Auto Clean Method'), 'description' => __('The method used to Clean RRDfiles from Cacti after their Data Sources are deleted.'), 'method' => 'drop_array', 'array' => array( '1' => __('Delete'), '3' => __('Archive') ), 'default' => '1' ), 'rrd_archive' => array( 'friendly_name' => __('Archive directory'), 'description' => __('This is the directory where RRDfiles are moved for archiving'), 'method' => 'dirpath', 'default' => $config['base_path'] . '/rra/archive/', 'max_length' => 255, ), ), 'general' => array( 'poller_specific_header' => array( 'friendly_name' => __('Log Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'log_destination' => array( 'friendly_name' => __('Log Destination'), 'description' => __('How will Cacti handle event logging.'), 'method' => 'drop_array', 'default' => 1, 'array' => $logfile_options, ), 'log_verbosity' => array( 'friendly_name' => __('Generic Log Level'), 'description' => __('What level of detail do you want sent to the log file. WARNING: Leaving in any other status than NONE or LOW can exhaust your disk space rapidly.'), 'method' => 'drop_array', 'default' => POLLER_VERBOSITY_LOW, 'array' => $logfile_verbosity, ), 'log_validation' => array( 'friendly_name' => __('Log Input Validation Issues'), 'description' => __('Record when request fields are accessed without going through proper input validation'), 'method' => 'checkbox', 'default' => '' ), 'data_source_trace' => array( 'friendly_name' => __('Data Source Tracing'), 'description' => __('A developer only option to trace the creation of Data Sources mainly around checks for uniqueness'), 'method' => 'checkbox', 'default' => '' ), 'selective_debug' => array( 'friendly_name' => __('Selective File Debug'), 'description' => __('Select which files you wish to place in Debug mode regardless of the Generic Log Level setting. Any files selected will be treated as they are in Debug mode.'), 'method' => 'drop_multi', 'array' => $logfiles, 'default' => '' ), 'selective_plugin_debug' => array( 'friendly_name' => __('Selective Plugin Debug'), 'description' => __('Select which Plugins you wish to place in Debug mode regardless of the Generic Log Level setting. Any files used by this plugin will be treated as they are in Debug mode.'), 'method' => 'drop_multi', 'array' => $logplugins, 'default' => '' ), 'selective_device_debug' => array( 'friendly_name' => __('Selective Device Debug'), 'description' => __('A comma delimited list of Device ID\'s that you wish to be in Debug mode during data collection. This Debug level is only in place during the Cacti polling process.'), 'method' => 'textbox', 'size' => '30', 'max_length' => 30, 'default' => '' ), 'poller_log' => array( 'friendly_name' => __('Syslog/Eventlog Item Selection'), 'description' => __('When using Syslog/Eventlog for logging, the Cacti log messages that will be forwarded to the Syslog/Eventlog.'), 'method' => 'checkbox_group', 'tab' => 'poller', 'items' => array( 'log_pstats' => array( 'friendly_name' => __('Statistics'), 'default' => '' ), 'log_pwarn' => array( 'friendly_name' => __('Warnings'), 'default' => '' ), 'log_perror' => array( 'friendly_name' => __('Errors'), 'default' => 'on' ) ) ), 'i18n_header' => array( 'friendly_name' => __('Internationalization (i18n)'), 'collapsible' => 'true', 'method' => 'spacer', ), 'i18n_language_support' => array( 'friendly_name' => __('Language Support'), 'description' => __('Choose \'enabled\' to allow the localization of Cacti. The strict mode requires that the requested language will also be supported by all plugins being installed at your system. If that\'s not the fact everything will be displayed in English.'), 'method' => 'drop_array', 'default' => '1', 'array' => $i18n_modes ), 'i18n_default_language' => array( 'friendly_name' => __('Language'), 'description' => __('Default language for this system.'), 'method' => 'drop_language', 'default' => 'en-US', 'array' => get_installed_locales() ), 'i18n_auto_detection' => array( 'friendly_name' => __('Auto Language Detection'), 'description' => __('Allow to automatically determine the \'default\' language of the user and provide it at login time if that language is supported by Cacti. If disabled, the default language will be in force until the user elects another language.'), 'method' => 'drop_array', 'default' => '1', 'array' => array( '0' => __('Disabled'), '1' => __('Enabled') ) ), 'default_date_format' => array( 'friendly_name' => __('Date Display Format'), 'description' => __('The System default date format to use in Cacti.'), 'method' => 'drop_array', 'array' => $dateformats, 'default' => GD_Y_MO_D ), 'default_datechar' => array( 'friendly_name' => __('Date Separator'), 'description' => __('The System default date separator to be used in Cacti.'), 'method' => 'drop_array', 'array' => $datechar, 'default' => GDC_HYPHEN ), 'other1_header' => array( 'friendly_name' => __('Other Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'default_has' => array( 'friendly_name' => __('Has Graphs/Data Sources Checked'), 'description' => __('Should the Has Graphs and Has Data Sources be Checked by Default.'), 'method' => 'checkbox', 'default' => '' ), 'rrdtool_version' => array( 'friendly_name' => __('RRDtool Version'), 'description' => __('The version of RRDtool that you have installed.'), 'method' => 'drop_array', 'default' => '1.4.0', 'array' => $rrdtool_versions, ), 'graph_auth_method' => array( 'friendly_name' => __('Graph Permission Method'), 'description' => __('There are two methods for determining a User\'s Graph Permissions. The first is \'Permissive\'. Under the \'Permissive\' setting, a User only needs access to either the Graph, Device or Graph Template to gain access to the Graphs that apply to them. Under \'Restrictive\', the User must have access to the Graph, the Device, and the Graph Template to gain access to the Graph.'), 'method' => 'drop_array', 'default' => '1', 'array' => array( '1' => __('Permissive'), '2' => __('Restrictive') ) ), 'grds_creation_method' => array( 'method' => 'drop_array', 'friendly_name' => __('Graph/Data Source Creation Method'), 'description' => __('If set to Simple, Graphs and Data Sources can only be created from New Graphs. If Advanced, legacy Graph and Data Source creation is supported.'), 'default' => '0', 'array' => array( '0' => __('Simple'), '1' => __('Advanced') ) ), 'hide_form_description' => array( 'friendly_name' => __('Show Form/Setting Help Inline'), 'description' => __('When checked, Form and Setting Help will be show inline. Otherwise it will be presented when hovering over the help button.'), 'default' => '', 'method' => 'checkbox', ), 'deletion_verification' => array( 'friendly_name' => __('Deletion Verification'), 'description' => __('Prompt user before item deletion.'), 'default' => 'on', 'method' => 'checkbox', ), 'ds_preselected_delete' => array( 'friendly_name' => __('Data Source Preservation Preset'), 'description' => __('When enabled, Cacti will set Radio Button to Delete related Data Sources of a Graph when removing Graphs. Note: Cacti will not allow the removal of Data Sources if they are used in other Graphs.'), 'method' => 'checkbox', 'default' => 'on' ), 'graphs_auto_unlock' => array( 'friendly_name' => __('Graphs Auto Unlock'), 'description' => __('When enabled, Cacti will not lock Graphs. This allow a faster manual modification of Data Sources related to a Graph.'), 'method' => 'checkbox', 'default' => '' ), 'hide_console' => array( 'friendly_name' => __('Hide Cacti Dashboard'), 'description' => __('For use with Cacti\'s External Link Support. Using this setting, you can hide the Cacti Dashboard, so you can display just your own page.'), 'default' => '', 'method' => 'checkbox' ), 'drag_and_drop' => array( 'friendly_name' => __('Enable Drag-N-Drop'), 'description' => __('Some of Cacti\'s interfaces support Drag-N-Drop. If checked this option will be enabled. Note: For visually impaired user, this option may be disabled.'), 'method' => 'checkbox', 'default' => 'on', ), 'security_header' => array( 'friendly_name' => __('Site Security'), 'method' => 'spacer', 'collapsible' => 'true' ), 'force_https' => array( 'friendly_name' => __('Force Connections over HTTPS'), 'description' => __('When checked, any attempts to access Cacti will be redirected to HTTPS to ensure high security.'), 'default' => '', 'method' => 'checkbox', ), 'content_security_policy_script' => array( 'method' => 'drop_array', 'friendly_name' => __('Content-Security Allow Unsafe JavaScript eval() calls'), 'description' => __('Certain Cacti plugins require the use of unsafe JavaScript eval() calls. If you select this option, they will be allowed in Cacti.'), 'default' => '', 'array' => array( '0' => __('No'), 'unsafe-eval' => __('Yes') ) ), 'content_security_alternate_sources' => array( 'friendly_name' => __('Content-Security Alternate Sources'), 'description' => __('Space delmited domain names that will be permitted to be accessed outside of the Web Server itself. This is important for users choosing to use a CDN, or hosting site. Sources can includes wildcards for example: *.mydomain.com, or a protocol, for example: https://*.example.com. These Alternate Sources include Image, CSS and JavaScript types only.'), 'method' => 'textbox', 'default' => '', 'size' => '100', 'max_length' => '255', ), 'automation_header' => array( 'friendly_name' => __('Automation'), 'method' => 'spacer', 'collapsible' => 'true' ), 'automation_graphs_enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Enable Automatic Graph Creation'), 'description' => __('When disabled, Cacti Automation will not actively create any Graph. This is useful when adjusting Device settings so as to avoid creating new Graphs each time you save an object. Invoking Automation Rules manually will still be possible.'), 'default' => 'on', ), 'automation_tree_enabled' => array( 'method' => 'checkbox', 'friendly_name' => __('Enable Automatic Tree Item Creation'), 'description' => __('When disabled, Cacti Automation will not actively create any Tree Item. This is useful when adjusting Device or Graph settings so as to avoid creating new Tree Entries each time you save an object. Invoking Rules manually will still be possible.'), 'default' => 'on', ), 'automation_email' => array( 'friendly_name' => __('Automation Notification To Email'), 'description' => __('The Email Address to send Automation Notification Emails to if not specified at the Automation Network level. If either this field, or the Automation Network value are left blank, Cacti will use the Primary Cacti Admins Email account.'), 'method' => 'textbox', 'default' => '', 'max_length' => '128', ), 'automation_fromname' => array( 'friendly_name' => __('Automation Notification From Name'), 'description' => __('The Email Name to use for Automation Notification Emails to if not specified at the Automation Network level. If either this field, or the Automation Network value are left blank, Cacti will use the system default From Name.'), 'method' => 'textbox', 'default' => '', 'max_length' => '32', 'size' => '30' ), 'automation_fromemail' => array( 'friendly_name' => __('Automation Notification From Email'), 'description' => __('The Email Address to use for Automation Notification Emails to if not specified at the Automation Network level. If either this field, or the Automation Network value are left blank, Cacti will use the system default From Email Address.'), 'method' => 'textbox', 'default' => '', 'max_length' => '100', ), 'other_header' => array( 'friendly_name' => __('Graph Template Defaults'), 'collapsible' => 'true', 'method' => 'spacer', ), 'default_test_source' => array( 'method' => 'checkbox', 'friendly_name' => __('Graph Template Test Data Source'), 'description' => __('Check this checkbox if you wish to test the Data Sources prior to their creation for new and newly imported Graph Templates. With Test Data Sources enabled, if the Data Source does not return valid data, the Graph will not be created. This setting is important if you wish to have a more generic Device Template that can include more Graph Templates that can be selectively applied depending on the characteristics of the Device itself. Note: If you have a long running script as a Data Source, the time to create Graphs will be increased.'), 'default' => '', ), 'default_image_format' => array( 'friendly_name' => __('Graph Template Image Format'), 'description' => __('The default Image Format to be used for all new Graph Templates.'), 'method' => 'drop_array', 'default' => '1', 'array' => $image_types, ), 'default_graph_height' => array( 'friendly_name' => __('Graph Template Height'), 'description' => __('The default Graph Width to be used for all new Graph Templates.'), 'method' => 'textbox', 'default' => '150', 'size' => '5', 'max_length' => '5' ), 'default_graph_width' => array( 'friendly_name' => __('Graph Template Width'), 'description' => __('The default Graph Width to be used for all new Graph Templates.'), 'method' => 'textbox', 'default' => '500', 'size' => '5', 'max_length' => '5' ) ), 'snmp' => array( 'general_header' => array( 'friendly_name' => __('General Defaults'), 'method' => 'spacer', 'collapsible' => 'true' ), 'default_template' => array( 'friendly_name' => __('Template'), 'description' => __('The default Device Template used on all new Devices.'), 'method' => 'drop_sql', 'default' => '1', 'none_value' => __('None'), 'sql' => 'SELECT id, name FROM host_template ORDER BY name', ), 'default_site' => array( 'friendly_name' => __('Site'), 'description' => __('The default Site for all new Devices.'), 'method' => 'drop_sql', 'default' => '1', 'none_value' => __('None'), 'sql' => 'SELECT id, name FROM sites ORDER BY name', ), 'default_poller' => array( 'friendly_name' => __('Poller'), 'description' => __('The default Poller for all new Devices.'), 'method' => 'drop_sql', 'default' => '1', 'none_value' => __('None'), 'sql' => 'SELECT id, name FROM poller ORDER BY name', ), 'device_threads' => array( 'friendly_name' => __('Device Threads'), 'description' => __('The default number of Device Threads. This is only applicable when using the Spine Data Collector.'), 'method' => 'drop_array', 'default' => '1', 'array' => array( 1 => __('%s Thread', 1), 2 => __('%s Threads', 2), 3 => __('%s Threads', 3), 4 => __('%s Threads', 4), 5 => __('%s Threads', 5), 6 => __('%s Threads', 6), 7 => __('%s Threads', 7), 8 => __('%s Threads', 8), 9 => __('%s Threads', 9), 10 => __('%s Threads', 10) ) ), 'reindex_method' => array( 'friendly_name' => __('Re-index Method for Data Queries'), 'description' => __('The default Re-index Method to use for all Data Queries.'), 'method' => 'drop_array', 'default' => '1', 'array' => $reindex_types, ), 'default_interface_speed' => array( 'friendly_name' => __('Default Interface Speed'), 'description' => __('If Cacti can not determine the interface speed due to either ifSpeed or ifHighSpeed not being set or being zero, what maximum value do you wish on the resulting RRDfiles.'), 'method' => 'drop_array', 'default' => '1000', 'array' => array( '100' => __('100 Mbps Ethernet'), '1000' => __('1 Gbps Ethernet'), '10000' => __('10 Gbps Ethernet'), '25000' => __('25 Gbps Ethernet'), '40000' => __('40 Gbps Ethernet'), '56000' => __('56 Gbps Ethernet'), '100000' => __('100 Gbps Ethernet') ) ), 'snmp_header' => array( 'friendly_name' => __('SNMP Defaults'), 'method' => 'spacer', 'collapsible' => 'true' ), 'snmp_version' => array( 'friendly_name' => __('Version'), 'description' => __('Default SNMP version for all new Devices.'), 'method' => 'drop_array', 'default' => '2', 'array' => $snmp_versions, ), 'snmp_community' => array( 'friendly_name' => __('Community'), 'description' => __('Default SNMP read community for all new Devices.'), 'method' => 'textbox', 'default' => 'public', 'max_length' => '100', ), 'snmp_security_level' => array( 'friendly_name' => __('Security Level'), 'description' => __('Default SNMP v3 Security Level for all new Devices.'), 'method' => 'drop_array', 'default' => 'authPriv', 'array' => $snmp_security_levels, ), 'snmp_auth_protocol' => array( 'method' => 'drop_array', 'friendly_name' => __('Auth Protocol (v3)'), 'description' => __('Default SNMPv3 Authorization Protocol for all new Devices.'), 'default' => 'MD5', 'array' => $snmp_auth_protocols, ), 'snmp_username' => array( 'friendly_name' => __('Auth User (v3)'), 'description' => __('Default SNMP v3 Authorization User for all new Devices.'), 'method' => 'textbox', 'default' => '', 'max_length' => '50', 'size' => '40' ), 'snmp_password' => array( 'friendly_name' => __('Auth Passphrase (v3)'), 'description' => __('Default SNMP v3 Authorization Passphrase for all new Devices.'), 'method' => 'textbox_password', 'default' => '', 'max_length' => '50', 'size' => '40' ), 'snmp_priv_protocol' => array( 'method' => 'drop_array', 'friendly_name' => __('Privacy Protocol (v3)'), 'description' => __('Default SNMPv3 Privacy Protocol for all new Devices.'), 'default' => 'DES', 'array' => $snmp_priv_protocols, ), 'snmp_priv_passphrase' => array( 'method' => 'textbox_password', 'friendly_name' => __('Privacy Passphrase (v3)'), 'description' => __('Default SNMPv3 Privacy Passphrase for all new Devices.'), 'default' => '', 'max_length' => '200', 'size' => '80' ), 'snmp_context' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Context (v3)'), 'description' => __('Enter the SNMP v3 Context for all new Devices.'), 'value' => '|arg1:snmp_context|', 'default' => '', 'max_length' => '64', 'size' => '40' ), 'snmp_engine_id' => array( 'method' => 'textbox', 'friendly_name' => __('SNMP Engine ID (v3)'), 'description' => __('Default SNMP v3 Engine Id for all new Devices. Leave this field empty to use the SNMP Engine ID being defined per SNMPv3 Notification receiver.'), 'value' => '|arg1:snmp_engine_id|', 'default' => '', 'max_length' => '64', 'size' => '40' ), 'snmp_port' => array( 'friendly_name' => __('Port Number'), 'description' => __('Default UDP Port for all new Devices. Typically 161.'), 'method' => 'textbox', 'default' => '161', 'max_length' => '10', 'size' => '5' ), 'snmp_timeout' => array( 'friendly_name' => __('Timeout'), 'description' => __('Default SNMP timeout in milli-seconds for all new Devices.'), 'method' => 'textbox', 'default' => '500', 'max_length' => '10', 'size' => '5' ), 'snmp_retries' => array( 'friendly_name' => __('Retries'), 'description' => __('Default SNMP retries for all new Devices.'), 'method' => 'textbox', 'default' => '3', 'max_length' => '10', 'size' => '5' ), 'availability_header' => array( 'friendly_name' => __('Availability/Reachability'), 'method' => 'spacer', 'collapsible' => 'true' ), 'availability_method' => array( 'friendly_name' => __('Downed Device Detection'), 'description' => __('Default Availability/Reachability for all new Devices. The method Cacti will use to determine if a Device is available for polling.
    NOTE: It is recommended that, at a minimum, SNMP always be selected.'), 'method' => 'drop_array', 'default' => AVAIL_SNMP, 'array' => $availability_options, ), 'ping_method' => array( 'friendly_name' => __('Ping Type'), 'description' => __('Default Ping type for all new Devices.'), 'method' => 'drop_array', 'default' => PING_UDP, 'array' => $ping_methods, ), 'ping_port' => array( 'friendly_name' => __('Ping Port'), 'description' => __('Default Ping Port for all new Devices. With TCP, Cacti will attempt to Syn the port. With UDP, Cacti requires either a successful connection, or a \'port not reachable\' error to determine if the Device is up or not.'), 'method' => 'textbox', 'default' => '23', 'max_length' => '10', 'size' => '5' ), 'ping_timeout' => array( 'friendly_name' => __('Ping Timeout Value'), 'description' => __('Default Ping Timeout value in milli-seconds for all new Devices. The timeout values to use for Device SNMP, ICMP, UDP and TCP pinging. ICMP Pings will be rounded up to the nearest second. TCP and UDP connection timeouts on Windows are controlled by the operating system, and are therefore not recommended on Windows.'), 'method' => 'textbox', 'default' => '400', 'max_length' => '10', 'size' => '5' ), 'ping_retries' => array( 'friendly_name' => __('Ping Retry Count'), 'description' => __('The number of times Cacti will attempt to ping a Device before marking it as down.'), 'method' => 'textbox', 'default' => '1', 'max_length' => '10', 'size' => '5' ), 'updown_header' => array( 'friendly_name' => __('Up/Down Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'ping_failure_count' => array( 'friendly_name' => __('Failure Count'), 'description' => __('The number of polling intervals a Device must be down before logging an error and reporting Device as down.'), 'method' => 'textbox', 'default' => '2', 'max_length' => '10', 'size' => '5' ), 'ping_recovery_count' => array( 'friendly_name' => __('Recovery Count'), 'description' => __('The number of polling intervals a Device must remain up before returning Device to an up status and issuing a notice.'), 'method' => 'textbox', 'default' => '3', 'max_length' => '10', 'size' => '5' ) ), 'visual' => array( 'themes_header' => array( 'friendly_name' => __('Theme Settings'), 'method' => 'spacer', 'collapsible' => 'true' ), 'selected_theme' => array( 'friendly_name' => __('Theme'), 'description' => __('Please select one of the available Themes to skin your Cacti with.'), 'method' => 'drop_array', 'default' => 'modern', 'array' => $themes ), 'table_header' => array( 'friendly_name' => __('Table Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'num_rows_table' => array( 'friendly_name' => __('Rows Per Page'), 'description' => __('The default number of rows to display on for a table.'), 'method' => 'drop_array', 'default' => '30', 'array' => $item_rows ), 'autocomplete_enabled' => array( 'friendly_name' => __('Autocomplete Enabled'), 'description' => __('In very large systems, select lists can slow the user interface significantly. If this option is enabled, Cacti will use autocomplete callbacks to populate the select list systematically. Note: autocomplete is forcibly disabled on the Classic theme.'), 'method' => 'drop_array', 'default' => '1', 'array' => array( 1 => __('Yes'), 0 => __('No') ) ), 'autocomplete_rows' => array( 'friendly_name' => __('Autocomplete Rows'), 'description' => __('The default number of rows to return from an autocomplete based select pattern match.'), 'method' => 'drop_array', 'default' => '30', 'array' => $item_rows ), 'tree_header' => array( 'friendly_name' => __('Tree Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'min_tree_width' => array( 'friendly_name' => __('Minimum Tree Width'), 'description' => __('The Minimum width of the Tree to contract to.'), 'method' => 'textbox', 'default' => '170', 'max_length' => '5', 'size' => '7' ), 'max_tree_width' => array( 'friendly_name' => __('Maximum Tree Width'), 'description' => __('The Maximum width of the Tree to expand to, after which time, Tree branches will scroll on the page.'), 'method' => 'textbox', 'default' => '300', 'max_length' => '5', 'size' => '7' ), 'filter_header' => array( 'friendly_name' => __('Filter Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'strip_domain' => array( 'friendly_name' => __('Strip Domains from Device Dropdowns'), 'description' => __('When viewing Device name filter dropdowns, checking this option will strip to domain from the hostname.'), 'method' => 'checkbox', 'default' => '' ), 'object_creation_header' => array( 'friendly_name' => __('Graph/Data Source/Data Query Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'max_title_length' => array( 'friendly_name' => __('Maximum Title Length'), 'description' => __('The maximum allowable Graph or Data Source titles.'), 'method' => 'textbox', 'default' => '110', 'max_length' => '10', 'size' => '5' ), 'max_data_query_field_length' => array( 'friendly_name' => __('Data Source Field Length'), 'description' => __('The maximum Data Query field length.'), 'method' => 'textbox', 'default' => '40', 'max_length' => '10', 'size' => '5' ), 'graphs_new_header' => array( 'friendly_name' => __('Graph Creation'), 'collapsible' => 'true', 'method' => 'spacer', ), 'default_graphs_new_dropdown' => array( 'friendly_name' => __('Default Graph Type'), 'description' => __('When creating graphs, what Graph Type would you like pre-selected?'), 'method' => 'drop_array', 'default' => '-2', 'array' => array( '-2' => __('All Types'), '-1' => __('By Template/Data Query') ) ), 'logmgmt_header' => array( 'friendly_name' => __('Log Management'), 'collapsible' => 'true', 'method' => 'spacer', ), 'num_rows_log' => array( 'friendly_name' => __('Default Log Tail Lines'), 'description' => __('Default number of lines of the Cacti log file to tail.'), 'method' => 'drop_array', 'default' => 500, 'array' => $log_tail_lines, ), 'max_display_rows' => array( 'friendly_name' => __('Maximum number of rows per page'), 'description' => __('User defined number of lines for the CLOG to tail when selecting \'All lines\'.'), 'method' => 'textbox', 'max_length' => 5, 'size' => 5, 'default' => 1000 ), 'log_refresh_interval' => array( 'friendly_name' => __('Log Tail Refresh'), 'description' => __('How often do you want the Cacti log display to update.'), 'method' => 'drop_array', 'default' => 60, 'array' => $page_refresh_interval, ), 'clog_header' => array( 'friendly_name' => __('Log Viewer Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'clog_exclude' => array( 'friendly_name' => __('Exclusion Regex'), 'description' => __('Any strings that match this regex will be excluded from the user display. For example, if you want to exclude all log lines that include the words \'Admin\' or \'Login\' you would type \'(Admin || Login)\''), 'method' => 'textarea', 'textarea_rows' => '5', 'textarea_cols' => '45', 'max_length' => 512 ), 'realtime_header' => array( 'friendly_name' => __('Real-time Graphs'), 'method' => 'spacer', 'collapsible' => 'true', ), 'realtime_enabled' => array( 'friendly_name' => __('Enable Real-time Graphing'), 'description' => __('When an option is checked, users will be able to put Cacti into Real-time mode.'), 'method' => 'checkbox', 'default' => 'on' ), 'realtime_gwindow' => array( 'friendly_name' => __('Graph Timespan'), 'description' => __('This timespan you wish to see on the default graph.'), 'method' => 'drop_array', 'default' => 60, 'array' => $realtime_window, ), 'realtime_interval' => array( 'friendly_name' => __('Minimum Refresh Interval'), 'description' => __('This is the minimal supported time between Graph updates. This value is also used to set certain RRDfile attributes. If you have a Device that caches data and does not provide realtime updates, you may have to increase the default Minimum Refresh Interval to prevent creating Graphs with gaps.'), 'method' => 'drop_array', 'default' => 10, 'array' => $realtime_refresh, ), 'realtime_cache_path' => array( 'friendly_name' => __('Cache Directory'), 'description' => __('This is the location, on the web server where the RRDfiles and PNG files will be cached. This cache will be managed by the poller. Make sure you have the correct read and write permissions on this folder'), 'method' => 'dirpath', 'default' => $config['base_path'] . '/cache/realtime/', 'max_length' => 255, 'size' => 40, ), 'rrdtool_header' => array( 'friendly_name' => __('RRDtool Graph Options'), 'method' => 'spacer', 'collapsible' => 'true' ), 'graph_watermark' => array( 'friendly_name' => __('Custom Watermark'), 'description' => __('Text placed at the bottom center of every Graph.'), 'method' => 'textbox', 'default' => 'Generated by Cacti®', 'max_length' => '80', 'size' => '60' ), 'graph_dateformat' => array( 'friendly_name' => __('Custom Date Format'), 'description' => __('To be used when formatting |date_time| on a graph'), 'method' => 'textbox', 'default' => 'D d M H:i:s T Y', 'max_length' => '80', 'size' => '60' ), 'rrdtool_watermark' => array( 'friendly_name' => __('Disable RRDtool Watermark'), 'description' => __('Provided your RRDtool version supports it, you may disable RRDtool advertisement on your Graphs by checking this option.'), 'method' => 'checkbox', 'default' => '', ), 'font_method' => array( 'friendly_name' => __('Font Selection Method'), 'description' => __('How do you wish fonts to be handled by default?'), 'method' => 'drop_array', 'default' => 1, 'array' => array( 0 => __('System'), 1 => __('Theme') ) ), 'path_rrdtool_default_font' => array( 'friendly_name' => __('Default Font'), 'description' => __('When not using Theme based font control, the Pangon font-config font name to use for all Graphs. Optionally, you may leave blank and control font settings on a per object basis.'), 'method' => 'font', 'placeholder' => __('Enter Valid Font Config Value'), 'max_length' => '255' ), 'title_size' => array( 'friendly_name' => __('Title Font Size'), 'description' => __('The size of the font used for Graph Titles'), 'method' => 'textbox', 'default' => '10', 'max_length' => '10', 'size' => '5' ), 'title_font' => array( 'friendly_name' => __('Title Font Setting'), 'description' => __('The font to use for Graph Titles. Enter either a valid True Type Font file or valid Pango font-config value.'), 'method' => 'font', 'placeholder' => __('Enter Valid Font Config Value'), 'max_length' => '100' ), 'legend_size' => array( 'friendly_name' => __('Legend Font Size'), 'description' => __('The size of the font used for Graph Legend items'), 'method' => 'textbox', 'default' => '8', 'max_length' => '10', 'size' => '5' ), 'legend_font' => array( 'friendly_name' => __('Legend Font Setting'), 'description' => __('The font to use for Graph Legends. Enter either a valid True Type Font file or valid Pango font-config value.'), 'method' => 'font', 'placeholder' => __('Enter Valid Font Config Value'), 'max_length' => '100' ), 'axis_size' => array( 'friendly_name' => __('Axis Font Size'), 'description' => __('The size of the font used for Graph Axis'), 'method' => 'textbox', 'default' => '7', 'max_length' => '10', 'size' => '5' ), 'axis_font' => array( 'friendly_name' => __('Axis Font Setting'), 'description' => __('The font to use for Graph Axis items. Enter either a valid True Type Font file or valid Pango font-config value.'), 'method' => 'font', 'placeholder' => __('Enter Valid Font Config Value'), 'max_length' => '100' ), 'unit_size' => array( 'friendly_name' => __('Unit Font Size'), 'description' => __('The size of the font used for Graph Units'), 'method' => 'textbox', 'default' => '7', 'max_length' => '10', 'size' => '5' ), 'unit_font' => array( 'friendly_name' => __('Unit Font Setting'), 'description' => __('The font to use for Graph Unit items. Enter either a valid True Type Font file or valid Pango font-config value.'), 'method' => 'font', 'placeholder' => __('Enter Valid Font Config Value'), 'max_length' => '100' ) ), 'poller' => array( 'poller_header' => array( 'friendly_name' => __('General'), 'collapsible' => 'true', 'method' => 'spacer', ), 'poller_enabled' => array( 'friendly_name' => __('Data Collection Enabled'), 'description' => __('If you wish to stop the polling process completely, uncheck this box.'), 'method' => 'checkbox', 'default' => 'on', 'tab' => 'poller' ), 'enable_snmp_agent' => array( 'friendly_name' => __('SNMP Agent Support Enabled'), 'description' => __('If this option is checked, Cacti will populate SNMP Agent tables with Cacti device and system information. It does not enable the SNMP Agent itself.'), 'method' => 'checkbox', 'default' => 'on' ), 'poller_type' => array( 'friendly_name' => __('Poller Type'), 'description' => __('The poller type to use. This setting will take affect at next polling interval.'), 'method' => 'drop_array', 'default' => 1, 'array' => $poller_options, ), 'poller_sync_interval' => array( 'friendly_name' => __('Poller Sync Interval'), 'description' => __('The default polling sync interval to use when creating a poller. This setting will affect how often remote pollers are checked and updated.'), 'method' => 'drop_array', 'default' => 7200, 'array' => $poller_sync_intervals, ), 'poller_interval' => array( 'friendly_name' => __('Poller Interval'), 'description' => __('The polling interval in use. This setting will affect how often RRDfiles are checked and updated. NOTE: If you change this value, you must re-populate the poller cache. Failure to do so, may result in lost data.'), 'method' => 'drop_array', 'default' => 300, 'array' => $poller_intervals, ), 'cron_interval' => array( 'friendly_name' => __('Cron/Daemon Interval'), 'description' => __('The frequency that the Cacti data collector will be started. You can use either crontab, a scheduled task (for windows), or the cactid systemd service to control launching the Cacti data collector. For instructions on using the cactid daemon, review the README.md file in the service directory.'), 'method' => 'drop_array', 'default' => 300, 'array' => $cron_intervals, ), 'process_leveling' => array( 'friendly_name' => __('Balance Process Load'), 'description' => __('If you choose this option, Cacti will attempt to balance the load of each poller process by equally distributing poller items per process.'), 'method' => 'checkbox', 'default' => 'on' ), 'poller_debug' => array( 'friendly_name' => __('Debug Output Width'), 'description' => __('If you choose this option, Cacti will check for output that exceeds Cacti\'s ability to store it and issue a warning when it finds it.'), 'method' => 'checkbox', 'default' => '' ), 'oid_increasing_check_disable' => array( 'friendly_name' => __('Disable increasing OID Check'), 'description' => __('Controls disabling check for increasing OID while walking OID tree.'), 'method' => 'checkbox', 'default' => '' ), 'remote_agent_timeout' => array( 'friendly_name' => __('Remote Agent Timeout'), 'description' => __('The amount of time, in seconds, that the Central Cacti web server will wait for a response from the Remote Data Collector to obtain various Device information before abandoning the request. On Devices that are associated with Data Collectors other than the Central Cacti Data Collector, the Remote Agent must be used to gather Device information.'), 'method' => 'drop_array', 'default' => '5', 'array' => array( 5 => __('%d Seconds', 5), 10 => __('%d Seconds', 10), 15 => __('%d Seconds', 15), 20 => __('%d Seconds', 20) ) ), 'snmp_bulk_walk_size' => array( 'friendly_name' => __('SNMP Bulkwalk Fetch Size'), 'description' => __('How many OID\'s should be returned per snmpbulkwalk request? For Devices with large SNMP trees, increasing this size will increase re-index performance over a WAN.'), 'method' => 'drop_array', 'default' => '10', 'array' => array( '10' => '10', '20' => '20', '30' => '30', '40' => '40', '50' => '50', '60' => '60', '70' => '70', '80' => '80', '90' => '90', '100' => '100', '150' => '150', '200' => '200') ), 'max_get_size' => array( 'friendly_name' => __('SNMP Get OID Limit'), 'description' => __('The default maximum number of SNMP Get OIDs to issue per snmpget request. For Devices, this setting is controlled at the Device level. You should only use this setting when using Cacti\'s SNMP API natively in your scripts or plugins.'), 'method' => 'textbox', 'default' => '10', 'max_length' => '10', 'size' => '5' ), 'disable_cache_replication' => array( 'friendly_name' => __('Disable Resource Cache Replication'), 'description' => __('By default, the main Cacti Data Collector will cache the entire web site and plugins into a Resource Cache. Then, periodically the Remote Data Collectors will update themeselves with any updates from the main Cacti Data Collector. This Resource Cache essentially allows Remote Data Collectors to self upgrade. If you do not wish to use this option, you can disable it using this setting.'), 'method' => 'checkbox', 'default' => '' ), 'data_collector1_header' => array( 'friendly_name' => __('Additional Data Collector Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'spine_log_level' => array( 'friendly_name' => __('Invalid Data Logging'), 'description' => __('How would you like the Data Collector output errors logged? Options include: \'Detailed\' which details every error, \'Summary\' which provides the number of output errors per Device, and \'None\', which does not provide error counts.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( '0' => __('None'), '1' => __('Summary'), '2' => __('Detailed') ) ), 'php_servers' => array( 'friendly_name' => __('Number of PHP Script Servers'), 'description' => __('The number of concurrent script server processes to run per spine process. Settings between 1 and 15 are accepted. This parameter will help if you are running several threads and script server scripts and is only valid for the spine Data Collector.'), 'method' => 'textbox', 'default' => '1', 'max_length' => '10', 'size' => '5' ), 'script_timeout' => array( 'friendly_name' => __('Script and Script Server Timeout Value'), 'description' => __('The maximum time that spine will wait on a script to complete. This timeout value is in seconds and is only valid for the spine Data Collector.'), 'method' => 'textbox', 'default' => '25', 'max_length' => '10', 'size' => '5' ), 'timeouts_header' => array( 'friendly_name' => __('Background Timeout Settings'), 'collapsible' => 'true', 'method' => 'spacer', ), 'reports_timeout' => array( 'friendly_name' => __('Report Generation Timeout'), 'description' => __('The maximum amount of time Cacti\'s Reports Generation script can run without generating a timeout error and being killed.'), 'method' => 'drop_array', 'default' => '300', 'array' => array( '60' => __('%s Minute', 1), '120' => __('%s Minutes', 2), '300' => __('%s Minutes', 5), '600' => __('%s Minutes', 10), '1200' => __('%s Minutes', 20) ) ), 'dsstats_timeout' => array( 'friendly_name' => __('Data Source Statistics Timeout'), 'description' => __('The maximum amount of time Cacti\'s Data Source Statistics script can run without generating a timeout error and being killed.'), 'method' => 'drop_array', 'default' => '300', 'array' => array( '60' => __('%s Minute', 1), '120' => __('%s Minutes', 2), '300' => __('%s Minutes', 5), '600' => __('%s Minutes', 10), '1200' => __('%s Minutes', 20) ) ), 'commands_timeout' => array( 'friendly_name' => __('Background Commands Timeout'), 'description' => __('The maximum amount of time Cacti\'s Background Commands script can run without generating a timeout error and being killed.'), 'method' => 'drop_array', 'default' => '300', 'array' => array( '60' => __('%s Minute', 1), '120' => __('%s Minutes', 2), '300' => __('%s Minutes', 5), '600' => __('%s Minutes', 10), '1200' => __('%s Minutes', 20) ) ), 'maintenance_timeout' => array( 'friendly_name' => __('Maintenance Background Generation Timeout'), 'description' => __('The maximum amount of time a Cacti\'s Maintenance script can run without generating a timeout error and being killed.'), 'method' => 'drop_array', 'default' => '300', 'array' => array( '60' => __('%s Minute', 1), '120' => __('%s Minutes', 2), '300' => __('%s Minutes', 5), '600' => __('%s Minutes', 10), '1200' => __('%s Minutes', 20), '3600' => __('%s Hour', 1) ) ), 'spikekill_timeout' => array( 'friendly_name' => __('Spikekill Background Generation Timeout'), 'description' => __('The maximum amount of time a Cacti\'s Spikekill script can run without generating a timeout error and being killed.'), 'method' => 'drop_array', 'default' => '3600', 'array' => array( '60' => __('%s Minute', 1), '120' => __('%s Minutes', 2), '300' => __('%s Minutes', 5), '600' => __('%s Minutes', 10), '1200' => __('%s Minutes', 20), '3600' => __('%s Hour', 1), '7200' => __('%s Hours', 2), '14400' => __('%s Hours', 4), '28800' => __('%s Hours', 8) ) ), 'data_collector_header' => array( 'friendly_name' => __('Data Collector Defaults'), 'description' => __('These settings are maintained at the Data Collector level. The values here are only defaults used when first creating a Data Collector.'), 'collapsible' => 'true', 'method' => 'spacer', ), 'concurrent_processes' => array( 'friendly_name' => __('Data Collector Processes'), 'description' => __('The default number of concurrent processes to execute per Data Collector. NOTE: Starting from Cacti 1.2, this setting is maintained in the Data Collector. Moving forward, this value is only a preset for the Data Collector. Using a higher number when using cmd.php will improve performance. Performance improvements in Spine are best resolved with the threads parameter. When using Spine, we recommend a lower number and leveraging threads instead. When using cmd.php, use no more than 2x the number of CPU cores.'), 'method' => 'textbox', 'default' => '1', 'max_length' => '10', 'size' => '5' ), 'max_threads' => array( 'friendly_name' => __('Threads per Process'), 'description' => __('The Default Threads allowed per process. NOTE: Starting in Cacti 1.2+, this setting is maintained in the Data Collector, and this is simply the Preset. Using a higher number when using Spine will improve performance. However, ensure that you have enough MySQL/MariaDB connections to support the following equation: connections = data collectors * processes * (threads + script servers). You must also ensure that you have enough spare connections for user login connections as well.'), 'method' => 'textbox', 'default' => '1', 'max_length' => '10', 'size' => '5' ), ), 'authentication' => array( 'auth_header' => array( 'friendly_name' => __('General'), 'method' => 'spacer', 'collapsible' => 'true' ), 'auth_method' => array( 'friendly_name' => __('Authentication Method'), 'description' => __('
    Built-in Authentication - Cacti handles user authentication, which allows you to create users and give them rights to different areas within Cacti.

    Web Basic Authentication - Authentication is handled by the web server. Users can be added or created automatically on first login if the Template User is defined, otherwise the defined guest permissions will be used.

    LDAP Authentication - Allows for authentication against a LDAP server. Users will be created automatically on first login if the Template User is defined, otherwise the defined guest permissions will be used. If PHPs LDAP module is not enabled, LDAP Authentication will not appear as a selectable option.

    Multiple LDAP/AD Domain Authentication - Allows administrators to support multiple disparate groups from different LDAP/AD directories to access Cacti resources. Just as LDAP Authentication, the PHP LDAP module is required to utilize this method.
    '), 'method' => 'drop_array', 'default' => 1, 'array' => $auth_methods ), 'auth_cache_enabled' => array( 'friendly_name' => __('Support Authentication Cookies'), 'description' => __('If a user authenticates and selects \'Keep me signed in\', an authentication cookie will be created on the user\'s computer allowing that user to stay logged in. The authentication cookie expires after 90 days of non-use.'), 'default' => 'on', 'method' => 'checkbox' ), 'special_users_header' => array( 'friendly_name' => __('Special Users'), 'method' => 'spacer', 'collapsible' => 'true' ), 'admin_user' => array( 'friendly_name' => __('Primary Admin'), 'description' => __('The name of the primary administrative account that will automatically receive Emails when the Cacti system experiences issues. To receive these Emails, ensure that your mail settings are correct, and the administrative account has an Email address that is set.'), 'method' => 'drop_sql', 'none_value' => __('No User'), 'sql' => 'SELECT id AS id, username AS name FROM user_auth WHERE realm = 0 ORDER BY username', 'default' => '1' ), 'guest_user' => array( 'friendly_name' => __('Guest User'), 'description' => __('The name of the guest user for viewing graphs; is \'No User\' by default.'), 'method' => 'drop_sql', 'none_value' => __('No User'), 'sql' => 'SELECT id AS id, username AS name FROM user_auth WHERE realm = 0 AND id NOT IN (' . $admin_account . ') ORDER BY username', 'default' => '0' ), 'user_template' => array( 'friendly_name' => __('User Template'), 'description' => __('The name of the user that Cacti will use as a template for new Web Basic and LDAP users; is \'guest\' by default. This user account will be disabled from logging in upon being selected.'), 'method' => 'drop_sql', 'none_value' => __('No User'), 'sql' => 'SELECT id AS id, username AS name FROM user_auth WHERE realm = 0 AND id NOT IN (' . $admin_account . ') ORDER BY username', 'default' => '0' ), 'path_basic_mapfile' => array( 'friendly_name' => __('Basic Auth Mapfile'), 'description' => __('When using basic authentication, if the basic account needs to be translated to a different login account, you can specify a CSV file here to map the basic account to the desired login account.'), 'method' => 'filepath', 'file_type' => 'ascii', 'max_length' => 255, 'default' => '', 'install_optional' => true ), 'secpass_header' => array( 'friendly_name' => __('Local Account Complexity Requirements'), 'method' => 'spacer', 'collapsible' => 'true' ), 'secpass_minlen' => array( 'friendly_name' => __('Minimum Length'), 'description' => __('This is minimal length of allowed passwords.'), 'method' => 'textbox', 'default' => '8', 'max_length' => 2, 'size' => 4 ), 'secpass_reqmixcase' => array( 'friendly_name' => __('Require Mix Case'), 'description' => __('This will require new passwords to contains both lower and upper-case characters.'), 'method' => 'checkbox', 'default' => 'on', ), 'secpass_reqnum' => array( 'friendly_name' => __('Require Number'), 'description' => __('This will require new passwords to contain at least 1 numerical character.'), 'method' => 'checkbox', 'default' => 'on', ), 'secpass_reqspec' => array( 'friendly_name' => __('Require Special Character'), 'description' => __('This will require new passwords to contain at least 1 special character.'), 'method' => 'checkbox', 'default' => 'on', ), 'secpass_forceold' => array( 'friendly_name' => __('Force Complexity Upon Old Passwords'), 'description' => __('This will require all old passwords to also meet the new complexity requirements upon login. If not met, it will force a password change.'), 'method' => 'checkbox', 'default' => '', ), 'secpass_expireaccount' => array( 'friendly_name' => __('Expire Inactive Accounts'), 'description' => __('This is maximum number of days before inactive accounts are disabled. The Admin account is excluded from this policy.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( '0' => __('Disabled'), '30' => __('%d Days', 30), '60' => __('%d Days', 60), '90' => __('%d Days', 90), '120' => __('%d Days', 120), '365' => __('%d Year', 1), '730' => __('%d Years', 2) ) ), 'secpass_expirepass' => array( 'friendly_name' => __('Expire Password'), 'description' => __('This is maximum number of days before a password is set to expire.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( '0' => __('Disabled'), '30' => __('%d Days', 30), '60' => __('%d Days', 60), '90' => __('%d Days', 90), '120' => __('%d Days', 120) ) ), 'secpass_history' => array( 'friendly_name' => __('Password History'), 'description' => __('Remember this number of old passwords and disallow re-using them.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( '0' => __('Disabled'), '1' => __('1 Change'), '2' => __('%d Changes', 2), '3' => __('%d Changes', 3), '4' => __('%d Changes', 4), '5' => __('%d Changes', 5), '6' => __('%d Changes', 6), '7' => __('%d Changes', 7), '8' => __('%d Changes', 8), '9' => __('%d Changes', 9), '10' => __('%d Changes', 10), '11' => __('%d Changes', 11), '12' => __('%d Changes', 12) ) ), 'secpass_lock_header' => array( 'friendly_name' => __('Account Locking'), 'method' => 'spacer', 'collapsible' => 'true' ), 'secpass_lockfailed' => array( 'friendly_name' => __('Lock Accounts'), 'description' => __('Lock an account after this many failed attempts in 1 hour.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( '0' => __('Disabled'), '1' => __('1 Attempt'), '2' => __('%d Attempts', 2), '3' => __('%d Attempts', 3), '4' => __('%d Attempts', 4), '5' => __('%d Attempts', 5), '6' => __('%d Attempts', 6) ) ), 'secpass_unlocktime' => array( 'friendly_name' => __('Auto Unlock'), 'description' => __('An account will automatically be unlocked after this many minutes. Even if the correct password is entered, the account will not unlock until this time limit has been met. Max of 1440 minutes (1 Day)'), 'method' => 'drop_array', 'default' => '60', 'array' => array( '0' => __('Disabled'), '1' => __('1 Minute'), '2' => __('%d Minutes', 2), '5' => __('%d Minutes', 5), '10' => __('%d Minutes', 10), '20' => __('%d Minutes', 20), '30' => __('%d Minutes', 30), '60' => __('1 Hour'), '120' => __('%d Hours', 2), '240' => __('%d Hours', 4), '480' => __('%d Hours', 8), '960' => __('%d Hours', 16), '1440' => __('1 Day') ) ), 'ldap_general_header' => array( 'friendly_name' => __('LDAP General Settings'), 'method' => 'spacer' ), 'ldap_server' => array( 'friendly_name' => __('Server(s)'), 'description' => __('A space delimited list of DNS hostnames or IP address of for valid LDAP servers. Cacti will attempt to use the LDAP servers from left to right to authenticate a user.'), 'method' => 'textbox', 'size' => '80', 'max_length' => '255' ), 'ldap_port' => array( 'friendly_name' => __('Port Standard'), 'description' => __('TCP port for Non-SSL communications including LDAP + TLS. Default is 389.'), 'method' => 'textbox', 'max_length' => '5', 'default' => '389', 'size' => '5' ), 'ldap_port_ssl' => array( 'friendly_name' => __('Port SSL'), 'description' => __('TCP port for LDAPS for SSL communications. Default is 636.'), 'method' => 'textbox', 'max_length' => '5', 'default' => '636', 'size' => '5' ), 'ldap_version' => array( 'friendly_name' => __('Protocol Version'), 'description' => __('Protocol Version to connect to the server with.'), 'method' => 'drop_array', 'default' => '3', 'array' => $ldap_versions ), 'ldap_network_timeout' => array( 'friendly_name' => __('Connect Timeout'), 'description' => __('The Network Connect Timeout in seconds.'), 'method' => 'textbox', 'max_length' => '5', 'default' => '2', 'size' => '5' ), 'ldap_bind_timeout' => array( 'friendly_name' => __('Bind Timeout'), 'description' => __('The Bind Timeout in seconds.'), 'method' => 'textbox', 'max_length' => '5', 'default' => '5', 'size' => '5' ), 'ldap_encryption' => array( 'friendly_name' => __('Encryption'), 'description' => __('Encryption that the server supports. NOTE: When using LDAP + TLS you must use version 3.'), 'method' => 'drop_array', 'default' => '0', 'array' => $ldap_encryption ), 'ldap_tls_certificate' => array( 'friendly_name' => __('TLS Certificate Requirements'), 'description' => __('Should LDAP verify TLS Certificates when received by the Client.'), 'method' => 'drop_array', 'default' => LDAP_OPT_X_TLS_NEVER, 'array' => $ldap_tls_cert_req ), 'ldap_referrals' => array( 'friendly_name' => __('Referrals'), 'description' => __('Enable or Disable LDAP referrals. If disabled, it may increase the speed of searches.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( '0' => __('Disabled'), '1' => __('Enable') ) ), 'ldap_mode' => array( 'friendly_name' => __('Mode'), 'description' => __('Mode which cacti will attempt to authenticate against the LDAP server.
    No Searching - No Distinguished Name (DN) searching occurs, just attempt to bind with the provided Distinguished Name (DN) format.

    Anonymous Searching - Attempts to search for username against LDAP directory via anonymous binding to locate the user\'s Distinguished Name (DN).

    Specific Searching - Attempts search for username against LDAP directory via Specific Distinguished Name (DN) and Specific Password for binding to locate the user\'s Distinguished Name (DN).'), 'method' => 'drop_array', 'default' => '0', 'array' => $ldap_modes ), 'ldap_dn' => array( 'friendly_name' => __('Distinguished Name (DN)'), 'description' => __('Distinguished Name syntax, such as for windows: "<username>@win2kdomain.local" or for OpenLDAP: "uid=<username>,ou=people,dc=domain,dc=local". "<username>" is replaced with the username that was supplied at the login prompt. This is only used when in "No Searching" mode.'), 'method' => 'textbox', 'max_length' => '255' ), 'ldap_group_require' => array( 'friendly_name' => __('Require Group Membership'), 'description' => __('Require user to be member of group to authenticate. Group settings must be set for this to work, enabling without proper group settings will cause authentication failure.'), 'default' => '', 'method' => 'checkbox' ), 'ldap_group_header' => array( 'friendly_name' => __('LDAP Group Settings'), 'method' => 'spacer' ), 'ldap_group_dn' => array( 'friendly_name' => __('Group Distinguished Name (DN)'), 'description' => __('Distinguished Name of the group that user must have membership.'), 'method' => 'textbox', 'max_length' => '255' ), 'ldap_group_attrib' => array( 'friendly_name' => __('Group Member Attribute'), 'description' => __('Name of the attribute that contains the usernames of the members.'), 'method' => 'textbox', 'max_length' => '255' ), 'ldap_group_member_type' => array( 'friendly_name' => __('Group Member Type'), 'description' => __('Defines if users use full Distinguished Name or just Username in the defined Group Member Attribute.'), 'method' => 'drop_array', 'default' => 1, 'array' => array( 1 => __('Distinguished Name'), 2 => __('Username') ) ), 'ldap_search_base_header' => array( 'friendly_name' => __('LDAP Specific Search Settings'), 'method' => 'spacer' ), 'ldap_search_base' => array( 'friendly_name' => __('Search Base'), 'description' => __('Search base for searching the LDAP directory, such as \'dc=win2kdomain,dc=local\' or \'ou=people,dc=domain,dc=local\'.'), 'method' => 'textbox', 'max_length' => '255' ), 'ldap_search_filter' => array( 'friendly_name' => __('Search Filter'), 'description' => __('Search filter to use to locate the user in the LDAP directory, such as for windows: \'(&(objectclass=user)(objectcategory=user)(userPrincipalName=<username>*))\' or for OpenLDAP: \'(&(objectClass=account)(uid=<username>))\'. \'<username>\' is replaced with the username that was supplied at the login prompt. '), 'method' => 'textbox', 'max_length' => '255' ), 'ldap_specific_dn' => array( 'friendly_name' => __('Search Distinguished Name (DN)'), 'description' => __('Distinguished Name for Specific Searching binding to the LDAP directory.'), 'method' => 'textbox', 'max_length' => '255' ), 'ldap_specific_password' => array( 'friendly_name' => __('Search Password'), 'description' => __('Password for Specific Searching binding to the LDAP directory.'), 'method' => 'textbox_password', 'max_length' => '255' ), 'cn_header' => array( 'friendly_name' => __('LDAP CN Settings'), 'method' => 'spacer' ), 'cn_full_name' => array( 'friendly_name' => __('Full Name'), 'description' => __('Field that will replace the Full Name when creating a new user, taken from LDAP. (on windows: displayname) '), 'method' => 'textbox', 'max_length' => '255' ), 'cn_email' => array( 'friendly_name' => __('Email'), 'description' => __('Field that will replace the Email taken from LDAP. (on windows: mail)'), 'method' => 'textbox', 'max_length' => '255' ), ), 'mail' => array( 'settings_web_url' => array( 'friendly_name' => __('URL Linking'), 'method' => 'spacer', 'collapsible' => 'true' ), 'base_url' => array( 'friendly_name' => __('Server Base URL'), 'description' => __('This is a the server location that will be used for links to the Cacti site. This should include the subdirectory if Cacti does not run from root folder.'), 'method' => 'textbox', 'max_length' => 255, 'size' => '60', 'default' => 'http://' . gethostname() . $config['url_path'] ), 'settings_email_header' => array( 'friendly_name' => __('Emailing Options'), 'method' => 'spacer', ), 'notify_admin' => array( 'friendly_name' => __('Notify Primary Admin of Issues'), 'description' => __('In cases where the Cacti server is experiencing problems, should the Primary Administrator be notified by Email? The Primary Administrator\'s Cacti user account is specified under the Authentication tab on Cacti\'s settings page. It defaults to the \'admin\' account.'), 'default' => '', 'method' => 'checkbox' ), 'settings_test_email' => array( 'friendly_name' => __('Test Email'), 'description' => __('This is a Email account used for sending a test message to ensure everything is working properly.'), 'method' => 'textbox', 'max_length' => 255, ), 'settings_how' => array( 'friendly_name' => __('Mail Services'), 'description' => __('Which mail service to use in order to send mail'), 'method' => 'drop_array', 'default' => 0, 'array' => $mail_methods, ), 'settings_ping_mail' => array( 'friendly_name' => __('Ping Mail Server'), 'description' => __('Ping the Mail Server before sending test Email?'), 'method' => 'drop_array', 'default' => 0, 'array' => array( 0 => __('Yes'), 1 => __('No') ) ), 'settings_from_email' => array( 'friendly_name' => __('From Email Address'), 'description' => __('This is the Email address that the Email will appear from.'), 'method' => 'textbox', 'max_length' => 255, ), 'settings_from_name' => array( 'friendly_name' => __('From Name'), 'description' => __('This is the actual name that the Email will appear from.'), 'method' => 'textbox', 'max_length' => 255, ), 'settings_wordwrap' => array( 'friendly_name' => __('Word Wrap'), 'description' => __('This is how many characters will be allowed before a line in the Email is automatically word wrapped. (0 = Disabled)'), 'method' => 'textbox', 'default' => 120, 'max_length' => 4, 'size' => 5 ), 'settings_sendmail_header' => array( 'friendly_name' => __('Sendmail Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'settings_sendmail_path' => array( 'friendly_name' => __('Sendmail Path'), 'description' => __('This is the path to sendmail on your server. (Only used if Sendmail is selected as the Mail Service)'), 'method' => 'filepath', 'file_type' => 'binary', 'max_length' => 255, 'default' => '', 'install_optional' => true ), 'settings_smtp_header' => array( 'friendly_name' => __('SMTP Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'settings_smtp_host' => array( 'friendly_name' => __('SMTP Hostname'), 'description' => __('This is the hostname/IP of the SMTP Server you will send the Email to. For failover, separate your hosts using a semi-colon.'), 'method' => 'textbox', 'default' => 'localhost', 'max_length' => 255, ), 'settings_smtp_port' => array( 'friendly_name' => __('SMTP Port'), 'description' => __('The port on the SMTP Server to use.'), 'method' => 'textbox', 'max_length' => 255, 'default' => 25, 'size' => 5 ), 'settings_smtp_username' => array( 'friendly_name' => __('SMTP Username'), 'description' => __('The username to authenticate with when sending via SMTP. (Leave blank if you do not require authentication.)'), 'method' => 'textbox', 'max_length' => 255, ), 'settings_smtp_password' => array( 'friendly_name' => __('SMTP Password'), 'description' => __('The password to authenticate with when sending via SMTP. (Leave blank if you do not require authentication.)'), 'method' => 'textbox_password', 'max_length' => 255, ), 'settings_smtp_secure' => array( 'friendly_name' => __('SMTP Security'), 'description' => __('The encryption method to use for the Email.'), 'method' => 'drop_array', 'array' => array( 'none' => __('None'), 'ssl' => __('SSL'), 'tls' => __('TLS') ), 'default' => 'none' ), 'settings_smtp_timeout' => array( 'friendly_name' => __('SMTP Timeout'), 'description' => __('Please enter the SMTP timeout in seconds.'), 'method' => 'textbox', 'default' => '10', 'max_length' => '10', 'size' => '5' ), 'reports_header' => array( 'friendly_name' => __('Reporting Presets'), 'method' => 'spacer', 'collapsible' => 'true' ), 'reports_default_image_format' => array( 'friendly_name' => __('Default Graph Image Format'), 'description' => __('When creating a new report, what image type should be used for the inline graphs.'), 'method' => 'drop_array', 'default' => REPORTS_TYPE_INLINE_PNG, 'array' => $attach_types ), 'reports_max_attach' => array( 'friendly_name' => __('Maximum E-Mail Size'), 'description' => __('The maximum size of the E-Mail message including all attachements.'), 'method' => 'drop_array', 'default' => REPORTS_DEFAULT_MAX_SIZE, 'array' => $attachment_sizes ), 'reports_log_verbosity' => array( 'friendly_name' => __('Poller Logging Level for Cacti Reporting'), 'description' => __('What level of detail do you want sent to the log file. WARNING: Leaving in any other status than NONE or LOW can exhaust your disk space rapidly.'), 'method' => 'drop_array', 'default' => POLLER_VERBOSITY_LOW, 'array' => $logfile_verbosity, ), 'reports_allow_ln' => array( 'friendly_name' => __('Enable Lotus Notes (R) tweak'), 'description' => __('Enable code tweak for specific handling of Lotus Notes Mail Clients.'), 'method' => 'checkbox', 'default' => '', ), 'settings_dns_header' => array( 'friendly_name' => __('DNS Options'), 'collapsible' => 'true', 'method' => 'spacer', ), 'settings_dns_primary' => array( 'friendly_name' => __('Primary DNS IP Address'), 'description' => __('Enter the primary DNS IP Address to utilize for reverse lookups.'), 'method' => 'textbox', 'default' => '', 'max_length' => '30' ), 'settings_dns_secondary' => array( 'friendly_name' => __('Secondary DNS IP Address'), 'description' => __('Enter the secondary DNS IP Address to utilize for reverse lookups.'), 'method' => 'textbox', 'default' => '', 'max_length' => '30' ), 'settings_dns_timeout' => array( 'friendly_name' => __('DNS Timeout'), 'description' => __('Please enter the DNS timeout in milliseconds. Cacti uses a PHP based DNS resolver.'), 'method' => 'textbox', 'default' => '500', 'max_length' => '10', 'size' => '5' ), ), 'boost' => array( 'boost_hq_header' => array( 'friendly_name' => __('On-demand RRD Update Settings'), 'method' => 'spacer', 'collapsible' => 'true' ), 'boost_rrd_update_enable' => array( 'friendly_name' => __('Enable On-demand RRD Updating'), 'description' => __('Should Boost enable on demand RRD updating in Cacti? If you disable, this change will not take affect until after the next polling cycle. When you have Remote Data Collectors, this settings is required to be on.'), 'method' => 'checkbox', 'default' => '' ), 'boost_rrd_update_system_enable' => array( 'friendly_name' => __('System Level RRD Updater'), 'description' => __('Before RRD On-demand Update Can be Cleared, a poller run must always pass'), 'method' => 'hidden', 'default' => '' ), 'boost_rrd_update_interval' => array( 'friendly_name' => __('How Often Should Boost Update All RRDs'), 'description' => __('When you enable boost, your RRD files are only updated when they are requested by a user, or when this time period elapses.'), 'default' => '60', 'method' => 'drop_array', 'array' => $boost_refresh_interval ), 'boost_parallel' => array( 'friendly_name' => __('Number of Boost Processes'), 'description' => __('The number of concurrent boost processes to use to use to process all of the RRDs in the boost table.'), 'default' => '1', 'method' => 'drop_array', 'array' => array( 1 => __('1 Process'), 2 => __('%d Processes', 2), 3 => __('%d Processes', 3), 4 => __('%d Processes', 4), 5 => __('%d Processes', 5), 6 => __('%d Processes', 6), 7 => __('%d Processes', 7), 8 => __('%d Processes', 8), 9 => __('%d Processes', 9), 10 => __('%d Processes', 10), 11 => __('%d Processes', 11), 12 => __('%d Processes', 12), 13 => __('%d Processes', 13), 14 => __('%d Processes', 14), 15 => __('%d Processes', 15), 16 => __('%d Processes', 16), 17 => __('%d Processes', 17), 18 => __('%d Processes', 18), 19 => __('%d Processes', 19), 20 => __('%d Processes', 20), ) ), 'boost_rrd_update_max_records' => array( 'friendly_name' => __('Maximum Records'), 'description' => __('If the boost output table exceeds this size, in records, an update will take place.'), 'method' => 'textbox', 'default' => '1000000', 'max_length' => '20', 'size' => '10' ), 'boost_rrd_update_max_records_per_select' => array( 'friendly_name' => __('Maximum Data Source Items Per Pass'), 'description' => __('To optimize performance, the boost RRD updater needs to know how many Data Source Items should be retrieved in one pass. Please be careful not to set too high as graphing performance during major updates can be compromised. If you encounter graphing or polling slowness during updates, lower this number. The default value is 50000.'), 'method' => 'drop_array', 'default' => '50000', 'array' => $boost_max_rows_per_select ), 'boost_rrd_update_string_length' => array( 'friendly_name' => __('Maximum Argument Length'), 'description' => __('When boost sends update commands to RRDtool, it must not exceed the operating systems Maximum Argument Length. This varies by operating system and kernel level. For example: Windows 2000 <= 2048, FreeBSD <= 65535, Linux 2.6.22-- <= 131072, Linux 2.6.23++ unlimited'), 'method' => 'textbox', 'default' => '2000', 'max_length' => '20', 'size' => '10' ), 'boost_poller_mem_limit' => array( 'friendly_name' => __('Memory Limit for Boost and Poller'), 'description' => __('The maximum amount of memory for the Cacti Poller and Boosts Poller'), 'method' => 'drop_array', 'default' => '1024', 'array' => $boost_max_memory ), 'boost_rrd_update_max_runtime' => array( 'friendly_name' => __('Maximum RRD Update Script Run Time'), 'description' => __('If the boost poller excceds this runtime, a warning will be placed in the cacti log,'), 'method' => 'drop_array', 'default' => '1200', 'array' => $boost_max_runtime ), 'boost_redirect' => array( 'friendly_name' => __('Enable direct population of poller_output_boost table'), 'description' => __('Enables direct insert of records into poller output boost with results in a 25% time reduction in each poll cycle.'), 'method' => 'checkbox', 'default' => '' ), 'path_boost_log' => array( 'friendly_name' => __('Boost Debug Log'), 'description' => __('If this field is non-blank, Boost will log RRDupdate output from the boost poller process.'), 'method' => 'filepath', 'file_type' => 'ascii', 'default' => '', 'max_length' => '255' ), 'boost_png_header' => array( 'friendly_name' => __('Image Caching'), 'method' => 'spacer', 'collapsible' => 'true' ), 'boost_png_cache_enable' => array( 'friendly_name' => __('Enable Image Caching'), 'description' => __('Should image caching be enabled?'), 'method' => 'checkbox', 'default' => '' ), 'boost_png_cache_directory' => array( 'friendly_name' => __('Location for Image Files'), 'description' => __('Specify the location where Boost should place your image files. These files will be automatically purged by the poller when they expire.'), 'method' => 'dirpath', 'max_length' => '255', 'default' => $config['base_path'] . '/cache/boost/' ) ), 'data' => array( 'dsstats_hq_header' => array( 'friendly_name' => __('Data Sources Statistics'), 'collapsible' => 'true', 'method' => 'spacer', ), 'dsstats_enable' => array( 'friendly_name' => __('Enable Data Source Statistics Collection'), 'description' => __('Should Data Source Statistics be collected for this Cacti system?'), 'method' => 'checkbox', 'default' => '' ), 'dsstats_daily_interval' => array( 'friendly_name' => __('Daily Update Frequency'), 'description' => __('How frequent should Daily Stats be updated?'), 'default' => '60', 'method' => 'drop_array', 'array' => $dsstats_refresh_interval ), 'dsstats_hourly_duration' => array( 'friendly_name' => __('Hourly Average Window'), 'description' => __('The number of consecutive hours that represent the hourly average. Keep in mind that a setting too high can result in very large memory tables'), 'default' => '60', 'method' => 'drop_array', 'array' => $dsstats_hourly_avg ), 'dsstats_major_update_time' => array( 'friendly_name' => __('Maintenance Time'), 'description' => __('What time of day should Weekly, Monthly, and Yearly Data be updated? Format is HH:MM [am/pm]'), 'method' => 'textbox', 'default' => '12:00am', 'max_length' => '20', 'size' => '10' ), 'dsstats_poller_mem_limit' => array( 'friendly_name' => __('Memory Limit for Data Source Statistics Data Collector'), 'description' => __('The maximum amount of memory for the Cacti Poller and Data Source Statistics Poller'), 'method' => 'drop_array', 'default' => '1024', 'array' => $dsstats_max_memory ), 'storage_header' => array( 'friendly_name' => __('Data Storage Settings'), 'method' => 'spacer', 'collapsible' => 'true' ), 'storage_location' => array( 'friendly_name' => __('Location'), 'description' => __('Choose if RRDs will be stored locally or being handled by an external RRDtool proxy server.'), 'method' => 'drop_array', 'default' => 0, 'array' => array ( __('Local'), __('RRDtool Proxy Server') ) ), 'extended_paths' => array( 'friendly_name' => __('Structured RRD Paths'), 'description' => __('Use a separate subfolder for each hosts RRD files. The naming of the RRDfiles will be <path_cacti>/rra/host_id/local_data_id.rrd.'), 'method' => 'checkbox' ), 'rrdp_header' => array( 'friendly_name' => __('RRDtool Proxy Server'), 'method' => 'spacer', 'collapsible' => 'true' ), 'rrdp_server' => array( 'friendly_name' => __('Proxy Server'), 'description' => __('The DNS hostname or IP address of the RRDtool proxy server.'), 'method' => 'textbox', 'max_length' => '255' ), 'rrdp_port' => array( 'friendly_name' => __('Proxy Port Number'), 'description' => __('TCP port for encrypted communication.'), 'method' => 'textbox', 'max_length' => '5', 'default' => '40301', 'size' => '5' ), 'rrdp_fingerprint' => array( 'friendly_name' => __('RSA Fingerprint'), 'description' => __('The fingerprint of the current public RSA key the proxy is using. This is required to establish a trusted connection.'), 'method' => 'textbox', 'max_length' => '47', 'default' => '', 'size' => '47' ), 'rrdp_header2' => array( 'friendly_name' => __('RRDtool Proxy Server - Backup'), 'method' => 'spacer', 'collapsible' => 'true' ), 'rrdp_load_balancing' => array( 'friendly_name' => __('Load Balancing'), 'description' => __('If both main and backup proxy are receivable this option allows to spread all requests against RRDtool.'), 'method' => 'checkbox' ), 'rrdp_server_backup' => array( 'friendly_name' => __('Proxy Server'), 'description' => __('The DNS hostname or IP address of the RRDtool backup proxy server if proxy is running in MSR mode.'), 'method' => 'textbox', 'max_length' => '255' ), 'rrdp_port_backup' => array( 'friendly_name' => __('Proxy Port Number'), 'description' => __('TCP port for encrypted communication with the backup proxy.'), 'method' => 'textbox', 'max_length' => '5', 'default' => '40301', 'size' => '5' ), 'rrdp_fingerprint_backup' => array( 'friendly_name' => __('RSA Fingerprint'), 'description' => __('The fingerprint of the current public RSA key the backup proxy is using. This required to establish a trusted connection.'), 'method' => 'textbox', 'max_length' => '47', 'default' => '', 'size' => '47' ) ), 'spikes' => array( 'spikekill_header' => array( 'friendly_name' => __('Spike Kill Settings'), 'method' => 'spacer', 'collapsible' => 'true' ), 'spikekill_method' => array( 'friendly_name' => __('Removal Method'), 'description' => __('There are two removal methods. The first, Standard Deviation, will remove any sample that is X number of standard deviations away from the average of samples. The second method, Variance, will remove any sample that is X% more than the Variance average. The Variance method takes into account a certain number of \'outliers\'. Those are exceptional samples, like the spike, that need to be excluded from the Variance Average calculation.'), 'method' => 'drop_array', 'default' => '2', 'array' => array( 1 => __('Standard Deviation'), 2 => __('Variance Based w/Outliers Removed') ) ), 'spikekill_avgnan' => array( 'friendly_name' => __('Replacement Method'), 'description' => __('There are three replacement methods. The first method replaces the spike with the average of the data source in question. The second method replaces the spike with a \'NaN\'. The last replaces the spike with the last known good value found.'), 'method' => 'drop_array', 'default' => 'last', 'array' => array( 'avg' => __('Average'), 'nan' => __('NaN\'s'), 'last' => __('Last Known Good'), ) ), 'spikekill_deviations' => array( 'friendly_name' => __('Number of Standard Deviations'), 'description' => __('Any value that is this many standard deviations above the average will be excluded. A good number will be dependent on the type of data to be operated on. We recommend a number no lower than 5 Standard Deviations.'), 'method' => 'drop_array', 'default' => '10', 'array' => array( 3 => __('%d Standard Deviations', 3), 4 => __('%d Standard Deviations', 4), 5 => __('%d Standard Deviations', 5), 6 => __('%d Standard Deviations', 6), 7 => __('%d Standard Deviations', 7), 8 => __('%d Standard Deviations', 8), 9 => __('%d Standard Deviations', 9), 10 => __('%d Standard Deviations', 10), 15 => __('%d Standard Deviations', 15), 20 => __('%d Standard Deviations', 20), 50 => __('%d Standard Deviations', 50), 100 => __('%d Standard Deviations', 100), 200 => __('%d Standard Deviations', 200), ) ), 'spikekill_percent' => array( 'friendly_name' => __('Variance Percentage'), 'description' => __('This value represents the percentage above the adjusted sample average once outliers have been removed from the sample. For example, a Variance Percentage of 100%% on an adjusted average of 50 would remove any sample above the quantity of 100 from the graph.'), 'method' => 'drop_array', 'default' => '1000', 'array' => array( 100 => '100 %', 200 => '200 %', 300 => '300 %', 400 => '400 %', 500 => '500 %', 600 => '600 %', 700 => '700 %', 800 => '800 %', 900 => '900 %', 1000 => '1000 %', 2000 => '2000 %', 3000 => '3000 %', 10000 => '10000 %', 50000 => '50000 %', 100000 => '100000 %', 500000 => '500000 %', ) ), 'spikekill_outliers' => array( 'friendly_name' => __('Variance Number of Outliers'), 'description' => __('This value represents the number of high and low average samples will be removed from the sample set prior to calculating the Variance Average. If you choose an outlier value of 5, then both the top and bottom 5 averages are removed.'), 'method' => 'drop_array', 'default' => '5', 'array' => array( 3 => __('%d High/Low Samples', 3), 4 => __('%d High/Low Samples', 4), 5 => __('%d High/Low Samples', 5), 6 => __('%d High/Low Samples', 6), 7 => __('%d High/Low Samples', 7), 8 => __('%d High/Low Samples', 8), 9 => __('%d High/Low Samples', 9), 10 => __('%d High/Low Samples', 10), 20 => __('%d High/Low Samples', 20), 50 => __('%d High/Low Samples', 50), 100 => __('%d High/Low Samples', 100), 500 => __('%d High/Low Samples', 500), 1000 => __('%d High/Low Samples', 1000), ) ), 'spikekill_number' => array( 'friendly_name' => __('Max Kills Per RRA'), 'description' => __('This value represents the maximum number of spikes to remove from a Graph RRA.'), 'method' => 'drop_array', 'default' => '5', 'array' => array( 1 => __('%d Spikes', 1), 2 => __('%d Spikes', 2), 3 => __('%d Spikes', 3), 4 => __('%d Spikes', 4), 5 => __('%d Spikes', 5), 6 => __('%d Spikes', 6), 7 => __('%d Spikes', 7), 8 => __('%d Spikes', 8), 9 => __('%d Spikes', 9), 10 => __('%d Spikes', 10), 50 => __('%d Spikes', 50), 100 => __('%d Spikes', 100), ) ), 'spikekill_backupdir' => array( 'friendly_name' => __('RRDfile Backup Directory'), 'description' => __('If this directory is not empty, then your original RRDfiles will be backed up to this location.'), 'method' => 'dirpath', 'default' => $config['base_path'] . '/cache/spikekill/', 'max_length' => '255', 'size' => '60' ), 'spikekill_batch_header' => array( 'friendly_name' => __('Batch Spike Kill Settings'), 'method' => 'spacer', 'collapsible' => 'true' ), 'spikekill_batch' => array( 'friendly_name' => __('Removal Schedule'), 'description' => __('Do you wish to periodically remove spikes from your graphs? If so, select the frequency below.'), 'method' => 'drop_array', 'default' => '0', 'array' => array( 0 => __('Disabled'), 6 => __('Every %d Hours', 6), 12 => __('Every %d Hours', 12), 24 => __('Once a Day'), 48 => __('Every Other Day') ) ), 'spikekill_basetime' => array( 'friendly_name' => __('Base Time'), 'description' => __('The Base Time for Spike removal to occur. For example, if you use \'12:00am\' and you choose once per day, the batch removal would begin at approximately midnight every day.'), 'method' => 'textbox', 'default' => '12:00am', 'max_length' => '10', 'size' => '10' ), 'spikekill_templates' => array( 'friendly_name' => __('Graph Templates to Spike Kill'), 'method' => 'drop_multi', 'description' => __('When performing batch spike removal, only the templates selected below will be acted on.'), 'array' => array() ), 'spikekill_purge' => array( 'friendly_name' => __('Backup Retention'), 'description' => __('When SpikeKill kills spikes in graphs, it makes a backup of the RRDfile. How long should these backup files be retained?'), 'method' => 'drop_array', 'default' => '7856352', 'none_value' => __('Never'), 'array' => $timespans ) ) ); $settings_user = array( 'general' => array( 'selected_theme' => array( 'friendly_name' => __('Theme'), 'description' => __('Please select one of the available Themes to skin your Cacti with.'), 'method' => 'drop_array', 'default' => read_config_option('selected_theme'), 'array' => $themes ), 'default_view_mode' => array( 'friendly_name' => __('Default View Mode'), 'description' => __('Which Graph mode you want displayed by default when you first visit the Graphs page?'), 'method' => 'drop_array', 'array' => $graph_views, 'default' => '1' ), 'user_language' => array( 'friendly_name' => __('User Language'), 'description' => __('Defines the preferred GUI language.'), 'method' => 'drop_language', 'default' => get_new_user_default_language(), 'array' => get_installed_locales() ), 'show_graph_title' => array( 'friendly_name' => __('Show Graph Title'), 'description' => __('Display the graph title on the page so that it may be searched using the browser.'), 'method' => 'checkbox', 'default' => '' ), 'hide_disabled' => array( 'friendly_name' => __('Hide Disabled'), 'description' => __('Hides Disabled Devices and Graphs when viewing outside of Console tab.'), 'method' => 'checkbox', 'default' => 'on' ), 'show_aggregates' => array( 'friendly_name' => __('Show Device Aggregates'), 'description' => __('If a Device Data Source is included in an Aggregate Graph, show that Graph along with other Device Graphs'), 'method' => 'checkbox', 'default' => 'on' ), 'enable_hscroll' => array( 'friendly_name' => __('Enable Horizontal Scrolling'), 'description' => __('Enable Horizontal Scrolling of Tables, Disabling Responsive Column Visibility.'), 'method' => 'checkbox', 'default' => '' ), 'default_date_format' => array( 'friendly_name' => __('Date Display Format'), 'description' => __('The date format to use in Cacti.'), 'method' => 'drop_array', 'array' => $dateformats, 'default' => read_config_option('default_date_format') ), 'default_datechar' => array( 'friendly_name' => __('Date Separator'), 'description' => __('The date separator to be used in Cacti.'), 'method' => 'drop_array', 'array' => $datechar, 'default' => read_config_option('default_datechar') ), 'page_refresh' => array( 'friendly_name' => __('Page Refresh'), 'description' => __('The number of seconds between automatic page refreshes.'), 'method' => 'drop_array', 'default' => '300', 'array' => array( '15' => __('%d Seconds', 15), '20' => __('%d Seconds', 20), '30' => __('%d Seconds', 30), '60' => __('1 Minute'), '300' => __('%d Minutes', 5) ) ), 'preview_graphs_per_page' => array( 'friendly_name' => __('Preview Graphs Per Page'), 'description' => __('The number of graphs to display on one page in preview mode.'), 'method' => 'drop_array', 'default' => '10', 'array' => $graphs_per_page ) ), 'timespan' => array( 'default_rra_id' => array( 'friendly_name' => __('Default Time Range'), 'description' => __('The default RRA to use in rare occasions.'), 'method' => 'drop_sql', 'sql' => 'SELECT id, name FROM data_source_profiles_rra ORDER BY steps', 'default' => '1' ), 'default_timespan' => array( 'friendly_name' => __('Default Timespan'), 'description' => __('The default Timespan displayed when viewing Graphs and other time specific data.'), 'method' => 'drop_array', 'array' => $graph_timespans, 'default' => GT_LAST_DAY ), 'default_timeshift' => array( 'friendly_name' => __('Default Timeshift'), 'description' => __('The default Timeshift displayed when viewing Graphs and other time specific data.'), 'method' => 'drop_array', 'array' => $graph_timeshifts, 'default' => GTS_1_DAY ), 'allow_graph_dates_in_future' => array( 'friendly_name' => __('Allow Graph to extend to Future'), 'description' => __('When displaying Graphs, allow Graph Dates to extend \'to future\''), 'method' => 'checkbox', 'default' => 'on' ), 'first_weekdayid' => array( 'friendly_name' => __('First Day of the Week'), 'description' => __('The first Day of the Week for weekly Graph Displays'), 'method' => 'drop_array', 'array' => $graph_weekdays, 'default' => WD_MONDAY ), 'day_shift_start' => array( 'friendly_name' => __('Start of Daily Shift'), 'description' => __('Start Time of the Daily Shift.'), 'method' => 'textbox', 'default' => '07:00', 'max_length' => '5', 'size' => '7' ), 'day_shift_end' => array( 'friendly_name' => __('End of Daily Shift'), 'description' => __('End Time of the Daily Shift.'), 'method' => 'textbox', 'default' => '18:00', 'max_length' => '5', 'size' => '7' ) ), 'thumbnail' => array( 'thumbnail_sections' => array( 'friendly_name' => __('Thumbnail Sections'), 'description' => __('Which portions of Cacti display Thumbnails by default.'), 'method' => 'checkbox_group', 'items' => array( 'thumbnail_section_preview' => array( 'friendly_name' => __('Preview Mode'), 'default' => 'on' ), 'thumbnail_section_tree_2' => array( 'friendly_name' => __('Tree View'), 'default' => '' ) ) ), 'num_columns' => array( 'friendly_name' => __('Preview Thumbnail Columns'), 'description' => __('The number of columns to use when displaying Thumbnail graphs in Preview mode.'), 'method' => 'drop_array', 'default' => '2', 'array' => array( '1' => __('1 Column'), '2' => __('%d Columns', 2), '3' => __('%d Columns', 3), '4' => __('%d Columns', 4), '5' => __('%d Columns', 5), '6' => __('%d Columns', 6) ) ), 'num_columns_tree' => array( 'friendly_name' => __('Tree View Thumbnail Columns'), 'description' => __('The number of columns to use when displaying Thumbnail graphs in Tree mode.'), 'method' => 'drop_array', 'default' => '2', 'array' => array( '1' => __('1 Column'), '2' => __('%d Columns', 2), '3' => __('%d Columns', 3), '4' => __('%d Columns', 4), '5' => __('%d Columns', 5), '6' => __('%d Columns', 6) ) ), 'default_height' => array( 'friendly_name' => __('Thumbnail Height'), 'description' => __('The height of Thumbnail graphs in pixels.'), 'method' => 'textbox', 'default' => '100', 'max_length' => '10', 'size' => '7' ), 'default_width' => array( 'friendly_name' => __('Thumbnail Width'), 'description' => __('The width of Thumbnail graphs in pixels.'), 'method' => 'textbox', 'default' => '300', 'max_length' => '10', 'size' => '7' ) ), 'tree' => array( 'default_tree_id' => array( 'friendly_name' => __('Default Tree'), 'description' => __('The default graph tree to use when displaying graphs in tree mode.'), 'method' => 'drop_sql', 'sql' => 'SELECT id,name FROM graph_tree ORDER BY name', 'default' => '0' ), 'treeview_graphs_per_page' => array( 'friendly_name' => __('Graphs Per Page'), 'description' => __('The number of graphs to display on one page in preview mode.'), 'method' => 'drop_array', 'default' => '10', 'array' => $graphs_per_page ), 'expand_hosts' => array( 'friendly_name' => __('Expand Devices'), 'description' => __('Choose whether to expand the Graph Templates and Data Queries used by a Device on Tree.'), 'method' => 'checkbox', 'default' => '' ), 'tree_history' => array( 'friendly_name' => __('Tree History'), 'description' => __('If enabled, Cacti will remember your Tree History between logins and when you return to the Graphs page.'), 'method' => 'checkbox', 'default' => 'on' ), 'min_tree_width' => array( 'friendly_name' => __('Minimum Tree Width'), 'description' => __('The Minimum width of the Tree to contract to.'), 'method' => 'textbox', 'default' => read_config_option('min_tree_width'), 'max_length' => '5', 'size' => '7' ), 'max_tree_width' => array( 'friendly_name' => __('Maximum Tree Width'), 'description' => __('The Maximum width of the Tree to expand to, after which time, Tree branches will scroll on the page.'), 'method' => 'textbox', 'default' => read_config_option('max_tree_width'), 'max_length' => '5', 'size' => '7' ) ), 'fonts' => array( 'custom_fonts' => array( 'friendly_name' => __('Use Custom Fonts'), 'description' => __('Choose whether to use your own custom fonts and font sizes or utilize the system defaults.'), 'method' => 'checkbox', 'on_change' => 'graphSettings()', 'default' => '' ), 'title_size' => array( 'friendly_name' => __('Title Font Size'), 'description' => __('The size of the font used for Graph Titles'), 'method' => 'textbox', 'default' => '12', 'max_length' => '10' ), 'title_font' => array( 'friendly_name' => __('Title Font File'), 'description' => __('The font file to use for Graph Titles'), 'method' => 'font', 'max_length' => '100' ), 'legend_size' => array( 'friendly_name' => __('Legend Font Size'), 'description' => __('The size of the font used for Graph Legend items'), 'method' => 'textbox', 'default' => '10', 'max_length' => '10' ), 'legend_font' => array( 'friendly_name' => __('Legend Font File'), 'description' => __('The font file to be used for Graph Legend items'), 'method' => 'font', 'max_length' => '100' ), 'axis_size' => array( 'friendly_name' => __('Axis Font Size'), 'description' => __('The size of the font used for Graph Axis'), 'method' => 'textbox', 'default' => '8', 'max_length' => '10' ), 'axis_font' => array( 'friendly_name' => __('Axis Font File'), 'description' => __('The font file to be used for Graph Axis items'), 'method' => 'font', 'max_length' => '100' ), 'unit_size' => array( 'friendly_name' => __('Unit Font Size'), 'description' => __('The size of the font used for Graph Units'), 'method' => 'textbox', 'default' => '8', 'max_length' => '10' ), 'unit_font' => array( 'friendly_name' => __('Unit Font File'), 'description' => __('The font file to be used for Graph Unit items'), 'method' => 'font', 'max_length' => '100' ) ) ); if ($config['cacti_server_os'] == 'win32') { unset($settings['mail']['settings_sendmail_header']); unset($settings['mail']['settings_sendmail_path']); } if (is_realm_allowed(25)) { $settings_user['general']['realtime_mode'] = array( 'friendly_name' => __('Realtime View Mode'), 'description' => __('How do you wish to view Realtime Graphs?'), 'method' => 'drop_array', 'array' => array( '1' => __('Inline'), '2' => __('New Window') ), 'default' => '1' ); } if (is_realm_allowed(8)) { if (!(read_config_option('auth_cache_enabled') == 'on' && isset($_SESSION['cacti_remembers']) && $_SESSION['cacti_remembers'] == true)) { if (ini_get('session.gc_maxlifetime') > '2147483') { $max_life = '2147483'; } else { $max_life = ini_get('session.gc_maxlifetime'); } $auto_array = array( '-1' => __('System Setting'), '900' => __('%d Minutes', 15), '1200' => __('%d Minutes', 20), '1800' => __('%d Minutes', 30), '3600' => __('1 Hour'), '21600' => __('%d Hours', 6), '43200' => __('%d Hours', 12), '86400' => __('1 Day'), '604800' => __('1 Week'), '1209600' => __('%d Weeks', 2), '1814400' => __('%d Weeks', 3), '2147483' => __('%d Weeks', 4) ); foreach($auto_array as $key => $value) { if ($key > $max_life) { unset($auto_array[$key]); } } $settings_user['general']['user_auto_logout_time'] = array( 'friendly_name' => __('Auto Log Out Time'), 'description' => __('For users with Console access only, how long this user can stay logged in before being automatically logged out. Note that if you have not been active in more than an hour, you may have to refresh your browser. Also note that this setting has no affect when Authentication Cookies are enabled.'), 'method' => 'drop_array', 'default' => $max_life, 'array' => $auto_array ); } } api_plugin_hook('config_settings'); cacti-release-1.2.19/include/index.php000066400000000000000000000000501413633772300175540ustar00rootroot00000000000000 * If other chart is set already, it will be replaced with the new one (only one chart can be set in one element). * - **NOTE:** In case of element doesn't exist or not specified, will add a `
    ` element to the body. * @name bindto * @memberof Options * @property {string|HTMLElement|d3.selection|object} [bindto="#chart"] Specify the element where chart will be drawn. * @property {string|HTMLElement|d3.selection} bindto.element="#chart" Specify the element where chart will be drawn. * @property {string} [bindto.classname=bb] Specify the class name of bind element.
    * **NOTE:** When class name isn't `bb`, then you also need to update the default CSS to be rendered correctly. * @default #chart * @example * bindto: "#myContainer" * * // or HTMLElement * bindto: document.getElementById("myContainer") * * // or D3 selection object * bindto: d3.select("#myContainer") * * // or to change default classname * bindto: { * element: "#chart", * classname: "bill-board" // ex)
    * } */ bindto: "#chart", /** * Set chart background. * @name background * @memberof Options * @property {object} background background object * @property {string} background.class Specify the class name for background element. * @property {string} background.color Specify the fill color for background element.
    **NOTE:** Will be ignored if `imgUrl` option is set. * @property {string} background.imgUrl Specify the image url string for background. * @see [Demo](https://naver.github.io/billboard.js/demo/#ChartOptions.Background) * @example * background: { * class: "myClass", * color: "red", * * // Set image url for background. * // If specified, 'color' option will be ignored. * imgUrl: "https://naver.github.io/billboard.js/img/logo/billboard.js.svg", * } */ background: {}, /** * Set 'clip-path' attribute for chart element * - **NOTE:** * > When is false, chart node element is positioned after the axis node in DOM tree hierarchy. * > Is to make chart element positioned over axis element. * @name clipPath * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#ChartOptions.clipPath) * @example * // don't set 'clip-path' attribute * clipPath: false */ clipPath: !0, /** * Set svg element's class name * @name svg * @memberof Options * @type {object} * @property {object} [svg] svg object * @property {string} [svg.classname] class name for svg element * @example * svg: { * classname: "test_class" * } */ svg_classname: undefined, /** * The desired size of the chart element. * If value is not specified, the width of the chart will be calculated by the size of the parent element it's appended to. * @name size * @memberof Options * @type {object} * @property {object} [size] size object * @property {number} [size.width] width of the chart element * @property {number} [size.height] height of the chart element * @see [Demo](https://naver.github.io/billboard.js/demo/#ChartOptions.ChartSize) * @example * size: { * width: 640, * height: 480 * } */ size_width: undefined, size_height: undefined, /** * The padding of the chart element. * @name padding * @memberof Options * @type {object} * @property {object} [padding] padding object * @property {number} [padding.top] padding on the top of chart * @property {number} [padding.right] padding on the right of chart * @property {number} [padding.bottom] padding on the bottom of chart * @property {number} [padding.left] padding on the left of chart * @example * padding: { * top: 20, * right: 20, * bottom: 20, * left: 20 * } */ padding_left: undefined, padding_right: undefined, padding_top: undefined, padding_bottom: undefined, /** * Set chart resize options * @name resize * @memberof Options * @type {object} * @property {object} [resize] resize object * @property {boolean} [resize.auto=true] Set chart resize automatically on viewport changes. * @example * resize: { * auto: false * } */ resize_auto: !0, /** * Set a callback to execute when mouse/touch enters the chart. * @name onover * @memberof Options * @type {Function} * @default undefined * @example * onover: function() { * this; // chart instance itself * ... * } */ onover: undefined, /** * Set a callback to execute when mouse/touch leaves the chart. * @name onout * @memberof Options * @type {Function} * @default undefined * @example * onout: function() { * this; // chart instance itself * ... * } */ onout: undefined, /** * Set a callback to execute when user resizes the screen. * @name onresize * @memberof Options * @type {Function} * @default undefined * @example * onresize: function() { * this; // chart instance itself * ... * } */ onresize: undefined, /** * Set a callback to execute when screen resize finished. * @name onresized * @memberof Options * @type {Function} * @default undefined * @example * onresized: function() { * this; // chart instance itself * ... * } */ onresized: undefined, /** * Set a callback to execute before the chart is initialized * @name onbeforeinit * @memberof Options * @type {Function} * @default undefined * @example * onbeforeinit: function() { * this; // chart instance itself * ... * } */ onbeforeinit: undefined, /** * Set a callback to execute when the chart is initialized. * @name oninit * @memberof Options * @type {Function} * @default undefined * @example * oninit: function() { * this; // chart instance itself * ... * } */ oninit: undefined, /** * Set a callback to execute after the chart is initialized * @name onafterinit * @memberof Options * @type {Function} * @default undefined * @example * onafterinit: function() { * this; // chart instance itself * ... * } */ onafterinit: undefined, /** * Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed. * @name onrendered * @memberof Options * @type {Function} * @default undefined * @example * onrendered: function() { * this; // chart instance itself * ... * } */ onrendered: undefined, /** * Set duration of transition (in milliseconds) for chart animation.

    * - **NOTE:** If `0 `or `null` set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data. * @name transition * @memberof Options * @type {object} * @property {object} [transition] transition object * @property {number} [transition.duration=350] duration in milliseconds * @example * transition: { * duration: 500 * } */ transition_duration: 350, /** * Set plugins * @name plugins * @memberof Options * @type {Array} * @example * plugins: [ * new bb.plugin.stanford({ ... }), * new PluginA(), * ... * ] */ plugins: [], /** * Control the render timing * @name render * @memberof Options * @type {object} * @property {object} [render] render object * @property {boolean} [render.lazy=true] Make to not render at initialization (enabled by default when bind element's visibility is hidden). * @property {boolean} [render.observe=true] Observe bind element's visibility(`display` or `visiblity` inline css property or class value) & render when is visible automatically (for IEs, only works IE11+). When set to **false**, call [`.flush()`](./Chart.html#flush) to render. * @see [Demo](https://naver.github.io/billboard.js/demo/#ChartOptions.LazyRender) * @example * render: { * lazy: true, * observe: true * } * * @example * // * // (a)
    * // (b) * * // render.lazy enabled by default when element is hidden * var chart = bb.generate({ ... }); * * // chart will be rendered automatically when element's visibility changes * // Note: works only for inlined css property or class attribute changes * document.getElementById('chart').classList.remove('hide') // (a) * document.getElementById('chart').style.display = 'block'; // (b) * * @example * // chart won't be rendered and not observing bind element's visiblity changes * var chart = bb.generate({ * render: { * lazy: true, * observe: false * } * }); * * // call at any point when you want to render * chart.flush(); */ render: {}, /** * Show rectangles inside the chart.

    * This option accepts array including object that has axis, start, end and class. * The keys start, end and class are optional. * axis must be x, y or y2. start and end should be the value where regions start and end. * If not specified, the edge values will be used. * If timeseries x axis, date string, Date object and unixtime integer can be used. * If class is set, the region element will have it as class. * @name regions * @memberof Options * @type {Array} * @default [] * @example * regions: [ * { * axis: "x", * start: 1, * end: 4, * class: "region-1-4" * } * ] */ regions: [] }); ;// CONCATENATED MODULE: ./src/config/Options/data/data.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * data config options */ /* harmony default export */ var data = ({ /** * Specify the key of x values in the data.

    * We can show the data with non-index x values by this option. This option is required when the type of x axis is timeseries. If this option is set on category axis, the values of the data on the key will be used for category names. * @name data․x * @memberof Options * @type {string} * @default undefined * @example * data: { * x: "date" * } */ data_x: undefined, /** * Converts data id value * @name data․idConverter * @memberof Options * @type {Function} * @default function(id) { return id; } * @example * data: { * idConverter: function(id) { * // when id is 'data1', converts to be 'data2' * // 'data2' should be given as the initial data value * if (id === "data1") { * return "data2"; * } else { * return id; * } * } * } */ data_idConverter: function data_idConverter(id) { return id; }, /** * Set custom data name. * @name data․names * @memberof Options * @type {object} * @default {} * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataName) * @example * data: { * names: { * data1: "Data Name 1", * data2: "Data Name 2" * } * } */ data_names: {}, /** * Set custom data class.

    * If this option is specified, the element g for the data has an additional class that has the prefix 'bb-target-' (eg. bb-target-additional-data1-class). * @name data․classes * @memberof Options * @type {object} * @default {} * @example * data: { * classes: { * data1: "additional-data1-class", * data2: "additional-data2-class" * } * } */ data_classes: {}, /** * Set chart type at once.

    * If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.

    * **Available Values:** * - area * - area-line-range * - area-spline * - area-spline-range * - area-step * - bar * - bubble * - candlestick * - donut * - gauge * - line * - pie * - radar * - scatter * - spline * - step * @name data․type * @memberof Options * @type {string} * @default "line"
    NOTE: When importing shapes by ESM, `line()` should be specified for type. * @example * data: { * type: "bar" * } * @example * // Generate chart by importing ESM * // Import types to be used only, where this will make smaller bundle size. * import bb, { * area, * areaLineRange, * areaSpline, * areaSplineRange, * areaStep, * bar, * bubble, * candlestick, * donut, * gauge, * line, * pie, * radar, * scatter, * spline, * step * } * * bb.generate({ * ..., * data: { * type: bar() * } * }); */ data_type: undefined, /** * Set chart type for each data.
    * This setting overwrites data.type setting. * - **NOTE:** `radar` type can't be combined with other types. * @name data․types * @memberof Options * @type {object} * @default {} * @example * data: { * types: { * data1: "bar", * data2: "spline" * } * } * @example * // Generate chart by importing ESM * // Import types to be used only, where this will make smaller bundle size. * import bb, { * area, * areaLineRange, * areaSpline, * areaSplineRange, * areaStep, * bar, * bubble, * candlestick, * donut, * gauge, * line, * pie, * radar, * scatter, * spline, * step * } * * bb.generate({ * ..., * data: { * types: { * data1: bar(), * data1: spline() * } * } * }); */ data_types: {}, /** * This option changes the order of stacking data and pieces of pie/donut. * - If `null` specified, it will be the order the data loaded. * - If function specified, it will be used as [Array.sort compareFunction](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters)

    * * **Available Values:** * - `desc`: In descending order * - `asc`: In ascending order * - `null`: It keeps the data load order * - `function(data1, data2) { ... }`: Array.sort compareFunction * * **NOTE**: order function, only works for Axis based types & Arc types, except `Radar` type. * @name data․order * @memberof Options * @type {string|Function|null} * @default desc * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataOrder) * @example * data: { * // in descending order (default) * order: "desc" * * // in ascending order * order: "asc" * * // keeps data input order * order: null * * // specifying sort function * order: function(a, b) { * // param data passed format * // { * // id: "data1", id_org: "data1", values: [ * // {x: 5, value: 250, id: "data1", index: 5, name: "data1"}, * // ... * // ] * // } * * const reducer = (p, c) => p + Math.abs(c.value); * const aSum = a.values.reduce(reducer, 0); * const bSum = b.values.reduce(reducer, 0); * * // ascending order * return aSum - bSum; * * // descending order * // return bSum - aSum; * } * } */ data_order: "desc", /** * Set groups for the data for stacking. * @name data․groups * @memberof Options * @type {Array} * @default [] * @example * data: { * groups: [ * ["data1", "data2"], * ["data3"] * ] * } */ data_groups: [], /** * Set color converter function.

    * This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc. And it must return a string that represents color (e.g. '#00ff00'). * @name data․color * @memberof Options * @type {Function} * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataColor) * @example * data: { * color: function(color, d) { ... } * } */ data_color: undefined, /** * Set color for each data. * @name data․colors * @memberof Options * @type {object} * @default {} * @example * data: { * colors: { * data1: "#ff0000", * data2: function(d) { * return "#000"; * } * ... * } * } */ data_colors: {}, /** * Set labels options * @name data․labels * @memberof Options * @type {object} * @property {object} data Data object * @property {boolean} [data.labels=false] Show or hide labels on each data points * @property {boolean} [data.labels.centered=false] Centerize labels on `bar` shape. (**NOTE:** works only for 'bar' type) * @property {Function} [data.labels.format] Set formatter function for data labels.
    * The formatter function receives 4 arguments such as v, id, i, j and it **must return a string**(`\n` character will be used as line break) that will be shown as the label.

    * The arguments are:
    * - `v` is the value of the data point where the label is shown. * - `id` is the id of the data where the label is shown. * - `i` is the index of the data point where the label is shown. * - `j` is the sub index of the data point where the label is shown.

    * Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$')) * @property {string|object|Function} [data.labels.colors] Set label text colors. * @property {object} [data.labels.position] Set each dataset position, relative the original. * @property {number} [data.labels.position.x=0] x coordinate position, relative the original. * @property {number} [data.labels.position.y=0] y coordinate position, relative the original. * @memberof Options * @type {object} * @default {} * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataLabel) * @see [Demo: label colors](https://naver.github.io/billboard.js/demo/#Data.DataLabelColors) * @see [Demo: label format](https://naver.github.io/billboard.js/demo/#Data.DataLabelFormat) * @see [Demo: label multiline](https://naver.github.io/billboard.js/demo/#Data.DataLabelMultiline) * @see [Demo: label overlap](https://naver.github.io/billboard.js/demo/#Data.DataLabelOverlap) * @see [Demo: label position](https://naver.github.io/billboard.js/demo/#Data.DataLabelPosition) * @example * data: { * labels: true, * * // or set specific options * labels: { * format: function(v, id, i, j) { * ... * // to multiline, return with '\n' character * return "Line1\nLine2"; * }, * * // it's possible to set for each data * format: { * data1: function(v, id, i, j) { ... }, * ... * }, * * // align text to center of the 'bar' shape (works only for 'bar' type) * centered: true, * * // apply for all label texts * colors: "red", * * // set different colors per dataset * // for not specified dataset, will have the default color value * colors: { * data1: "yellow", * data3: "green" * }, * * // call back for label text color * colors: function(color, d) { * // color: the default data label color string * // data: ex) {x: 0, value: 200, id: "data3", index: 0} * .... * return d.value > 200 ? "cyan" : color; * }, * * // set x, y coordinate position * position: { * x: -10, * y: 10 * }, * * // or set x, y coordinate position by each dataset * position: { * data1: {x: 5, y: 5}, * data2: {x: 10, y: -20} * } * } * } */ data_labels: {}, data_labels_colors: undefined, data_labels_position: {}, /** * Hide each data when the chart appears.

    * If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden. * @name data․hide * @memberof Options * @type {boolean|Array} * @default false * @example * data: { * // all of data will be hidden * hide: true * * // specified data will be hidden * hide: ["data1", ...] * } */ data_hide: !1, /** * Filter values to be shown * The data value is the same as the returned by `.data()`. * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter * @name data․filter * @memberof Options * @type {Function} * @default undefined * @example * data: { * // filter for id value * filter: function(v) { * // v: [{id: "data1", id_org: "data1", values: [ * // {x: 0, value: 130, id: "data2", index: 0}, ...] * // }, ...] * return v.id !== "data1"; * } */ data_filter: undefined, /** * Set a callback for click event on each data point.

    * This callback will be called when each data point clicked and will receive `d` and element as the arguments. * - `d` is the data clicked and element is the element clicked. * - `element` is the current interacting svg element. * - In this callback, `this` will be the Chart object. * @name data․onclick * @memberof Options * @type {Function} * @default function() {} * @example * data: { * onclick: function(d, element) { * // d - ex) {x: 4, value: 150, id: "data1", index: 4, name: "data1"} * // element - * ... * } * } */ data_onclick: function data_onclick() {}, /** * Set a callback for mouse/touch over event on each data point.

    * This callback will be called when mouse cursor or via touch moves onto each data point and will receive `d` and `element` as the argument. * - `d` is the data where mouse cursor moves onto. * - `element` is the current interacting svg element. * - In this callback, `this` will be the Chart object. * @name data․onover * @memberof Options * @type {Function} * @default function() {} * @example * data: { * onover: function(d, element) { * // d - ex) {x: 4, value: 150, id: "data1", index: 4} * // element - * ... * } * } */ data_onover: function data_onover() {}, /** * Set a callback for mouse/touch out event on each data point.

    * This callback will be called when mouse cursor or via touch moves out each data point and will receive `d` as the argument. * - `d` is the data where mouse cursor moves out. * - `element` is the current interacting svg element. * - In this callback, `this` will be the Chart object. * @name data․onout * @memberof Options * @type {Function} * @default function() {} * @example * data: { * onout: function(d, element) { * // d - ex) {x: 4, value: 150, id: "data1", index: 4} * // element - * ... * } * } */ data_onout: function data_onout() {}, /** * Set a callback for minimum data * - **NOTE:** For 'area-line-range' and 'area-spline-range', `mid` data will be taken for the comparison * @name data․onmin * @memberof Options * @type {Function} * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.OnMinMaxCallback) * @example * onmin: function(data) { * // data - ex) [{x: 3, value: 400, id: "data1", index: 3}, ... ] * ... * } */ data_onmin: undefined, /** * Set a callback for maximum data * - **NOTE:** For 'area-line-range' and 'area-spline-range', `mid` data will be taken for the comparison * @name data․onmax * @memberof Options * @type {Function} * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.OnMinMaxCallback) * @example * onmax: function(data) { * // data - ex) [{x: 3, value: 400, id: "data1", index: 3}, ... ] * ... * } */ data_onmax: undefined, /** * Load a CSV or JSON file from a URL. NOTE that this will not work if loading via the "file://" protocol as the most browsers will block XMLHTTPRequests. * @name data․url * @memberof Options * @type {string} * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.LoadData) * @example * data: { * url: "/data/test.csv" * } */ data_url: undefined, /** * XHR header value * - **NOTE:** Should be used with `data.url` option * @name data․headers * @memberof Options * @type {string} * @default undefined * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader * @example * data: { * url: "/data/test.csv", * headers: { * "Content-Type": "text/xml", * ... * } * } */ data_headers: undefined, /** * Parse a JSON object for data. See also data.keys. * @name data․json * @memberof Options * @type {Array} * @default undefined * @see [data․keys](#.data%25E2%2580%25A4keys) * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.JSONData) * @example * data: { * json: [ * {name: "www.site1.com", upload: 200, download: 200, total: 400}, * {name: "www.site2.com", upload: 100, download: 300, total: 400}, * {name: "www.site3.com", upload: 300, download: 200, total: 500}, * {name: "www.site4.com", upload: 400, download: 100, total: 500} * ], * keys: { * // x: "name", // it's possible to specify 'x' when category axis * value: ["upload", "download"] * } * } */ data_json: undefined, /** * Load data from a multidimensional array, with the first element containing the data names, the following containing related data in that order. * @name data․rows * @memberof Options * @type {Array} * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.RowOrientedData) * @example * data: { * rows: [ * ["A", "B", "C"], * [90, 120, 300], * [40, 160, 240], * [50, 200, 290], * [120, 160, 230], * [80, 130, 300], * [90, 220, 320] * ] * } * * // for 'range' types('area-line-range' or 'area-spline-range'), data should contain: * // - an array of [high, mid, low] data following the order * // - or an object with 'high', 'mid' and 'low' key value * data: { * rows: [ * ["data1", "data2"], * [ * // or {high:150, mid: 140, low: 110}, 120 * [150, 140, 110], 120 * ], * [[155, 130, 115], 55], * [[160, 135, 120], 60] * ], * types: { * data1: "area-line-range", * data2: "line" * } * } * * // for 'bubble' type, data can contain dimension value: * // - an array of [y, z] data following the order * // - or an object with 'y' and 'z' key value * // 'y' is for y axis coordination and 'z' is the bubble radius value * data: { * rows: [ * ["data1", "data2"], * [ * // or {y:10, z: 140}, 120 * [10, 140], 120 * ], * [[100, 30], 55], * [[50, 100], 60] * ], * types: { * data1: "bubble", * data2: "line" * } * } * * // for 'canlestick' type, data should contain: * // - an array of [open, high, low, close, volume(optional)] data following the order * // - or an object with 'open', 'high', 'low', 'close' and 'value'(optional) key value * data: { * rows: [ * ["data1", "data2"], * [ * // open, high, low, close, volume (optional) * {open: 1300, high: 1369, low: 1200, close: 1339, volume: 100}, * [1000, 1100, 850, 870] * ], * [ * {open: 1348, high: 1371, low: 1271, close: 1320}, * [870, 1250, 830, 1200, 50] * ] * ], * type: "candlestick" * } */ data_rows: undefined, /** * Load data from a multidimensional array, with each element containing an array consisting of a datum name and associated data values. * @name data․columns * @memberof Options * @type {Array} * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.ColumnOrientedData) * @example * data: { * columns: [ * ["data1", 30, 20, 50, 40, 60, 50], * ["data2", 200, 130, 90, 240, 130, 220], * ["data3", 300, 200, 160, 400, 250, 250] * ] * } * * // for 'range' types('area-line-range' or 'area-spline-range'), data should contain: * // - an array of [high, mid, low] data following the order * // - or an object with 'high', 'mid' and 'low' key value * data: { * columns: [ * ["data1", * [150, 140, 110], // or {high:150, mid: 140, low: 110} * [150, 140, 110], * [150, 140, 110] * ] * ], * type: "area-line-range" * } * * // for 'bubble' type, data can contain dimension value: * // - an array of [y, z] data following the order * // - or an object with 'y' and 'z' key value * // 'y' is for y axis coordination and 'z' is the bubble radius value * data: { * columns: [ * ["data1", * [10, 140], // or {y:10, z: 140} * [100, 30], * [50, 100] * ] * ], * type: "bubble" * } * * // for 'canlestick' type, data should contain: * // - an array of [open, high, low, close, volume(optional)] data following the order * // - or an object with 'open', 'high', 'low', 'close' and 'value'(optional) key value * data: { * columns: [ * ["data1", * [1000, 1100, 850, 870, 100], // or {open:1000, high: 1100, low: 870, volume: 100} * [870, 1250, 830, 1200] // 'volume' can be omitted * ] * ], * type: "candlestick" * } */ data_columns: undefined, /** * Used if loading JSON via data.url. * - **Available Values:** * - json * - csv * - tsv * @name data․mimeType * @memberof Options * @type {string} * @default csv * @example * data: { * mimeType: "json" * } */ data_mimeType: "csv", /** * Choose which JSON object keys correspond to desired data. * - **NOTE:** Only for JSON object given as array. * @name data․keys * @memberof Options * @type {string} * @default undefined * @example * data: { * json: [ * {name: "www.site1.com", upload: 200, download: 200, total: 400}, * {name: "www.site2.com", upload: 100, download: 300, total: 400}, * {name: "www.site3.com", upload: 300, download: 200, total: 500}, * {name: "www.site4.com", upload: 400, download: 100, total: 500} * ], * keys: { * // x: "name", // it's possible to specify 'x' when category axis * value: ["upload", "download"] * } * } */ data_keys: undefined, /** * Set text label to be displayed when there's no data to show. * - ex. Toggling all visible data to not be shown, unloading all current data, etc. * @name data․empty․label․text * @memberof Options * @type {string} * @default "" * @example * data: { * empty: { * label: { * text: "No Data" * } * } * } */ data_empty_label_text: "" }); ;// CONCATENATED MODULE: ./src/config/Options/common/color.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * color config options */ /* harmony default export */ var color = ({ /** * Set color of the data values * @name color * @memberof Options * @type {object} * @property {object} color color object * @property {string|object|Function} [color.onover] Set the color value for each data point when mouse/touch onover event occurs. * @property {Array|null} [color.pattern=[]] Set custom color pattern. Passing `null` will not set a color for these elements, which requires the usage of custom CSS-based theming to work. * @property {Function} [color.tiles] if defined, allows use svg's patterns to fill data area. It should return an array of [SVGPatternElement](https://developer.mozilla.org/en-US/docs/Web/API/SVGPatternElement). * - **NOTE:** The pattern element's id will be defined as `bb-colorize-pattern-$COLOR-VALUE`.
    * ex. When color pattern value is `['red', '#fff']` and defined 2 patterns,then ids for pattern elements are:
    * - `bb-colorize-pattern-red` * - `bb-colorize-pattern-fff` * @property {object} [color.threshold] color threshold for gauge and tooltip color * @property {string} [color.threshold.unit] If set to `value`, the threshold will be based on the data value. Otherwise it'll be based on equation of the `threshold.max` option value. * @property {Array} [color.threshold.values] Threshold values for each steps * @property {number} [color.threshold.max=100] The base value to determine threshold step value condition. When the given value is 15 and max 10, then the value for threshold is `15*100/10`. * @example * color: { * pattern: ["#1f77b4", "#aec7e8", ...], * * // Set colors' patterns * // it should return an array of SVGPatternElement * tiles: function() { * var pattern = document.createElementNS("http://www.w3.org/2000/svg", "pattern"); * var g = document.createElementNS("http://www.w3.org/2000/svg", "g"); * var circle1 = document.createElementNS("http://www.w3.org/2000/svg", "circle"); * * pattern.setAttribute("patternUnits", "userSpaceOnUse"); * pattern.setAttribute("width", "32"); * pattern.setAttribute("height", "32"); * * g.style.fill = "#000"; * g.style.opacity = "0.2"; * * circle1.setAttribute("cx", "3"); * circle1.setAttribute("cy", "3"); * circle1.setAttribute("r", "3"); * * g.appendChild(circle1); * pattern.appendChild(g); * * return [pattern]; * }, * * // for threshold usage, pattern values should be set for each steps * pattern: ["grey", "green", "yellow", "orange", "red"], * threshold: { * unit: "value", * * // when value is 20 => 'green', value is 40 => 'orange' will be set. * values: [10, 20, 30, 40, 50], * * // the equation for max: * // - unit == 'value': max => 30 * // - unit != 'value': max => value*100/30 * max: 30 * }, * * // set all data to 'red' * onover: "red", * * // set different color for data * onover: { * data1: "red", * data2: "yellow" * }, * * // will pass data object to the callback * onover: function(d) { * return d.id === "data1" ? "red" : "green"; * } * } */ color_pattern: [], color_tiles: undefined, color_threshold: {}, color_onover: undefined }); ;// CONCATENATED MODULE: ./src/config/Options/interaction/interaction.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * interaction config options */ /* harmony default export */ var interaction = ({ /** * Interaction options * @name interaction * @memberof Options * @type {object} * @property {object} interaction Intersection object * @property {boolean} [interaction.enabled=true] Indicate if the chart should have interactions.
    * If `false` is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled. * @property {boolean} [interaction.brighten=true] Make brighter for the selected area (ex. 'pie' type data selected area) * @property {boolean} [interaction.inputType.mouse=true] enable or disable mouse interaction * @property {boolean} [interaction.inputType.touch=true] enable or disable touch interaction * @property {boolean|number} [interaction.inputType.touch.preventDefault=false] enable or disable to call event.preventDefault on touchstart & touchmove event. It's usually used to prevent document scrolling. * @see [Demo: touch.preventDefault](https://naver.github.io/billboard.js/demo/#Interaction.PreventScrollOnTouch) * @example * interaction: { * enabled: false, * brighten: false, * inputType: { * mouse: true, * touch: false * * // or declare preventDefault explicitly. * // In this case touch inputType is enabled by default * touch: { * preventDefault: true * * // or threshold pixel value (pixel moved from touchstart to touchmove) * preventDefault: 5 * } * } * } */ interaction_enabled: !0, interaction_brighten: !0, interaction_inputType_mouse: !0, interaction_inputType_touch: {} }); ;// CONCATENATED MODULE: ./src/config/Options/common/legend.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * legend config options */ /* harmony default export */ var legend = ({ /** * Legend options * @name legend * @memberof Options * @type {object} * @property {object} legend Legend object * @property {boolean} [legend.show=true] Show or hide legend. * @property {boolean} [legend.hide=false] Hide legend * If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden. * @property {string|HTMLElement} [legend.contents.bindto=undefined] Set CSS selector or element reference to bind legend items. * @property {string|Function} [legend.contents.template=undefined] Set item's template.
    * - If set `string` value, within template the 'color' and 'title' can be replaced using template-like syntax string: * - {=COLOR}: data color value * - {=TITLE}: data title value * - If set `function` value, will pass following arguments to the given function: * - title {string}: data's id value * - color {string}: color string * - data {Array}: data array * @property {string} [legend.position=bottom] Change the position of legend.
    * Available values are: `bottom`, `right` and `inset` are supported. * @property {object} [legend.inset={anchor: 'top-left',x: 10,y: 0,step: undefined}] Change inset legend attributes.
    * This option accepts object that has the keys `anchor`, `x`, `y` and `step`. * - **anchor** decides the position of the legend: * - top-left * - top-right * - bottom-left * - bottom-right * - **x** and **y**: * - set the position of the legend based on the anchor. * - **step**: * - defines the max step the legend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns). * @property {boolean} [legend.equally=false] Set to all items have same width size. * @property {boolean} [legend.padding=0] Set padding value * @property {Function} [legend.item.onclick=undefined] Set click event handler to the legend item. * @property {Function} [legend.item.onover=undefined] Set mouse/touch over event handler to the legend item. * @property {Function} [legend.item.onout=undefined] Set mouse/touch out event handler to the legend item. * @property {number} [legend.item.tile.width=10] Set width of item tile element * @property {number} [legend.item.tile.height=10] Set height of item tile element * @property {boolean} [legend.usePoint=false] Whether to use custom points in legend. * @see [Demo: position](https://naver.github.io/billboard.js/demo/#Legend.LegendPosition) * @see [Demo: contents.template](https://naver.github.io/billboard.js/demo/#Legend.LegendTemplate1) * @see [Demo: usePoint](https://naver.github.io/billboard.js/demo/#Legend.usePoint) * @example * legend: { * show: true, * hide: true, * //or hide: "data1" * //or hide: ["data1", "data2"] * contents: { * bindto: "#legend", //
      * * // will be as:
    • data1
    • * template: "
    • {=TITLE}
    • " * * // or using function * template: function(id, color, data) { * // if you want omit some legend, return falsy value * if (id !== "data1") { * return "
    • If specified, linked tooltip will be groped interacting to be worked only with the same name. * @property {Function} [tooltip.format.title] Set format for the title of tooltip.
      * Specified function receives x of the data point to show. * @property {Function} [tooltip.format.name] Set format for the name of each data in tooltip.
      * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. * @property {Function} [tooltip.format.value] Set format for the value of each data in tooltip.
      * Specified function receives name, ratio, id and index of the data point to show. ratio will be undefined if the chart is not donut/pie/gauge. * If undefined returned, the row of that value will be skipped. * @property {Function} [tooltip.position] Set custom position function for the tooltip.
      * This option can be used to modify the tooltip position by returning object that has top and left. * @property {Function|object} [tooltip.contents] Set custom HTML for the tooltip.
      * Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show. If tooltip.grouped is true, data includes multiple data points. * @property {string|HTMLElement} [tooltip.contents.bindto=undefined] Set CSS selector or element reference to bind tooltip. * - **NOTE:** When is specified, will not be updating tooltip's position. * @property {string} [tooltip.contents.template=undefined] Set tooltip's template.

      * Within template, below syntax will be replaced using template-like syntax string: * - **{{ ... }}**: the doubly curly brackets indicate loop block for data rows. * - **{=CLASS_TOOLTIP}**: default tooltip class name `bb-tooltip`. * - **{=CLASS_TOOLTIP_NAME}**: default tooltip data class name (ex. `bb-tooltip-name-data1`) * - **{=TITLE}**: title value. * - **{=COLOR}**: data color. * - **{=VALUE}**: data value. * @property {object} [tooltip.contents.text=undefined] Set additional text content within data loop, using template syntax. * - **NOTE:** It should contain `{ key: Array, ... }` value * - 'key' name is used as substitution within template as '{=KEY}' * - The value array length should match with the data length * @property {boolean} [tooltip.init.show=false] Show tooltip at the initialization. * @property {number} [tooltip.init.x=0] Set x Axis index(or index for Arc(donut, gauge, pie) types) to be shown at the initialization. * @property {object} [tooltip.init.position={top: "0px",left: "50px"}] Set the position of tooltip at the initialization. * @property {Function} [tooltip.onshow] Set a callback that will be invoked before the tooltip is shown. * @property {Function} [tooltip.onhide] Set a callback that will be invoked before the tooltip is hidden. * @property {Function} [tooltip.onshown] Set a callback that will be invoked after the tooltip is shown * @property {Function} [tooltip.onhidden] Set a callback that will be invoked after the tooltip is hidden. * @property {string|Function|null} [tooltip.order=null] Set tooltip data display order.

      * **Available Values:** * - `desc`: In descending data value order * - `asc`: In ascending data value order * - `null`: It keeps the data display order
      * **NOTE:** When `data.groups` is set, the order will follow as the stacked graph order.
      * If want to order as data bound, set any value rather than asc, desc or null. (ex. empty string "") * - `function(data1, data2) { ... }`: [Array.sort compareFunction](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters) * @see [Demo: Hide Tooltip](https://naver.github.io/billboard.js/demo/#Tooltip.HideTooltip) * @see [Demo: Tooltip Grouping](https://naver.github.io/billboard.js/demo/#Tooltip.TooltipGrouping) * @see [Demo: Tooltip Format](https://naver.github.io/billboard.js/demo/#Tooltip.TooltipFormat) * @see [Demo: Linked Tooltip](https://naver.github.io/billboard.js/demo/#Tooltip.LinkedTooltips) * @see [Demo: Tooltip Template](https://naver.github.io/billboard.js/demo/#Tooltip.TooltipTemplate) * @example * tooltip: { * show: true, * doNotHide: true, * grouped: false, * format: { * title: function(x) { return "Data " + x; }, * name: function(name, ratio, id, index) { return name; }, * value: function(value, ratio, id, index) { return ratio; } * }, * position: function(data, width, height, element) { * return {top: 0, left: 0} * }, * * contents: function(d, defaultTitleFormat, defaultValueFormat, color) { * return ... // formatted html as you want * }, * * // specify tooltip contents using template * // - example of HTML returned: * //
        * //
      • 250
        data1
      • * //
      • 50
        data2
      • * //
      * contents: { * bindto: "#tooltip", * template: '
        {{' + * '
      • {=VALUE}
        ' + * '{=NAME}
      • ' + * '}}
      ' * } * * // with additional text value * // - example of HTML returned: * //
        * //
      • 250
        comment1data1text1
      • * //
      • 50
        comment2data2text2
      • * //
      * contents: { * bindto: "#tooltip", * text: { * // a) 'key' name is used as substitution within template as '{=KEY}' * // b) the length should match with the data length * VAR1: ["text1", "text2"], * VAR2: ["comment1", "comment2"], * }, * template: '
        {{' + * '
      • {=VALUE}{=VAR2}
        ' + * '{=NAME}{=VAR1}
      • ' + * '}}
      ' * } * * // sort tooltip data value display in ascending order * order: "asc", * * // specifying sort function * order: function(a, b) { * // param data passed format * {x: 5, value: 250, id: "data1", index: 5, name: "data1"} * ... * }, * * // show at the initialization * init: { * show: true, * x: 2, // x Axis index(or index for Arc(donut, gauge, pie) types) * position: { * top: "150px", * left: "250px" * } * }, * * // fires prior tooltip is shown * onshow: function(selectedData) { * // current dataset selected * // ==> [{x: 4, value: 150, id: "data2", index: 4, name: "data2"}, ...] * selectedData; * }, * * // fires prior tooltip is hidden * onhide: function(selectedData) { * // current dataset selected * // ==> [{x: 4, value: 150, id: "data2", index: 4, name: "data2"}, ...] * selectedData; * }, * * // fires after tooltip is shown * onshown: function(selectedData) { * // current dataset selected * // ==> [{x: 4, value: 150, id: "data2", index: 4, name: "data2"}, ...] * selectedData; * }, * * // fires after tooltip is hidden * onhidden: function(selectedData) { * // current dataset selected * // ==> [{x: 4, value: 150, id: "data2", index: 4, name: "data2"}, ...] * selectedData; * }, * * // Link any tooltips when multiple charts are on the screen where same x coordinates are available * // Useful for timeseries correlation * linked: true, * * // Specify name to interact those with the same name only. * linked: { * name: "some-group" * } * } */ tooltip_show: !0, tooltip_doNotHide: !1, tooltip_grouped: !0, tooltip_format_title: undefined, tooltip_format_name: undefined, tooltip_format_value: undefined, tooltip_position: undefined, tooltip_contents: {}, tooltip_init_show: !1, tooltip_init_x: 0, tooltip_init_position: { top: "0px", left: "50px" }, tooltip_linked: !1, tooltip_linked_name: "", tooltip_onshow: function tooltip_onshow() {}, tooltip_onhide: function tooltip_onhide() {}, tooltip_onshown: function tooltip_onshown() {}, tooltip_onhidden: function tooltip_onhidden() {}, tooltip_order: null }); // EXTERNAL MODULE: external {"commonjs":"d3-brush","commonjs2":"d3-brush","amd":"d3-brush","root":"d3"} var external_commonjs_d3_brush_commonjs2_d3_brush_amd_d3_brush_root_d3_ = __webpack_require__(3); ;// CONCATENATED MODULE: ./src/module/browser.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Window object * @private */ /* eslint-disable no-new-func, no-undef */ var win = function () { var root = typeof globalThis === "object" && globalThis !== null && globalThis.Object === Object && globalThis || typeof global === "object" && global !== null && global.Object === Object && global || typeof self === "object" && self !== null && self.Object === Object && self; return root || Function("return this")(); }(), browser_doc = win && win.document; /* eslint-enable no-new-func, no-undef */ ;// CONCATENATED MODULE: ./src/module/util.ts function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var source, i = 1; i < arguments.length; i++) source = arguments[i] == null ? {} : arguments[i], i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); return target; } /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * @ignore */ var isValue = function (v) { return v || v === 0; }, isFunction = function (v) { return typeof v === "function"; }, isString = function (v) { return typeof v === "string"; }, isNumber = function (v) { return typeof v === "number"; }, isUndefined = function (v) { return typeof v === "undefined"; }, isDefined = function (v) { return typeof v !== "undefined"; }, isboolean = function (v) { return typeof v === "boolean"; }, ceil10 = function (v) { return Math.ceil(v / 10) * 10; }, asHalfPixel = function (n) { return Math.ceil(n) + .5; }, diffDomain = function (d) { return d[1] - d[0]; }, isObjectType = function (v) { return typeof v === "object"; }, isEmpty = function (o) { return isUndefined(o) || o === null || isString(o) && o.length === 0 || isObjectType(o) && !(o instanceof Date) && Object.keys(o).length === 0 || isNumber(o) && isNaN(o); }, notEmpty = function (o) { return !isEmpty(o); }, isArray = function (arr) { return Array.isArray(arr); }, isObject = function (obj) { return obj && !obj.nodeType && isObjectType(obj) && !isArray(obj); }; /** * Get specified key value from object * If default value is given, will return if given key value not found * @param {object} options Source object * @param {string} key Key value * @param {*} defaultValue Default value * @returns {*} * @private */ function getOption(options, key, defaultValue) { return isDefined(options[key]) ? options[key] : defaultValue; } /** * Check if value exist in the given object * @param {object} dict Target object to be checked * @param {*} value Value to be checked * @returns {boolean} * @private */ function hasValue(dict, value) { var found = !1; return Object.keys(dict).forEach(function (key) { return dict[key] === value && (found = !0); }), found; } /** * Call function with arguments * @param {Function} fn Function to be called * @param {*} args Arguments * @returns {boolean} true: fn is function, false: fn is not function * @private */ function callFn(fn) { for (var isFn = isFunction(fn), _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key]; return isFn && fn.call.apply(fn, args), isFn; } /** * Call function after all transitions ends * @param {d3.transition} transition Transition * @param {Fucntion} cb Callback function * @private */ function endall(transition, cb) { var n = 0; transition.each(function () { return ++n; }).on("end", function () { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2]; --n || cb.apply.apply(cb, [this].concat(args)); }); } /** * Replace tag sign to html entity * @param {string} str Target string value * @returns {string} * @private */ function sanitise(str) { return isString(str) ? str.replace(//g, ">") : str; } /** * Set text value. If there's multiline add nodes. * @param {d3Selection} node Text node * @param {string} text Text value string * @param {Array} dy dy value for multilined text * @param {boolean} toMiddle To be alingned vertically middle * @private */ function setTextValue(node, text, dy, toMiddle) { if (dy === void 0 && (dy = [-1, 1]), toMiddle === void 0 && (toMiddle = !1), node && isString(text)) if (text.indexOf("\n") === -1) node.text(text);else { var diff = [node.text(), text].map(function (v) { return v.replace(/[\s\n]/g, ""); }); if (diff[0] !== diff[1]) { var multiline = text.split("\n"), len = toMiddle ? multiline.length - 1 : 1; node.html(""), multiline.forEach(function (v, i) { node.append("tspan").attr("x", 0).attr("dy", (i === 0 ? dy[0] * len : dy[1]) + "em").text(v); }); } } } /** * Substitution of SVGPathSeg API polyfill * @param {SVGGraphicsElement} path Target svg element * @returns {Array} * @private */ function getRectSegList(path) { /* * seg1 ---------- seg2 * | | * | | * | | * seg0 ---------- seg3 * */ var _path$getBBox = path.getBBox(), x = _path$getBBox.x, y = _path$getBBox.y, width = _path$getBBox.width, height = _path$getBBox.height; return [{ x: x, y: y + height }, // seg0 { x: x, y: y }, // seg1 { x: x + width, y: y }, // seg2 { x: x + width, y: y + height } // seg3 ]; } /** * Get svg bounding path box dimension * @param {SVGGraphicsElement} path Target svg element * @returns {object} * @private */ function getPathBox(path) { var _path$getBoundingClie = path.getBoundingClientRect(), width = _path$getBoundingClie.width, height = _path$getBoundingClie.height, items = getRectSegList(path), x = items[0].x, y = Math.min(items[0].y, items[1].y); return { x: x, y: y, width: width, height: height }; } /** * Get event's current position coordinates * @param {object} event Event object * @param {SVGElement|HTMLElement} element Target element * @returns {Array} [x, y] Coordinates x, y array * @private */ function getPointer(event, element) { var touches = event && (event.touches || event.sourceEvent && event.sourceEvent.touches), pointer = event ? (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.pointer)(touches ? touches[0] : event, element) : [0, 0]; return pointer; } /** * Return brush selection array * @param {object} ctx Current instance * @returns {d3.brushSelection} * @private */ function getBrushSelection(ctx) { var selection, event = ctx.event, $el = ctx.$el, main = $el.subchart.main || $el.main; return event && event.type === "brush" ? selection = event.selection : main && (selection = main.select("." + config_classes.brush).node()) && (selection = (0,external_commonjs_d3_brush_commonjs2_d3_brush_amd_d3_brush_root_d3_.brushSelection)(selection)), selection; } /** * Get boundingClientRect. * Cache the evaluated value once it was called. * @param {HTMLElement} node Target element * @returns {object} * @private */ function getBoundingRect(node) { var needEvaluate = !("rect" in node) || "rect" in node && node.hasAttribute("width") && node.rect.width !== +node.getAttribute("width"); return needEvaluate ? node.rect = node.getBoundingClientRect() : node.rect; } /** * Retrun random number * @param {boolean} asStr Convert returned value as string * @returns {number|string} * @private */ function getRandom(asStr) { asStr === void 0 && (asStr = !0); var rand = Math.random(); return asStr ? rand + "" : rand; } /** * Find index based on binary search * @param {Array} arr Data array * @param {number} v Target number to find * @param {number} start Start index of data array * @param {number} end End index of data arr * @param {boolean} isRotated Weather is roted axis * @returns {number} Index number * @private */ function findIndex(arr, v, start, end, isRotated) { if (start > end) return -1; var mid = Math.floor((start + end) / 2), _arr$mid = arr[mid], x = _arr$mid.x, _arr$mid$w = _arr$mid.w, w = _arr$mid$w === void 0 ? 0 : _arr$mid$w; return isRotated && (x = arr[mid].y, w = arr[mid].h), v >= x && v <= x + w ? mid : v < x ? findIndex(arr, v, start, mid - 1, isRotated) : findIndex(arr, v, mid + 1, end, isRotated); } /** * Check if brush is empty * @param {object} ctx Bursh context * @returns {boolean} * @private */ function brushEmpty(ctx) { var selection = getBrushSelection(ctx); return !selection || selection[0] === selection[1]; } /** * Deep copy object * @param {object} objectN Source object * @returns {object} Cloned object * @private */ function deepClone() { for (var clone = function (_clone) { function clone() { return _clone.apply(this, arguments); } return clone.toString = function () { return _clone.toString(); }, clone; }(function (v) { if (isObject(v) && v.constructor) { var r = new v.constructor(); for (var k in v) r[k] = clone(v[k]); return r; } return v; }), _len3 = arguments.length, objectN = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) objectN[_key3] = arguments[_key3]; return objectN.map(function (v) { return clone(v); }).reduce(function (a, c) { return _objectSpread(_objectSpread({}, a), c); }); } /** * Extend target from source object * @param {object} target Target object * @param {object|Array} source Source object * @returns {object} * @private */ function extend(target, source) { // exclude name with only numbers for (var p in target === void 0 && (target = {}), isArray(source) && source.forEach(function (v) { return extend(target, v); }), source) /^\d+$/.test(p) || p in target || (target[p] = source[p]); return target; } /** * Return first letter capitalized * @param {string} str Target string * @returns {string} capitalized string * @private */ var capitalize = function (str) { return str.charAt(0).toUpperCase() + str.slice(1); }, toArray = function (v) { return [].slice.call(v); }; /** * Convert to array * @param {object} v Target to be converted * @returns {Array} * @private */ /** * Get css rules for specified stylesheets * @param {Array} styleSheets The stylesheets to get the rules from * @returns {Array} * @private */ function getCssRules(styleSheets) { var rules = []; return styleSheets.forEach(function (sheet) { try { sheet.cssRules && sheet.cssRules.length && (rules = rules.concat(toArray(sheet.cssRules))); } catch (e) { console.error("Error while reading rules from " + sheet.href + ": " + e.toString()); } }), rules; } /** * Gets the SVGMatrix of an SVGGElement * @param {SVGElement} node Node element * @returns {SVGMatrix} matrix * @private */ var getTranslation = function (node) { var transform = node ? node.transform : null, baseVal = transform && transform.baseVal; return baseVal && baseVal.numberOfItems ? baseVal.getItem(0).matrix : { a: 0, b: 0, c: 0, d: 0, e: 0, f: 0 }; }; /** * Get unique value from array * @param {Array} data Source data * @returns {Array} Unique array value * @private */ function getUnique(data) { var isDate = data[0] instanceof Date, d = (isDate ? data.map(Number) : data).filter(function (v, i, self) { return self.indexOf(v) === i; }); return isDate ? d.map(function (v) { return new Date(v); }) : d; } /** * Merge array * @param {Array} arr Source array * @returns {Array} * @private */ function mergeArray(arr) { return arr && arr.length ? arr.reduce(function (p, c) { return p.concat(c); }) : []; } /** * Merge object returning new object * @param {object} target Target object * @param {object} objectN Source object * @returns {object} merged target object * @private */ function mergeObj(target) { for (var _len4 = arguments.length, objectN = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) objectN[_key4 - 1] = arguments[_key4]; if (!objectN.length || objectN.length === 1 && !objectN[0]) return target; var source = objectN.shift(); return isObject(target) && isObject(source) && Object.keys(source).forEach(function (key) { var value = source[key]; isObject(value) ? (!target[key] && (target[key] = {}), target[key] = mergeObj(target[key], value)) : target[key] = isArray(value) ? value.concat() : value; }), mergeObj.apply(void 0, [target].concat(objectN)); } /** * Sort value * @param {Array} data value to be sorted * @param {boolean} isAsc true: asc, false: desc * @returns {number|string|Date} sorted date * @private */ function sortValue(data, isAsc) { isAsc === void 0 && (isAsc = !0); var fn; return data[0] instanceof Date ? fn = isAsc ? function (a, b) { return a - b; } : function (a, b) { return b - a; } : isAsc && !data.every(isNaN) ? fn = function (a, b) { return a - b; } : !isAsc && (fn = function (a, b) { return a > b && -1 || a < b && 1 || a === b && 0; }), data.concat().sort(fn); } /** * Get min/max value * @param {string} type 'min' or 'max' * @param {Array} data Array data value * @returns {number|Date|undefined} * @private */ function getMinMax(type, data) { var res = data.filter(function (v) { return notEmpty(v); }); return res.length ? isNumber(res[0]) ? res = Math[type].apply(Math, res) : res[0] instanceof Date && (res = sortValue(res, type === "min")[0]) : res = undefined, res; } /** * Get range * @param {number} start Start number * @param {number} end End number * @param {number} step Step number * @returns {Array} * @private */ var getRange = function (start, end, step) { step === void 0 && (step = 1); var res = [], n = Math.max(0, Math.ceil((end - start) / step)) | 0; for (var i = start; i < n; i++) res.push(start + i * step); return res; }, emulateEvent = { mouse: function () { var getParams = function () { return { bubbles: !1, cancelable: !1, screenX: 0, screenY: 0, clientX: 0, clientY: 0 }; }; try { return new MouseEvent("t"), function (el, eventType, params) { params === void 0 && (params = getParams()), el.dispatchEvent(new MouseEvent(eventType, params)); }; } catch (e) { // Polyfills DOM4 MouseEvent return function (el, eventType, params) { params === void 0 && (params = getParams()); var mouseEvent = browser_doc.createEvent("MouseEvent"); // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/initMouseEvent mouseEvent.initMouseEvent(eventType, params.bubbles, params.cancelable, win, 0, // the event's mouse click count params.screenX, params.screenY, params.clientX, params.clientY, !1, !1, !1, !1, 0, null), el.dispatchEvent(mouseEvent); }; } }(), touch: function touch(el, eventType, params) { var touchObj = new Touch(mergeObj({ identifier: Date.now(), target: el, radiusX: 2.5, radiusY: 2.5, rotationAngle: 10, force: .5 }, params)); el.dispatchEvent(new TouchEvent(eventType, { cancelable: !0, bubbles: !0, shiftKey: !0, touches: [touchObj], targetTouches: [], changedTouches: [touchObj] })); } }; // emulate event /** * Process the template & return bound string * @param {string} tpl Template string * @param {object} data Data value to be replaced * @returns {string} * @private */ function tplProcess(tpl, data) { var res = tpl; for (var x in data) res = res.replace(new RegExp("{=" + x + "}", "g"), data[x]); return res; } /** * Get parsed date value * (It must be called in 'ChartInternal' context) * @param {Date|string|number} date Value of date to be parsed * @returns {Date} * @private */ function parseDate(date) { var parsedDate; if (date instanceof Date) parsedDate = date;else if (isString(date)) { var config = this.config, format = this.format; parsedDate = format.dataTime(config.data_xFormat)(date); } else isNumber(date) && !isNaN(date) && (parsedDate = new Date(+date)); return (!parsedDate || isNaN(+parsedDate)) && console && console.error && console.error("Failed to parse x '" + date + "' to Date object"), parsedDate; } /** * Return if the current doc is visible or not * @returns {boolean} * @private */ function isTabVisible() { return !browser_doc.hidden; } /** * Get the current input type * @param {boolean} mouse Config value: interaction.inputType.mouse * @param {boolean} touch Config value: interaction.inputType.touch * @returns {string} "mouse" | "touch" | null * @private */ function convertInputType(mouse, touch) { var isMobile = !1; // https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#Mobile_Tablet_or_Desktop if (/Mobi/.test(win.navigator.userAgent) && touch) { // Some Edge desktop return true: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/20417074/ var hasTouchPoints = win.navigator && "maxTouchPoints" in win.navigator && win.navigator.maxTouchPoints > 0, hasTouch = "ontouchmove" in win || win.DocumentTouch && browser_doc instanceof win.DocumentTouch; // Ref: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js // On IE11 with IE9 emulation mode, ('ontouchstart' in window) is returning true isMobile = hasTouchPoints || hasTouch; } var hasMouse = !(!mouse || isMobile) && "onmouseover" in win; return hasMouse && "mouse" || isMobile && "touch" || null; } ;// CONCATENATED MODULE: ./src/config/Options/Options.ts function Options_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function Options_objectSpread(target) { for (var source, i = 1; i < arguments.length; i++) source = arguments[i] == null ? {} : arguments[i], i % 2 ? Options_ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : Options_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); return target; } /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ // common /** * Class to set options on generating chart. * - It's instantiated internally, not exposed for public. * @class Options * @see {@link bb.generate} to use these options on generating the chart */ var Options = /*#__PURE__*/function () { function Options() { return deepClone(main, data, color, interaction, legend, title, tooltip, Options.data); } return Options.setOptions = function setOptions(options) { this.data = options.reduce(function (a, c) { return Options_objectSpread(Options_objectSpread({}, a), c); }, this.data); }, Options; }(); Options.data = {}; ;// CONCATENATED MODULE: ./src/module/Cache.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Constant for cache key * - NOTE: Prefixed with '$', will be resetted when .load() is called * @private */ var KEY = { bubbleBaseLength: "$baseLength", colorPattern: "__colorPattern__", dataMinMax: "$dataMinMax", dataTotalSum: "$dataTotalSum", dataTotalPerIndex: "$totalPerIndex", legendItemTextBox: "legendItemTextBox", radarPoints: "$radarPoints", setOverOut: "setOverOut", callOverOutForTouch: "callOverOutForTouch", textRect: "textRect" }; var Cache = /*#__PURE__*/function () { function Cache() { this.cache = {}; } var _proto = Cache.prototype; return _proto.add = /** * Add cache * @param {string} key Cache key * @param {*} value Value to be stored * @param {boolean} isDataType Weather the cache is data typed '{id:'data', id_org: 'data', values: [{x:0, index:0,...}, ...]}' * @returns {*} Added data value * @private */ function add(key, value, isDataType) { return isDataType === void 0 && (isDataType = !1), this.cache[key] = isDataType ? this.cloneTarget(value) : value, this.cache[key]; } /** * Remove cache * @param {string|Array} key Cache key * @private */ , _proto.remove = function remove(key) { var _this = this; toArray(key).forEach(function (v) { return delete _this.cache[v]; }); } /** * Get cahce * @param {string|Array} key Cache key * @param {boolean} isDataType Weather the cache is data typed '{id:'data', id_org: 'data', values: [{x:0, index:0,...}, ...]}' * @returns {*} * @private */ , _proto.get = function get(key, isDataType) { if (isDataType === void 0 && (isDataType = !1), isDataType) { for (var id, targets = [], i = 0; id = key[i]; i++) id in this.cache && targets.push(this.cloneTarget(this.cache[id])); return targets; } var value = this.cache[key]; return isValue(value) ? value : null; } /** * Reset cached data * @param {boolean} all true: reset all data, false: reset only '$' prefixed key data * @private */ , _proto.reset = function reset(all) { var $$ = this; for (var x in $$.cache) (all || /^\$/.test(x)) && ($$.cache[x] = null); } /** * Clone data target object * @param {object} target Data object * @returns {object} * @private */ // eslint-disable-next-line camelcase , _proto.cloneTarget = function cloneTarget(target) { return { id: target.id, id_org: target.id_org, values: target.values.map(function (d) { return { x: d.x, value: d.value, id: d.id }; }) }; }, Cache; }(); ;// CONCATENATED MODULE: ./src/module/generator.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ var generator_setTimeout = win.setTimeout, generator_clearTimeout = win.clearTimeout; /** * Generate resize queue function * @returns {Fucntion} * @private */ function generateResize() { var timeout, fn = [], callResizeFn = function () { callResizeFn.clear(), timeout = generator_setTimeout(function () { fn.forEach(function (f) { return f(); }); }, 200); }; return callResizeFn.clear = function () { timeout && (generator_clearTimeout(timeout), timeout = null); }, callResizeFn.add = function (f) { return fn.push(f); }, callResizeFn.remove = function (f) { return fn.splice(fn.indexOf(f), 1); }, callResizeFn; } /** * Generate transition queue function * @returns {Function} * @private */ function generateWait() { var transitionsToWait = [], f = function (t, callback) { // eslint-disable-next-line function loop() { for (var _t, done = 0, i = 0; _t = transitionsToWait[i]; i++) { if (_t === !0 || _t.empty && _t.empty()) { done++; continue; } try { _t.transition(); } catch (e) { done++; } } timer && generator_clearTimeout(timer), done === transitionsToWait.length ? callback && callback() : timer = generator_setTimeout(loop, 50); } var timer; loop(); }; return f.add = function (t) { isArray(t) ? transitionsToWait = transitionsToWait.concat(t) : transitionsToWait.push(t); }, f; } // EXTERNAL MODULE: external {"commonjs":"d3-dsv","commonjs2":"d3-dsv","amd":"d3-dsv","root":"d3"} var external_commonjs_d3_dsv_commonjs2_d3_dsv_amd_d3_dsv_root_d3_ = __webpack_require__(5); ;// CONCATENATED MODULE: ./src/ChartInternal/data/convert.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Data convert * @memberof ChartInternal * @private */ /* harmony default export */ var convert = ({ /** * Convert data according its type * @param {object} args data object * @param {Function} [callback] callback for url(XHR) type loading * @returns {object} * @private */ convertData: function convertData(args, callback) { var data; if (args.bindto ? (data = {}, ["url", "mimeType", "headers", "keys", "json", "keys", "rows", "columns"].forEach(function (v) { var key = "data_" + v; key in args && (data[v] = args[key]); })) : data = args, data.url && callback) this.convertUrlToData(data.url, data.mimeType, data.headers, data.keys, callback);else if (data.json) data = this.convertJsonToData(data.json, data.keys);else if (data.rows) data = this.convertRowsToData(data.rows);else if (data.columns) data = this.convertColumnsToData(data.columns);else if (args.bindto) throw Error("url or json or rows or columns is required."); return isArray(data) && data; }, /** * Convert URL data * @param {string} url Remote URL * @param {string} mimeType MIME type string: json | csv | tsv * @param {object} headers Header object * @param {object} keys Key object * @param {Function} done Callback function * @private */ convertUrlToData: function convertUrlToData(url, mimeType, headers, keys, done) { var _this = this; mimeType === void 0 && (mimeType = "csv"); var req = new XMLHttpRequest(); req.open("GET", url), headers && Object.keys(headers).forEach(function (key) { req.setRequestHeader(key, headers[key]); }), req.onreadystatechange = function () { if (req.readyState === 4) if (req.status === 200) { var response = req.responseText; response && done.call(_this, _this["convert" + capitalize(mimeType) + "ToData"](mimeType === "json" ? JSON.parse(response) : response, keys)); } else throw new Error(url + ": Something went wrong loading!"); }, req.send(); }, /** * Convert CSV/TSV data * @param {object} parser Parser object * @param {object} xsv Data * @private * @returns {object} */ convertCsvTsvToData: function convertCsvTsvToData(parser, xsv) { var d, rows = parser.rows(xsv); return rows.length === 1 ? (d = [{}], rows[0].forEach(function (id) { d[0][id] = null; })) : d = parser.parse(xsv), d; }, convertCsvToData: function convertCsvToData(xsv) { return this.convertCsvTsvToData({ rows: external_commonjs_d3_dsv_commonjs2_d3_dsv_amd_d3_dsv_root_d3_.csvParseRows, parse: external_commonjs_d3_dsv_commonjs2_d3_dsv_amd_d3_dsv_root_d3_.csvParse }, xsv); }, convertTsvToData: function convertTsvToData(tsv) { return this.convertCsvTsvToData({ rows: external_commonjs_d3_dsv_commonjs2_d3_dsv_amd_d3_dsv_root_d3_.tsvParseRows, parse: external_commonjs_d3_dsv_commonjs2_d3_dsv_amd_d3_dsv_root_d3_.tsvParse }, tsv); }, convertJsonToData: function convertJsonToData(json, keysParam) { var targetKeys, data, _this2 = this, config = this.config, newRows = []; if (isArray(json)) { var keys = keysParam || config.data_keys; keys.x ? (targetKeys = keys.value.concat(keys.x), config.data_x = keys.x) : targetKeys = keys.value, newRows.push(targetKeys), json.forEach(function (o) { var newRow = targetKeys.map(function (key) { // convert undefined to null because undefined data will be removed in convertDataToTargets() var v = _this2.findValueInJson(o, key); return isUndefined(v) && (v = null), v; }); newRows.push(newRow); }), data = this.convertRowsToData(newRows); } else Object.keys(json).forEach(function (key) { var tmp = json[key].concat(); tmp.unshift(key), newRows.push(tmp); }), data = this.convertColumnsToData(newRows); return data; }, findValueInJson: function findValueInJson(object, path) { if (object[path] !== undefined) return object[path]; var convertedPath = path.replace(/\[(\w+)\]/g, ".$1"), pathArray = convertedPath.replace(/^\./, "").split("."), target = object; // convert indexes to properties (replace [] with .) return pathArray.some(function (k) { return !(target = target && k in target ? target[k] : undefined); }), target; }, convertRowsToData: function convertRowsToData(rows) { var keys = rows[0], newRows = []; return rows.forEach(function (row, i) { if (i > 0) { var newRow = {}; row.forEach(function (v, j) { if (isUndefined(v)) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!"); newRow[keys[j]] = v; }), newRows.push(newRow); } }), newRows; }, convertColumnsToData: function convertColumnsToData(columns) { var newRows = []; return columns.forEach(function (col, i) { var key = col[0]; col.forEach(function (v, j) { if (j > 0) { if (isUndefined(newRows[j - 1]) && (newRows[j - 1] = {}), isUndefined(v)) throw new Error("Source data is missing a component at (" + i + ", " + j + ")!"); newRows[j - 1][key] = v; } }); }), newRows; }, convertDataToTargets: function convertDataToTargets(data, appendXs) { var _this3 = this, $$ = this, axis = $$.axis, config = $$.config, state = $$.state, isCategorized = !1, isTimeSeries = !1, isCustomX = !1; axis && (isCategorized = axis.isCategorized(), isTimeSeries = axis.isTimeSeries(), isCustomX = axis.isCustomX()); var xsData, dataKeys = Object.keys(data[0] || {}), ids = dataKeys.length ? dataKeys.filter($$.isNotX, $$) : [], xs = dataKeys.length ? dataKeys.filter($$.isX, $$) : []; ids.forEach(function (id) { var xKey = _this3.getXKey(id); isCustomX || isTimeSeries ? xs.indexOf(xKey) >= 0 ? xsData = (appendXs && $$.data.xs[id] || []).concat(data.map(function (d) { return d[xKey]; }).filter(isValue).map(function (rawX, i) { return $$.generateTargetX(rawX, id, i); })) : config.data_x ? xsData = _this3.getOtherTargetXs() : notEmpty(config.data_xs) && (xsData = $$.getXValuesOfXKey(xKey, $$.data.targets)) : xsData = data.map(function (d, i) { return i; }), xsData && (_this3.data.xs[id] = xsData); }), ids.forEach(function (id) { if (!_this3.data.xs[id]) throw new Error("x is not defined for id = \"" + id + "\"."); }); // convert to target var targets = ids.map(function (id, index) { var convertedId = config.data_idConverter.bind($$.api)(id), xKey = $$.getXKey(id), isCategory = isCustomX && isCategorized, hasCategory = isCategory && data.map(function (v) { return v.x; }).every(function (v) { return config.axis_x_categories.indexOf(v) > -1; }); return { id: convertedId, id_org: id, values: data.map(function (d, i) { var x, rawX = d[xKey], value = d[id]; return value = value === null || isNaN(value) || isObject(value) ? isArray(value) || isObject(value) ? value : null : +value, (isCategory || state.hasRadar) && index === 0 && !isUndefined(rawX) ? (!hasCategory && index === 0 && i === 0 && (config.axis_x_categories = []), x = config.axis_x_categories.indexOf(rawX), x === -1 && (x = config.axis_x_categories.length, config.axis_x_categories.push(rawX))) : x = $$.generateTargetX(rawX, id, i), (isUndefined(value) || $$.data.xs[id].length <= i) && (x = undefined), { x: x, value: value, id: convertedId }; }).filter(function (v) { return isDefined(v.x); }) }; }); // finish targets return targets.forEach(function (t) { config.data_xSort && (t.values = t.values.sort(function (v1, v2) { var x1 = v1.x || v1.x === 0 ? v1.x : Infinity, x2 = v2.x || v2.x === 0 ? v2.x : Infinity; return x1 - x2; })), t.values.forEach(function (v, i) { return v.index = i; }), $$.data.xs[t.id].sort(function (v1, v2) { return v1 - v2; }); }), state.hasNegativeValue = $$.hasNegativeValueInTargets(targets), state.hasPositiveValue = $$.hasPositiveValueInTargets(targets), config.data_type && $$.setTargetType($$.mapToIds(targets).filter(function (id) { return !(id in config.data_types); }), config.data_type), targets.forEach(function (d) { return $$.cache.add(d.id_org, d, !0); }), targets; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/data/data.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var data_data = ({ isX: function isX(key) { var $$ = this, config = $$.config, dataKey = config.data_x && key === config.data_x, existValue = notEmpty(config.data_xs) && hasValue(config.data_xs, key); return dataKey || existValue; }, isNotX: function isNotX(key) { return !this.isX(key); }, isStackNormalized: function isStackNormalized() { var config = this.config; return !!(config.data_stack_normalize && config.data_groups.length); }, isGrouped: function isGrouped(id) { var groups = this.config.data_groups; return id ? groups.some(function (v) { return v.indexOf(id) >= 0 && v.length > 1; }) : groups.length > 0; }, getXKey: function getXKey(id) { var $$ = this, config = $$.config; return config.data_x ? config.data_x : notEmpty(config.data_xs) ? config.data_xs[id] : null; }, getXValuesOfXKey: function getXValuesOfXKey(key, targets) { var xValues, $$ = this, ids = targets && notEmpty(targets) ? $$.mapToIds(targets) : []; return ids.forEach(function (id) { $$.getXKey(id) === key && (xValues = $$.data.xs[id]); }), xValues; }, /** * Get index number based on given x Axis value * @param {Date|number|string} x x Axis to be compared * @param {Array} basedX x Axis list to be based on * @returns {number} index number * @private */ getIndexByX: function getIndexByX(x, basedX) { var $$ = this; return basedX ? basedX.indexOf(isString(x) ? x : +x) : ($$.filterByX($$.data.targets, x)[0] || { index: null }).index; }, getXValue: function getXValue(id, i) { var $$ = this; return id in $$.data.xs && $$.data.xs[id] && isValue($$.data.xs[id][i]) ? $$.data.xs[id][i] : i; }, getOtherTargetXs: function getOtherTargetXs() { var $$ = this, idsForX = Object.keys($$.data.xs); return idsForX.length ? $$.data.xs[idsForX[0]] : null; }, getOtherTargetX: function getOtherTargetX(index) { var xs = this.getOtherTargetXs(); return xs && index < xs.length ? xs[index] : null; }, addXs: function addXs(xs) { var $$ = this, config = $$.config; Object.keys(xs).forEach(function (id) { config.data_xs[id] = xs[id]; }); }, isMultipleX: function isMultipleX() { return notEmpty(this.config.data_xs) || !this.config.data_xSort || this.hasType("bubble") || this.hasType("scatter"); }, addName: function addName(data) { var name, $$ = this, config = $$.config; return data && (name = config.data_names[data.id], data.name = name === undefined ? data.id : name), data; }, /** * Get all values on given index * @param {number} index Index * @param {boolean} filterNull Filter nullish value * @returns {Array} * @private */ getAllValuesOnIndex: function getAllValuesOnIndex(index, filterNull) { filterNull === void 0 && (filterNull = !1); var $$ = this, value = $$.filterTargetsToShow($$.data.targets).map(function (t) { return $$.addName($$.getValueOnIndex(t.values, index)); }); return filterNull && (value = value.filter(function (v) { return isValue(v.value); })), value; }, getValueOnIndex: function getValueOnIndex(values, index) { var valueOnIndex = values.filter(function (v) { return v.index === index; }); return valueOnIndex.length ? valueOnIndex[0] : null; }, updateTargetX: function updateTargetX(targets, x) { var $$ = this; targets.forEach(function (t) { t.values.forEach(function (v, i) { v.x = $$.generateTargetX(x[i], t.id, i); }), $$.data.xs[t.id] = x; }); }, updateTargetXs: function updateTargetXs(targets, xs) { var $$ = this; targets.forEach(function (t) { xs[t.id] && $$.updateTargetX([t], xs[t.id]); }); }, generateTargetX: function generateTargetX(rawX, id, index) { var $$ = this, axis = $$.axis, x = axis && axis.isCategorized() ? index : rawX || index; if (axis && axis.isTimeSeries()) { var fn = parseDate.bind($$); x = rawX ? fn(rawX) : fn($$.getXValue(id, index)); } else axis && axis.isCustomX() && !axis.isCategorized() && (x = isValue(rawX) ? +rawX : $$.getXValue(id, index)); return x; }, updateXs: function updateXs(values) { values.length && (this.axis.xs = values.map(function (v) { return v.x; })); }, getPrevX: function getPrevX(i) { var x = this.axis.xs[i - 1]; return isDefined(x) ? x : null; }, getNextX: function getNextX(i) { var x = this.axis.xs[i + 1]; return isDefined(x) ? x : null; }, /** * Get base value isAreaRangeType * @param {object} data Data object * @returns {number} * @private */ getBaseValue: function getBaseValue(data) { var $$ = this, hasAxis = $$.state.hasAxis, value = data.value; return value && hasAxis && ($$.isAreaRangeType(data) ? value = $$.getRangedData(data, "mid") : $$.isBubbleZType(data) && (value = $$.getBubbleZData(value, "y"))), value; }, /** * Get min/max value from the data * @private * @param {Array} data array data to be evaluated * @returns {{min: {number}, max: {number}}} */ getMinMaxValue: function getMinMaxValue(data) { var min, max, getBaseValue = this.getBaseValue.bind(this); return (data || this.data.targets.map(function (t) { return t.values; })).forEach(function (v, i) { var value = v.map(getBaseValue).filter(isNumber); min = Math.min.apply(Math, [i ? min : Infinity].concat(value)), max = Math.max.apply(Math, [i ? max : -Infinity].concat(value)); }), { min: min, max: max }; }, /** * Get the min/max data * @private * @returns {{min: Array, max: Array}} */ getMinMaxData: function getMinMaxData() { var $$ = this, cacheKey = KEY.dataMinMax, minMaxData = $$.cache.get(cacheKey); if (!minMaxData) { var data = $$.data.targets.map(function (t) { return t.values; }), minMax = $$.getMinMaxValue(data), min = [], max = []; // update the cached data data.forEach(function (v) { var minData = $$.getFilteredDataByValue(v, minMax.min), maxData = $$.getFilteredDataByValue(v, minMax.max); minData.length && (min = min.concat(minData)), maxData.length && (max = max.concat(maxData)); }), $$.cache.add(cacheKey, minMaxData = { min: min, max: max }); } return minMaxData; }, /** * Get sum of data per index * @private * @returns {Array} */ getTotalPerIndex: function getTotalPerIndex() { var $$ = this, cacheKey = KEY.dataTotalPerIndex, sum = $$.cache.get(cacheKey); return $$.isStackNormalized() && !sum && (sum = [], $$.data.targets.forEach(function (row) { row.values.forEach(function (v, i) { sum[i] || (sum[i] = 0), sum[i] += isNumber(v.value) ? v.value : 0; }); })), sum; }, /** * Get total data sum * @param {boolean} subtractHidden Subtract hidden data from total * @returns {number} * @private */ getTotalDataSum: function getTotalDataSum(subtractHidden) { var $$ = this, cacheKey = KEY.dataTotalSum, total = $$.cache.get(cacheKey); if (!isNumber(total)) { var sum = mergeArray($$.data.targets.map(function (t) { return t.values; })).map(function (v) { return v.value; }).reduce(function (p, c) { return p + c; }); $$.cache.add(cacheKey, total = sum); } return subtractHidden && (total -= $$.getHiddenTotalDataSum()), total; }, /** * Get total hidden data sum * @returns {number} * @private */ getHiddenTotalDataSum: function getHiddenTotalDataSum() { var $$ = this, api = $$.api, hiddenTargetIds = $$.state.hiddenTargetIds, total = 0; return hiddenTargetIds.length && (total = api.data.values.bind(api)(hiddenTargetIds).reduce(function (p, c) { return p + c; })), total; }, /** * Get filtered data by value * @param {object} data Data * @param {number} value Value to be filtered * @returns {Array} filtered array data * @private */ getFilteredDataByValue: function getFilteredDataByValue(data, value) { var _this = this; return data.filter(function (t) { return _this.getBaseValue(t) === value; }); }, /** * Return the max length of the data * @returns {number} max data length * @private */ getMaxDataCount: function getMaxDataCount() { return Math.max.apply(Math, this.data.targets.map(function (t) { return t.values.length; })); }, getMaxDataCountTarget: function getMaxDataCountTarget() { var target = this.filterTargetsToShow() || [], length = target.length; return length > 1 ? (target = target.map(function (t) { return t.values; }).reduce(function (a, b) { return a.concat(b); }).map(function (v) { return v.x; }), target = sortValue(getUnique(target)).map(function (x, index) { return { x: x, index: index }; })) : length && (target = target[0].values), target; }, mapToIds: function mapToIds(targets) { return targets.map(function (d) { return d.id; }); }, mapToTargetIds: function mapToTargetIds(ids) { var $$ = this; return ids ? isArray(ids) ? ids.concat() : [ids] : $$.mapToIds($$.data.targets); }, hasTarget: function hasTarget(targets, id) { var ids = this.mapToIds(targets); for (var val, i = 0; val = ids[i]; i++) if (val === id) return !0; return !1; }, isTargetToShow: function isTargetToShow(targetId) { return this.state.hiddenTargetIds.indexOf(targetId) < 0; }, isLegendToShow: function isLegendToShow(targetId) { return this.state.hiddenLegendIds.indexOf(targetId) < 0; }, filterTargetsToShow: function filterTargetsToShow(targets) { var $$ = this; return (targets || $$.data.targets).filter(function (t) { return $$.isTargetToShow(t.id); }); }, mapTargetsToUniqueXs: function mapTargetsToUniqueXs(targets) { var $$ = this, axis = $$.axis, xs = []; return targets && targets.length && (xs = getUnique(mergeArray(targets.map(function (t) { return t.values.map(function (v) { return +v.x; }); }))), xs = axis && axis.isTimeSeries() ? xs.map(function (x) { return new Date(+x); }) : xs.map(function (x) { return +x; })), sortValue(xs); }, addHiddenTargetIds: function addHiddenTargetIds(targetIds) { this.state.hiddenTargetIds = this.state.hiddenTargetIds.concat(targetIds); }, removeHiddenTargetIds: function removeHiddenTargetIds(targetIds) { this.state.hiddenTargetIds = this.state.hiddenTargetIds.filter(function (id) { return targetIds.indexOf(id) < 0; }); }, addHiddenLegendIds: function addHiddenLegendIds(targetIds) { this.state.hiddenLegendIds = this.state.hiddenLegendIds.concat(targetIds); }, removeHiddenLegendIds: function removeHiddenLegendIds(targetIds) { this.state.hiddenLegendIds = this.state.hiddenLegendIds.filter(function (id) { return targetIds.indexOf(id) < 0; }); }, getValuesAsIdKeyed: function getValuesAsIdKeyed(targets) { var $$ = this, hasAxis = $$.state.hasAxis, ys = {}, isMultipleX = $$.isMultipleX(), xs = isMultipleX ? $$.mapTargetsToUniqueXs(targets).map(function (v) { return isString(v) ? v : +v; }) : null; return targets.forEach(function (t) { var data = []; t.values.filter(function (v) { return isValue(v.value); }).forEach(function (v) { var value = v.value; // exclude 'volume' value to correct mis domain calculation $$.isCandlestickType(v) && (value = isArray(value) ? value.slice(0, 4) : [value.open, value.high, value.low, value.close]), isArray(value) ? data.push.apply(data, value) : isObject(value) && "high" in value ? data.push.apply(data, Object.values(value)) : $$.isBubbleZType(v) ? data.push(hasAxis && $$.getBubbleZData(value, "y")) : isMultipleX ? data[$$.getIndexByX(v.x, xs)] = value : data.push(value); }), ys[t.id] = data; }), ys; }, checkValueInTargets: function checkValueInTargets(targets, checker) { var values, ids = Object.keys(targets); for (var i = 0; i < ids.length; i++) { values = targets[ids[i]].values; for (var j = 0; j < values.length; j++) if (checker(values[j].value)) return !0; } return !1; }, hasMultiTargets: function hasMultiTargets() { return this.filterTargetsToShow().length > 1; }, hasNegativeValueInTargets: function hasNegativeValueInTargets(targets) { return this.checkValueInTargets(targets, function (v) { return v < 0; }); }, hasPositiveValueInTargets: function hasPositiveValueInTargets(targets) { return this.checkValueInTargets(targets, function (v) { return v > 0; }); }, _checkOrder: function _checkOrder(type) { var config = this.config, order = config.data_order; return isString(order) && order.toLowerCase() === type; }, isOrderDesc: function isOrderDesc() { return this._checkOrder("desc"); }, isOrderAsc: function isOrderAsc() { return this._checkOrder("asc"); }, /** * Sort targets data * @param {Array} targetsValue Target value * @returns {Array} * @private */ orderTargets: function orderTargets(targetsValue) { var $$ = this, targets = [].concat(targetsValue), fn = $$.getSortCompareFn(); return fn && targets.sort(fn), targets; }, /** * Get data.order compare function * @param {boolean} isArc Is for Arc type sort or not * @returns {Function} compare function * @private */ getSortCompareFn: function getSortCompareFn(isArc) { isArc === void 0 && (isArc = !1); var fn, $$ = this, config = $$.config, orderAsc = $$.isOrderAsc(), orderDesc = $$.isOrderDesc(); return orderAsc || orderDesc ? fn = function (t1, t2) { var reducer = function (p, c) { return p + Math.abs(c.value); }, t1Sum = t1.values.reduce(reducer, 0), t2Sum = t2.values.reduce(reducer, 0); return isArc ? orderAsc ? t1Sum - t2Sum : t2Sum - t1Sum : orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum; } : isFunction(config.data_order) && (fn = config.data_order.bind($$.api)), fn || null; }, filterByX: function filterByX(targets, x) { return mergeArray(targets.map(function (t) { return t.values; })).filter(function (v) { return v.x - x === 0; }); }, filterRemoveNull: function filterRemoveNull(data) { var _this2 = this; return data.filter(function (d) { return isValue(_this2.getBaseValue(d)); }); }, filterByXDomain: function filterByXDomain(targets, xDomain) { return targets.map(function (t) { return { id: t.id, id_org: t.id_org, values: t.values.filter(function (v) { return xDomain[0] <= v.x && v.x <= xDomain[1]; }) }; }); }, hasDataLabel: function hasDataLabel() { var dataLabels = this.config.data_labels; return isboolean(dataLabels) && dataLabels || isObjectType(dataLabels) && notEmpty(dataLabels); }, /** * Get data index from the event coodinates * @param {Event} event Event object * @returns {number} */ getDataIndexFromEvent: function getDataIndexFromEvent(event) { var $$ = this, config = $$.config, _$$$state = $$.state, inputType = _$$$state.inputType, _$$$state$eventReceiv = _$$$state.eventReceiver, coords = _$$$state$eventReceiv.coords, rect = _$$$state$eventReceiv.rect, isRotated = config.axis_rotated, e = inputType === "touch" && event.changedTouches ? event.changedTouches[0] : event, index = findIndex(coords, isRotated ? e.clientY - rect.top : e.clientX - rect.left, 0, coords.length - 1, isRotated); return index; }, getDataLabelLength: function getDataLabelLength(min, max, key) { var $$ = this, lengths = [0, 0]; return $$.$el.chart.select("svg").selectAll(".dummy").data([min, max]).enter().append("text").text(function (d) { return $$.dataLabelFormat(d.id)(d); }).each(function (d, i) { lengths[i] = this.getBoundingClientRect()[key] * 1.3; }).remove(), lengths; }, isNoneArc: function isNoneArc(d) { return this.hasTarget(this.data.targets, d.id); }, isArc: function isArc(d) { return "data" in d && this.hasTarget(this.data.targets, d.data.id); }, findSameXOfValues: function findSameXOfValues(values, index) { var i, targetX = values[index].x, sames = []; for (i = index - 1; i >= 0 && !(targetX !== values[i].x); i--) sames.push(values[i]); for (i = index; i < values.length && !(targetX !== values[i].x); i++) sames.push(values[i]); return sames; }, findClosestFromTargets: function findClosestFromTargets(targets, pos) { var $$ = this, candidates = targets.map(function (target) { return $$.findClosest(target.values, pos); }); // map to array of closest points of each target // decide closest point and return return $$.findClosest(candidates, pos); }, findClosest: function findClosest(values, pos) { var closest, $$ = this, config = $$.config, main = $$.$el.main, data = values.filter(function (v) { return v && isValue(v.value); }), minDist = config.point_sensitivity; return data.filter(function (v) { return $$.isBarType(v.id); }).forEach(function (v) { var shape = main.select("." + config_classes.bars + $$.getTargetSelectorSuffix(v.id) + " ." + config_classes.bar + "-" + v.index).node(); !closest && $$.isWithinBar(shape) && (closest = v); }), data.filter(function (v) { return !$$.isBarType(v.id); }).forEach(function (v) { var d = $$.dist(v, pos); d < minDist && (minDist = d, closest = v); }), closest; }, dist: function dist(data, pos) { var $$ = this, isRotated = $$.config.axis_rotated, scale = $$.scale, xIndex = isRotated ? 1 : 0, yIndex = isRotated ? 0 : 1, y = $$.circleY(data, data.index), x = (scale.zoom || scale.x)(data.x); return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2)); }, /** * Convert data for step type * @param {Array} values Object data values * @returns {Array} * @private */ convertValuesToStep: function convertValuesToStep(values) { var $$ = this, axis = $$.axis, config = $$.config, stepType = config.line_step_type, isCategorized = !!axis && axis.isCategorized(), converted = isArray(values) ? values.concat() : [values]; if (!(isCategorized || /step\-(after|before)/.test(stepType))) return values; // insert & append cloning first/last value to be fully rendered covering on each gap sides var head = converted[0], tail = converted[converted.length - 1], id = head.id, x = head.x; return converted.unshift({ x: --x, value: head.value, id: id }), isCategorized && stepType === "step-after" && converted.unshift({ x: --x, value: head.value, id: id }), x = tail.x, converted.push({ x: ++x, value: tail.value, id: id }), isCategorized && stepType === "step-before" && converted.push({ x: ++x, value: tail.value, id: id }), converted; }, convertValuesToRange: function convertValuesToRange(values) { var converted = isArray(values) ? values.concat() : [values], ranges = []; return converted.forEach(function (range) { var x = range.x, id = range.id; ranges.push({ x: x, id: id, value: range.value[0] }), ranges.push({ x: x, id: id, value: range.value[2] }); }), ranges; }, updateDataAttributes: function updateDataAttributes(name, attrs) { var $$ = this, config = $$.config, current = config["data_" + name]; return isUndefined(attrs) ? current : (Object.keys(attrs).forEach(function (id) { current[id] = attrs[id]; }), $$.redraw({ withLegend: !0 }), current); }, getRangedData: function getRangedData(d, key, type) { key === void 0 && (key = ""), type === void 0 && (type = "areaRange"); var value = d == null ? void 0 : d.value; if (isArray(value)) { // @ts-ignore var index = { areaRange: ["high", "mid", "low"], candlestick: ["open", "high", "low", "close", "volume"] }[type].indexOf(key); return index >= 0 && value ? value[index] : undefined; } return value ? value[key] : value; }, /** * Get ratio value * @param {string} type Ratio for given type * @param {object} d Data value object * @param {boolean} asPercent Convert the return as percent or not * @returns {number} Ratio value * @private */ getRatio: function getRatio(type, d, asPercent) { var $$ = this, config = $$.config, state = $$.state, api = $$.api, ratio = 0; if (d && api.data.shown().length) if (ratio = d.ratio || d.value, type === "arc") { // if has padAngle set, calculate rate based on value if ($$.pie.padAngle()()) ratio = d.value / $$.getTotalDataSum(!0);else { var gaugeArcLength = config.gauge_fullCircle ? $$.getArcLength() : $$.getStartAngle() * -2, arcLength = $$.hasType("gauge") ? gaugeArcLength : Math.PI * 2; ratio = (d.endAngle - d.startAngle) / arcLength; } } else if (type === "index") { var dataValues = api.data.values.bind(api), total = this.getTotalPerIndex(); if (state.hiddenTargetIds.length) { var hiddenSum = dataValues(state.hiddenTargetIds, !1); hiddenSum.length && (hiddenSum = hiddenSum.reduce(function (acc, curr) { return acc.map(function (v, i) { return (isNumber(v) ? v : 0) + curr[i]; }); }), total = total.map(function (v, i) { return v - hiddenSum[i]; })); } d.ratio = isNumber(d.value) && total && total[d.index] > 0 ? d.value / total[d.index] : 0, ratio = d.ratio; } else if (type === "radar") ratio = parseFloat(Math.max(d.value, 0) + "") / state.current.dataMax * config.radar_size_ratio;else if (type === "bar") { var yScale = $$.getYScaleById.bind($$)(d.id), max = yScale.domain().reduce(function (a, c) { return c - a; }); ratio = Math.abs(d.value) / max; } return asPercent && ratio ? ratio * 100 : ratio; }, /** * Sort data index to be aligned with x axis. * @param {Array} tickValues Tick array values * @private */ updateDataIndexByX: function updateDataIndexByX(tickValues) { var $$ = this, tickValueMap = tickValues.reduce(function (out, tick, index) { return out[+tick.x] = index, out; }, {}); $$.data.targets.forEach(function (t) { t.values.forEach(function (value, valueIndex) { var index = tickValueMap[+value.x]; index === undefined && (index = valueIndex), value.index = index; }); }); }, /** * Determine if bubble has dimension data * @param {object|Array} d data value * @returns {boolean} * @private */ isBubbleZType: function isBubbleZType(d) { var $$ = this; return $$.isBubbleType(d) && (isObject(d.value) && ("z" in d.value || "y" in d.value) || isArray(d.value) && d.value.length === 2); }, /** * Get data object by id * @param {string} id data id * @returns {object} * @private */ getDataById: function getDataById(id) { var d = this.cache.get(id) || this.api.data(id); return isArray(d) ? d[0] : d; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/data/load.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var load = ({ load: function load(rawTargets, args) { var $$ = this, targets = rawTargets; // Set targets // Redraw with new targets // Update current state chart type and elements list after redraw targets && (args.filter && (targets = targets.filter(args.filter)), (args.type || args.types) && targets.forEach(function (t) { var type = args.types && args.types[t.id] || args.type; $$.setTargetType(t.id, type); }), $$.data.targets.forEach(function (d) { for (var i = 0; i < targets.length; i++) if (d.id === targets[i].id) { d.values = targets[i].values, targets.splice(i, 1); break; } }), $$.data.targets = $$.data.targets.concat(targets)), $$.updateTargets($$.data.targets), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0, withLegend: !0 }), $$.updateTypesElements(), args.done && args.done.call($$.api); }, loadFromArgs: function loadFromArgs(args) { var $$ = this; // prevent load when chart is already destroyed if ($$.config) { $$.cache.reset(); var data = args.data || $$.convertData(args, function (d) { return $$.load($$.convertDataToTargets(d), args); }); data && $$.load($$.convertDataToTargets(data), args); } // reset internally cached data }, unload: function unload(rawTargetIds, customDoneCb) { var $$ = this, state = $$.state, $el = $$.$el, done = customDoneCb, targetIds = rawTargetIds; // If no target, call done and return return $$.cache.reset(), done || (done = function () {}), targetIds = targetIds.filter(function (id) { return $$.hasTarget($$.data.targets, id); }), targetIds && targetIds.length !== 0 ? void ( // Update current state chart type and elements list after redraw $el.svg.selectAll(targetIds.map(function (id) { return $$.selectorTarget(id); })).transition().style("opacity", "0").remove().call(endall, done), targetIds.forEach(function (id) { state.withoutFadeIn[id] = !1, $el.legend && $el.legend.selectAll("." + config_classes.legendItem + $$.getTargetSelectorSuffix(id)).remove(), $$.data.targets = $$.data.targets.filter(function (t) { return t.id !== id; }); }), $$.updateTypesElements()) : void done(); } }); // EXTERNAL MODULE: external {"commonjs":"d3-drag","commonjs2":"d3-drag","amd":"d3-drag","root":"d3"} var external_commonjs_d3_drag_commonjs2_d3_drag_amd_d3_drag_root_d3_ = __webpack_require__(7); ;// CONCATENATED MODULE: ./src/ChartInternal/interactions/interaction.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var interactions_interaction = ({ selectRectForSingle: function selectRectForSingle(context, eventRect, index) { var $$ = this, config = $$.config, main = $$.$el.main, isSelectionEnabled = config.data_selection_enabled, isSelectionGrouped = config.data_selection_grouped, isSelectable = config.data_selection_isselectable, isTooltipGrouped = config.tooltip_grouped, selectedData = $$.getAllValuesOnIndex(index); isTooltipGrouped && ($$.showTooltip(selectedData, context), $$.showGridFocus && $$.showGridFocus(selectedData), !isSelectionEnabled || isSelectionGrouped) || main.selectAll("." + config_classes.shape + "-" + index).each(function () { (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.EXPANDED, !0), isSelectionEnabled && eventRect.style("cursor", isSelectionGrouped ? "pointer" : null), isTooltipGrouped || ($$.hideGridFocus && $$.hideGridFocus(), $$.hideTooltip(), !isSelectionGrouped && $$.expandCirclesBars(index)); }).filter(function (d) { return $$.isWithinShape(this, d); }).call(function (selected) { var d = selected.data(); isSelectionEnabled && (isSelectionGrouped || isSelectable && isSelectable.bind($$.api)(d)) && eventRect.style("cursor", "pointer"), isTooltipGrouped || ($$.showTooltip(d, context), $$.showGridFocus && $$.showGridFocus(d), $$.unexpandCircles && $$.unexpandCircles(), selected.each(function (d) { return $$.expandCirclesBars(index, d.id); })); }); }, expandCirclesBars: function expandCirclesBars(index, id, reset) { var $$ = this, config = $$.config, _$$$$el = $$.$el, bar = _$$$$el.bar, circle = _$$$$el.circle; circle && config.point_focus_expand_enabled && $$.expandCircles(index, id, reset), bar && $$.expandBars(index, id, reset); }, /** * Handle data.onover/out callback options * @param {boolean} isOver Over or not * @param {number|object} d data object * @private */ setOverOut: function setOverOut(isOver, d) { var $$ = this, config = $$.config, hasRadar = $$.state.hasRadar, main = $$.$el.main, isArc = isObject(d); // Call event handler if (isArc || d !== -1) { var callback = config[isOver ? "data_onover" : "data_onout"].bind($$.api); if (config.color_onover && $$.setOverColor(isOver, d, isArc), isArc) callback(d, main.select("." + config_classes.arc + $$.getTargetSelectorSuffix(d.id)).node());else if (!config.tooltip_grouped) { var last = $$.cache.get(KEY.setOverOut) || [], shape = main.selectAll("." + config_classes.shape + "-" + d).filter(function (d) { return $$.isWithinShape(this, d); }); shape.each(function (d) { var _this = this; (last.length === 0 || last.every(function (v) { return v !== _this; })) && (callback(d, this), last.push(this)); }), last.length > 0 && shape.empty() && (callback = config.data_onout.bind($$.api), last.forEach(function (v) { return callback((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(v).datum(), v); }), last = []), $$.cache.add(KEY.setOverOut, last); } else isOver && (config.point_focus_only && hasRadar ? $$.showCircleFocus($$.getAllValuesOnIndex(d, !0)) : $$.expandCirclesBars(d, null, !0)), $$.isMultipleX() || main.selectAll("." + config_classes.shape + "-" + d).each(function (d) { callback(d, this); }); } }, /** * Call data.onover/out callback for touch event * @param {number|object} d target index or data object for Arc type * @private */ callOverOutForTouch: function callOverOutForTouch(d) { var $$ = this, last = $$.cache.get(KEY.callOverOutForTouch); (isObject(d) && last ? d.id !== last.id : d !== last) && ((last || isNumber(last)) && $$.setOverOut(!1, last), (d || isNumber(d)) && $$.setOverOut(!0, d), $$.cache.add(KEY.callOverOutForTouch, d)); }, /** * Return draggable selection function * @returns {Function} * @private */ getDraggableSelection: function getDraggableSelection() { var $$ = this, config = $$.config, state = $$.state; return config.interaction_enabled && config.data_selection_draggable && $$.drag ? (0,external_commonjs_d3_drag_commonjs2_d3_drag_amd_d3_drag_root_d3_.drag)().on("drag", function (event) { state.event = event, $$.drag(getPointer(event, this)); }).on("start", function (event) { state.event = event, $$.dragstart(getPointer(event, this)); }).on("end", function (event) { state.event = event, $$.dragend(); }) : function () {}; }, /** * Dispatch a mouse event. * @private * @param {string} type event type * @param {number} index Index of eventRect * @param {Array} mouse x and y coordinate value */ dispatchEvent: function dispatchEvent(type, index, mouse) { var $$ = this, config = $$.config, _$$$state = $$.state, eventReceiver = _$$$state.eventReceiver, hasAxis = _$$$state.hasAxis, hasRadar = _$$$state.hasRadar, _$$$$el2 = $$.$el, eventRect = _$$$$el2.eventRect, arcs = _$$$$el2.arcs, radar = _$$$$el2.radar, isMultipleX = $$.isMultipleX(), element = (hasRadar ? radar.axes.select("." + config_classes.axis + "-" + index + " text") : eventRect || arcs.selectAll("." + config_classes.target + " path").filter(function (d, i) { return i === index; })).node(), _element$getBoundingC = element.getBoundingClientRect(), width = _element$getBoundingC.width, left = _element$getBoundingC.left, top = _element$getBoundingC.top; if (hasAxis && !hasRadar && !isMultipleX) { var coords = eventReceiver.coords[index]; width = coords.w, left += coords.x, top += coords.y; } var x = left + (mouse ? mouse[0] : 0) + (isMultipleX || config.axis_rotated ? 0 : width / 2), y = top + (mouse ? mouse[1] : 0); emulateEvent[/^(mouse|click)/.test(type) ? "mouse" : "touch"](element, type, { screenX: x, screenY: y, clientX: x, clientY: y }); }, setDragStatus: function setDragStatus(isDragging) { this.state.dragging = isDragging; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/class.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var internals_class = ({ generateClass: function generateClass(prefix, targetId) { return " " + prefix + " " + (prefix + this.getTargetSelectorSuffix(targetId)); }, /** * Get class string * @param {string} type Shape type * @param {boolean} withShape Get with shape prefix * @returns {string} Class string * @private */ getClass: function getClass(type, withShape) { var _this = this, isPlural = /s$/.test(type), useIdKey = /^(area|arc|line)s?$/.test(type), key = isPlural ? "id" : "index"; return function (d) { var data = d.data || d, result = (withShape ? _this.generateClass(config_classes[isPlural ? "shapes" : "shape"], data[key]) : "") + _this.generateClass(config_classes[type], data[useIdKey ? "id" : key]); return result.trim(); }; }, /** * Get chart class string * @param {string} type Shape type * @returns {string} Class string * @private */ getChartClass: function getChartClass(type) { var _this2 = this; return function (d) { return config_classes["chart" + type] + _this2.classTarget((d.data ? d.data : d).id); }; }, generateExtraLineClass: function generateExtraLineClass() { var $$ = this, classes = $$.config.line_classes || [], ids = []; return function (d) { var id = d.id || d.data && d.data.id || d; return ids.indexOf(id) < 0 && ids.push(id), classes[ids.indexOf(id) % classes.length]; }; }, classRegion: function classRegion(d, i) { return this.generateClass(config_classes.region, i) + " " + ("class" in d ? d.class : ""); }, classTarget: function classTarget(id) { var additionalClassSuffix = this.config.data_classes[id], additionalClass = ""; return additionalClassSuffix && (additionalClass = " " + config_classes.target + "-" + additionalClassSuffix), this.generateClass(config_classes.target, id) + additionalClass; }, classFocus: function classFocus(d) { return this.classFocused(d) + this.classDefocused(d); }, classFocused: function classFocused(d) { return " " + (this.state.focusedTargetIds.indexOf(d.id) >= 0 ? config_classes.focused : ""); }, classDefocused: function classDefocused(d) { return " " + (this.state.defocusedTargetIds.indexOf(d.id) >= 0 ? config_classes.defocused : ""); }, getTargetSelectorSuffix: function getTargetSelectorSuffix(targetId) { return targetId || targetId === 0 ? ("-" + targetId).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g, "-") : ""; }, selectorTarget: function selectorTarget(id, prefix) { var pfx = prefix || "", target = this.getTargetSelectorSuffix(id); // select target & circle return pfx + "." + (config_classes.target + target) + ", " + pfx + "." + (config_classes.circles + target); }, selectorTargets: function selectorTargets(idsValue, prefix) { var _this3 = this, ids = idsValue || []; return ids.length ? ids.map(function (id) { return _this3.selectorTarget(id, prefix); }) : null; }, selectorLegend: function selectorLegend(id) { return "." + (config_classes.legendItem + this.getTargetSelectorSuffix(id)); }, selectorLegends: function selectorLegends(ids) { var _this4 = this; return ids && ids.length ? ids.map(function (id) { return _this4.selectorLegend(id); }) : null; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/category.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var category = ({ /** * Category Name * @param {number} i Index number * @returns {string} category Name * @private */ categoryName: function categoryName(i) { var categories = this.config.axis_x_categories; return categories && i < categories.length ? categories[i] : i; } }); // EXTERNAL MODULE: external {"commonjs":"d3-scale","commonjs2":"d3-scale","amd":"d3-scale","root":"d3"} var external_commonjs_d3_scale_commonjs2_d3_scale_amd_d3_scale_root_d3_ = __webpack_require__(6); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/color.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Set pattern's background color * (it adds a element to simulate bg-color) * @param {SVGPatternElement} pattern SVG pattern element * @param {string} color Color string * @param {string} id ID to be set * @returns {{id: string, node: SVGPatternElement}} * @private */ var colorizePattern = function (pattern, color, id) { var node = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(pattern.cloneNode(!0)); return node.attr("id", id).insert("rect", ":first-child").attr("width", node.attr("width")).attr("height", node.attr("height")).style("fill", color), { id: id, node: node.node() }; }, schemeCategory10 = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf"]; // Replacement of d3.schemeCategory10. // Contained differently depend on d3 version: v4(d3-scale), v5(d3-scale-chromatic) /* harmony default export */ var internals_color = ({ /** * Get color pattern from CSS file * CSS should be defined as: background-image: url("#00c73c;#fa7171; ..."); * @returns {Array} * @private */ getColorFromCss: function getColorFromCss() { var cacheKey = KEY.colorPattern, body = browser_doc.body, pattern = body[cacheKey]; if (!pattern) { var span = browser_doc.createElement("span"); span.className = config_classes.colorPattern, span.style.display = "none", body.appendChild(span); var content = win.getComputedStyle(span).backgroundImage; span.parentNode.removeChild(span), content.indexOf(";") > -1 && (pattern = content.replace(/url[^#]*|["'()]|(\s|%20)/g, "").split(";").map(function (v) { return v.trim().replace(/[\"'\s]/g, ""); }).filter(Boolean), body[cacheKey] = pattern); } return pattern; }, generateColor: function generateColor() { var $$ = this, config = $$.config, colors = config.data_colors, callback = config.data_color, ids = [], pattern = notEmpty(config.color_pattern) ? config.color_pattern : (0,external_commonjs_d3_scale_commonjs2_d3_scale_amd_d3_scale_root_d3_.scaleOrdinal)($$.getColorFromCss() || schemeCategory10).range(), originalColorPattern = pattern; if (isFunction(config.color_tiles)) { var tiles = config.color_tiles.bind($$.api)(), colorizedPatterns = pattern.map(function (p, index) { var color = p.replace(/[#\(\)\s,]/g, ""), id = $$.state.datetimeId + "-pattern-" + color + "-" + index; return colorizePattern(tiles[index % tiles.length], p, id); }); // Add background color to patterns pattern = colorizedPatterns.map(function (p) { return "url(#" + p.id + ")"; }), $$.patterns = colorizedPatterns; } return function (d) { var color, id = d.id || d.data && d.data.id || d, isLine = $$.isTypeOf(id, ["line", "spline", "step"]) || !config.data_types[id]; return isFunction(colors[id]) ? color = colors[id].bind($$.api)(d) : colors[id] ? color = colors[id] : (ids.indexOf(id) < 0 && ids.push(id), color = isLine ? originalColorPattern[ids.indexOf(id) % originalColorPattern.length] : pattern[ids.indexOf(id) % pattern.length], colors[id] = color), isFunction(callback) ? callback.bind($$.api)(color, d) : color; }; }, generateLevelColor: function generateLevelColor() { var $$ = this, config = $$.config, colors = config.color_pattern, threshold = config.color_threshold, asValue = threshold.unit === "value", max = threshold.max || 100, values = threshold.values && threshold.values.length ? threshold.values : []; return notEmpty(threshold) ? function (value) { var v = asValue ? value : value * 100 / max, color = colors[colors.length - 1]; for (var i = 0, l = values.length; i < l; i++) if (v <= values[i]) { color = colors[i]; break; } return color; } : null; }, /** * Set the data over color. * When is out, will restate in its previous color value * @param {boolean} isOver true: set overed color, false: restore * @param {number|object} d target index or data object for Arc type * @private */ setOverColor: function setOverColor(isOver, d) { var $$ = this, config = $$.config, main = $$.$el.main, onover = config.color_onover, color = isOver ? onover : $$.color; isObject(color) ? color = function (_ref) { var id = _ref.id; return id in onover ? onover[id] : $$.color(id); } : isString(color) ? color = function () { return onover; } : isFunction(onover) && (color = color.bind($$.api)), main.selectAll(isObject(d) ? // when is Arc type "." + config_classes.arc + $$.getTargetSelectorSuffix(d.id) : "." + config_classes.shape + "-" + d).style("fill", color); } }); ;// CONCATENATED MODULE: ./src/config/const.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Chart type constant * @private */ var TYPE = { AREA: "area", AREA_LINE_RANGE: "area-line-range", AREA_SPLINE: "area-spline", AREA_SPLINE_RANGE: "area-spline-range", AREA_STEP: "area-step", BAR: "bar", BUBBLE: "bubble", CANDLESTICK: "candlestick", DONUT: "donut", GAUGE: "gauge", LINE: "line", PIE: "pie", RADAR: "radar", SCATTER: "scatter", SPLINE: "spline", STEP: "step" }; /** * chart types by category * @private */ var TYPE_BY_CATEGORY = { Area: [TYPE.AREA, TYPE.AREA_SPLINE, TYPE.AREA_SPLINE_RANGE, TYPE.AREA_LINE_RANGE, TYPE.AREA_STEP], AreaRange: [TYPE.AREA_SPLINE_RANGE, TYPE.AREA_LINE_RANGE], Arc: [TYPE.PIE, TYPE.DONUT, TYPE.GAUGE, TYPE.RADAR], Line: [TYPE.LINE, TYPE.SPLINE, TYPE.AREA, TYPE.AREA_SPLINE, TYPE.AREA_SPLINE_RANGE, TYPE.AREA_LINE_RANGE, TYPE.STEP, TYPE.AREA_STEP], Step: [TYPE.STEP, TYPE.AREA_STEP], Spline: [TYPE.SPLINE, TYPE.AREA_SPLINE, TYPE.AREA_SPLINE_RANGE] }; ;// CONCATENATED MODULE: ./src/ChartInternal/internals/domain.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var domain = ({ getYDomainMinMax: function getYDomainMinMax(targets, type) { var $$ = this, axis = $$.axis, config = $$.config, isMin = type === "min", dataGroups = config.data_groups, ids = $$.mapToIds(targets), ys = $$.getValuesAsIdKeyed(targets); return dataGroups.length > 0 && function () { for (var idsInGroup, _ret, hasValue = $$["has" + (isMin ? "Negative" : "Positive") + "ValueInTargets"](targets), _loop = function (j, _idsInGroup) { if (_idsInGroup = _idsInGroup.filter(function (v) { return ids.indexOf(v) >= 0; }), _idsInGroup.length === 0) return idsInGroup = _idsInGroup, "continue"; var baseId = _idsInGroup[0], baseAxisId = axis.getId(baseId); hasValue && ys[baseId] && (ys[baseId] = ys[baseId].map(function (v) { return (isMin ? v < 0 : v > 0) ? v : 0; })); for (var id, _ret2, _loop2 = function (k, id) { if (!ys[id]) return "continue"; var axisId = axis.getId(id); ys[id].forEach(function (v, i) { var val = +v, meetCondition = isMin ? val > 0 : val < 0; axisId !== baseAxisId || hasValue && meetCondition || (ys[baseId][i] += val); }); }, k = 1; id = _idsInGroup[k]; k++) _ret2 = _loop2(k, id), _ret2 === "continue"; idsInGroup = _idsInGroup; }, j = 0; idsInGroup = dataGroups[j]; j++) _ret = _loop(j, idsInGroup), _ret === "continue"; }(), getMinMax(type, Object.keys(ys).map(function (key) { return getMinMax(type, ys[key]); })); }, getYDomainMin: function getYDomainMin(targets) { return this.getYDomainMinMax(targets, "min"); }, getYDomainMax: function getYDomainMax(targets) { return this.getYDomainMinMax(targets, "max"); }, /** * Check if hidden targets bound to the given axis id * @param {string} id ID to be checked * @returns {boolean} * @private */ isHiddenTargetWithYDomain: function isHiddenTargetWithYDomain(id) { var $$ = this; return $$.state.hiddenTargetIds.some(function (v) { return $$.axis.getId(v) === id; }); }, getYDomain: function getYDomain(targets, axisId, xDomain) { var $$ = this, axis = $$.axis, config = $$.config, scale = $$.scale, pfx = "axis_" + axisId; if ($$.isStackNormalized()) return [0, 100]; var isLog = scale && scale[axisId] && scale[axisId].type === "log", targetsByAxisId = targets.filter(function (t) { return axis.getId(t.id) === axisId; }), yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId; if (yTargets.length === 0) // use domain of the other axis if target of axisId is none return $$.isHiddenTargetWithYDomain(axisId) ? scale[axisId].domain() : axisId === "y2" ? scale.y.domain() : // When all data bounds to y2, y Axis domain is called prior y2. // So, it needs to call to get y2 domain here $$.getYDomain(targets, "y2", xDomain); var yMin = config[pfx + "_min"], yMax = config[pfx + "_max"], yDomainMin = $$.getYDomainMin(yTargets), yDomainMax = $$.getYDomainMax(yTargets), center = config[pfx + "_center"], isZeroBased = [TYPE.BAR, TYPE.BUBBLE, TYPE.SCATTER].concat(TYPE_BY_CATEGORY.Line).some(function (v) { var type = v.indexOf("area") > -1 ? "area" : v; return $$.hasType(v, yTargets) && config[type + "_zerobased"]; }), isInverted = config[pfx + "_inverted"], showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated, showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated; yDomainMin = isValue(yMin) ? yMin : isValue(yMax) ? yDomainMin < yMax ? yDomainMin : yMax - 10 : yDomainMin, yDomainMax = isValue(yMax) ? yMax : isValue(yMin) ? yMin < yDomainMax ? yDomainMax : yMin + 10 : yDomainMax, isNaN(yDomainMin) && (yDomainMin = 0), isNaN(yDomainMax) && (yDomainMax = yDomainMin), yDomainMin === yDomainMax && (yDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0); var isAllPositive = yDomainMin >= 0 && yDomainMax >= 0, isAllNegative = yDomainMin <= 0 && yDomainMax <= 0; (isValue(yMin) && isAllPositive || isValue(yMax) && isAllNegative) && (isZeroBased = !1), isZeroBased && (isAllPositive && (yDomainMin = 0), isAllNegative && (yDomainMax = 0)); var domainLength = Math.abs(yDomainMax - yDomainMin), padding = { top: domainLength * .1, bottom: domainLength * .1 }; if (isDefined(center)) { var yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax)); yDomainMax = center + yDomainAbs, yDomainMin = center - yDomainAbs; } // add padding for data label if (showHorizontalDataLabel) { var diff = diffDomain(scale.y.range()), ratio = $$.getDataLabelLength(yDomainMin, yDomainMax, "width").map(function (v) { return v / diff; }); ["bottom", "top"].forEach(function (v, i) { padding[v] += domainLength * (ratio[i] / (1 - ratio[0] - ratio[1])); }); } else if (showVerticalDataLabel) { var lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, "height"); ["bottom", "top"].forEach(function (v, i) { padding[v] += axis.convertPixelsToAxisPadding(lengths[i], domainLength); }); } // if padding is set, the domain will be updated relative the current domain value // ex) $$.height=300, padding.top=150, domainLength=4 --> domain=6 var p = config[pfx + "_padding"]; notEmpty(p) && ["bottom", "top"].forEach(function (v) { padding[v] = axis.getPadding(p, v, padding[v], domainLength); }), isZeroBased && (isAllPositive && (padding.bottom = yDomainMin), isAllNegative && (padding.top = -yDomainMax)); var domain = isLog ? [yDomainMin, yDomainMax].map(function (v) { return v < 0 ? 0 : v; }) : [yDomainMin - padding.bottom, yDomainMax + padding.top]; return isInverted ? domain.reverse() : domain; }, getXDomainMinMax: function getXDomainMinMax(targets, type) { var $$ = this, configValue = $$.config["axis_x_" + type], dataValue = getMinMax(type, targets.map(function (t) { return getMinMax(type, t.values.map(function (v) { return v.x; })); })), value = isObject(configValue) ? configValue.value : configValue; return value = isDefined(value) && $$.axis.isTimeSeries() ? parseDate.bind(this)(value) : value, isObject(configValue) && configValue.fit && (type === "min" && value < dataValue || type === "max" && value > dataValue) && (value = undefined), isDefined(value) ? value : dataValue; }, getXDomainMin: function getXDomainMin(targets) { return this.getXDomainMinMax(targets, "min"); }, getXDomainMax: function getXDomainMax(targets) { return this.getXDomainMinMax(targets, "max"); }, getXDomainPadding: function getXDomainPadding(domain) { var maxDataCount, padding, $$ = this, axis = $$.axis, config = $$.config, diff = domain[1] - domain[0], xPadding = config.axis_x_padding; axis.isCategorized() ? padding = 0 : $$.hasType("bar") ? (maxDataCount = $$.getMaxDataCount(), padding = maxDataCount > 1 ? diff / (maxDataCount - 1) / 2 : .5) : padding = diff * .01; var left = padding, right = padding; return isObject(xPadding) && notEmpty(xPadding) ? (left = isValue(xPadding.left) ? xPadding.left : padding, right = isValue(xPadding.right) ? xPadding.right : padding) : isNumber(config.axis_x_padding) && (left = xPadding, right = xPadding), { left: left, right: right }; }, getXDomain: function getXDomain(targets) { var $$ = this, isLog = $$.scale.x.type === "log", xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)], min = 0, max = 0; if (isLog) min = xDomain[0], max = xDomain[1];else { var isCategorized = $$.axis.isCategorized(), isTimeSeries = $$.axis.isTimeSeries(), padding = $$.getXDomainPadding(xDomain), _xDomain = xDomain, firstX = _xDomain[0], lastX = _xDomain[1]; firstX - lastX !== 0 || isCategorized || (isTimeSeries ? (firstX = new Date(firstX.getTime() * .5), lastX = new Date(lastX.getTime() * 1.5)) : (firstX = firstX === 0 ? 1 : firstX * .5, lastX = lastX === 0 ? -1 : lastX * 1.5)), (firstX || firstX === 0) && (min = isTimeSeries ? new Date(firstX.getTime() - padding.left) : firstX - padding.left), (lastX || lastX === 0) && (max = isTimeSeries ? new Date(lastX.getTime() + padding.right) : lastX + padding.right); } return [min, max]; }, updateXDomain: function updateXDomain(targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) { var $$ = this, config = $$.config, org = $$.org, _$$$scale = $$.scale, x = _$$$scale.x, subX = _$$$scale.subX, zoomEnabled = config.zoom_enabled; if (withUpdateOrgXDomain && (x.domain(domain || sortValue($$.getXDomain(targets))), org.xDomain = x.domain(), zoomEnabled && $$.zoom.updateScaleExtent(), subX.domain(x.domain()), $$.brush && $$.brush.scale(subX)), withUpdateXDomain) { var domainValue = domain || !$$.brush || brushEmpty($$) ? org.xDomain : getBrushSelection($$).map(subX.invert); x.domain(domainValue), zoomEnabled && $$.zoom.updateScaleExtent(); } // Trim domain when too big by zoom mousemove event return withTrim && x.domain($$.trimXDomain(x.orgDomain())), x.domain(); }, trimXDomain: function trimXDomain(domain) { var zoomDomain = this.getZoomDomain(), min = zoomDomain[0], max = zoomDomain[1]; return domain[0] <= min && (domain[1] = +domain[1] + (min - domain[0]), domain[0] = min), max <= domain[1] && (domain[0] = +domain[0] - (domain[1] - max), domain[1] = max), domain; }, /** * Get zoom domain * @returns {Array} zoom domain * @private */ getZoomDomain: function getZoomDomain() { var $$ = this, config = $$.config, org = $$.org, _org$xDomain = org.xDomain, min = _org$xDomain[0], max = _org$xDomain[1]; return isDefined(config.zoom_x_min) && (min = getMinMax("min", [min, config.zoom_x_min])), isDefined(config.zoom_x_max) && (max = getMinMax("max", [max, config.zoom_x_max])), [min, max]; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/format.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Get formatted * @param {object} $$ Context * @param {string} typeValue Axis type * @param {number} v Value to be formatted * @returns {number | string} * @private */ function getFormat($$, typeValue, v) { var config = $$.config, type = "axis_" + typeValue + "_tick_format", format = config[type] ? config[type] : $$.defaultValueFormat; return format(v); } /* harmony default export */ var format = ({ getYFormat: function getYFormat(forArc) { var $$ = this, yFormat = $$.yFormat, y2Format = $$.y2Format; return forArc && !$$.hasType("gauge") && (yFormat = $$.defaultArcValueFormat, y2Format = $$.defaultArcValueFormat), function (v, ratio, id) { var format = $$.axis && $$.axis.getId(id) === "y2" ? y2Format : yFormat; return format.call($$, v, ratio); }; }, yFormat: function yFormat(v) { return getFormat(this, "y", v); }, y2Format: function y2Format(v) { return getFormat(this, "y2", v); }, defaultValueFormat: function defaultValueFormat(v) { return isValue(v) ? +v : ""; }, defaultArcValueFormat: function defaultArcValueFormat(v, ratio) { return (ratio * 100).toFixed(1) + "%"; }, dataLabelFormat: function dataLabelFormat(targetId) { var $$ = this, dataLabels = $$.config.data_labels, defaultFormat = function (v) { return isValue(v) ? +v : ""; }, format = defaultFormat; return isFunction(dataLabels.format) ? format = dataLabels.format : isObjectType(dataLabels.format) && (dataLabels.format[targetId] ? format = dataLabels.format[targetId] === !0 ? defaultFormat : dataLabels.format[targetId] : format = function () { return ""; }), format.bind($$.api); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/legend.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var internals_legend = ({ /** * Initialize the legend. * @private */ initLegend: function initLegend() { var $$ = this, config = $$.config, $el = $$.$el; $$.legendItemTextBox = {}, $$.state.legendHasRendered = !1, config.legend_show ? (!config.legend_contents_bindto && ($el.legend = $$.$el.svg.append("g").classed(config_classes.legend, !0).attr("transform", $$.getTranslate("legend"))), $$.updateLegend()) : $$.state.hiddenLegendIds = $$.mapToIds($$.data.targets); }, /** * Update legend element * @param {Array} targetIds ID's of target * @param {object} options withTransform : Whether to use the transform property / withTransitionForTransform: Whether transition is used when using the transform property / withTransition : whether or not to transition. * @param {object} transitions Return value of the generateTransitions * @private */ updateLegend: function updateLegend(targetIds, options, transitions) { var $$ = this, config = $$.config, state = $$.state, scale = $$.scale, $el = $$.$el, optionz = options || { withTransform: !1, withTransitionForTransform: !1, withTransition: !1 }; // toggle legend state // Update size and scale // Update g positions optionz.withTransition = getOption(optionz, "withTransition", !0), optionz.withTransitionForTransform = getOption(optionz, "withTransitionForTransform", !0), config.legend_contents_bindto && config.legend_contents_template ? $$.updateLegendTemplate() : $$.updateLegendElement(targetIds || $$.mapToIds($$.data.targets), optionz, transitions), $el.legend.selectAll("." + config_classes.legendItem).classed(config_classes.legendItemHidden, function (id) { var hide = !$$.isTargetToShow(id); return hide && (this.style.opacity = null), hide; }), $$.updateScales(!1, !scale.zoom), $$.updateSvgSize(), $$.transformAll(optionz.withTransitionForTransform, transitions), state.legendHasRendered = !0; }, /** * Update legend using template option * @private */ updateLegendTemplate: function updateLegendTemplate() { var $$ = this, config = $$.config, $el = $$.$el, wrapper = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(config.legend_contents_bindto), template = config.legend_contents_template; if (!wrapper.empty()) { var targets = $$.mapToIds($$.data.targets), ids = [], html = ""; targets.forEach(function (v) { var content = isFunction(template) ? template.bind($$.api)(v, $$.color(v), $$.api.data(v)[0].values) : tplProcess(template, { COLOR: $$.color(v), TITLE: v }); content && (ids.push(v), html += content); }); var legendItem = wrapper.html(html).selectAll(function () { return this.childNodes; }).data(ids); $$.setLegendItem(legendItem), $el.legend = wrapper; } }, /** * Update the size of the legend. * @param {Obejct} size Size object * @private */ updateSizeForLegend: function updateSizeForLegend(size) { var $$ = this, config = $$.config, _$$$state = $$.state, isLegendTop = _$$$state.isLegendTop, isLegendLeft = _$$$state.isLegendLeft, isLegendRight = _$$$state.isLegendRight, isLegendInset = _$$$state.isLegendInset, current = _$$$state.current, width = size.width, height = size.height, insetLegendPosition = { top: isLegendTop ? $$.getCurrentPaddingTop() + config.legend_inset_y + 5.5 : current.height - height - $$.getCurrentPaddingBottom() - config.legend_inset_y, left: isLegendLeft ? $$.getCurrentPaddingLeft() + config.legend_inset_x + .5 : current.width - width - $$.getCurrentPaddingRight() - config.legend_inset_x + .5 }; $$.state.margin3 = { top: isLegendRight ? 0 : isLegendInset ? insetLegendPosition.top : current.height - height, right: NaN, bottom: 0, left: isLegendRight ? current.width - width : isLegendInset ? insetLegendPosition.left : 0 }; }, /** * Transform Legend * @param {boolean} withTransition whether or not to transition. * @private */ transformLegend: function transformLegend(withTransition) { var $$ = this, legend = $$.$el.legend; (withTransition ? legend.transition() : legend).attr("transform", $$.getTranslate("legend")); }, /** * Update the legend step * @param {number} step Step value * @private */ updateLegendStep: function updateLegendStep(step) { this.state.legendStep = step; }, /** * Update legend item width * @param {number} width Width value * @private */ updateLegendItemWidth: function updateLegendItemWidth(width) { this.state.legendItemWidth = width; }, /** * Update legend item height * @param {number} height Height value * @private */ updateLegendItemHeight: function updateLegendItemHeight(height) { this.state.legendItemHeight = height; }, /** * Update legend item color * @param {string} id Corresponding data ID value * @param {string} color Color value * @private */ updateLegendItemColor: function updateLegendItemColor(id, color) { var legend = this.$el.legend; legend && legend.select("." + config_classes.legendItem + "-" + id + " line").style("stroke", color); }, /** * Get the width of the legend * @returns {number} width * @private */ getLegendWidth: function getLegendWidth() { var $$ = this, _$$$state2 = $$.state, width = _$$$state2.current.width, isLegendRight = _$$$state2.isLegendRight, isLegendInset = _$$$state2.isLegendInset, legendItemWidth = _$$$state2.legendItemWidth, legendStep = _$$$state2.legendStep; return $$.config.legend_show ? isLegendRight || isLegendInset ? legendItemWidth * (legendStep + 1) : width : 0; }, /** * Get the height of the legend * @returns {number} height * @private */ getLegendHeight: function getLegendHeight() { var $$ = this, _$$$state3 = $$.state, current = _$$$state3.current, isLegendRight = _$$$state3.isLegendRight, legendItemHeight = _$$$state3.legendItemHeight, legendStep = _$$$state3.legendStep; return $$.config.legend_show ? isLegendRight ? current.height : Math.max(20, legendItemHeight) * (legendStep + 1) : 0; }, /** * Get the opacity of the legend * @param {d3.selection} legendItem Legend item node * @returns {string|null} opacity * @private */ opacityForLegend: function opacityForLegend(legendItem) { return legendItem.classed(config_classes.legendItemHidden) ? null : "1"; }, /** * Get the opacity of the legend that is unfocused * @param {d3.selection} legendItem Legend item node * @returns {string|null} opacity * @private */ opacityForUnfocusedLegend: function opacityForUnfocusedLegend(legendItem) { return legendItem.classed(config_classes.legendItemHidden) ? null : "0.3"; }, /** * Toggles the focus of the legend * @param {Array} targetIds ID's of target * @param {boolean} focus whether or not to focus. * @private */ toggleFocusLegend: function toggleFocusLegend(targetIds, focus) { var $$ = this, legend = $$.$el.legend, targetIdz = $$.mapToTargetIds(targetIds); legend && legend.selectAll("." + config_classes.legendItem).filter(function (id) { return targetIdz.indexOf(id) >= 0; }).classed(config_classes.legendItemFocused, focus).transition().duration(100).style("opacity", function () { return (focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend).call($$, (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this)); }); }, /** * Revert the legend to its default state * @private */ revertLegend: function revertLegend() { var $$ = this, legend = $$.$el.legend; legend && legend.selectAll("." + config_classes.legendItem).classed(config_classes.legendItemFocused, !1).transition().duration(100).style("opacity", function () { return $$.opacityForLegend((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this)); }); }, /** * Shows the legend * @param {Array} targetIds ID's of target * @private */ showLegend: function showLegend(targetIds) { var $$ = this, config = $$.config, $el = $$.$el; config.legend_show || (config.legend_show = !0, $el.legend ? $el.legend.style("visibility", "visible") : $$.initLegend(), !$$.state.legendHasRendered && $$.updateLegend()), $$.removeHiddenLegendIds(targetIds), $el.legend.selectAll($$.selectorLegends(targetIds)).style("visibility", "visible").transition().style("opacity", function () { return $$.opacityForLegend((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this)); }); }, /** * Hide the legend * @param {Array} targetIds ID's of target * @private */ hideLegend: function hideLegend(targetIds) { var $$ = this, config = $$.config, legend = $$.$el.legend; config.legend_show && isEmpty(targetIds) && (config.legend_show = !1, legend.style("visibility", "hidden")), $$.addHiddenLegendIds(targetIds), legend.selectAll($$.selectorLegends(targetIds)).style("opacity", "0").style("visibility", "hidden"); }, /** * Get legend item textbox dimension * @param {string} id Data ID * @param {HTMLElement|d3.selection} textElement Text node element * @returns {object} Bounding rect * @private */ getLegendItemTextBox: function getLegendItemTextBox(id, textElement) { var data, $$ = this, cache = $$.cache, state = $$.state, cacheKey = KEY.legendItemTextBox; return id && (data = !state.redrawing && cache.get(cacheKey) || {}, !data[id] && (data[id] = $$.getTextRect(textElement, config_classes.legendItem), cache.add(cacheKey, data)), data = data[id]), data; }, /** * Set legend item style & bind events * @param {d3.selection} item Item node * @private */ setLegendItem: function setLegendItem(item) { var $$ = this, api = $$.api, config = $$.config, state = $$.state, isTouch = state.inputType === "touch", hasGauge = $$.hasType("gauge"); item.attr("class", function (id) { var node = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), itemClass = !node.empty() && node.attr("class") || ""; return itemClass + $$.generateClass(config_classes.legendItem, id); }).style("visibility", function (id) { return $$.isLegendToShow(id) ? "visible" : "hidden"; }), config.interaction_enabled && (item.style("cursor", "pointer").on("click", function (event, id) { callFn(config.legend_item_onclick, api, id) || (event.altKey ? (api.hide(), api.show(id)) : (api.toggle(id), (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.legendItemFocused, !1).style("opacity", null))), isTouch && $$.hideTooltip(); }), !isTouch && item.on("mouseout", function (event, id) { callFn(config.legend_item_onout, api, id) || ((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.legendItemFocused, !1), hasGauge && $$.undoMarkOverlapped($$, "." + config_classes.gaugeValue), $$.api.revert()); }).on("mouseover", function (event, id) { callFn(config.legend_item_onover, api, id) || ((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.legendItemFocused, !0), hasGauge && $$.markOverlapped(id, $$, "." + config_classes.gaugeValue), !state.transiting && $$.isTargetToShow(id) && api.focus(id)); })); }, /** * Update the legend * @param {Array} targetIds ID's of target * @param {object} options withTransform : Whether to use the transform property / withTransitionForTransform: Whether transition is used when using the transform property / withTransition : whether or not to transition. * @private */ updateLegendElement: function updateLegendElement(targetIds, options) { var xForLegend, yForLegend, background, $$ = this, config = $$.config, state = $$.state, legend = $$.$el.legend, posMin = 10, tileWidth = config.legend_item_tile_width + 5, maxWidth = 0, maxHeight = 0, totalLength = 0, offsets = {}, widths = {}, heights = {}, margins = [0], steps = {}, step = 0, isLegendRightOrInset = state.isLegendRight || state.isLegendInset, targetIdz = targetIds.filter(function (id) { return !isDefined(config.data_names[id]) || config.data_names[id] !== null; }), withTransition = options.withTransition, updatePositions = function (textElement, id, index) { var margin, isLast = index === targetIdz.length - 1, box = $$.getLegendItemTextBox(id, textElement), itemWidth = box.width + tileWidth + (isLast && !isLegendRightOrInset ? 0 : 10) + config.legend_padding, itemHeight = box.height + 4, itemLength = isLegendRightOrInset ? itemHeight : itemWidth, areaLength = isLegendRightOrInset ? $$.getLegendHeight() : $$.getLegendWidth(), updateValues = function (id2, withoutStep) { withoutStep || (margin = (areaLength - totalLength - itemLength) / 2, margin < posMin && (margin = (areaLength - itemLength) / 2, totalLength = 0, step++)), steps[id2] = step, margins[step] = state.isLegendInset ? 10 : margin, offsets[id2] = totalLength, totalLength += itemLength; }; if (index === 0 && (totalLength = 0, step = 0, maxWidth = 0, maxHeight = 0), config.legend_show && !$$.isLegendToShow(id)) return widths[id] = 0, heights[id] = 0, steps[id] = 0, void (offsets[id] = 0); widths[id] = itemWidth, heights[id] = itemHeight, (!maxWidth || itemWidth >= maxWidth) && (maxWidth = itemWidth), (!maxHeight || itemHeight >= maxHeight) && (maxHeight = itemHeight); var maxLength = isLegendRightOrInset ? maxHeight : maxWidth; config.legend_equally ? (Object.keys(widths).forEach(function (id2) { return widths[id2] = maxWidth; }), Object.keys(heights).forEach(function (id2) { return heights[id2] = maxHeight; }), margin = (areaLength - maxLength * targetIdz.length) / 2, margin < posMin ? (totalLength = 0, step = 0, targetIdz.forEach(function (id2) { return updateValues(id2); })) : updateValues(id, !0)) : updateValues(id); }; state.isLegendInset && (step = config.legend_inset_step ? config.legend_inset_step : targetIdz.length, $$.updateLegendStep(step)), state.isLegendRight ? (xForLegend = function (id) { return maxWidth * steps[id]; }, yForLegend = function (id) { return margins[steps[id]] + offsets[id]; }) : state.isLegendInset ? (xForLegend = function (id) { return maxWidth * steps[id] + 10; }, yForLegend = function (id) { return margins[steps[id]] + offsets[id]; }) : (xForLegend = function (id) { return margins[steps[id]] + offsets[id]; }, yForLegend = function (id) { return maxHeight * steps[id]; }); var xForLegendText = function (id, i) { return xForLegend(id, i) + 4 + config.legend_item_tile_width; }, xForLegendRect = function (id, i) { return xForLegend(id, i); }, x1ForLegendTile = function (id, i) { return xForLegend(id, i) - 2; }, x2ForLegendTile = function (id, i) { return xForLegend(id, i) - 2 + config.legend_item_tile_width; }, yForLegendText = function (id, i) { return yForLegend(id, i) + 9; }, yForLegendRect = function (id, i) { return yForLegend(id, i) - 5; }, yForLegendTile = function (id, i) { return yForLegend(id, i) + 4; }, pos = -200, l = legend.selectAll("." + config_classes.legendItem).data(targetIdz).enter().append("g"); $$.setLegendItem(l), l.append("text").text(function (id) { return isDefined(config.data_names[id]) ? config.data_names[id] : id; }).each(function (id, i) { updatePositions(this, id, i); }).style("pointer-events", "none").attr("x", isLegendRightOrInset ? xForLegendText : pos).attr("y", isLegendRightOrInset ? pos : yForLegendText), l.append("rect").attr("class", config_classes.legendItemEvent).style("fill-opacity", "0").attr("x", isLegendRightOrInset ? xForLegendRect : pos).attr("y", isLegendRightOrInset ? pos : yForLegendRect); var getColor = function (id) { var data = $$.getDataById(id); return $$.levelColor ? $$.levelColor(data.values[0].value) : $$.color(data); }, usePoint = config.legend_usePoint; if (usePoint) { var ids = []; l.append(function (d) { var pattern = notEmpty(config.point_pattern) ? config.point_pattern : [config.point_type]; ids.indexOf(d) === -1 && ids.push(d); var point = pattern[ids.indexOf(d) % pattern.length]; return point === "rectangle" && (point = "rect"), browser_doc.createElementNS(external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.namespaces.svg, "hasValidPointType" in $$ && $$.hasValidPointType(point) ? point : "use"); }).attr("class", config_classes.legendItemPoint).style("fill", getColor).style("pointer-events", "none").attr("href", function (data, idx, selection) { var node = selection[idx], nodeName = node.nodeName.toLowerCase(); return nodeName === "use" ? "#" + state.datetimeId + "-point-" + data : undefined; }); } else l.append("line").attr("class", config_classes.legendItemTile).style("stroke", getColor).style("pointer-events", "none").attr("x1", isLegendRightOrInset ? x1ForLegendTile : pos).attr("y1", isLegendRightOrInset ? pos : yForLegendTile).attr("x2", isLegendRightOrInset ? x2ForLegendTile : pos).attr("y2", isLegendRightOrInset ? pos : yForLegendTile).attr("stroke-width", config.legend_item_tile_height); // Set background for inset legend background = legend.select("." + config_classes.legendBackground + " rect"), state.isLegendInset && maxWidth > 0 && background.size() === 0 && (background = legend.insert("g", "." + config_classes.legendItem).attr("class", config_classes.legendBackground).append("rect")); var texts = legend.selectAll("text").data(targetIdz).text(function (id) { return isDefined(config.data_names[id]) ? config.data_names[id] : id; }) // MEMO: needed for update .each(function (id, i) { updatePositions(this, id, i); }); (withTransition ? texts.transition() : texts).attr("x", xForLegendText).attr("y", yForLegendText); var rects = legend.selectAll("rect." + config_classes.legendItemEvent).data(targetIdz); if ((withTransition ? rects.transition() : rects).attr("width", function (id) { return widths[id]; }).attr("height", function (id) { return heights[id]; }).attr("x", xForLegendRect).attr("y", yForLegendRect), usePoint) { var tiles = legend.selectAll("." + config_classes.legendItemPoint).data(targetIdz); (withTransition ? tiles.transition() : tiles).each(function () { var radius, width, height, nodeName = this.nodeName.toLowerCase(), pointR = config.point_r, x = "x", y = "y", xOffset = 2, yOffset = 2.5; if (nodeName === "circle") { var size = pointR * .2; x = "cx", y = "cy", radius = pointR + size, xOffset = pointR * 2, yOffset = -size; } else if (nodeName === "rect") { var _size = pointR * 2.5; width = _size, height = _size, yOffset = 3; } (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).attr(x, function (d) { return x1ForLegendTile(d) + xOffset; }).attr(y, function (d) { return yForLegendTile(d) - yOffset; }).attr("r", radius).attr("width", width).attr("height", height); }); } else { var _tiles = legend.selectAll("line." + config_classes.legendItemTile).data(targetIdz); (withTransition ? _tiles.transition() : _tiles).style("stroke", getColor).attr("x1", x1ForLegendTile).attr("y1", yForLegendTile).attr("x2", x2ForLegendTile).attr("y2", yForLegendTile); } background && (withTransition ? background.transition() : background).attr("height", $$.getLegendHeight() - 12).attr("width", maxWidth * (step + 1) + 10), $$.updateLegendItemWidth(maxWidth), $$.updateLegendItemHeight(maxHeight), $$.updateLegendStep(step); } }); // EXTERNAL MODULE: external {"commonjs":"d3-transition","commonjs2":"d3-transition","amd":"d3-transition","root":"d3"} var external_commonjs_d3_transition_commonjs2_d3_transition_amd_d3_transition_root_d3_ = __webpack_require__(8); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/redraw.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var redraw = ({ redraw: function redraw(options) { options === void 0 && (options = {}); var $$ = this, config = $$.config, state = $$.state, $el = $$.$el, main = $el.main; state.redrawing = !0; var targetsToShow = $$.filterTargetsToShow($$.data.targets), initializing = options.initializing, flow = options.flow, wth = $$.getWithOption(options), duration = wth.Transition ? config.transition_duration : 0, durationForExit = wth.TransitionForExit ? duration : 0, durationForAxis = wth.TransitionForAxis ? duration : 0, transitions = $$.axis && $$.axis.generateTransitions(durationForAxis); // text // title $$.updateSizes(initializing), wth.Legend && config.legend_show ? (options.withTransition = !!duration, $$.updateLegend($$.mapToIds($$.data.targets), options, transitions)) : wth.Dimension && $$.updateDimension(!0), (!$$.hasArcType() || state.hasRadar) && $$.updateCircleY && ($$.circleY = $$.updateCircleY()), state.hasAxis ? ($$.axis.redrawAxis(targetsToShow, wth, transitions, flow, initializing), config.data_empty_label_text && main.select("text." + config_classes.text + "." + config_classes.empty).attr("x", state.width / 2).attr("y", state.height / 2).text(config.data_empty_label_text).style("display", targetsToShow.length ? "none" : null), $$.hasGrid() && $$.updateGrid(duration), config.regions.length && $$.updateRegion(duration), ["bar", "candlestick", "line", "area"].forEach(function (v) { var name = capitalize(v); (/^(line|area)$/.test(v) && $$.hasTypeOf(name) || $$.hasType(v)) && $$["update" + name](durationForExit); }), $el.text && main.selectAll("." + config_classes.selectedCircles).filter($$.isBarType.bind($$)).selectAll("circle").remove(), config.interaction_enabled && !flow && wth.EventRect && ($$.redrawEventRect(), $$.bindZoomEvent && $$.bindZoomEvent())) : ($el.arcs && $$.redrawArc(duration, durationForExit, wth.Transform), $el.radar && $$.redrawRadar(durationForExit)), !state.resizing && ($$.hasPointType() || state.hasRadar) && $$.updateCircle(), $$.hasDataLabel() && !$$.hasArcType(null, ["radar"]) && $$.updateText(durationForExit), $$.redrawTitle && $$.redrawTitle(), initializing && $$.updateTypesElements(), $$.generateRedrawList(targetsToShow, flow, duration, wth.Subchart), $$.callPluginHook("$redraw", options, duration); }, /** * Generate redraw list * @param {object} targets targets data to be shown * @param {object} flow flow object * @param {number} duration duration value * @param {boolean} withSubchart whether or not to show subchart * @private */ generateRedrawList: function generateRedrawList(targets, flow, duration, withSubchart) { var $$ = this, config = $$.config, state = $$.state, shape = $$.getDrawShape(); state.hasAxis && config.subchart_show && $$.redrawSubchart(withSubchart, duration, shape); // generate flow var flowFn = flow && $$.generateFlow({ targets: targets, flow: flow, duration: flow.duration, shape: shape, xv: $$.xv.bind($$) }), isTransition = (duration || flowFn) && isTabVisible(), redrawList = $$.getRedrawList(shape, flow, flowFn, isTransition), afterRedraw = flow || config.onrendered ? function () { flowFn && flowFn(), state.redrawing = !1, callFn(config.onrendered, $$.api); } : null; if (afterRedraw) // Only use transition when current tab is visible. if (isTransition && redrawList.length) { // Wait for end of transitions for callback var waitForDraw = generateWait(); // transition should be derived from one transition (0,external_commonjs_d3_transition_commonjs2_d3_transition_amd_d3_transition_root_d3_.transition)().duration(duration).each(function () { redrawList.reduce(function (acc, t1) { return acc.concat(t1); }, []).forEach(function (t) { return waitForDraw.add(t); }); }).call(waitForDraw, afterRedraw); } else state.transiting || afterRedraw(); // update fadein condition $$.mapToIds($$.data.targets).forEach(function (id) { state.withoutFadeIn[id] = !0; }); }, getRedrawList: function getRedrawList(shape, flow, flowFn, isTransition) { var $$ = this, config = $$.config, _$$$state = $$.state, hasAxis = _$$$state.hasAxis, hasRadar = _$$$state.hasRadar, grid = $$.$el.grid, _shape$pos = shape.pos, cx = _shape$pos.cx, cy = _shape$pos.cy, xForText = _shape$pos.xForText, yForText = _shape$pos.yForText, list = []; return hasAxis && ((config.grid_x_lines.length || config.grid_y_lines.length) && list.push($$.redrawGrid(isTransition)), config.regions.length && list.push($$.redrawRegion(isTransition)), Object.keys(shape.type).forEach(function (v) { var name = capitalize(v), drawFn = shape.type[v]; (/^(area|line)$/.test(v) && $$.hasTypeOf(name) || $$.hasType(v)) && list.push($$["redraw" + name](drawFn, isTransition)); }), !flow && grid.main && list.push($$.updateGridFocus())), (!$$.hasArcType() || hasRadar) && notEmpty(config.data_labels) && config.data_labels !== !1 && list.push($$.redrawText(xForText, yForText, flow, isTransition)), ($$.hasPointType() || hasRadar) && !config.point_focus_only && $$.redrawCircle && list.push($$.redrawCircle(cx, cy, isTransition, flowFn)), list; }, updateAndRedraw: function updateAndRedraw(options) { options === void 0 && (options = {}); var transitions, $$ = this, config = $$.config, state = $$.state; // same with redraw // NOT same with redraw // Draw with new sizes & scales options.withTransition = getOption(options, "withTransition", !0), options.withTransform = getOption(options, "withTransform", !1), options.withLegend = getOption(options, "withLegend", !1), options.withUpdateXDomain = !0, options.withUpdateOrgXDomain = !0, options.withTransitionForExit = !1, options.withTransitionForTransform = getOption(options, "withTransitionForTransform", options.withTransition), options.withLegend && config.legend_show || (state.hasAxis && (transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0)), $$.updateScales(), $$.updateSvgSize(), $$.transformAll(options.withTransitionForTransform, transitions)), $$.redraw(options, transitions); }, redrawWithoutRescale: function redrawWithoutRescale() { this.redraw({ withY: !1, withSubchart: !1, withEventRect: !1, withTransitionForAxis: !1 }); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/scale.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Get scale * @param {string} [type='linear'] Scale type * @param {number} [min] Min range * @param {number} [max] Max range * @returns {d3.scaleLinear|d3.scaleTime} scale * @private */ function getScale(type, min, max) { type === void 0 && (type = "linear"), min === void 0 && (min = 0), max === void 0 && (max = 1); var scale = { linear: external_commonjs_d3_scale_commonjs2_d3_scale_amd_d3_scale_root_d3_.scaleLinear, log: external_commonjs_d3_scale_commonjs2_d3_scale_amd_d3_scale_root_d3_.scaleSymlog, _log: external_commonjs_d3_scale_commonjs2_d3_scale_amd_d3_scale_root_d3_.scaleLog, time: external_commonjs_d3_scale_commonjs2_d3_scale_amd_d3_scale_root_d3_.scaleTime }[type](); return scale.type = type, /_?log/.test(type) && scale.clamp(!0), scale.range([min, max]); } /* harmony default export */ var scale = ({ /** * Get x Axis scale function * @param {number} min Min value * @param {number} max Max value * @param {Array} domain Domain value * @param {Function} offset The offset getter to be sum * @returns {Function} scale * @private */ getXScale: function getXScale(min, max, domain, offset) { var $$ = this, scale = $$.scale.zoom || getScale($$.axis.getAxisType("x"), min, max); return $$.getCustomizedScale(domain ? scale.domain(domain) : scale, offset); }, /** * Get y Axis scale function * @param {string} id Axis id: 'y' or 'y2' * @param {number} min Min value * @param {number} max Max value * @param {Array} domain Domain value * @returns {Function} Scale function * @private */ getYScale: function getYScale(id, min, max, domain) { var $$ = this, scale = getScale($$.axis.getAxisType(id), min, max); return domain && scale.domain(domain), scale; }, /** * Get y Axis scale * @param {string} id Axis id * @param {boolean} isSub Weather is sub Axis * @returns {Function} Scale function * @private */ getYScaleById: function getYScaleById(id, isSub) { isSub === void 0 && (isSub = !1); var isY2 = this.axis.getId(id) === "y2", key = isSub ? isY2 ? "subY2" : "subY" : isY2 ? "y2" : "y"; return this.scale[key]; }, /** * Get customized scale * @param {d3.scaleLinear|d3.scaleTime} scaleValue Scale function * @param {Function} offsetValue Offset getter to be sum * @returns {Function} Scale function * @private */ getCustomizedScale: function getCustomizedScale(scaleValue, offsetValue) { var $$ = this, offset = offsetValue || function () { return $$.axis.x.tickOffset(); }, scale = function (d, raw) { var v = scaleValue(d) + offset(); return raw ? v : Math.ceil(v); }; // copy original scale methods for (var key in scaleValue) scale[key] = scaleValue[key]; return scale.orgDomain = function () { return scaleValue.domain(); }, scale.orgScale = function () { return scaleValue; }, $$.axis.isCategorized() && (scale.domain = function (domainValue) { var domain = domainValue; return arguments.length ? (scaleValue.domain(domain), scale) : (domain = this.orgDomain(), [domain[0], domain[1] + 1]); }), scale; }, /** * Update scale * @param {boolean} isInit Param is given at the init rendering * @param {boolean} updateXDomain If update x domain * @private */ updateScales: function updateScales(isInit, updateXDomain) { updateXDomain === void 0 && (updateXDomain = !0); var $$ = this, axis = $$.axis, config = $$.config, format = $$.format, org = $$.org, scale = $$.scale, _$$$state = $$.state, width = _$$$state.width, height = _$$$state.height, width2 = _$$$state.width2, height2 = _$$$state.height2, hasAxis = _$$$state.hasAxis; if (hasAxis) { var isRotated = config.axis_rotated, min = { x: isRotated ? 1 : 0, y: isRotated ? 0 : height, subX: isRotated ? 1 : 0, subY: isRotated ? 0 : height2 }, max = { x: isRotated ? height : width, y: isRotated ? width : 1, subX: isRotated ? height : width, subY: isRotated ? width2 : 1 }, xDomain = updateXDomain && scale.x && scale.x.orgDomain(), xSubDomain = updateXDomain && org.xDomain; // update edges // y Axis scale.x = $$.getXScale(min.x, max.x, xDomain, function () { return axis.x.tickOffset(); }), scale.subX = $$.getXScale(min.x, max.x, xSubDomain, function (d) { return d % 1 ? 0 : axis.subX.tickOffset(); }), format.xAxisTick = axis.getXAxisTickFormat(), axis.setAxis("x", scale.x, config.axis_x_tick_outer, isInit), config.subchart_show && axis.setAxis("subX", scale.subX, config.axis_x_tick_outer, isInit), scale.y = $$.getYScale("y", min.y, max.y, scale.y ? scale.y.domain() : config.axis_y_default), scale.subY = $$.getYScale("y", min.subY, max.subY, scale.subY ? scale.subY.domain() : config.axis_y_default), axis.setAxis("y", scale.y, config.axis_y_tick_outer, isInit), config.axis_y2_show && (scale.y2 = $$.getYScale("y2", min.y, max.y, scale.y2 ? scale.y2.domain() : config.axis_y2_default), scale.subY2 = $$.getYScale("y2", min.subY, max.subY, scale.subY2 ? scale.subY2.domain() : config.axis_y2_default), axis.setAxis("y2", scale.y2, config.axis_y2_tick_outer, isInit)); } else // update for arc $$.updateArc && $$.updateArc(); }, /** * Get the zoom or unzoomed scaled value * @param {Date|number|object} d Data value * @returns {number|null} * @private */ xx: function xx(d) { var $$ = this, config = $$.config, _$$$scale = $$.scale, x = _$$$scale.x, zoom = _$$$scale.zoom, fn = config.zoom_enabled && zoom ? zoom : x; return d ? fn(isValue(d.x) ? d.x : d) : null; }, xv: function xv(d) { var $$ = this, axis = $$.axis, config = $$.config, x = $$.scale.x, value = $$.getBaseValue(d); return axis.isTimeSeries() ? value = parseDate.call($$, value) : axis.isCategorized() && isString(value) && (value = config.axis_x_categories.indexOf(value)), Math.ceil(x(value)); }, yv: function yv(d) { var $$ = this, _$$$scale2 = $$.scale, y = _$$$scale2.y, y2 = _$$$scale2.y2, yScale = d.axis && d.axis === "y2" ? y2 : y; return Math.ceil(yScale($$.getBaseValue(d))); }, subxx: function subxx(d) { return d ? this.scale.subX(d.x) : null; } }); // EXTERNAL MODULE: external {"commonjs":"d3-shape","commonjs2":"d3-shape","amd":"d3-shape","root":"d3"} var external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_ = __webpack_require__(9); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/shape.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var shape = ({ /** * Get the shape draw function * @returns {object} * @private */ getDrawShape: function getDrawShape() { var $$ = this, isRotated = $$.config.axis_rotated, hasRadar = $$.state.hasRadar, shape = { type: {}, indices: {}, pos: {} }; if (["bar", "candlestick", "line", "area"].forEach(function (v) { var name = capitalize(/^(bubble|scatter)$/.test(v) ? "line" : v); if ($$.hasType(v) || $$.hasTypeOf(name) || v === "line" && ($$.hasType("bubble") || $$.hasType("scatter"))) { var indices = $$.getShapeIndices($$["is" + name + "Type"]), drawFn = $$["generateDraw" + name]; shape.indices[v] = indices, shape.type[v] = drawFn ? drawFn.bind($$)(indices, !1) : undefined; } }), !$$.hasArcType() || hasRadar) { // generate circle x/y functions depending on updated params var cx = hasRadar ? $$.radarCircleX : isRotated ? $$.circleY : $$.circleX, cy = hasRadar ? $$.radarCircleY : isRotated ? $$.circleX : $$.circleY; shape.pos = { xForText: $$.generateXYForText(shape.indices, !0), yForText: $$.generateXYForText(shape.indices, !1), cx: (cx || function () {}).bind($$), cy: (cy || function () {}).bind($$) }; } return shape; }, getShapeIndices: function getShapeIndices(typeFilter) { var $$ = this, config = $$.config, xs = config.data_xs, hasXs = notEmpty(xs), indices = {}, i = hasXs ? {} : 0; return hasXs && getUnique(Object.keys(xs).map(function (v) { return xs[v]; })).forEach(function (v) { i[v] = 0, indices[v] = {}; }), $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function (d) { for (var groups, xKey = (d.id in xs) ? xs[d.id] : "", ind = xKey ? indices[xKey] : indices, j = 0; groups = config.data_groups[j]; j++) if (!(groups.indexOf(d.id) < 0)) for (var _row4, _k4 = 0; _row4 = groups[_k4]; _k4++) if (_row4 in ind) { ind[d.id] = ind[_row4]; break; } isUndefined(ind[d.id]) && (ind[d.id] = xKey ? i[xKey]++ : i++, ind.__max__ = (xKey ? i[xKey] : i) - 1); }), indices; }, /** * Get indices value based on data ID value * @param {object} indices Indices object * @param {string} id Data id value * @returns {object} Indices object * @private */ getIndices: function getIndices(indices, id) { var xs = this.config.data_xs; return notEmpty(xs) ? indices[xs[id]] : indices; }, /** * Get indices max number * @param {object} indices Indices object * @returns {number} Max number * @private */ getIndicesMax: function getIndicesMax(indices) { return notEmpty(this.config.data_xs) ? // if is multiple xs, return total sum of xs' __max__ value Object.keys(indices).map(function (v) { return indices[v].__max__ || 0; }).reduce(function (acc, curr) { return acc + curr; }) : indices.__max__; }, getShapeX: function getShapeX(offset, indices, isSub) { var $$ = this, config = $$.config, scale = $$.scale, currScale = isSub ? scale.subX : scale.zoom || scale.x, barPadding = config.bar_padding, sum = function (p, c) { return p + c; }, halfWidth = isObjectType(offset) && (offset._$total.length ? offset._$total.reduce(sum) / 2 : 0); return function (d) { var ind = $$.getIndices(indices, d.id), index = d.id in ind ? ind[d.id] : 0, targetsNum = (ind.__max__ || 0) + 1, x = 0; if (notEmpty(d.x)) { var xPos = currScale(d.x, !0); x = halfWidth ? xPos - (offset[d.id] || offset._$width) + offset._$total.slice(0, index + 1).reduce(sum) - halfWidth : xPos - (isNumber(offset) ? offset : offset._$width) * (targetsNum / 2 - index); } // adjust x position for bar.padding optionq return offset && x && targetsNum > 1 && barPadding && (index && (x += barPadding * index), targetsNum > 2 ? x -= (targetsNum - 1) * barPadding / 2 : targetsNum === 2 && (x -= barPadding / 2)), x; }; }, getShapeY: function getShapeY(isSub) { var $$ = this, isStackNormalized = $$.isStackNormalized(); return function (d) { var value = d.value; return isNumber(d) ? value = d : isStackNormalized ? value = $$.getRatio("index", d, !0) : $$.isBubbleZType(d) && (value = $$.getBubbleZData(d.value, "y")), $$.getYScaleById(d.id, isSub)(value); }; }, /** * Get shape based y Axis min value * @param {string} id Data id * @returns {number} * @private */ getShapeYMin: function getShapeYMin(id) { var $$ = this, scale = $$.scale[$$.axis.getId(id)], _scale$domain = scale.domain(), yMin = _scale$domain[0]; return !$$.isGrouped(id) && yMin > 0 ? yMin : 0; }, /** * Get Shape's offset data * @param {Function} typeFilter Type filter function * @returns {object} * @private */ getShapeOffsetData: function getShapeOffsetData(typeFilter) { var $$ = this, targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))), isStackNormalized = $$.isStackNormalized(), shapeOffsetTargets = targets.map(function (target) { var rowValues = target.values, values = {}; $$.isStepType(target) && (rowValues = $$.convertValuesToStep(rowValues)); var rowValueMapByXValue = rowValues.reduce(function (out, d) { var key = +d.x; return out[key] = d, values[key] = isStackNormalized ? $$.getRatio("index", d, !0) : d.value, out; }, {}); return { id: target.id, rowValues: rowValues, rowValueMapByXValue: rowValueMapByXValue, values: values }; }), indexMapByTargetId = targets.reduce(function (out, _ref, index) { var id = _ref.id; return out[id] = index, out; }, {}); return { indexMapByTargetId: indexMapByTargetId, shapeOffsetTargets: shapeOffsetTargets }; }, getShapeOffset: function getShapeOffset(typeFilter, indices, isSub) { var $$ = this, _$$$getShapeOffsetDat = $$.getShapeOffsetData(typeFilter), shapeOffsetTargets = _$$$getShapeOffsetDat.shapeOffsetTargets, indexMapByTargetId = _$$$getShapeOffsetDat.indexMapByTargetId; return function (d, idx) { var ind = $$.getIndices(indices, d.id), scale = $$.getYScaleById(d.id, isSub), y0 = scale($$.getShapeYMin(d.id)), dataXAsNumber = +d.x, offset = y0; return shapeOffsetTargets.filter(function (t) { return t.id !== d.id; }).forEach(function (t) { if (ind[t.id] === ind[d.id] && indexMapByTargetId[t.id] < indexMapByTargetId[d.id]) { var row = t.rowValues[idx]; // check if the x values line up row && +row.x === dataXAsNumber || (row = t.rowValueMapByXValue[dataXAsNumber]), row && row.value * d.value >= 0 && (offset += scale(t.values[dataXAsNumber]) - y0); } }), offset; }; }, getBarW: function getBarW(type, axis, targetsNum) { var $$ = this, config = $$.config, org = $$.org, scale = $$.scale, maxDataCount = $$.getMaxDataCount(), isGrouped = type === "bar" && config.data_groups.length, configName = type + "_width", tickInterval = scale.zoom && !$$.axis.isCategorized() ? org.xDomain.map(function (v) { return scale.zoom(v); }).reduce(function (a, c) { return Math.abs(a) + c; }) / maxDataCount : axis.tickInterval(maxDataCount), getWidth = function (id) { var width = id ? config[configName][id] : config[configName], ratio = id ? width.ratio : config[configName + "_ratio"], max = id ? width.max : config[configName + "_max"], w = isNumber(width) ? width : targetsNum ? tickInterval * ratio / targetsNum : 0; return max && w > max ? max : w; }, result = getWidth(); return !isGrouped && isObjectType(config[configName]) && (result = { _$width: result, _$total: [] }, $$.filterTargetsToShow($$.data.targets).forEach(function (v) { config[configName][v.id] && (result[v.id] = getWidth(v.id), result._$total.push(result[v.id] || result._$width)); })), result; }, isWithinShape: function isWithinShape(that, d) { var isWithin, $$ = this, shape = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(that); return $$.isTargetToShow(d.id) ? "hasValidPointType" in $$ && $$.hasValidPointType(that.nodeName) ? isWithin = $$.isStepType(d) ? $$.isWithinStep(that, $$.getYScaleById(d.id)(d.value)) : $$.isWithinCircle(that, $$.isBubbleType(d) ? $$.pointSelectR(d) * 1.5 : 0) : that.nodeName === "path" && (isWithin = !shape.classed(config_classes.bar) || $$.isWithinBar(that)) : isWithin = !1, isWithin; }, getInterpolate: function getInterpolate(d) { var $$ = this, interpolation = $$.getInterpolateType(d); return { "basis": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveBasis, "basis-closed": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveBasisClosed, "basis-open": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveBasisOpen, "bundle": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveBundle, "cardinal": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveCardinal, "cardinal-closed": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveCardinalClosed, "cardinal-open": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveCardinalOpen, "catmull-rom": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveCatmullRom, "catmull-rom-closed": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveCatmullRomClosed, "catmull-rom-open": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveCatmullRomOpen, "monotone-x": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveMonotoneX, "monotone-y": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveMonotoneY, "natural": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveNatural, "linear-closed": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveLinearClosed, "linear": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveLinear, "step": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveStep, "step-after": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveStepAfter, "step-before": external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.curveStepBefore }[interpolation]; }, getInterpolateType: function getInterpolateType(d) { var $$ = this, config = $$.config, type = config.spline_interpolation_type, interpolation = $$.isInterpolationType(type) ? type : "cardinal"; return $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? config.line_step_type : "linear"; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/size.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var size = ({ /** * Update container size * @private */ setContainerSize: function setContainerSize() { var $$ = this, state = $$.state; state.current.width = $$.getCurrentWidth(), state.current.height = $$.getCurrentHeight(); }, getCurrentWidth: function getCurrentWidth() { var $$ = this; return $$.config.size_width || $$.getParentWidth(); }, getCurrentHeight: function getCurrentHeight() { var $$ = this, config = $$.config, h = config.size_height || $$.getParentHeight(); return h > 0 ? h : 320 / ($$.hasType("gauge") && !config.gauge_fullCircle ? 2 : 1); }, getCurrentPaddingTop: function getCurrentPaddingTop() { var $$ = this, config = $$.config, hasAxis = $$.state.hasAxis, $el = $$.$el, axesLen = hasAxis ? config.axis_y2_axes.length : 0, padding = isValue(config.padding_top) ? config.padding_top : 0; return $el.title && $el.title.node() && (padding += $$.getTitlePadding()), axesLen && config.axis_rotated && (padding += $$.getHorizontalAxisHeight("y2") * axesLen), padding; }, getCurrentPaddingBottom: function getCurrentPaddingBottom() { var $$ = this, config = $$.config, hasAxis = $$.state.hasAxis, axisId = config.axis_rotated ? "y" : "x", axesLen = hasAxis ? config["axis_" + axisId + "_axes"].length : 0, padding = isValue(config.padding_bottom) ? config.padding_bottom : 0; return padding + (axesLen ? $$.getHorizontalAxisHeight(axisId) * axesLen : 0); }, getCurrentPaddingLeft: function getCurrentPaddingLeft(withoutRecompute) { var padding, $$ = this, config = $$.config, hasAxis = $$.state.hasAxis, isRotated = config.axis_rotated, axisId = isRotated ? "x" : "y", axesLen = hasAxis ? config["axis_" + axisId + "_axes"].length : 0, axisWidth = hasAxis ? $$.getAxisWidthByAxisId(axisId, withoutRecompute) : 0; return padding = isValue(config.padding_left) ? config.padding_left : hasAxis && isRotated ? config.axis_x_show ? Math.max(ceil10(axisWidth), 40) : 1 : hasAxis && (!config.axis_y_show || config.axis_y_inner) ? $$.axis.getAxisLabelPosition("y").isOuter ? 30 : 1 : ceil10(axisWidth), padding + axisWidth * axesLen; }, getCurrentPaddingRight: function getCurrentPaddingRight(withXAxisTickTextOverflow) { withXAxisTickTextOverflow === void 0 && (withXAxisTickTextOverflow = !1); var padding, $$ = this, config = $$.config, hasAxis = $$.state.hasAxis, defaultPadding = 10, legendWidthOnRight = $$.state.isLegendRight ? $$.getLegendWidth() + 20 : 0, axesLen = hasAxis ? config.axis_y2_axes.length : 0, axisWidth = hasAxis ? $$.getAxisWidthByAxisId("y2") : 0, xAxisTickTextOverflow = withXAxisTickTextOverflow ? $$.axis.getXAxisTickTextY2Overflow(defaultPadding) : 0; return padding = isValue(config.padding_right) ? config.padding_right + 1 : $$.axis && config.axis_rotated ? defaultPadding + legendWidthOnRight : $$.axis && (!config.axis_y2_show || config.axis_y2_inner) ? Math.max(2 + legendWidthOnRight + ($$.axis.getAxisLabelPosition("y2").isOuter ? 20 : 0), xAxisTickTextOverflow) : Math.max(ceil10(axisWidth) + legendWidthOnRight, xAxisTickTextOverflow), padding + axisWidth * axesLen; }, /** * Get the parent rect element's size * @param {string} key property/attribute name * @returns {number} * @private */ getParentRectValue: function getParentRectValue(key) { for (var v, offsetName = "offset" + capitalize(key), parent = this.$el.chart.node(); !v && parent && parent.tagName !== "BODY";) { try { v = parent.getBoundingClientRect()[key]; } catch (e) { offsetName in parent && (v = parent[offsetName]); } parent = parent.parentNode; } if (key === "width") { // Sometimes element's width value is incorrect(ex. flex container) // In this case, use body's offsetWidth instead. var bodyWidth = browser_doc.body.offsetWidth; v > bodyWidth && (v = bodyWidth); } return v; }, getParentWidth: function getParentWidth() { return this.getParentRectValue("width"); }, getParentHeight: function getParentHeight() { var h = this.$el.chart.style("height"); return h.indexOf("px") > 0 ? parseInt(h, 10) : 0; }, getSvgLeft: function getSvgLeft(withoutRecompute) { var $$ = this, config = $$.config, $el = $$.$el, hasLeftAxisRect = config.axis_rotated || !config.axis_rotated && !config.axis_y_inner, leftAxisClass = config.axis_rotated ? config_classes.axisX : config_classes.axisY, leftAxis = $el.main.select("." + leftAxisClass).node(), svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : { right: 0 }, chartRect = $el.chart.node().getBoundingClientRect(), hasArc = $$.hasArcType(), svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute)); return svgLeft > 0 ? svgLeft : 0; }, updateDimension: function updateDimension(withoutAxis) { var $$ = this, config = $$.config, hasAxis = $$.state.hasAxis, $el = $$.$el; // pass 'withoutAxis' param to not animate at the init rendering hasAxis && !withoutAxis && $$.axis.x && config.axis_rotated && $$.axis.subX && $$.axis.subX.create($el.axis.subX), $$.updateScales(withoutAxis), $$.updateSvgSize(), $$.transformAll(!1); }, updateSvgSize: function updateSvgSize() { var $$ = this, _$$$state = $$.state, clip = _$$$state.clip, current = _$$$state.current, hasAxis = _$$$state.hasAxis, width = _$$$state.width, height = _$$$state.height, svg = $$.$el.svg; if (svg.attr("width", current.width).attr("height", current.height), hasAxis) { var brush = svg.select("." + config_classes.brush + " .overlay"), brushSize = { width: 0, height: 0 }; brush.size() && (brushSize.width = +brush.attr("width"), brushSize.height = +brush.attr("height")), svg.selectAll(["#" + clip.id, "#" + clip.idGrid]).select("rect").attr("width", width).attr("height", height), svg.select("#" + clip.idXAxis).select("rect").call($$.setXAxisClipPath.bind($$)), svg.select("#" + clip.idYAxis).select("rect").call($$.setYAxisClipPath.bind($$)), clip.idSubchart && svg.select("#" + clip.idSubchart).select("rect").attr("width", width).attr("height", brushSize.height); } }, /** * Update size values * @param {boolean} isInit If is called at initialization * @private */ updateSizes: function updateSizes(isInit) { var $$ = this, config = $$.config, state = $$.state, legend = $$.$el.legend, isRotated = config.axis_rotated, hasArc = $$.hasArcType(); isInit || $$.setContainerSize(); var currLegend = { width: legend ? $$.getLegendWidth() : 0, height: legend ? $$.getLegendHeight() : 0 }; !hasArc && config.axis_x_show && config.axis_x_tick_autorotate && $$.updateXAxisTickClip(); var legendHeightForBottom = state.isLegendRight || state.isLegendInset ? 0 : currLegend.height, xAxisHeight = isRotated || hasArc ? 0 : $$.getHorizontalAxisHeight("x"), subchartXAxisHeight = config.subchart_axis_x_show && config.subchart_axis_x_tick_text_show ? xAxisHeight : 30, subchartHeight = config.subchart_show && !hasArc ? config.subchart_size_height + subchartXAxisHeight : 0; state.margin = !hasArc && isRotated ? { top: $$.getHorizontalAxisHeight("y2") + $$.getCurrentPaddingTop(), right: hasArc ? 0 : $$.getCurrentPaddingRight(!0), bottom: $$.getHorizontalAxisHeight("y") + legendHeightForBottom + $$.getCurrentPaddingBottom(), left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft()) } : { top: 4 + $$.getCurrentPaddingTop(), // for top tick text right: hasArc ? 0 : $$.getCurrentPaddingRight(!0), bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(), left: hasArc ? 0 : $$.getCurrentPaddingLeft() }, state.margin2 = isRotated ? { top: state.margin.top, right: NaN, bottom: 20 + legendHeightForBottom, left: $$.state.rotatedPadding.left } : { top: state.current.height - subchartHeight - legendHeightForBottom, right: NaN, bottom: subchartXAxisHeight + legendHeightForBottom, left: state.margin.left }, state.margin3 = { top: 0, right: NaN, bottom: 0, left: 0 }, $$.updateSizeForLegend && $$.updateSizeForLegend(currLegend), state.width = state.current.width - state.margin.left - state.margin.right, state.height = state.current.height - state.margin.top - state.margin.bottom, state.width < 0 && (state.width = 0), state.height < 0 && (state.height = 0), state.width2 = isRotated ? state.margin.left - state.rotatedPadding.left - state.rotatedPadding.right : state.width, state.height2 = isRotated ? state.height : state.current.height - state.margin2.top - state.margin2.bottom, state.width2 < 0 && (state.width2 = 0), state.height2 < 0 && (state.height2 = 0); // for arc var hasGauge = $$.hasType("gauge"), isLegendRight = config.legend_show && state.isLegendRight; state.arcWidth = state.width - (isLegendRight ? currLegend.width + 10 : 0), state.arcHeight = state.height - (isLegendRight && !hasGauge ? 0 : 10), hasGauge && !config.gauge_fullCircle && (state.arcHeight += state.height - $$.getPaddingBottomForGauge()), $$.updateRadius && $$.updateRadius(), state.isLegendRight && hasArc && (state.margin3.left = state.arcWidth / 2 + state.radiusExpanded * 1.1); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/text.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var internals_text = ({ opacityForText: function opacityForText(d) { var $$ = this; return $$.isBarType(d) && !$$.meetsLabelThreshold(Math.abs($$.getRatio("bar", d)), "bar") ? "0" : $$.hasDataLabel ? "1" : "0"; }, /** * Initializes the text * @private */ initText: function initText() { var $el = this.$el; $el.main.select("." + config_classes.chart).append("g").attr("class", config_classes.chartTexts); }, /** * Update chartText * @param {object} targets $$.data.targets * @private */ updateTargetsForText: function updateTargetsForText(targets) { var $$ = this, classChartText = $$.getChartClass("Text"), classTexts = $$.getClass("texts", "id"), classFocus = $$.classFocus.bind($$), mainTextUpdate = $$.$el.main.select("." + config_classes.chartTexts).selectAll("." + config_classes.chartText).data(targets).attr("class", function (d) { return classChartText(d) + classFocus(d); }), mainTextEnter = mainTextUpdate.enter().append("g").style("opacity", "0").attr("class", classChartText).style("pointer-events", "none"); mainTextEnter.append("g").attr("class", classTexts); }, /** * Update text * @param {number} durationForExit Fade-out transition duration * @private */ updateText: function updateText(durationForExit) { var $$ = this, config = $$.config, $el = $$.$el, classText = $$.getClass("text", "index"), text = $el.main.selectAll("." + config_classes.texts).selectAll("." + config_classes.text).data($$.labelishData.bind($$)); text.exit().transition().duration(durationForExit).style("fill-opacity", "0").remove(), $el.text = text.enter().append("text").merge(text).attr("class", classText).attr("text-anchor", function (d) { // when value is negative or var isEndAnchor = d.value < 0; if ($$.isCandlestickType(d)) { var data = $$.getCandlestickData(d); isEndAnchor = data && !data._isUp; } return config.axis_rotated ? isEndAnchor ? "end" : "start" : "middle"; }).style("fill", $$.updateTextColor.bind($$)).style("fill-opacity", "0").each(function (d, i, j) { var node = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), value = d.value; if ($$.isBubbleZType(d)) value = $$.getBubbleZData(value, "z");else if ($$.isCandlestickType(d)) { var data = $$.getCandlestickData(d); data && (value = data.close); } value = $$.dataLabelFormat(d.id)(value, d.id, i, j), isNumber(value) ? this.textContent = value : setTextValue(node, value); }); }, updateTextColor: function updateTextColor(d) { var color, $$ = this, config = $$.config, labelColors = config.data_labels_colors, defaultColor = $$.isArcType(d) && !$$.isRadarType(d) ? null : $$.color(d); if (isString(labelColors)) color = labelColors;else if (isObject(labelColors)) { var _ref = d.data || d, id = _ref.id; color = labelColors[id]; } else isFunction(labelColors) && (color = labelColors.bind($$.api)(defaultColor, d)); if ($$.isCandlestickType(d) && !isFunction(labelColors)) { var value = $$.getCandlestickData(d); if (value && !value._isUp) { var downColor = config.candlestick_color_down; color = isObject(downColor) ? downColor[d.id] : downColor; } } return color || defaultColor; }, /** * Redraw chartText * @param {Function} x Positioning function for x * @param {Function} y Positioning function for y * @param {boolean} forFlow Weather is flow * @param {boolean} withTransition transition is enabled * @returns {Array} * @private */ redrawText: function redrawText(x, y, forFlow, withTransition) { var $$ = this, t = getRandom(!0); // need to return 'true' as of being pushed to the redraw list // ref: getRedrawList() return $$.$el.text.style("fill", $$.updateTextColor.bind($$)).style("fill-opacity", forFlow ? 0 : $$.opacityForText.bind($$)).each(function (d, i) { // do not apply transition for newly added text elements var node = withTransition && this.getAttribute("x") ? (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).transition(t) : (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), posX = x.bind(this)(d, i), posY = y.bind(this)(d, i); this.childElementCount ? node.attr("transform", "translate(" + posX + " " + posY + ")") : node.attr("x", posX).attr("y", posY); }), !0; }, /** * Gets the getBoundingClientRect value of the element * @param {HTMLElement|d3.selection} element Target element * @param {string} className Class name * @returns {object} value of element.getBoundingClientRect() * @private */ getTextRect: function getTextRect(element, className) { var $$ = this, base = element.node ? element.node() : element; /text/i.test(base.tagName) || (base = base.querySelector("text")); var text = base.textContent, cacheKey = KEY.textRect + "-" + text.replace(/\W/g, "_"), rect = $$.cache.get(cacheKey); return rect || ($$.$el.svg.append("text").style("visibility", "hidden").style("font", (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(base).style("font")).classed(className, !0).text(text).call(function (v) { rect = getBoundingRect(v.node()); }).remove(), $$.cache.add(cacheKey, rect)), rect; }, /** * Gets the x or y coordinate of the text * @param {object} indices Indices values * @param {boolean} forX whether or not to x * @returns {number} coordinates * @private */ generateXYForText: function generateXYForText(indices, forX) { var $$ = this, types = Object.keys(indices), points = {}, getter = forX ? $$.getXForText : $$.getYForText; return $$.hasType("radar") && types.push("radar"), types.forEach(function (v) { points[v] = $$["generateGet" + capitalize(v) + "Points"](indices[v], !1); }), function (d, i) { var type = $$.isAreaType(d) && "area" || $$.isBarType(d) && "bar" || $$.isCandlestickType(d) && "candlestick" || $$.isRadarType(d) && "radar" || "line"; return getter.call($$, points[type](d, i), d, this); }; }, /** * Get centerized text position for bar type data.label.text * @param {object} d Data object * @param {Array} points Data points position * @param {HTMLElement} textElement Data label text element * @returns {number} Position value * @private */ getCenteredTextPos: function getCenteredTextPos(d, points, textElement) { var $$ = this, config = $$.config, isRotated = config.axis_rotated; if (config.data_labels.centered && $$.isBarType(d)) { var rect = getBoundingRect(textElement), isPositive = d.value >= 0; if (isRotated) { var w = (isPositive ? points[1][1] - points[0][1] : points[0][1] - points[1][1]) / 2 + rect.width / 2; return isPositive ? -w - 3 : w + 2; } var h = (isPositive ? points[0][1] - points[1][1] : points[1][1] - points[0][1]) / 2 + rect.height / 2; return isPositive ? h : -h - 2; } return 0; }, /** * Get data.labels.position value * @param {string} id Data id value * @param {string} type x | y * @returns {number} Position value * @private */ getTextPos: function getTextPos(id, type) { var pos = this.config.data_labels_position; return (id in pos ? pos[id] : pos)[type] || 0; }, /** * Gets the x coordinate of the text * @param {object} points Data points position * @param {object} d Data object * @param {HTMLElement} textElement Data label text element * @returns {number} x coordinate * @private */ getXForText: function getXForText(points, d, textElement) { var $$ = this, config = $$.config, state = $$.state, isRotated = config.axis_rotated, xPos = points[0][0]; if ($$.hasType("candlestick")) isRotated ? xPos = $$.getCandlestickData(d)._isUp ? points[2][2] + 4 : points[2][1] - 4 : xPos += (points[1][0] - xPos) / 2;else if (isRotated) { var padding = $$.isBarType(d) ? 4 : 6; xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1); } else xPos = $$.hasType("bar") ? (points[2][0] + points[0][0]) / 2 : xPos; // show labels regardless of the domain if value is null if (d.value === null) if (xPos > state.width) { var _getBoundingRect = getBoundingRect(textElement), width = _getBoundingRect.width; xPos = state.width - width; } else xPos < 0 && (xPos = 4); return isRotated && (xPos += $$.getCenteredTextPos(d, points, textElement)), xPos + $$.getTextPos(d.id, "x"); }, /** * Gets the y coordinate of the text * @param {object} points Data points position * @param {object} d Data object * @param {HTMLElement} textElement Data label text element * @returns {number} y coordinate * @private */ getYForText: function getYForText(points, d, textElement) { var yPos, $$ = this, config = $$.config, state = $$.state, isRotated = config.axis_rotated, r = config.point_r, rect = getBoundingRect(textElement), value = d.value, baseY = 3; if ($$.isCandlestickType(d)) value = $$.getCandlestickData(d), isRotated ? (yPos = points[0][0], yPos += (points[1][0] - yPos) / 2 + baseY) : yPos = value && value._isUp ? points[2][2] - baseY : points[2][1] + baseY * 4;else if (isRotated) yPos = (points[0][0] + points[2][0] + rect.height * .6) / 2;else if (yPos = points[2][1], isNumber(r) && r > 5 && ($$.isLineType(d) || $$.isScatterType(d)) && (baseY += config.point_r / 2.3), value < 0 || value === 0 && !state.hasPositiveValue && state.hasNegativeValue) yPos += rect.height + ($$.isBarType(d) ? -baseY : baseY);else { var diff = -baseY * 2; $$.isBarType(d) ? diff = -baseY : $$.isBubbleType(d) && (diff = baseY), yPos += diff; } // show labels regardless of the domain if value is null if (d.value === null && !isRotated) { var boxHeight = rect.height; yPos < boxHeight ? yPos = boxHeight : yPos > state.height && (yPos = state.height - 4); } return isRotated || (yPos += $$.getCenteredTextPos(d, points, textElement)), yPos + $$.getTextPos(d.id, "y"); }, /** * Calculate if two or more text nodes are overlapping * Mark overlapping text nodes with "text-overlapping" class * @param {string} id Axis id * @param {ChartInternal} $$ ChartInternal context * @param {string} selector Selector string * @private */ markOverlapped: function markOverlapped(id, $$, selector) { var textNodes = $$.$el.arcs.selectAll(selector), filteredTextNodes = textNodes.filter(function (node) { return node.data.id !== id; }), textNode = textNodes.filter(function (node) { return node.data.id === id; }), translate = getTranslation(textNode.node()), calcHypo = function (x, y) { return Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); }; textNode.node() && filteredTextNodes.each(function () { var coordinate = getTranslation(this), filteredTextNode = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), nodeForWidth = calcHypo(translate.e, translate.f) > calcHypo(coordinate.e, coordinate.f) ? textNode : filteredTextNode, overlapsX = Math.ceil(Math.abs(translate.e - coordinate.e)) < Math.ceil(nodeForWidth.node().getComputedTextLength()), overlapsY = Math.ceil(Math.abs(translate.f - coordinate.f)) < parseInt(textNode.style("font-size"), 10); filteredTextNode.classed(config_classes.TextOverlapping, overlapsX && overlapsY); }); }, /** * Calculate if two or more text nodes are overlapping * Remove "text-overlapping" class on selected text nodes * @param {ChartInternal} $$ ChartInternal context * @param {string} selector Selector string * @private */ undoMarkOverlapped: function undoMarkOverlapped($$, selector) { $$.$el.arcs.selectAll(selector).each(function () { (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.selectAll)([this, this.previousSibling]).classed(config_classes.TextOverlapping, !1); }); }, /** * Check if meets the ratio to show data label text * @param {number} ratio ratio to meet * @param {string} type chart type * @returns {boolean} * @private */ meetsLabelThreshold: function meetsLabelThreshold(ratio, type) { ratio === void 0 && (ratio = 0); var $$ = this, config = $$.config, threshold = config[type + "_label_threshold"] || 0; return ratio >= threshold; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/title.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Get the text position * @param {string} pos right, left or center * @param {number} width chart width * @returns {string|number} text-anchor value or position in pixel * @private */ function getTextPos(pos, width) { pos === void 0 && (pos = "left"); var position, isNum = isNumber(width); return position = pos.indexOf("center") > -1 ? isNum ? width / 2 : "middle" : pos.indexOf("right") > -1 ? isNum ? width : "end" : isNum ? 0 : "start", position; } /* harmony default export */ var internals_title = ({ /** * Initializes the title * @private */ initTitle: function initTitle() { var $$ = this, config = $$.config, $el = $$.$el; if (config.title_text) { $el.title = $el.svg.append("g"); var text = $el.title.append("text").style("text-anchor", getTextPos(config.title_position)).attr("class", config_classes.title); setTextValue(text, config.title_text, [.3, 1.5]); } }, /** * Redraw title * @private */ redrawTitle: function redrawTitle() { var $$ = this, config = $$.config, current = $$.state.current, title = $$.$el.title; if (title) { var y = $$.yForTitle.call($$); /g/i.test(title.node().tagName) ? title.attr("transform", "translate(" + getTextPos(config.title_position, current.width) + ", " + y + ")") : title.attr("x", $$.xForTitle.call($$)).attr("y", y); } }, /** * Returns the x attribute value of the title * @returns {number} x attribute value * @private */ xForTitle: function xForTitle() { var x, $$ = this, config = $$.config, current = $$.state.current, position = config.title_position || "left", textRectWidth = $$.getTextRect($$.$el.title, config_classes.title).width; return /(right|center)/.test(position) ? (x = current.width - textRectWidth, position.indexOf("right") >= 0 ? x = current.width - textRectWidth - config.title_padding.right : position.indexOf("center") >= 0 && (x = (current.width - textRectWidth) / 2)) : x = config.title_padding.left || 0, x; }, /** * Returns the y attribute value of the title * @returns {number} y attribute value * @private */ yForTitle: function yForTitle() { var $$ = this; return ($$.config.title_padding.top || 0) + $$.getTextRect($$.$el.title, config_classes.title).height; }, /** * Get title padding * @returns {number} padding value * @private */ getTitlePadding: function getTitlePadding() { var $$ = this; return $$.yForTitle() + ($$.config.title_padding.bottom || 0); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/tooltip.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var internals_tooltip = ({ /** * Initializes the tooltip * @private */ initTooltip: function initTooltip() { var $$ = this, config = $$.config, $el = $$.$el; $el.tooltip = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(config.tooltip_contents.bindto), $el.tooltip.empty() && ($el.tooltip = $el.chart.style("position", "relative").append("div").attr("class", config_classes.tooltipContainer).style("position", "absolute").style("pointer-events", "none").style("display", "none")), $$.bindTooltipResizePos(); }, initShowTooltip: function initShowTooltip() { var $$ = this, config = $$.config, $el = $$.$el, _$$$state = $$.state, hasAxis = _$$$state.hasAxis, hasRadar = _$$$state.hasRadar; // Show tooltip if needed if (config.tooltip_init_show) { var isArc = !(hasAxis && hasRadar); if ($$.axis && $$.axis.isTimeSeries() && isString(config.tooltip_init_x)) { var i, val, targets = $$.data.targets[0]; for (config.tooltip_init_x = parseDate.call($$, config.tooltip_init_x), i = 0; (val = targets.values[i]) && !(val.x - config.tooltip_init_x === 0); i++); config.tooltip_init_x = i; } var data = $$.data.targets.map(function (d) { var x = isArc ? 0 : config.tooltip_init_x; return $$.addName(d.values[x]); }); isArc && (data = [data[config.tooltip_init_x]]), $el.tooltip.html($$.getTooltipHTML(data, $$.axis && $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType(null, ["radar"])), $$.color)), config.tooltip_contents.bindto || $el.tooltip.style("top", config.tooltip_init_position.top).style("left", config.tooltip_init_position.left).style("display", "block"); } }, /** * Get the tooltip HTML string * @param {Array} args Arguments * @returns {string} Formatted HTML string * @private */ getTooltipHTML: function getTooltipHTML() { var $$ = this, api = $$.api, config = $$.config; return isFunction(config.tooltip_contents) ? config.tooltip_contents.bind(api).apply(void 0, arguments) : $$.getTooltipContent.apply($$, arguments); }, /** * Returns the tooltip content(HTML string) * @param {object} d data * @param {Function} defaultTitleFormat Default title format * @param {Function} defaultValueFormat Default format for each data value in the tooltip. * @param {Function} color Color function * @returns {string} html * @private */ getTooltipContent: function getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) { var $$ = this, api = $$.api, config = $$.config, state = $$.state, _map = ["title", "name", "value"].map(function (v) { var fn = config["tooltip_format_" + v]; return isFunction(fn) ? fn.bind(api) : fn; }), titleFormat = _map[0], nameFormat = _map[1], valueFormat = _map[2]; titleFormat = titleFormat || defaultTitleFormat, nameFormat = nameFormat || function (name) { return name; }, valueFormat = valueFormat || ($$.isStackNormalized() ? function (v, ratio) { return (ratio * 100).toFixed(2) + "%"; } : defaultValueFormat); var order = config.tooltip_order, getRowValue = function (row) { return $$.axis && $$.isBubbleZType(row) ? $$.getBubbleZData(row.value, "z") : $$.getBaseValue(row); }, getBgColor = $$.levelColor ? function (row) { return $$.levelColor(row.value); } : function (row) { return color(row); }, contents = config.tooltip_contents, tplStr = contents.template, targetIds = $$.mapToTargetIds(); if (order === null && config.data_groups.length) { // for stacked data, order should aligned with the visually displayed data var ids = $$.orderTargets($$.data.targets).map(function (i2) { return i2.id; }).reverse(); d.sort(function (a, b) { var v1 = a ? a.value : null, v2 = b ? b.value : null; return v1 > 0 && v2 > 0 && (v1 = a.id ? ids.indexOf(a.id) : null, v2 = b.id ? ids.indexOf(b.id) : null), v1 - v2; }); } else if (/^(asc|desc)$/.test(order)) { d.sort(function (a, b) { var v1 = a ? getRowValue(a) : null, v2 = b ? getRowValue(b) : null; return order === "asc" ? v1 - v2 : v2 - v1; }); } else isFunction(order) && d.sort(order.bind(api)); var text, row, param, value, i, tpl = $$.getTooltipContentTemplate(tplStr), len = d.length; for (i = 0; i < len; i++) if (row = d[i], row && (getRowValue(row) || getRowValue(row) === 0)) { if (isUndefined(text)) { var title = (state.hasAxis || state.hasRadar) && sanitise(titleFormat ? titleFormat(row.x) : row.x); text = tplProcess(tpl[0], { CLASS_TOOLTIP: config_classes.tooltip, TITLE: isValue(title) ? tplStr ? title : "" + title + "" : "" }); } if (!row.ratio && $$.$el.arcs && (row.ratio = $$.getRatio("arc", $$.$el.arcs.select("path." + config_classes.arc + "-" + row.id).data()[0])), param = [row.ratio, row.id, row.index, d], value = sanitise(valueFormat.apply(void 0, [getRowValue(row)].concat(param))), $$.isAreaRangeType(row)) { var _map2 = ["high", "low"].map(function (v) { return sanitise(valueFormat.apply(void 0, [$$.getRangedData(row, v)].concat(param))); }), high = _map2[0], low = _map2[1]; value = "Mid: " + value + " High: " + high + " Low: " + low; } else if ($$.isCandlestickType(row)) { var _map3 = ["open", "high", "low", "close", "volume"].map(function (v) { return sanitise(valueFormat.apply(void 0, [$$.getRangedData(row, v, "candlestick")].concat(param))); }), open = _map3[0], _high = _map3[1], _low = _map3[2], close = _map3[3], volume = _map3[4]; value = "Open: " + open + " High: " + _high + " Low: " + _low + " Close: " + close + (volume ? " Volume: " + volume : ""); } if (value !== undefined) { var _ret = function () { // Skip elements when their name is set to null if (row.name === null) return "continue"; var name = sanitise(nameFormat.apply(void 0, [row.name].concat(param))), color = getBgColor(row), contentValue = { CLASS_TOOLTIP_NAME: config_classes.tooltipName + $$.getTargetSelectorSuffix(row.id), COLOR: tplStr || !$$.patterns ? color : "", NAME: name, VALUE: value }; if (tplStr && isObject(contents.text)) { var index = targetIds.indexOf(row.id); Object.keys(contents.text).forEach(function (key) { contentValue[key] = contents.text[key][index]; }); } text += tplProcess(tpl[1], contentValue); }(); if (_ret === "continue") continue; } } return text + ""; }, /** * Get the content template string * @param {string} tplStr Tempalte string * @returns {Array} Template string * @private */ getTooltipContentTemplate: function getTooltipContentTemplate(tplStr) { return (tplStr || "\n\t\t\t\t{=TITLE}\n\t\t\t\t{{\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t}}\n\t\t\t
      " + (this.patterns ? "{=COLOR}" : "") + "{=NAME}{=VALUE}
      ").replace(/(\r?\n|\t)/g, "").split(/{{(.*)}}/); }, /** * Returns the position of the tooltip * @param {object} dataToShow data * @param {string} tWidth Width value of tooltip element * @param {string} tHeight Height value of tooltip element * @param {HTMLElement} element Tooltip element * @returns {object} top, left value * @private */ tooltipPosition: function tooltipPosition(dataToShow, tWidth, tHeight, element) { var $$ = this, config = $$.config, scale = $$.scale, state = $$.state, _state = state, width = _state.width, height = _state.height, current = _state.current, isLegendRight = _state.isLegendRight, inputType = _state.inputType, event = _state.event, hasGauge = $$.hasType("gauge") && !config.gauge_fullCircle, svgLeft = $$.getSvgLeft(!0), chartRight = svgLeft + current.width - $$.getCurrentPaddingRight(), chartLeft = $$.getCurrentPaddingLeft(!0), size = 20, _getPointer = getPointer(event, element), x = _getPointer[0], y = _getPointer[1]; // Determine tooltip position if ($$.hasArcType()) { var raw = inputType === "touch" || $$.hasType("radar"); raw || (y += hasGauge ? height : height / 2, x += (width - (isLegendRight ? $$.getLegendWidth() : 0)) / 2); } else { var dataScale = scale.x(dataToShow[0].x); config.axis_rotated ? (y = dataScale + size, x += svgLeft + 100, chartRight -= svgLeft) : (y -= 5, x = svgLeft + chartLeft + size + ($$.zoomScale ? x : dataScale)); } // when tooltip left + tWidth > chart's width x + tWidth + 15 > chartRight && (x -= tWidth + chartLeft), y + tHeight > current.height && (y -= hasGauge ? tHeight * 3 : tHeight + 30); var pos = { top: y, left: x }; // make sure to not be positioned out of viewport return Object.keys(pos).forEach(function (v) { pos[v] < 0 && (pos[v] = 0); }), pos; }, /** * Show the tooltip * @param {object} selectedData Data object * @param {HTMLElement} element Tooltip element * @private */ showTooltip: function showTooltip(selectedData, element) { var $$ = this, config = $$.config, state = $$.state, tooltip = $$.$el.tooltip, bindto = config.tooltip_contents.bindto, forArc = $$.hasArcType(null, ["radar"]), dataToShow = selectedData.filter(function (d) { return d && isValue($$.getBaseValue(d)); }); if (tooltip && dataToShow.length !== 0 && config.tooltip_show) { var datum = tooltip.datum(), _ref = datum || {}, _ref$width = _ref.width, width = _ref$width === void 0 ? 0 : _ref$width, _ref$height = _ref.height, height = _ref$height === void 0 ? 0 : _ref$height, dataStr = JSON.stringify(selectedData); if (!datum || datum.current !== dataStr) { var index = selectedData.concat().sort()[0].index; callFn(config.tooltip_onshow, $$.api, selectedData), tooltip.html($$.getTooltipHTML(selectedData, // data $$.axis ? $$.axis.getXAxisTickFormat() : $$.categoryName.bind($$), // defaultTitleFormat $$.getYFormat(forArc), // defaultValueFormat $$.color // color )).style("display", null).style("visibility", null) // for IE9 .datum(datum = { index: index, current: dataStr, width: width = tooltip.property("offsetWidth"), height: height = tooltip.property("offsetHeight") }), callFn(config.tooltip_onshown, $$.api, selectedData), $$._handleLinkedCharts(!0, index); } if (!bindto) { var fnPos = config.tooltip_position || $$.tooltipPosition, pos = fnPos.call(this, dataToShow, width, height, element); // Get tooltip dimensions ["top", "left"].forEach(function (v) { var value = pos[v]; tooltip.style(v, value + "px"), v !== "left" || datum.xPosInPercent || (datum.xPosInPercent = value / state.current.width * 100); }); } } }, /** * Adjust tooltip position on resize event * @private */ bindTooltipResizePos: function bindTooltipResizePos() { var $$ = this, resizeFunction = $$.resizeFunction, state = $$.state, tooltip = $$.$el.tooltip; resizeFunction.add(function () { if (tooltip.style("display") === "block") { var current = state.current, _tooltip$datum = tooltip.datum(), width = _tooltip$datum.width, xPosInPercent = _tooltip$datum.xPosInPercent, _value = current.width / 100 * xPosInPercent, diff = current.width - (_value + width); diff < 0 && (_value += diff), tooltip.style("left", _value + "px"); } }); }, /** * Hide the tooltip * @param {boolean} force Force to hide * @private */ hideTooltip: function hideTooltip(force) { var $$ = this, api = $$.api, config = $$.config, tooltip = $$.$el.tooltip; if (tooltip && tooltip.style("display") !== "none" && (!config.tooltip_doNotHide || force)) { var selectedData = JSON.parse(tooltip.datum().current); // hide tooltip callFn(config.tooltip_onhide, api, selectedData), tooltip.style("display", "none").style("visibility", "hidden") // for IE9 .datum(null), callFn(config.tooltip_onhidden, api, selectedData); } }, /** * Toggle display for linked chart instances * @param {boolean} show true: show, false: hide * @param {number} index x Axis index * @private */ _handleLinkedCharts: function _handleLinkedCharts(show, index) { var $$ = this, charts = $$.charts, config = $$.config, event = $$.state.event; // Prevent propagation among instances if isn't instantiated from the user's event // https://github.com/naver/billboard.js/issues/1979 if (event && event.isTrusted && config.tooltip_linked && charts.length > 1) { var linkedName = config.tooltip_linked_name; charts.filter(function (c) { return c !== $$.api; }).forEach(function (c) { var _c$internal = c.internal, config = _c$internal.config, $el = _c$internal.$el, isLinked = config.tooltip_linked, name = config.tooltip_linked_name, isInDom = browser_doc.body.contains($el.chart.node()); if (isLinked && linkedName === name && isInDom) { var data = $el.tooltip.data()[0], isNotSameIndex = index !== (data && data.index); try { c.tooltip[show && isNotSameIndex ? "show" : "hide"]({ index: index }); } catch (e) {} } }); } } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/transform.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var transform = ({ getTranslate: function getTranslate(target, index) { index === void 0 && (index = 0); var x, y, $$ = this, config = $$.config, state = $$.state, isRotated = config.axis_rotated, padding = 0; if (index && /^(x|y2?)$/.test(target) && (padding = $$.getAxisSize(target) * index), target === "main") x = asHalfPixel(state.margin.left), y = asHalfPixel(state.margin.top);else if (target === "context") x = asHalfPixel(state.margin2.left), y = asHalfPixel(state.margin2.top);else if (target === "legend") x = state.margin3.left, y = state.margin3.top;else if (target === "x") x = isRotated ? -padding : 0, y = isRotated ? 0 : state.height + padding;else if (target === "y") x = isRotated ? 0 : -padding, y = isRotated ? state.height + padding : 0;else if (target === "y2") x = isRotated ? 0 : state.width + padding, y = isRotated ? 1 - padding : 0;else if (target === "subX") x = 0, y = isRotated ? 0 : state.height2;else if (target === "arc") x = state.arcWidth / 2, y = state.arcHeight / 2;else if (target === "radar") { var _$$$getRadarSize = $$.getRadarSize(), width = _$$$getRadarSize[0]; x = state.width / 2 - width, y = asHalfPixel(state.margin.top); } return "translate(" + x + ", " + y + ")"; }, transformMain: function transformMain(withTransition, transitions) { var xAxis, yAxis, y2Axis, $$ = this, main = $$.$el.main; transitions && transitions.axisX ? xAxis = transitions.axisX : (xAxis = main.select("." + config_classes.axisX), withTransition && (xAxis = xAxis.transition())), transitions && transitions.axisY ? yAxis = transitions.axisY : (yAxis = main.select("." + config_classes.axisY), withTransition && (yAxis = yAxis.transition())), transitions && transitions.axisY2 ? y2Axis = transitions.axisY2 : (y2Axis = main.select("." + config_classes.axisY2), withTransition && (y2Axis = y2Axis.transition())), (withTransition ? main.transition() : main).attr("transform", $$.getTranslate("main")), xAxis.attr("transform", $$.getTranslate("x")), yAxis.attr("transform", $$.getTranslate("y")), y2Axis.attr("transform", $$.getTranslate("y2")), main.select("." + config_classes.chartArcs).attr("transform", $$.getTranslate("arc")); }, transformAll: function transformAll(withTransition, transitions) { var $$ = this, config = $$.config, hasAxis = $$.state.hasAxis, $el = $$.$el; $$.transformMain(withTransition, transitions), hasAxis && config.subchart_show && $$.transformContext(withTransition, transitions), $el.legend && $$.transformLegend(withTransition); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/type.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var type = ({ setTargetType: function setTargetType(targetIds, type) { var $$ = this, config = $$.config, withoutFadeIn = $$.state.withoutFadeIn; $$.mapToTargetIds(targetIds).forEach(function (id) { withoutFadeIn[id] = type === config.data_types[id], config.data_types[id] = type; }), targetIds || (config.data_type = type); }, /** * Updte current used chart types * @private */ updateTypesElements: function updateTypesElements() { var $$ = this, current = $$.state.current; // Update current chart elements reference Object.keys(TYPE).forEach(function (v) { var t = TYPE[v], has = $$.hasType(t, null, !0), idx = current.types.indexOf(t); idx === -1 && has ? current.types.push(t) : idx > -1 && !has && current.types.splice(idx, 1); }), $$.setChartElements(); }, /** * Check if given chart types exists * @param {string} type Chart type * @param {Array} targetsValue Data array * @param {boolean} checkFromData Force to check type cotains from data targets * @returns {boolean} * @private */ hasType: function hasType(type, targetsValue, checkFromData) { checkFromData === void 0 && (checkFromData = !1); var $$ = this, config = $$.config, current = $$.state.current, types = config.data_types, targets = targetsValue || $$.data.targets, has = !1; return !checkFromData && current.types.length && current.types.indexOf(type) > -1 ? has = !0 : targets && targets.length ? targets.forEach(function (target) { var t = types[target.id]; t !== type && (t || type !== "line") || (has = !0); }) : Object.keys(types).length ? Object.keys(types).forEach(function (id) { types[id] === type && (has = !0); }) : has = config.data_type === type, has; }, /** * Check if contains given chart types * @param {string} type Type key * @param {object} targets Target data * @param {Array} exclude Excluded types * @returns {boolean} * @private */ hasTypeOf: function hasTypeOf(type, targets, exclude) { var _this = this; return exclude === void 0 && (exclude = []), !!(type in TYPE_BY_CATEGORY) && !TYPE_BY_CATEGORY[type].filter(function (v) { return exclude.indexOf(v) === -1; }).every(function (v) { return !_this.hasType(v, targets); }); }, /** * Check if given data is certain chart type * @param {object} d Data object * @param {string|Array} type chart type * @returns {boolean} * @private */ isTypeOf: function isTypeOf(d, type) { var id = isString(d) ? d : d.id, dataType = this.config.data_types[id] || this.config.data_type; return isArray(type) ? type.indexOf(dataType) >= 0 : dataType === type; }, hasPointType: function hasPointType() { var $$ = this; return $$.hasTypeOf("Line") || $$.hasType("bubble") || $$.hasType("scatter"); }, /** * Check if contains arc types chart * @param {object} targets Target data * @param {Array} exclude Excluded types * @returns {boolean} * @private */ hasArcType: function hasArcType(targets, exclude) { return this.hasTypeOf("Arc", targets, exclude); }, hasMultiArcGauge: function hasMultiArcGauge() { return this.hasType("gauge") && this.config.gauge_type === "multi"; }, isLineType: function isLineType(d) { var id = isString(d) ? d : d.id; return !this.config.data_types[id] || this.isTypeOf(id, TYPE_BY_CATEGORY.Line); }, isStepType: function isStepType(d) { return this.isTypeOf(d, TYPE_BY_CATEGORY.Step); }, isSplineType: function isSplineType(d) { return this.isTypeOf(d, TYPE_BY_CATEGORY.Spline); }, isAreaType: function isAreaType(d) { return this.isTypeOf(d, TYPE_BY_CATEGORY.Area); }, isAreaRangeType: function isAreaRangeType(d) { return this.isTypeOf(d, TYPE_BY_CATEGORY.AreaRange); }, isBarType: function isBarType(d) { return this.isTypeOf(d, "bar"); }, isBubbleType: function isBubbleType(d) { return this.isTypeOf(d, "bubble"); }, isCandlestickType: function isCandlestickType(d) { return this.isTypeOf(d, "candlestick"); }, isScatterType: function isScatterType(d) { return this.isTypeOf(d, "scatter"); }, isPieType: function isPieType(d) { return this.isTypeOf(d, "pie"); }, isGaugeType: function isGaugeType(d) { return this.isTypeOf(d, "gauge"); }, isDonutType: function isDonutType(d) { return this.isTypeOf(d, "donut"); }, isRadarType: function isRadarType(d) { return this.isTypeOf(d, "radar"); }, isArcType: function isArcType(d) { return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d) || this.isRadarType(d); }, // determine if is 'circle' data point isCirclePoint: function isCirclePoint(node) { var config = this.config, pattern = config.point_pattern, isCircle = !1; return isCircle = !!(node && node.tagName === "circle") || config.point_type === "circle" && (!pattern || isArray(pattern) && pattern.length === 0), isCircle; }, lineData: function lineData(d) { return this.isLineType(d) ? [d] : []; }, arcData: function arcData(d) { return this.isArcType(d.data) ? [d] : []; }, /** * Get data adapt for data label showing * @param {object} d Data object * @returns {Array} * @private */ labelishData: function labelishData(d) { return this.isBarType(d) || this.isLineType(d) || this.isScatterType(d) || this.isBubbleType(d) || this.isCandlestickType(d) || this.isRadarType(d) ? d.values.filter(function (v) { return isNumber(v.value) || !!v.value; }) : []; }, barLineBubbleData: function barLineBubbleData(d) { return this.isBarType(d) || this.isLineType(d) || this.isBubbleType(d) ? d.values : []; }, // https://github.com/d3/d3-shape#curves isInterpolationType: function isInterpolationType(type) { return ["basis", "basis-closed", "basis-open", "bundle", "cardinal", "cardinal-closed", "cardinal-open", "catmull-rom", "catmull-rom-closed", "catmull-rom-open", "linear", "linear-closed", "monotone-x", "monotone-y", "natural"].indexOf(type) >= 0; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/ChartInternal.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * @ignore */ // data // interactions // internals // used to retrieve radar Axis name /** * Internal chart class. * - Note: Instantiated internally, not exposed for public. * @class ChartInternal * @ignore * @private */ var ChartInternal = /*#__PURE__*/function () { // API interface // config object // cache instance // elements // state variables // all Chart instances array within page (equivalent of 'bb.instances') // data object // Axis // Axis // scales // original values // formatter function // format function function ChartInternal(api) { this.api = void 0, this.config = void 0, this.cache = void 0, this.$el = void 0, this.state = void 0, this.charts = void 0, this.data = { xs: {}, targets: [] }, this.axis = void 0, this.scale = { x: null, y: null, y2: null, subX: null, subY: null, subY2: null, zoom: null }, this.org = { xScale: null, xDomain: null }, this.color = void 0, this.patterns = void 0, this.levelColor = void 0, this.point = void 0, this.brush = void 0, this.format = { extraLineClasses: null, xAxisTick: null, dataTime: null, // dataTimeFormat defaultAxisTime: null, // defaultAxisTimeFormat axisTime: null // axisTimeFormat }; var $$ = this; $$.api = api, $$.config = new Options(), $$.cache = new Cache(); var store = new Store(); $$.$el = store.getStore("element"), $$.state = store.getStore("state"); } var _proto = ChartInternal.prototype; return _proto.beforeInit = function beforeInit() { var $$ = this; $$.callPluginHook("$beforeInit"), callFn($$.config.onbeforeinit, $$.api); }, _proto.afterInit = function afterInit() { var $$ = this; $$.callPluginHook("$afterInit"), callFn($$.config.onafterinit, $$.api); }, _proto.init = function init() { var $$ = this, config = $$.config, state = $$.state, $el = $$.$el; state.hasAxis = !$$.hasArcType(), state.hasRadar = !state.hasAxis && $$.hasType("radar"), $$.initParams(); var bindto = { element: config.bindto, classname: "bb" }; isObject(config.bindto) && (bindto.element = config.bindto.element || "#chart", bindto.classname = config.bindto.classname || bindto.classname), $el.chart = isFunction(bindto.element.node) ? config.bindto.element : (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(bindto.element || []), $el.chart.empty() && ($el.chart = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(browser_doc.body.appendChild(browser_doc.createElement("div")))), $el.chart.html("").classed(bindto.classname, !0), $$.initToRender(); } /** * Initialize the rendering process * @param {boolean} forced Force to render process * @private */ , _proto.initToRender = function initToRender(forced) { var $$ = this, config = $$.config, state = $$.state, chart = $$.$el.chart, isHidden = function () { return chart.style("display") === "none" || chart.style("visibility") === "hidden"; }, isLazy = config.render.lazy || isHidden(), MutationObserver = win.MutationObserver; if (isLazy && MutationObserver && config.render.observe !== !1 && !forced && new MutationObserver(function (mutation, observer) { isHidden() || (observer.disconnect(), !state.rendered && $$.initToRender(!0)); }).observe(chart.node(), { attributes: !0, attributeFilter: ["class", "style"] }), !isLazy || forced) { var convertedData = $$.convertData(config, $$.initWithData); convertedData && $$.initWithData(convertedData), $$.afterInit(); } }, _proto.initParams = function initParams() { var $$ = this, _ref = $$, config = _ref.config, format = _ref.format, state = _ref.state, isRotated = config.axis_rotated; if (state.datetimeId = "bb-" + +new Date(), $$.color = $$.generateColor(), $$.levelColor = $$.generateLevelColor(), $$.hasPointType() && ($$.point = $$.generatePoint()), state.hasAxis) { $$.initClip(), format.extraLineClasses = $$.generateExtraLineClass(), format.dataTime = config.data_xLocaltime ? external_commonjs_d3_time_format_commonjs2_d3_time_format_amd_d3_time_format_root_d3_.timeParse : external_commonjs_d3_time_format_commonjs2_d3_time_format_amd_d3_time_format_root_d3_.utcParse, format.axisTime = config.axis_x_localtime ? external_commonjs_d3_time_format_commonjs2_d3_time_format_amd_d3_time_format_root_d3_.timeFormat : external_commonjs_d3_time_format_commonjs2_d3_time_format_amd_d3_time_format_root_d3_.utcFormat; var isDragZoom = $$.config.zoom_enabled && $$.config.zoom_type === "drag"; format.defaultAxisTime = function (d) { var _$$$scale = $$.scale, x = _$$$scale.x, zoom = _$$$scale.zoom, isZoomed = isDragZoom ? zoom : zoom && x.orgDomain().toString() !== zoom.domain().toString(), specifier = d.getMilliseconds() && ".%L" || d.getSeconds() && ".:%S" || d.getMinutes() && "%I:%M" || d.getHours() && "%I %p" || d.getDate() !== 1 && "%b %d" || isZoomed && d.getDate() === 1 && "%b\'%y" || d.getMonth() && "%-m/%-d" || "%Y"; return format.axisTime(specifier)(d); }; } state.isLegendRight = config.legend_position === "right", state.isLegendInset = config.legend_position === "inset", state.isLegendTop = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "top-right", state.isLegendLeft = config.legend_inset_anchor === "top-left" || config.legend_inset_anchor === "bottom-left", state.rotatedPaddingRight = isRotated && !config.axis_x_show ? 0 : 30, state.inputType = convertInputType(config.interaction_inputType_mouse, config.interaction_inputType_touch); }, _proto.initWithData = function initWithData(data) { var $$ = this, config = $$.config, scale = $$.scale, state = $$.state, $el = $$.$el, org = $$.org, hasAxis = state.hasAxis, hasInteraction = config.interaction_enabled; hasAxis && ($$.axis = $$.getAxisInstance(), config.zoom_enabled && $$.initZoom()), $$.data.xs = {}, $$.data.targets = $$.convertDataToTargets(data), config.data_filter && ($$.data.targets = $$.data.targets.filter(config.data_filter.bind($$.api))), config.data_hide && $$.addHiddenTargetIds(config.data_hide === !0 ? $$.mapToIds($$.data.targets) : config.data_hide), config.legend_hide && $$.addHiddenLegendIds(config.legend_hide === !0 ? $$.mapToIds($$.data.targets) : config.legend_hide), $$.updateSizes(), $$.updateScales(!0); // retrieve scale after the 'updateScales()' is called var x = scale.x, y = scale.y, y2 = scale.y2, subX = scale.subX, subY = scale.subY, subY2 = scale.subY2; // Set domains for each scale if (x && (x.domain(sortValue($$.getXDomain($$.data.targets))), subX.domain(x.domain()), org.xDomain = x.domain()), y && (y.domain($$.getYDomain($$.data.targets, "y")), subY.domain(y.domain())), y2 && (y2.domain($$.getYDomain($$.data.targets, "y2")), subY2 && subY2.domain(y2.domain())), $el.svg = $el.chart.append("svg").style("overflow", "hidden").style("display", "block"), hasInteraction && state.inputType) { var isTouch = state.inputType === "touch"; $el.svg.on(isTouch ? "touchstart" : "mouseenter", function () { return callFn(config.onover, $$.api); }).on(isTouch ? "touchend" : "mouseleave", function () { return callFn(config.onout, $$.api); }); } config.svg_classname && $el.svg.attr("class", config.svg_classname); // Define defs var hasColorPatterns = isFunction(config.color_tiles) && $$.patterns; (hasAxis || hasColorPatterns) && ($el.defs = $el.svg.append("defs"), hasAxis && ["id", "idXAxis", "idYAxis", "idGrid"].forEach(function (v) { $$.appendClip($el.defs, state.clip[v]); }), hasColorPatterns && $$.patterns.forEach(function (p) { return $el.defs.append(function () { return p.node; }); })), $$.updateSvgSize(), $$.bindResize(); // Define regions var main = $el.svg.append("g").classed(config_classes.main, !0).attr("transform", $$.getTranslate("main")); // data.onmin/max callback if ($el.main = main, config.subchart_show && $$.initSubchart(), config.tooltip_show && $$.initTooltip(), config.title_text && $$.initTitle(), config.legend_show && $$.initLegend(), config.data_empty_label_text && main.append("text").attr("class", config_classes.text + " " + config_classes.empty).attr("text-anchor", "middle") // horizontal centering of text at x position in all browsers. .attr("dominant-baseline", "middle"), hasAxis && (config.regions.length && $$.initRegion(), !config.clipPath && $$.axis.init()), main.append("g").attr("class", config_classes.chart).attr("clip-path", state.clip.path), $$.callPluginHook("$init"), hasAxis && (hasInteraction && $$.initEventRect && $$.initEventRect(), $$.initGrid(), config.clipPath && $$.axis && $$.axis.init()), $$.initChartElements(), $$.updateTargets($$.data.targets), $$.updateDimension(), callFn(config.oninit, $$.api), $$.setBackground(), $$.redraw({ withTransition: !1, withTransform: !0, withUpdateXDomain: !0, withUpdateOrgXDomain: !0, withTransitionForAxis: !1, initializing: !0 }), config.data_onmin || config.data_onmax) { var minMax = $$.getMinMaxData(); callFn(config.data_onmin, $$.api, minMax.min), callFn(config.data_onmax, $$.api, minMax.max); } config.tooltip_show && $$.initShowTooltip(), state.rendered = !0; }, _proto.initChartElements = function initChartElements() { var $$ = this, _$$$state = $$.state, hasAxis = _$$$state.hasAxis, hasRadar = _$$$state.hasRadar, types = []; hasAxis ? ["bar", "bubble", "candlestick", "line"].forEach(function (v) { var name = capitalize(v); (v === "line" && $$.hasTypeOf(name) || $$.hasType(v)) && types.push(name); }) : (!hasRadar && types.push("Arc", "Pie"), $$.hasType("gauge") ? types.push("Gauge") : hasRadar && types.push("Radar")), types.forEach(function (v) { $$["init" + v](); }), notEmpty($$.config.data_labels) && !$$.hasArcType(null, ["radar"]) && $$.initText(); }, _proto.setChartElements = function setChartElements() { var $$ = this, _$$$$el = $$.$el, chart = _$$$$el.chart, svg = _$$$$el.svg, defs = _$$$$el.defs, main = _$$$$el.main, tooltip = _$$$$el.tooltip, legend = _$$$$el.legend, title = _$$$$el.title, grid = _$$$$el.grid, arc = _$$$$el.arcs, circles = _$$$$el.circle, bars = _$$$$el.bar, candlestick = _$$$$el.candlestick, lines = _$$$$el.line, areas = _$$$$el.area, texts = _$$$$el.text; $$.api.$ = { chart: chart, svg: svg, defs: defs, main: main, tooltip: tooltip, legend: legend, title: title, grid: grid, arc: arc, circles: circles, bar: { bars: bars }, candlestick: candlestick, line: { lines: lines, areas: areas }, text: { texts: texts } }; } /** * Set background element/image * @private */ , _proto.setBackground = function setBackground() { var $$ = this, bg = $$.config.background, state = $$.state, svg = $$.$el.svg; if (notEmpty(bg)) { var element = svg.select("g").insert(bg.imgUrl ? "image" : "rect", ":first-child"); bg.imgUrl ? element.attr("href", bg.imgUrl) : bg.color && element.style("fill", bg.color).attr("clip-path", state.clip.path), element.attr("class", bg.class || null).attr("width", "100%").attr("height", "100%"); } } /** * Update targeted element with given data * @param {object} targets Data object formatted as 'target' * @private */ , _proto.updateTargets = function updateTargets(targets) { var $$ = this, _$$$state2 = $$.state, hasAxis = _$$$state2.hasAxis, hasRadar = _$$$state2.hasRadar; $$.updateTargetsForText(targets), hasAxis ? (["bar", "candlestick", "line"].forEach(function (v) { var name = capitalize(v); (v === "line" && $$.hasTypeOf(name) || $$.hasType(v)) && $$["updateTargetsFor" + name](targets.filter($$["is" + name + "Type"].bind($$))); }), $$.updateTargetsForSubchart && $$.updateTargetsForSubchart(targets)) : $$.hasArcType(targets) && (hasRadar ? $$.updateTargetsForRadar(targets.filter($$.isRadarType.bind($$))) : $$.updateTargetsForArc(targets.filter($$.isArcType.bind($$)))), ($$.hasType("bubble") || $$.hasType("scatter")) && $$.updateTargetForCircle && $$.updateTargetForCircle(), $$.showTargets(); } /** * Display targeted elements * @private */ , _proto.showTargets = function showTargets() { var $$ = this, config = $$.config, svg = $$.$el.svg; svg.selectAll("." + config_classes.target).filter(function (d) { return $$.isTargetToShow(d.id); }).transition().duration(config.transition_duration).style("opacity", "1"); }, _proto.getWithOption = function getWithOption(options) { var withOptions = { Y: !0, Subchart: !0, Transition: !0, EventRect: !0, Dimension: !0, TrimXDomain: !0, Transform: !1, UpdateXDomain: !1, UpdateOrgXDomain: !1, Legend: !1, UpdateXAxis: "UpdateXDomain", TransitionForExit: "Transition", TransitionForAxis: "Transition" }; return Object.keys(withOptions).forEach(function (key) { var defVal = withOptions[key]; isString(defVal) && (defVal = withOptions[defVal]), withOptions[key] = getOption(options, "with" + key, defVal); }), withOptions; }, _proto.initialOpacity = function initialOpacity(d) { var $$ = this, withoutFadeIn = $$.state.withoutFadeIn; return $$.getBaseValue(d) !== null && withoutFadeIn[d.id] ? "1" : "0"; }, _proto.bindResize = function bindResize() { var $$ = this, config = $$.config, state = $$.state, resizeFunction = generateResize(), list = []; list.push(function () { return callFn(config.onresize, $$, $$.api); }), config.resize_auto && list.push(function () { state.resizing = !0, $$.api.flush(!1); }), list.push(function () { callFn(config.onresized, $$, $$.api), state.resizing = !1; }), list.forEach(function (v) { return resizeFunction.add(v); }), $$.resizeFunction = resizeFunction, win.addEventListener("resize", $$.resizeFunction = resizeFunction); } /** * Call plugin hook * @param {string} phase The lifecycle phase * @param {Array} args Arguments * @private */ , _proto.callPluginHook = function callPluginHook(phase) { for (var _this = this, _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key]; this.config.plugins.forEach(function (v) { phase === "$beforeInit" && (v.$$ = _this, _this.api.plugins.push(v)), v[phase].apply(v, args); }); }, ChartInternal; }(); extend(ChartInternal.prototype, [// common convert, data_data, load, category, internals_class, internals_color, domain, interactions_interaction, format, internals_legend, redraw, scale, shape, size, internals_text, internals_title, internals_tooltip, transform, type]); ;// CONCATENATED MODULE: ./src/config/config.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Load configuration option * @param {object} config User's generation config value * @private */ function loadConfig(config) { var target, keys, read, thisConfig = this.config, find = function () { var key = keys.shift(); return key && target && isObjectType(target) && key in target ? (target = target[key], find()) : key ? undefined : target; }; Object.keys(thisConfig).forEach(function (key) { target = config, keys = key.split("_"), read = find(), isDefined(read) && (thisConfig[key] = read); }); } ;// CONCATENATED MODULE: ./src/Chart/api/chart.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var chart = ({ /** * Resize the chart. * @function resize * @instance * @memberof Chart * @param {object} size This argument should include width and height in pixels. * @param {number} [size.width] width value * @param {number} [size.height] height value * @example * // Resize to 640x480 * chart.resize({ * width: 640, * height: 480 * }); */ resize: function resize(size) { var $$ = this.internal, config = $$.config, state = $$.state; state.rendered && (config.size_width = size ? size.width : null, config.size_height = size ? size.height : null, state.resizing = !0, this.flush(!1, !0), $$.resizeFunction()); }, /** * Force to redraw. * - **NOTE:** When zoom/subchart is used, the zoomed state will be resetted. * @function flush * @instance * @memberof Chart * @param {boolean} [soft] For soft redraw. * @example * chart.flush(); * * // for soft redraw * chart.flush(true); */ flush: function flush(soft) { var $$ = this.internal, state = $$.state; state.rendered ? (state.resizing ? $$.brush && $$.brush.updateResize() : $$.axis && $$.axis.setOrient(), $$.scale.zoom = null, soft ? $$.redraw({ withTransform: !0, withUpdateXDomain: !0, withUpdateOrgXDomain: !0, withLegend: !0 }) : $$.updateAndRedraw({ withLegend: !0, withTransition: !1, withTransitionForTransform: !1 }), !state.resizing && $$.brush && ($$.brush.getSelection().call($$.brush.move), $$.unselectRect())) : $$.initToRender(!0); }, /** * Reset the chart object and remove element and events completely. * @function destroy * @instance * @memberof Chart * @returns {null} * @example * chart.destroy(); */ destroy: function destroy() { var _this = this, $$ = this.internal, _$$$$el = $$.$el, chart = _$$$$el.chart, svg = _$$$$el.svg; if (notEmpty($$)) // release prototype chains for (var _key in $$.callPluginHook("$willDestroy"), $$.charts.splice($$.charts.indexOf(this), 1), svg.select("*").interrupt(), $$.resizeFunction.clear(), win.removeEventListener("resize", $$.resizeFunction), chart.classed("bb", !1).html(""), Object.keys(this).forEach(function (key) { key === "internal" && Object.keys($$).forEach(function (k) { $$[k] = null; }), _this[key] = null, delete _this[key]; }), this) this[_key] = function () {}; return null; }, /** * Get or set single config option value. * @function config * @instance * @memberof Chart * @param {string} name The option key name. * @param {*} [value] The value accepted for indicated option. * @param {boolean} [redraw] Set to redraw with the new option changes. * - **NOTE:** Doesn't guarantee work in all circumstances. It can be applied for limited options only. * @returns {*} * @example * // Getter * chart.config("gauge.max"); * * // Setter * chart.config("gauge.max", 100); * * // Setter & redraw with the new option * chart.config("gauge.max", 100, true); */ config: function (name, value, redraw) { var res, $$ = this.internal, config = $$.config, key = name && name.replace(/\./g, "_"); return key in config && (isDefined(value) ? (config[key] = value, res = value, redraw && this.flush()) : res = config[key]), res; } }); ;// CONCATENATED MODULE: ./src/Chart/api/color.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var api_color = ({ /** * Get the color * @function color * @instance * @memberof Chart * @param {string} id id to get the color * @returns {string} * @example * chart.color("data1"); */ color: function color(id) { return this.internal.color(id); // more patterns } }); ;// CONCATENATED MODULE: ./src/Chart/api/data.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Get data loaded in the chart. * @function data * @instance * @memberof Chart * @param {string|Array} targetIds If this argument is given, this API returns the specified target data. If this argument is not given, all of data will be returned. * @returns {Array} Data objects * @example * // Get only data1 data * chart.data("data1"); * // --> [{id: "data1", id_org: "data1", values: Array(6)}, ...] * * // Get data1 and data2 data * chart.data(["data1", "data2"]); * * // Get all data * chart.data(); */ function api_data_data(targetIds) { var targets = this.internal.data.targets; if (!isUndefined(targetIds)) { var ids = isArray(targetIds) ? targetIds : [targetIds]; return targets.filter(function (t) { return ids.some(function (v) { return v === t.id; }); }); } return targets; } extend(api_data_data, { /** * Get data shown in the chart. * @function data․shown * @instance * @memberof Chart * @param {string|Array} targetIds If this argument is given, this API filters the data with specified target ids. If this argument is not given, all shown data will be returned. * @returns {Array} Data objects * @example * // Get shown data by filtering to include only data1 data * chart.data.shown("data1"); * // --> [{id: "data1", id_org: "data1", values: Array(6)}, ...] * * // Get shown data by filtering to include data1 and data2 data * chart.data.shown(["data1", "data2"]); * * // Get all shown data * chart.data.shown(); */ shown: function shown(targetIds) { return this.internal.filterTargetsToShow(this.data(targetIds)); }, /** * Get values of the data loaded in the chart. * @function data․values * @instance * @memberof Chart * @param {string|Array|null} targetIds This API returns the values of specified target. If this argument is not given, null will be retruned * @param {boolean} [flat=true] Get flatten values * @returns {Array} Data values * @example * // Get data1 values * chart.data.values("data1"); * // --> [10, 20, 30, 40] */ values: function (targetIds, flat) { flat === void 0 && (flat = !0); var values = null; if (targetIds) { var targets = this.data(targetIds); targets && isArray(targets) && (values = [], targets.forEach(function (v) { var dataValue = v.values.map(function (d) { return d.value; }); flat ? values = values.concat(dataValue) : values.push(dataValue); })); } return values; }, /** * Get and set names of the data loaded in the chart. * @function data․names * @instance * @memberof Chart * @param {object} names If this argument is given, the names of data will be updated. If not given, the current names will be returned. The format of this argument is the same as * @returns {object} Corresponding names according its key value, if specified names values. * @example * // Get current names * chart.data.names(); * // --> {data1: "test1", data2: "test2"} * * // Update names * chart.data.names({ * data1: "New Name 1", * data2: "New Name 2" *}); */ names: function names(_names) { var $$ = this.internal; return $$.updateDataAttributes("names", _names); }, /** * Get and set colors of the data loaded in the chart. * @function data․colors * @instance * @memberof Chart * @param {object} colors If this argument is given, the colors of data will be updated. If not given, the current colors will be returned. The format of this argument is the same as [data.colors](./Options.html#.data%25E2%2580%25A4colors). * @returns {object} Corresponding data color value according its key value. * @example * // Get current colors * chart.data.colors(); * // --> {data1: "#00c73c", data2: "#fa7171"} * * // Update colors * chart.data.colors({ * data1: "#FFFFFF", * data2: "#000000" * }); */ colors: function colors(_colors) { return this.internal.updateDataAttributes("colors", _colors); }, /** * Get and set axes of the data loaded in the chart. * - **NOTE:** If all data is related to one of the axes, the domain of axis without related data will be replaced by the domain from the axis with related data * @function data․axes * @instance * @memberof Chart * @param {object} axes If this argument is given, the axes of data will be updated. If not given, the current axes will be returned. The format of this argument is the same as * @returns {object} Corresponding axes value for data, if specified axes value. * @example * // Get current axes * chart.data.axes(); * // --> {data1: "y"} * * // Update axes * chart.data.axes({ * data1: "y", * data2: "y2" * }); */ axes: function axes(_axes) { return this.internal.updateDataAttributes("axes", _axes); }, /** * Get the minimum data value bound to the chart * @function data․min * @instance * @memberof Chart * @returns {Array} Data objects * @example * // Get current axes * chart.data.min(); * // --> [{x: 0, value: 30, id: "data1", index: 0}, ...] */ min: function min() { return this.internal.getMinMaxData().min; }, /** * Get the maximum data value bound to the chart * @function data․max * @instance * @memberof Chart * @returns {Array} Data objects * @example * // Get current axes * chart.data.max(); * // --> [{x: 3, value: 400, id: "data1", index: 3}, ...] */ max: function max() { return this.internal.getMinMaxData().max; } }); /* harmony default export */ var api_data = ({ data: api_data_data }); ;// CONCATENATED MODULE: ./src/Chart/api/export.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Encode to base64 * @param {string} str string to be encoded * @returns {string} * @private * @see https://developer.mozilla.org/ko/docs/Web/API/WindowBase64/Base64_encoding_and_decoding */ var b64EncodeUnicode = function (str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p) { return String.fromCharCode(+("0x" + p)); })); }; /** * Convert svg node to data url * @param {HTMLElement} node target node * @param {object} option object containing {width, height, preserveAspectRatio} * @param {object} orgSize object containing {width, height} * @returns {string} * @private */ function nodeToSvgDataUrl(node, option, orgSize) { var _ref = option || orgSize, width = _ref.width, height = _ref.height, serializer = new XMLSerializer(), clone = node.cloneNode(!0), cssText = getCssRules(toArray(browser_doc.styleSheets)).filter(function (r) { return r.cssText; }).map(function (r) { return r.cssText; }); clone.setAttribute("xmlns", external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.namespaces.xhtml); var nodeXml = serializer.serializeToString(clone), style = browser_doc.createElement("style"); // escape css for XML style.appendChild(browser_doc.createTextNode(cssText.join("\n"))); var styleXml = serializer.serializeToString(style), dataStr = ("\n\t\t\t\n\t\t\t\t" + styleXml + "\n\t\t\t\t" + nodeXml.replace(/(url\()[^#]+/g, "$1") + "\n\t\t\t").replace("/\n/g", "%0A"); // foreignObject not supported in IE11 and below // https://msdn.microsoft.com/en-us/library/hh834675(v=vs.85).aspx return "data:image/svg+xml;base64," + b64EncodeUnicode(dataStr); } /* harmony default export */ var api_export = ({ /** * Export chart as an image. * - **NOTE:** * - IE11 and below not work properly due to the lack of the feature(foreignObject) support * - The basic CSS file(ex. billboard.css) should be at same domain as API call context to get correct styled export image. * @function export * @instance * @memberof Chart * @param {object} option Export option * @param {string} [option.mimeType="image/png"] The desired output image format. (ex. 'image/png' for png, 'image/jpeg' for jpeg format) * @param {number} [option.width={currentWidth}] width * @param {number} [option.height={currentHeigth}] height * @param {boolean} [option.preserveAspectRatio=true] Preserve aspect ratio on given size * @param {Function} [callback] The callback to be invoked when export is ready. * @returns {string} dataURI * @example * chart.export(); * // --> "data:image/svg+xml;base64,PHN..." * * // Initialize the download automatically * chart.export({mimeType: "image/png"}, dataUrl => { * const link = document.createElement("a"); * * link.download = `${Date.now()}.png`; * link.href = dataUrl; * link.innerHTML = "Download chart as image"; * * document.body.appendChild(link); * }); * * // Resize the exported image * chart.export( * { * width: 800, * height: 600, * preserveAspectRatio: false, * mimeType: "image/png" * }, * dataUrl => { ... } * ); */ export: function _export(option, callback) { var _this = this, $$ = this.internal, state = $$.state, chart = $$.$el.chart, _state$current = state.current, width = _state$current.width, height = _state$current.height, opt = mergeObj({ width: width, height: height, preserveAspectRatio: !0, mimeType: "image/png" }, option), svgDataUrl = nodeToSvgDataUrl(chart.node(), opt, { width: width, height: height }); if (callback && isFunction(callback)) { var img = new Image(); img.crossOrigin = "Anonymous", img.onload = function () { var canvas = browser_doc.createElement("canvas"), ctx = canvas.getContext("2d"); canvas.width = opt.width || width, canvas.height = opt.height || height, ctx.drawImage(img, 0, 0), callback.bind(_this)(canvas.toDataURL(opt.mimeType)); }, img.src = svgDataUrl; } return svgDataUrl; } }); ;// CONCATENATED MODULE: ./src/Chart/api/focus.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var api_focus = ({ /** * This API highlights specified targets and fade out the others.

      * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be highlighted. * @function focus * @instance * @memberof Chart * @param {string|Array} targetIdsValue Target ids to be highlighted. * @example * // data1 will be highlighted and the others will be faded out * chart.focus("data1"); * * // data1 and data2 will be highlighted and the others will be faded out * chart.focus(["data1", "data2"]); * * // all targets will be highlighted * chart.focus(); */ focus: function focus(targetIdsValue) { var $$ = this.internal, state = $$.state, targetIds = $$.mapToTargetIds(targetIdsValue), candidates = $$.$el.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))); this.revert(), this.defocus(), candidates.classed(config_classes.focused, !0).classed(config_classes.defocused, !1), $$.hasArcType() && !state.hasRadar && ($$.expandArc(targetIds), $$.hasType("gauge") && $$.markOverlapped(targetIdsValue, $$, "." + config_classes.gaugeValue)), $$.toggleFocusLegend(targetIds, !0), state.focusedTargetIds = targetIds, state.defocusedTargetIds = state.defocusedTargetIds.filter(function (id) { return targetIds.indexOf(id) < 0; }); }, /** * This API fades out specified targets and reverts the others.

      * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be faded out. * @function defocus * @instance * @memberof Chart * @param {string|Array} targetIdsValue Target ids to be faded out. * @example * // data1 will be faded out and the others will be reverted. * chart.defocus("data1"); * * // data1 and data2 will be faded out and the others will be reverted. * chart.defocus(["data1", "data2"]); * * // all targets will be faded out. * chart.defocus(); */ defocus: function defocus(targetIdsValue) { var $$ = this.internal, state = $$.state, targetIds = $$.mapToTargetIds(targetIdsValue), candidates = $$.$el.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))); candidates.classed(config_classes.focused, !1).classed(config_classes.defocused, !0), $$.hasArcType() && ($$.unexpandArc(targetIds), $$.hasType("gauge") && $$.undoMarkOverlapped($$, "." + config_classes.gaugeValue)), $$.toggleFocusLegend(targetIds, !1), state.focusedTargetIds = state.focusedTargetIds.filter(function (id) { return targetIds.indexOf(id) < 0; }), state.defocusedTargetIds = targetIds; }, /** * This API reverts specified targets.

      * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be reverted. * @function revert * @instance * @memberof Chart * @param {string|Array} targetIdsValue Target ids to be reverted * @example * // data1 will be reverted. * chart.revert("data1"); * * // data1 and data2 will be reverted. * chart.revert(["data1", "data2"]); * * // all targets will be reverted. * chart.revert(); */ revert: function revert(targetIdsValue) { var $$ = this.internal, config = $$.config, state = $$.state, $el = $$.$el, targetIds = $$.mapToTargetIds(targetIdsValue), candidates = $el.svg.selectAll($$.selectorTargets(targetIds)); // should be for all targets candidates.classed(config_classes.focused, !1).classed(config_classes.defocused, !1), $$.hasArcType() && $$.unexpandArc(targetIds), config.legend_show && ($$.showLegend(targetIds.filter($$.isLegendToShow.bind($$))), $el.legend.selectAll($$.selectorLegends(targetIds)).filter(function () { return (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.legendItemFocused); }).classed(config_classes.legendItemFocused, !1)), state.focusedTargetIds = [], state.defocusedTargetIds = []; } }); ;// CONCATENATED MODULE: ./src/Chart/api/legend.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Define legend * @ignore */ var legend_legend = { /** * Show legend for each target. * @function legend․show * @instance * @memberof Chart * @param {string|Array} targetIds * - If targetIds is given, specified target's legend will be shown. * - If only one target is the candidate, String can be passed. * - If no argument is given, all of target's legend will be shown. * @example * // Show legend for data1. * chart.legend.show("data1"); * * // Show legend for data1 and data2. * chart.legend.show(["data1", "data2"]); * * // Show all legend. * chart.legend.show(); */ show: function show(targetIds) { var $$ = this.internal; $$.showLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 }); }, /** * Hide legend for each target. * @function legend․hide * @instance * @memberof Chart * @param {string|Array} targetIds * - If targetIds is given, specified target's legend will be hidden. * - If only one target is the candidate, String can be passed. * - If no argument is given, all of target's legend will be hidden. * @example * // Hide legend for data1. * chart.legend.hide("data1"); * * // Hide legend for data1 and data2. * chart.legend.hide(["data1", "data2"]); * * // Hide all legend. * chart.legend.hide(); */ hide: function hide(targetIds) { var $$ = this.internal; $$.hideLegend($$.mapToTargetIds(targetIds)), $$.updateAndRedraw({ withLegend: !0 }); } }; /* harmony default export */ var api_legend = ({ legend: legend_legend }); ;// CONCATENATED MODULE: ./src/Chart/api/load.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var api_load = ({ /** * Load data to the chart.

      * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles. * - Note: * - unload should be used if some data needs to be unloaded simultaneously. * If you call unload API soon after/before load instead of unload param, chart will not be rendered properly because of cancel of animation.
      * - done will be called after data loaded, but it's not after rendering. * It's because rendering will finish after some transition and there is some time lag between loading and rendering * @function load * @instance * @memberof Chart * @param {object} args The object can consist with following members:
      * * | Key | Description | * | --- | --- | * | - url
      - json
      - rows
      - columns | The data will be loaded. If data that has the same target id is given, the chart will be updated. Otherwise, new target will be added | * | data | Data objects to be loaded. Checkout the example. | * | names | Same as data.names() | * | xs | Same as data.xs option | * | classes | The classes specified by data.classes will be updated. classes must be Object that has target id as keys. | * | categories | The categories specified by axis.x.categories or data.x will be updated. categories must be Array. | * | axes | The axes specified by data.axes will be updated. axes must be Object that has target id as keys. | * | colors | The colors specified by data.colors will be updated. colors must be Object that has target id as keys. | * | headers | Set request header if loading via `data.url`.
      @see [data․headers](Options.html#.data%25E2%2580%25A4headers) | * | keys | Choose which JSON objects keys correspond to desired data.
      **NOTE:** Only for JSON object given as array.
      @see [data․keys](Options.html#.data%25E2%2580%25A4keys) | * | mimeType | Set 'json' if loading JSON via url.
      @see [data․mimeType](Options.html#.data%25E2%2580%25A4mimeType) | * | - type
      - types | The type of targets will be updated. type must be String and types must be Object. | * | unload | Specify the data will be unloaded before loading new data. If true given, all of data will be unloaded. If target ids given as String or Array, specified targets will be unloaded. If absent or false given, unload will not occur. | * | done | The specified function will be called after data loaded.| * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataFromURL) * @example * // Load data1 and unload data2 and data3 * chart.load({ * columns: [ * ["data1", 100, 200, 150, ...], * ... * ], * unload: ["data2", "data3"], * url: "...", * done: function() { ... } * }); * @example * // myAPI.json * // { * // "data1": [220, 240, 270, 250, 280], * // "data2": [180, 150, 300, 70, 120] * // } * * chart.load({ * url: './data/myAPI.json', * mimeType: "json", * * // set request header if is needed * headers: { * "Content-Type": "text/json" * } * }); * @example * chart.load({ * data: [ * // equivalent as: columns: [["data1", 30, 200, 100]] * {"data1": 30}, {"data1": 200}, {"data1": 100} * * // or * // equivalent as: columns: [["data1", 10, 20], ["data2", 13, 30]] * // {"data1": 10, "data2": 13}, {"data1": 20, "data2": 30}} * ] * }); * @example * chart.load({ * json: [ * {name: "www.site1.com", upload: 800, download: 500, total: 400}, * ], * keys: { * x: "name", * value: ["upload", "download"] * } * }); */ load: function load(args) { var $$ = this.internal, config = $$.config; // update xs if specified // update names if exists // update classes if exists // update axes if exists // update colors if exists args.xs && $$.addXs(args.xs), "names" in args && this.data.names(args.names), "classes" in args && Object.keys(args.classes).forEach(function (id) { config.data_classes[id] = args.classes[id]; }), "categories" in args && $$.axis.isCategorized() && (config.axis_x_categories = args.categories), "axes" in args && Object.keys(args.axes).forEach(function (id) { config.data_axes[id] = args.axes[id]; }), "colors" in args && Object.keys(args.colors).forEach(function (id) { config.data_colors[id] = args.colors[id]; }), "unload" in args && args.unload !== !1 ? $$.unload($$.mapToTargetIds(args.unload === !0 ? null : args.unload), function () { return $$.loadFromArgs(args); }) : $$.loadFromArgs(args); }, /** * Unload data to the chart.

      * You can specify multiple targets by giving an array that includes id as String. If no argument is given, all of targets will be toggles. * - Note: * If you call load API soon after/before unload, unload param of load should be used. Otherwise chart will not be rendered properly because of cancel of animation.
      * `done` will be called after data loaded, but it's not after rendering. It's because rendering will finish after some transition and there is some time lag between loading and rendering. * @function unload * @instance * @memberof Chart * @param {object} argsValue * | key | Type | Description | * | --- | --- | --- | * | ids | String | Array | Target id data to be unloaded. If not given, all data will be unloaded. | * | done | Fuction | Callback after data is unloaded. | * @example * // Unload data2 and data3 * chart.unload({ * ids: ["data2", "data3"], * done: function() { * // called after the unloaded * } * }); */ unload: function unload(argsValue) { var _this = this, $$ = this.internal, args = argsValue || {}; isArray(args) ? args = { ids: args } : isString(args) && (args = { ids: [args] }); var ids = $$.mapToTargetIds(args.ids); $$.unload(ids, function () { $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0, withLegend: !0 }), $$.cache.remove(ids), args.done && args.done.call(_this); }); } }); ;// CONCATENATED MODULE: ./src/Chart/api/show.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Show/Hide data series * @param {boolean} show Show or hide * @param {Array} targetIdsValue Target id values * @param {object} options Options * @private */ function showHide(show, targetIdsValue, options) { var $$ = this.internal, targetIds = $$.mapToTargetIds(targetIdsValue); $$.state.toggling = !0, $$[(show ? "remove" : "add") + "HiddenTargetIds"](targetIds); var targets = $$.$el.svg.selectAll($$.selectorTargets(targetIds)), opacity = show ? "1" : "0"; show && targets.style("display", null), targets.transition().style("opacity", opacity, "important").call(endall, function () { // https://github.com/naver/billboard.js/issues/1758 show || targets.style("display", "none"), targets.style("opacity", opacity); }), options.withLegend && $$[(show ? "show" : "hide") + "Legend"](targetIds), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0, withLegend: !0 }), $$.state.toggling = !1; } /* harmony default export */ var show = ({ /** * Show data series on chart * @function show * @instance * @memberof Chart * @param {string|Array} [targetIdsValue] The target id value. * @param {object} [options] The object can consist with following members:
      * * | Key | Type | default | Description | * | --- | --- | --- | --- | * | withLegend | boolean | false | whether or not display legend | * * @example * // show 'data1' * chart.show("data1"); * * // show 'data1' and 'data3' * chart.show(["data1", "data3"]); */ show: function show(targetIdsValue, options) { options === void 0 && (options = {}), showHide.call(this, !0, targetIdsValue, options); }, /** * Hide data series from chart * @function hide * @instance * @memberof Chart * @param {string|Array} [targetIdsValue] The target id value. * @param {object} [options] The object can consist with following members:
      * * | Key | Type | default | Description | * | --- | --- | --- | --- | * | withLegend | boolean | false | whether or not display legend | * * @example * // hide 'data1' * chart.hide("data1"); * * // hide 'data1' and 'data3' * chart.hide(["data1", "data3"]); */ hide: function hide(targetIdsValue, options) { options === void 0 && (options = {}), showHide.call(this, !1, targetIdsValue, options); }, /** * Toggle data series on chart. When target data is hidden, it will show. If is shown, it will hide in vice versa. * @function toggle * @instance * @memberof Chart * @param {string|Array} [targetIds] The target id value. * @param {object} [options] The object can consist with following members:
      * * | Key | Type | default | Description | * | --- | --- | --- | --- | * | withLegend | boolean | false | whether or not display legend | * * @example * // toggle 'data1' * chart.toggle("data1"); * * // toggle 'data1' and 'data3' * chart.toggle(["data1", "data3"]); */ toggle: function toggle(targetIds, options) { var _this = this; options === void 0 && (options = {}); var $$ = this.internal, targets = { show: [], hide: [] }; // sort show & hide target ids // perform show & hide task separately // https://github.com/naver/billboard.js/issues/454 $$.mapToTargetIds(targetIds).forEach(function (id) { return targets[$$.isTargetToShow(id) ? "hide" : "show"].push(id); }), targets.show.length && this.show(targets.show, options), targets.hide.length && setTimeout(function () { return _this.hide(targets.hide, options); }, 0); } }); ;// CONCATENATED MODULE: ./src/Chart/api/tooltip.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Define tooltip * @ignore */ var tooltip_tooltip = { /** * Show tooltip * @function tooltip․show * @instance * @memberof Chart * @param {object} args The object can consist with following members:
      * * | Key | Type | Description | * | --- | --- | --- | * | index | Number | Determine focus by index | * | x | Number | Date | Determine focus by x Axis index | * | mouse | Array | Determine x and y coordinate value relative the targeted '.bb-event-rect' x Axis.
      It should be used along with `data`, `index` or `x` value. The default value is set as `[0,0]` | * | data | Object | When [data.xs](Options.html#.data%25E2%2580%25A4xs) option is used or [tooltip.grouped](Options.html#.tooltip) set to 'false', `should be used giving this param`.

      **Key:**
      - x {number | Date}: x Axis value
      - index {number}: x Axis index (useless for data.xs)
      - id {string}: data id
      - value {number}: The corresponding value for tooltip. | * * @example * // show the 2nd x Axis coordinate tooltip * // for Arc(gauge, donut & pie) and radar type, approch showing tooltip by using "index" number. * chart.tooltip.show({ * index: 1 * }); * * // show tooltip for the 3rd x Axis in x:50 and y:100 coordinate of '.bb-event-rect' of the x Axis. * chart.tooltip.show({ * x: 2, * mouse: [50, 100] * }); * * // show tooltip for timeseries x axis * chart.tooltip.show({ * x: new Date("2018-01-02 00:00") * }); * * // when data.xs is used * chart.tooltip.show({ * data: { * x: 3, // x Axis value * id: "data1", // data id * value: 500 // data value * } * }); * * // when data.xs isn't used, but tooltip.grouped=false is set * chart.tooltip.show({ * data: { * index: 3, // or 'x' key value * id: "data1", // data id * value: 500 // data value * } * }); */ show: function show(args) { var index, mouse, $$ = this.internal, config = $$.config, inputType = $$.state.inputType; // determine focus data if (args.mouse && (mouse = args.mouse), args.data) { var data = args.data, y = $$.getYScaleById(data.id)(data.value); $$.isMultipleX() ? mouse = [$$.scale.x(data.x), y] : (!config.tooltip_grouped && (mouse = [0, y]), index = isValue(data.index) ? data.index : $$.getIndexByX(data.x)); } else isDefined(args.x) ? index = $$.getIndexByX(args.x) : isDefined(args.index) && (index = args.index); (inputType === "mouse" ? ["mouseover", "mousemove"] : ["touchstart"]).forEach(function (eventName) { $$.dispatchEvent(eventName, index, mouse); }); }, /** * Hide tooltip * @function tooltip․hide * @instance * @memberof Chart */ hide: function hide() { var $$ = this.internal, inputType = $$.state.inputType, tooltip = $$.$el.tooltip, data = tooltip && tooltip.datum(); if (data) { var index = JSON.parse(data.current)[0].index; // make to finalize, possible pending event flow set from '.tooltip.show()' call (inputType === "mouse" ? ["mouseout"] : ["touchend"]).forEach(function (eventName) { $$.dispatchEvent(eventName, index); }); } // reset last touch point index inputType === "touch" && $$.callOverOutForTouch(), $$.hideTooltip(!0), $$.hideGridFocus(), $$.unexpandCircles && $$.unexpandCircles(), $$.unexpandBars && $$.unexpandBars(); } }; /* harmony default export */ var api_tooltip = ({ tooltip: tooltip_tooltip }); ;// CONCATENATED MODULE: ./src/Chart/Chart.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Main chart class. * - Note: Instantiated via `bb.generate()`. * @class Chart * @example * var chart = bb.generate({ * data: { * columns: [ * ["x", "2015-11-02", "2015-12-01", "2016-01-01", "2016-02-01", "2016-03-01"], * ["count1", 11, 8, 7, 6, 5 ], * ["count2", 9, 3, 6, 2, 8 ] * ]} * } * @see {@link bb.generate} for the initialization. */ /** * Access instance's primary node elements * @member {object} $ * @property {object} $ Access instance's primary node elements * @property {d3.selection} $.chart Wrapper element * @property {d3.selection} $.svg Main svg element * @property {d3.selection} $.defs Definition element * @property {d3.selection} $.main Main grouping element * @property {d3.selection} $.tooltip Tooltip element * @property {d3.selection} $.legend Legend element * @property {d3.selection} $.title Title element * @property {d3.selection} $.grid Grid element * @property {d3.selection} $.arc Arc element * @property {d3.selection} $.circles Data point circle elements * @property {object} $.bar Bar element object * @property {d3.selection} $.bar.bars Bar elements * @property {d3.selection} $.candlestick Candlestick elements * @property {object} $.line Line element object * @property {d3.selection} $.line.lines Line elements * @property {d3.selection} $.line.areas Areas elements * @property {object} $.text Text element object * @property {d3.selection} $.text.texts Data label text elements * @memberof Chart * @example * var chart = bb.generate({ ... }); * * chart.$.chart; // wrapper element * chart.$.line.circles; // all data point circle elements */ /** * Plugin instance array * @member {Array} plugins * @memberof Chart * @example * var chart = bb.generate({ * ... * plugins: [ * new bb.plugin.stanford({ ... }), * new PluginA() * ] * }); * * chart.plugins; // [Stanford, PluginA] - instance array */ var Chart = function Chart(options) { this.plugins = [], this.internal = void 0; var $$ = new ChartInternal(this); // bind to namespaced APIs this.internal = $$, function bindThis(fn, target, argThis) { Object.keys(fn).forEach(function (key) { var isFunc = isFunction(fn[key]), isChild = target !== argThis, hasChild = Object.keys(fn[key]).length > 0; isFunc && (!isChild && hasChild || isChild) ? target[key] = fn[key].bind(argThis) : !isFunc && (target[key] = {}), hasChild && bindThis(fn[key], target[key], argThis); }); }(Chart.prototype, this, this), loadConfig.call($$, options), $$.beforeInit(), $$.init(); }; // extend common APIs as part of Chart class extend(Chart.prototype, [chart, api_color, api_data, api_export, api_focus, api_legend, api_load, show, api_tooltip]); ;// CONCATENATED MODULE: ./src/Chart/api/axis.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Set the min/max value * @param {Chart} $$ Chart instance * @param {string} type Set type 'min' or 'max' * @param {object} value Value to be set * @private */ function setMinMax($$, type, value) { var config = $$.config, axisY = "axis_y_" + type, axisY2 = "axis_y2_" + type; isDefined(value) && (isObjectType(value) ? (isValue(value.x) && (config["axis_x_" + type] = value.x), isValue(value.y) && (config[axisY] = value.y), isValue(value.y2) && (config[axisY2] = value.y2)) : (config[axisY] = value, config[axisY2] = value), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0 })); } /** * Get the min/max value * @param {Chart} $$ Chart instance * @param {string} type Set type 'min' or 'max' * @returns {{x, y, y2}} * @private */ function axis_getMinMax($$, type) { var config = $$.config; return { x: config["axis_x_" + type], y: config["axis_y_" + type], y2: config["axis_y2_" + type] }; } /** * Define axis * @ignore */ var axis = { /** * Get and set axis labels. * @function axis․labels * @instance * @memberof Chart * @param {object} labels specified axis' label to be updated. * @param {string} [labels.x] x Axis string * @param {string} [labels.y] y Axis string * @param {string} [labels.y2] y2 Axis string * @returns {object|undefined} axis labels text object * @example * // Update axis' label * chart.axis.labels({ * x: "New X Axis Label", * y: "New Y Axis Label", * y2: "New Y2 Axis Label" * }); * * chart.axis.labels(); * // --> { * // x: "New X Axis Label", * // y: "New Y Axis Label", * // y2: "New Y2 Axis Label" * // } */ labels: function labels(_labels) { var labelText, $$ = this.internal; return _labels && (Object.keys(_labels).forEach(function (axisId) { $$.axis.setLabelText(axisId, _labels[axisId]); }), $$.axis.updateLabels()), ["x", "y", "y2"].forEach(function (v) { var text = $$.axis.getLabelText(v); text && (!labelText && (labelText = {}), labelText[v] = text); }), labelText; }, /** * Get and set axis min value. * @function axis․min * @instance * @memberof Chart * @param {object} min If min is given, specified axis' min value will be updated.
      * If no argument is given, the min values set on generating option for each axis will be returned. * If not set any min values on generation, it will return `undefined`. * @returns {object|undefined} * @example * // Update axis' min * chart.axis.min({ * x: -10, * y: 1000, * y2: 100 * }); */ min: function min(_min) { var $$ = this.internal; return isValue(_min) ? setMinMax($$, "min", _min) : axis_getMinMax($$, "min"); }, /** * Get and set axis max value. * @function axis․max * @instance * @memberof Chart * @param {object} max If max is given, specified axis' max value will be updated.
      * If no argument is given, the max values set on generating option for each axis will be returned. * If not set any max values on generation, it will return `undefined`. * @returns {object|undefined} * @example * // Update axis' label * chart.axis.max({ * x: 100, * y: 1000, * y2: 10000 * }); */ max: function max(_max) { var $$ = this.internal; return arguments.length ? setMinMax($$, "max", _max) : axis_getMinMax($$, "max"); }, /** * Get and set axis min and max value. * @function axis․range * @instance * @memberof Chart * @param {object} range If range is given, specified axis' min and max value will be updated. If no argument is given, the current min and max values for each axis will be returned. * @returns {object|undefined} * @example * // Update axis' label * chart.axis.range({ * min: { * x: -10, * y: -1000, * y2: -10000 * }, * max: { * x: 100, * y: 1000, * y2: 10000 * }, * }); */ range: function range(_range) { var axis = this.axis; if (arguments.length) isDefined(_range.max) && axis.max(_range.max), isDefined(_range.min) && axis.min(_range.min);else return { max: axis.max(), min: axis.min() }; return undefined; } }; /* harmony default export */ var api_axis = ({ axis: axis }); ;// CONCATENATED MODULE: ./src/Chart/api/category.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var api_category = ({ /** * Set specified category name on category axis. * @function category * @instance * @memberof Chart * @param {number} i index of category to be changed * @param {string} category category value to be changed * @returns {string} * @example * chart.category(2, "Category 3"); */ category: function category(i, _category) { var $$ = this.internal, config = $$.config; return arguments.length > 1 && (config.axis_x_categories[i] = _category, $$.redraw()), config.axis_x_categories[i]; }, /** * Set category names on category axis. * @function categories * @instance * @memberof Chart * @param {Array} categories This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required. * @returns {Array} * @example * chart.categories([ * "Category 1", "Category 2", ... * ]); */ categories: function categories(_categories) { var $$ = this.internal, config = $$.config; return arguments.length ? (config.axis_x_categories = _categories, $$.redraw(), config.axis_x_categories) : config.axis_x_categories; } }); ;// CONCATENATED MODULE: ./src/Chart/api/grid.x.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Update x grid lines. * @function xgrids * @instance * @memberof Chart * @param {Array} grids X grid lines will be replaced with this argument. The format of this argument is the same as grid.x.lines. * @returns {object} * @example * // Show 2 x grid lines * chart.xgrids([ * {value: 1, text: "Label 1"}, * {value: 4, text: "Label 4"} * ]); * // --> Returns: [{value: 1, text: "Label 1"}, {value: 4, text: "Label 4"}] */ function xgrids(grids) { var $$ = this.internal, config = $$.config; return grids ? (config.grid_x_lines = grids, $$.redrawWithoutRescale(), config.grid_x_lines) : config.grid_x_lines; } extend(xgrids, { /** * Add x grid lines.
      * This API adds new x grid lines instead of replacing like xgrids. * @function xgrids․add * @instance * @memberof Chart * @param {Array|object} grids New x grid lines will be added. The format of this argument is the same as grid.x.lines and it's possible to give an Object if only one line will be added. * @returns {object} * @example * // Add a new x grid line * chart.xgrids.add( * {value: 4, text: "Label 4"} * ); * * // Add new x grid lines * chart.xgrids.add([ * {value: 2, text: "Label 2"}, * {value: 4, text: "Label 4"} * ]); */ add: function add(grids) { return this.xgrids(this.internal.config.grid_x_lines.concat(grids || [])); }, /** * Remove x grid lines.
      * This API removes x grid lines. * @function xgrids․remove * @instance * @memberof Chart * @param {object} params This argument should include value or class. If value is given, the x grid lines that have specified x value will be removed. If class is given, the x grid lines that have specified class will be removed. If args is not given, all of x grid lines will be removed. * @example * // x grid line on x = 2 will be removed * chart.xgrids.remove({value: 2}); * * // x grid lines that have 'grid-A' will be removed * chart.xgrids.remove({ * class: "grid-A" * }); * * // all of x grid lines will be removed * chart.xgrids.remove(); */ remove: function remove(params) { // TODO: multiple this.internal.removeGridLines(params, !0); } }); /* harmony default export */ var grid_x = ({ xgrids: xgrids }); ;// CONCATENATED MODULE: ./src/Chart/api/grid.y.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Update y grid lines. * @function ygrids * @instance * @memberof Chart * @param {Array} grids Y grid lines will be replaced with this argument. The format of this argument is the same as grid.y.lines. * @returns {object} * @example * // Show 2 y grid lines * chart.ygrids([ * {value: 100, text: "Label 1"}, * {value: 400, text: "Label 4"} * ]); * // --> Returns: [{value: 100, text: "Label 1"}, {value: 400, text: "Label 4"}] */ function ygrids(grids) { var $$ = this.internal, config = $$.config; return grids ? (config.grid_y_lines = grids, $$.redrawWithoutRescale(), config.grid_y_lines) : config.grid_y_lines; } extend(ygrids, { /** * Add y grid lines.
      * This API adds new y grid lines instead of replacing like ygrids. * @function ygrids․add * @instance * @memberof Chart * @param {Array|object} grids New y grid lines will be added. The format of this argument is the same as grid.y.lines and it's possible to give an Object if only one line will be added. * @returns {object} * @example * // Add a new x grid line * chart.ygrids.add( * {value: 400, text: "Label 4"} * ); * * // Add new x grid lines * chart.ygrids.add([ * {value: 200, text: "Label 2"}, * {value: 400, text: "Label 4"} * ]); */ add: function add(grids) { return this.ygrids(this.internal.config.grid_y_lines.concat(grids || [])); }, /** * Remove y grid lines.
      * This API removes x grid lines. * @function ygrids․remove * @instance * @memberof Chart * @param {object} params This argument should include value or class. If value is given, the y grid lines that have specified y value will be removed. If class is given, the y grid lines that have specified class will be removed. If args is not given, all of y grid lines will be removed. * @param {number} [params.value] target value * @param {string} [params.class] target class * @example * // y grid line on y = 200 will be removed * chart.ygrids.remove({value: 200}); * * // y grid lines that have 'grid-A' will be removed * chart.ygrids.remove({ * class: "grid-A" * }); * * // all of y grid lines will be removed * chart.ygrids.remove(); */ remove: function remove(params) { // TODO: multiple this.internal.removeGridLines(params, !1); } }); /* harmony default export */ var grid_y = ({ ygrids: ygrids }); ;// CONCATENATED MODULE: ./src/Chart/api/group.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var group = ({ /** * Update groups for the targets. * @function groups * @instance * @memberof Chart * @param {Array} groups This argument needs to be an Array that includes one or more Array that includes target ids to be grouped. * @returns {Array} Grouped data names array * @example * // data1 and data2 will be a new group. * chart.groups([ * ["data1", "data2"] * ]); */ groups: function groups(_groups) { var $$ = this.internal, config = $$.config; return isUndefined(_groups) ? config.data_groups : (config.data_groups = _groups, $$.redraw(), config.data_groups); } }); ;// CONCATENATED MODULE: ./src/Chart/api/regions.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Update regions. * @function regions * @instance * @memberof Chart * @param {Array} regions Regions will be replaced with this argument. The format of this argument is the same as regions. * @returns {Array} regions * @example * // Show 2 regions * chart.regions([ * {axis: "x", start: 5, class: "regionX"}, * {axis: "y", end: 50, class: "regionY"} * ]); */ function regions(regions) { var $$ = this.internal, config = $$.config; return regions ? (config.regions = regions, $$.redrawWithoutRescale(), regions) : config.regions; } extend(regions, { /** * Add new region.

      * This API adds new region instead of replacing like regions. * @function regions․add * @instance * @memberof Chart * @param {Array|object} regions New region will be added. The format of this argument is the same as regions and it's possible to give an Object if only one region will be added. * @returns {Array} regions * @example * // Add a new region * chart.regions.add( * {axis: "x", start: 5, class: "regionX"} * ); * * // Add new regions * chart.regions.add([ * {axis: "x", start: 5, class: "regionX"}, * {axis: "y", end: 50, class: "regionY"} *]); */ add: function add(regions) { var $$ = this.internal, config = $$.config; return regions ? (config.regions = config.regions.concat(regions), $$.redrawWithoutRescale(), config.regions) : config.regions; }, /** * Remove regions.

      * This API removes regions. * @function regions․remove * @instance * @memberof Chart * @param {object} optionsValue This argument should include classes. If classes is given, the regions that have one of the specified classes will be removed. If args is not given, all of regions will be removed. * @returns {Array} regions Removed regions * @example * // regions that have 'region-A' or 'region-B' will be removed. * chart.regions.remove({ * classes: [ * "region-A", "region-B" * ] * }); * * // all of regions will be removed. * chart.regions.remove(); */ remove: function remove(optionsValue) { var $$ = this.internal, config = $$.config, options = optionsValue || {}, duration = getOption(options, "duration", config.transition_duration), classes = getOption(options, "classes", [config_classes.region]), regions = $$.$el.main.select("." + config_classes.regions).selectAll(classes.map(function (c) { return "." + c; })); return (duration ? regions.transition().duration(duration) : regions).style("opacity", "0").remove(), regions = config.regions, Object.keys(options).length ? (regions = regions.filter(function (region) { var found = !1; return !region.class || (region.class.split(" ").forEach(function (c) { classes.indexOf(c) >= 0 && (found = !0); }), !found); }), config.regions = regions) : config.regions = [], regions; } }); /* harmony default export */ var api_regions = ({ regions: regions }); ;// CONCATENATED MODULE: ./src/Chart/api/x.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var x = ({ /** * Get and set x values for the chart. * @function x * @instance * @memberof Chart * @param {Array} x If x is given, x values of every target will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids. * @returns {object} xs * @example * // Get current x values * chart.x(); * * // Update x values for all targets * chart.x([100, 200, 300, 400, ...]); */ x: function x(_x) { var $$ = this.internal, axis = $$.axis, data = $$.data, isCategorized = axis.isCustomX() && axis.isCategorized(); return isArray(_x) && (isCategorized ? this.categories(_x) : ($$.updateTargetX(data.targets, _x), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0 }))), isCategorized ? this.categories() : data.xs; }, /** * Get and set x values for the chart. * @function xs * @instance * @memberof Chart * @param {Array} xs If xs is given, specified target's x values will be updated. If no argument is given, current x values will be returned as an Object whose keys are the target ids. * @returns {object} xs * @example * // Get current x values * chart.xs(); * * // Update x values for all targets * chart.xs({ * data1: [10, 20, 30, 40, ...], * data2: [100, 200, 300, 400, ...] * }); */ xs: function xs(_xs) { var $$ = this.internal; return isObject(_xs) && ($$.updateTargetXs($$.data.targets, _xs), $$.redraw({ withUpdateOrgXDomain: !0, withUpdateXDomain: !0 })), $$.data.xs; } }); ;// CONCATENATED MODULE: ./src/Chart/api/flow.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var flow = ({ /** * Flow data to the chart.

      * By this API, you can append new data points to the chart. * @function flow * @instance * @memberof Chart * @param {object} args The object can consist with following members:
      * * | Key | Type | Description | * | --- | --- | --- | * | json | Object | Data as JSON format (@see [data․json](Options.html#.data%25E2%2580%25A4json)) | * | rows | Array | Data in array as row format (@see [data․rows](Options.html#.data%25E2%2580%25A4json)) | * | columns | Array | Data in array as column format (@see [data․columns](Options.html#.data%25E2%2580%25A4columns)) | * | to | String | The lower x edge will move to that point. If not given, the lower x edge will move by the number of given data points | * | length | Number | The lower x edge will move by the number of this argument | * | duration | Number | The duration of the transition will be specified value. If not given, transition.duration will be used as default | * | done | Function | The specified function will be called when flow ends | * * - **NOTE:** * - If json, rows and columns given, the data will be loaded. * - If data that has the same target id is given, the chart will be appended. * - Otherwise, new target will be added. One of these is required when calling. * - If json specified, keys is required as well as data.json. * - If tab isn't visible(by evaluating `document.hidden`), will not be executed to prevent unnecessary work. * @example * // 2 data points will be apprended to the tail and popped from the head. * // After that, 4 data points will be appended and no data points will be poppoed. * chart.flow({ * columns: [ * ["x", "2018-01-11", "2018-01-21"], * ["data1", 500, 200], * ["data2", 100, 300], * ["data3", 200, 120] * ], * to: "2013-01-11", * done: function () { * chart.flow({ * columns: [ * ["x", "2018-02-11", "2018-02-12", "2018-02-13", "2018-02-14"], * ["data1", 200, 300, 100, 250], * ["data2", 100, 90, 40, 120], * ["data3", 100, 100, 300, 500] * ], * length: 2, * duration: 1500 * }); * } * }); */ flow: function flow(args) { var data, domain, diff, to, $$ = this.internal, length = 0, tail = 0; if ((args.json || args.rows || args.columns) && (data = $$.convertData(args)), data && isTabVisible()) { var notfoundIds = [], orgDataCount = $$.getMaxDataCount(), targets = $$.convertDataToTargets(data, !0), isTimeSeries = $$.axis.isTimeSeries(); $$.data.targets.forEach(function (t) { for (var found = !1, i = 0; i < targets.length; i++) if (t.id === targets[i].id) { found = !0, t.values[t.values.length - 1] && (tail = t.values[t.values.length - 1].index + 1), length = targets[i].values.length; for (var _j3 = 0; _j3 < length; _j3++) targets[i].values[_j3].index = tail + _j3, isTimeSeries || (targets[i].values[_j3].x = tail + _j3); t.values = t.values.concat(targets[i].values), targets.splice(i, 1); break; } found || notfoundIds.push(t.id); }), $$.data.targets.forEach(function (t) { for (var _i = 0; _i < notfoundIds.length; _i++) if (t.id === notfoundIds[_i]) { tail = t.values[t.values.length - 1].index + 1; for (var _j4 = 0; _j4 < length; _j4++) t.values.push({ id: t.id, index: tail + _j4, x: isTimeSeries ? $$.getOtherTargetX(tail + _j4) : tail + _j4, value: null }); } }), $$.data.targets.length && targets.forEach(function (t) { for (var missing = [], i = $$.data.targets[0].values[0].index; i < tail; i++) missing.push({ id: t.id, index: i, x: isTimeSeries ? $$.getOtherTargetX(i) : i, value: null }); t.values.forEach(function (v) { v.index += tail, isTimeSeries || (v.x += tail); }), t.values = missing.concat(t.values); }), $$.data.targets = $$.data.targets.concat(targets); // add remained // check data count because behavior needs to change when it"s only one // const dataCount = $$.getMaxDataCount(); var baseTarget = $$.data.targets[0], baseValue = baseTarget.values[0]; isDefined(args.to) ? (length = 0, to = isTimeSeries ? parseDate.call($$, args.to) : args.to, baseTarget.values.forEach(function (v) { v.x < to && length++; })) : isDefined(args.length) && (length = args.length), orgDataCount ? orgDataCount === 1 && isTimeSeries && (diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2, domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)]) : (diff = isTimeSeries ? baseTarget.values.length > 1 ? baseTarget.values[baseTarget.values.length - 1].x - baseValue.x : baseValue.x - $$.getXDomain($$.data.targets)[0] : 1, domain = [baseValue.x - diff, baseValue.x]), domain && $$.updateXDomain(null, !0, !0, !1, domain), $$.updateTargets($$.data.targets), $$.redraw({ flow: { index: baseValue.index, length: length, duration: isValue(args.duration) ? args.duration : $$.config.transition_duration, done: args.done, orgDataCount: orgDataCount }, withLegend: !0, withTransition: orgDataCount > 1, withTrimXDomain: !1, withUpdateXAxis: !0 }); } } }); // EXTERNAL MODULE: external {"commonjs":"d3-axis","commonjs2":"d3-axis","amd":"d3-axis","root":"d3"} var external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_ = __webpack_require__(10); ;// CONCATENATED MODULE: ./src/ChartInternal/Axis/AxisRendererHelper.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * @ignore */ var AxisRendererHelper = /*#__PURE__*/function () { function AxisRendererHelper(owner) { this.owner = void 0, this.config = void 0, this.scale = void 0; var scale = getScale(), config = owner.config, params = owner.params; this.owner = owner, this.config = config, this.scale = scale, (config.noTransition || !params.config.transition_duration) && (config.withoutTransition = !0), config.range = this.scaleExtent((params.orgXScale || scale).range()); } /** * Compute a character dimension * @param {d3.selection} node node * @returns {{w: number, h: number}} * @private */ AxisRendererHelper.getSizeFor1Char = function getSizeFor1Char(node) { // default size for one character var size = { w: 5.5, h: 11.5 }; return node.empty() || node.select("text").text("0").call(function (el) { try { var _el$node$getBBox = el.node().getBBox(), width = _el$node$getBBox.width, height = _el$node$getBBox.height; width && height && (size.w = width, size.h = height); } catch (e) {} finally { el.text(""); } }), this.getSizeFor1Char = function () { return size; }, size; } /** * Get tick transform setter function * @param {string} id Axis id * @returns {Function} transfrom setter function * @private */ ; var _proto = AxisRendererHelper.prototype; return _proto.getTickTransformSetter = function getTickTransformSetter(id) { var config = this.config, fn = id === "x" ? function (value) { return "translate(" + (value + config.tickOffset) + ",0)"; } : function (value) { return "translate(0," + value + ")"; }; return function (selection, scale) { selection.attr("transform", function (d) { return fn(Math.ceil(scale(d))); }); }; }, _proto.scaleExtent = function scaleExtent(domain) { var start = domain[0], stop = domain[domain.length - 1]; return start < stop ? [start, stop] : [stop, start]; }, _proto.generateTicks = function generateTicks(scale, isYAxes) { var tickStepSize = this.owner.params.tickStepSize, _scale$domain = scale.domain(), start = _scale$domain[0], end = _scale$domain[1], ticks = []; // When 'axis[y|y2].tick.stepSize' option is set if (isYAxes && tickStepSize) for (var interval = start; interval <= end;) ticks.push(interval), interval += tickStepSize;else if (scale.ticks) { var tickArguments = this.config.tickArguments; // adjust excessive tick count show if (scale.type === "log" && !tickArguments) { // nicer symlog ticks didn't implemented yet: https://github.com/d3/d3-scale/issues/162 // get ticks values from logScale var s = getScale("_log").domain([start > 0 ? start : 1, end]).range(scale.range()); ticks = s.ticks(); for (var cnt = end.toFixed().length; ticks.length > 15; cnt--) ticks = s.ticks(cnt); ticks.splice(0, 1, start), ticks.splice(ticks.length - 1, 1, end); } else ticks = scale.ticks.apply(scale, this.config.tickArguments || []); ticks = ticks.map(function (v) { // round the tick value if is number var r = isString(v) && isNumber(v) && !isNaN(v) && Math.round(v * 10) / 10 || v; return r; }); } else { for (var i = Math.ceil(start); i < end; i++) ticks.push(i); ticks.length > 0 && ticks[0] > 0 && ticks.unshift(ticks[0] - (ticks[1] - ticks[0])); } return ticks; }, _proto.copyScale = function copyScale() { var newScale = this.scale.copy(); return newScale.domain().length || newScale.domain(this.scale.domain()), newScale.type = this.scale.type, newScale; }, _proto.textFormatted = function textFormatted(v) { var tickFormat = this.config.tickFormat, value = /\d+\.\d+0{5,}\d$/.test(v) ? +(v + "").replace(/0+\d$/, "") : v, formatted = tickFormat ? tickFormat(value) : value; // to round float numbers from 'binary floating point' // https://en.wikipedia.org/wiki/Double-precision_floating-point_format // https://stackoverflow.com/questions/17849101/laymans-explanation-for-why-javascript-has-weird-floating-math-ieee-754-stand return isDefined(formatted) ? formatted : ""; }, _proto.transitionise = function transitionise(selection) { var config = this.config; return config.withoutTransition ? selection.interrupt() : selection.transition(config.transition); }, AxisRendererHelper; }(); ;// CONCATENATED MODULE: ./src/ChartInternal/Axis/AxisRenderer.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * @ignore */ var AxisRenderer = /*#__PURE__*/function () { function AxisRenderer(params) { params === void 0 && (params = {}), this.helper = void 0, this.config = void 0, this.params = void 0, this.g = void 0; var config = { innerTickSize: 6, outerTickSize: params.outerTick ? 6 : 0, orient: "bottom", range: [], tickArguments: null, tickCentered: null, tickCulling: !0, tickFormat: null, tickLength: 9, tickOffset: 0, tickPadding: 3, tickValues: null, transition: null, noTransition: params.noTransition }; config.tickLength = Math.max(config.innerTickSize, 0) + config.tickPadding, this.config = config, this.params = params, this.helper = new AxisRendererHelper(this); } /** * Create axis element * @param {d3.selection} g Axis selection * @private */ var _proto = AxisRenderer.prototype; return _proto.create = function create(g) { var ctx = this, config = this.config, helper = this.helper, params = this.params, scale = helper.scale, orient = config.orient, splitTickText = this.splitTickText.bind(this), isLeftRight = /^(left|right)$/.test(orient), isTopBottom = /^(top|bottom)$/.test(orient), tickTransform = helper.getTickTransformSetter(isTopBottom ? "x" : "y"), axisPx = tickTransform === helper.axisX ? "y" : "x", sign = /^(top|left)$/.test(orient) ? -1 : 1, rotate = params.tickTextRotate; this.config.range = scale.rangeExtent ? scale.rangeExtent() : helper.scaleExtent((params.orgXScale || scale).range()); var $g, _config2 = config, innerTickSize = _config2.innerTickSize, tickLength = _config2.tickLength, range = _config2.range, id = params.id, tickTextPos = id && /^(x|y|y2)$/.test(id) ? params.config["axis_" + id + "_tick_text_position"] : { x: 0, y: 0 }, prefix = id === "subX" ? "subchart_axis_x" : "axis_" + id, axisShow = params.config[prefix + "_show"], tickShow = { tick: !!axisShow && params.config[prefix + "_tick_show"], text: !!axisShow && params.config[prefix + "_tick_text_show"] }; // // get the axis' tick position configuration g.each(function () { var g = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), scale0 = this.__chart__ || scale, scale1 = helper.copyScale(); $g = g, this.__chart__ = scale1, config.tickOffset = params.isCategory ? Math.ceil((scale1(1) - scale1(0)) / 2) : 0; // update selection - data join var path = g.selectAll(".domain").data([0]); // enter + update selection if (path.enter().append("path").attr("class", "domain") // https://observablehq.com/@d3/d3-selection-2-0 .merge(helper.transitionise(path).selection()).attr("d", function () { var outerTickSized = config.outerTickSize * sign; return isTopBottom ? "M" + range[0] + "," + outerTickSized + "V0H" + range[1] + "V" + outerTickSized : "M" + outerTickSized + "," + range[0] + "H0V" + range[1] + "H" + outerTickSized; }), tickShow.tick || tickShow.text) { // count of tick data in array var ticks = config.tickValues || helper.generateTicks(scale1, isLeftRight), tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", "1"), tickExit = tick.exit().remove(); // update selection tick = tickEnter.merge(tick), tickShow.tick && tickEnter.append("line"), tickShow.text && tickEnter.append("text"); var sizeFor1Char = AxisRendererHelper.getSizeFor1Char(tick), counts = [], tspan = tick.select("text").selectAll("tspan").data(function (d, index) { var split = params.tickMultiline ? splitTickText(d, scale1, ticks, isLeftRight, sizeFor1Char.w) : isArray(helper.textFormatted(d)) ? helper.textFormatted(d).concat() : [helper.textFormatted(d)]; return counts[index] = split.length, split.map(function (splitted) { return { index: index, splitted: splitted }; }); }); tspan.exit().remove(), tspan = tspan.enter().append("tspan").merge(tspan).text(function (d) { return d.splitted; }), tspan.attr("x", isTopBottom ? 0 : tickLength * sign).attr("dx", function () { var dx = 0; return /(top|bottom)/.test(orient) && rotate && (dx = 8 * Math.sin(Math.PI * (rotate / 180)) * (orient === "top" ? -1 : 1)), dx + (tickTextPos.x || 0); }()).attr("dy", function (d, i) { var dy = 0; return orient !== "top" && (dy = sizeFor1Char.h, i === 0 && (dy = isLeftRight ? -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 3) : tickTextPos.y === 0 ? ".71em" : 0)), isNumber(dy) && tickTextPos.y ? dy + tickTextPos.y : dy || ".71em"; }); var lineUpdate = tick.select("line"), textUpdate = tick.select("text"); // Append for tooltip display if (tickEnter.select("line").attr(axisPx + "2", innerTickSize * sign), tickEnter.select("text").attr(axisPx, tickLength * sign), ctx.setTickLineTextPosition(lineUpdate, textUpdate), params.tickTitle) { var title = textUpdate.select("title"); (title.empty() ? textUpdate.append("title") : title).text(function (index) { return params.tickTitle[index]; }); } if (scale1.bandwidth) { var x = scale1, dx = x.bandwidth() / 2; scale0 = function (d) { return x(d) + dx; }, scale1 = scale0; } else scale0.bandwidth ? scale0 = scale1 : tickTransform(tickExit, scale1); tickTransform(tickEnter, scale0), tickTransform(helper.transitionise(tick).style("opacity", "1"), scale1); } }), this.g = $g; } /** * Get tick x/y coordinate * @returns {{x: number, y: number}} * @private */ , _proto.getTickXY = function getTickXY() { var config = this.config, pos = { x: 0, y: 0 }; return this.params.isCategory && (pos.x = config.tickCentered ? 0 : config.tickOffset, pos.y = config.tickCentered ? config.tickOffset : 0), pos; } /** * Get tick size * @param {object} d data object * @returns {number} * @private */ , _proto.getTickSize = function getTickSize(d) { var scale = this.helper.scale, config = this.config, _config3 = config, innerTickSize = _config3.innerTickSize, range = _config3.range, tickPosition = scale(d) + (config.tickCentered ? 0 : config.tickOffset); return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0; } /** * Set tick's line & text position * @param {d3.selection} lineUpdate Line selection * @param {d3.selection} textUpdate Text selection * @private */ , _proto.setTickLineTextPosition = function setTickLineTextPosition(lineUpdate, textUpdate) { var tickPos = this.getTickXY(), _this$config = this.config, innerTickSize = _this$config.innerTickSize, orient = _this$config.orient, tickLength = _this$config.tickLength, tickOffset = _this$config.tickOffset, rotate = this.params.tickTextRotate, textAnchorForText = function (r) { var value = ["start", "end"]; return orient === "top" && value.reverse(), r ? r > 0 ? value[0] : value[1] : "middle"; }, textTransform = function (r) { return r ? "rotate(" + r + ")" : null; }, yForText = function (r) { var r2 = r / (orient === "bottom" ? 15 : 23); return r ? 11.5 - 2.5 * r2 * (r > 0 ? 1 : -1) : tickLength; }; orient === "bottom" ? (lineUpdate.attr("x1", tickPos.x).attr("x2", tickPos.x).attr("y2", this.getTickSize.bind(this)), textUpdate.attr("x", 0).attr("y", yForText(rotate)).style("text-anchor", textAnchorForText(rotate)).attr("transform", textTransform(rotate))) : orient === "top" ? (lineUpdate.attr("x2", 0).attr("y2", -innerTickSize), textUpdate.attr("x", 0).attr("y", -yForText(rotate) * 2).style("text-anchor", textAnchorForText(rotate)).attr("transform", textTransform(rotate))) : orient === "left" ? (lineUpdate.attr("x2", -innerTickSize).attr("y1", tickPos.y).attr("y2", tickPos.y), textUpdate.attr("x", -tickLength).attr("y", tickOffset).style("text-anchor", "end")) : orient === "right" ? (lineUpdate.attr("x2", innerTickSize).attr("y2", 0), textUpdate.attr("x", tickLength).attr("y", 0).style("text-anchor", "start")) : void 0; } // this should be called only when category axis , _proto.splitTickText = function splitTickText(d, scale, ticks, isLeftRight, charWidth) { // split given text by tick width size // eslint-disable-next-line function split(splitted, text) { for (var subtext, spaceIndex, textWidth, i = 1; i < text.length; i++) // if text width gets over tick width, split by space index or current index if (text.charAt(i) === " " && (spaceIndex = i), subtext = text.substr(0, i + 1), textWidth = charWidth * subtext.length, tickWidth < textWidth) return split(splitted.concat(text.substr(0, spaceIndex || i)), text.slice(spaceIndex ? spaceIndex + 1 : i)); return splitted.concat(text); } var params = this.params, tickText = this.helper.textFormatted(d), splitted = isString(tickText) && tickText.indexOf("\n") > -1 ? tickText.split("\n") : []; if (splitted.length) return splitted; if (isArray(tickText)) return tickText; var tickWidth = params.tickWidth; return (!tickWidth || tickWidth <= 0) && (tickWidth = isLeftRight ? 95 : params.isCategory ? Math.ceil(scale(ticks[1]) - scale(ticks[0])) - 12 : 110), split(splitted, tickText + ""); }, _proto.scale = function scale(x) { return arguments.length ? (this.helper.scale = x, this) : this.helper.scale; }, _proto.orient = function orient(x) { return arguments.length ? (this.config.orient = x in { top: 1, right: 1, bottom: 1, left: 1 } ? x + "" : "bottom", this) : this.config.orient; }, _proto.tickFormat = function tickFormat(format) { var config = this.config; return arguments.length ? (config.tickFormat = format, this) : config.tickFormat; }, _proto.tickCentered = function tickCentered(isCentered) { var config = this.config; return arguments.length ? (config.tickCentered = isCentered, this) : config.tickCentered; } /** * Return tick's offset value. * The value will be set for 'category' axis type. * @returns {number} * @private */ , _proto.tickOffset = function tickOffset() { return this.config.tickOffset; } /** * Get tick interval count * @private * @param {number} size Total data size * @returns {number} */ , _proto.tickInterval = function tickInterval(size) { var interval, _this = this; if (this.params.isCategory) interval = this.config.tickOffset * 2;else { var length = this.g.select("path.domain").node().getTotalLength() - this.config.outerTickSize * 2; interval = length / (size || this.g.selectAll("line").size()); // get the interval by its values var intervalByValue = this.config.tickValues.map(function (v, i, arr) { var next = i + 1; return next < arr.length ? _this.helper.scale(arr[next]) - _this.helper.scale(v) : null; }).filter(Boolean); interval = Math.min.apply(Math, intervalByValue.concat([interval])); } return interval === Infinity ? 0 : interval; }, _proto.ticks = function ticks() { for (var config = this.config, _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; return args.length ? (config.tickArguments = toArray(args), this) : config.tickArguments; }, _proto.tickCulling = function tickCulling(culling) { var config = this.config; return arguments.length ? (config.tickCulling = culling, this) : config.tickCulling; }, _proto.tickValues = function tickValues(x) { var _this2 = this, config = this.config; if (isFunction(x)) config.tickValues = function () { return x(_this2.helper.scale.domain()); };else { if (!arguments.length) return config.tickValues; config.tickValues = x; } return this; }, _proto.setTransition = function setTransition(t) { return this.config.transition = t, this; }, AxisRenderer; }(); ;// CONCATENATED MODULE: ./src/ChartInternal/Axis/Axis.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var Axis = ({ getAxisInstance: function getAxisInstance() { return this.axis || new Axis_Axis(this); } }); var Axis_Axis = /*#__PURE__*/function () { function Axis(owner) { this.owner = void 0, this.x = void 0, this.subX = void 0, this.y = void 0, this.y2 = void 0, this.axesList = {}, this.tick = { x: null, y: null, y2: null }, this.xs = [], this.orient = { x: "bottom", y: "left", y2: "right", subX: "bottom" }, this.owner = owner, this.setOrient(); } var _proto = Axis.prototype; return _proto.getAxisClassName = function getAxisClassName(id) { return config_classes.axis + " " + config_classes["axis" + capitalize(id)]; }, _proto.isHorizontal = function isHorizontal($$, forHorizontal) { var isRotated = $$.config.axis_rotated; return forHorizontal ? isRotated : !isRotated; }, _proto.isCategorized = function isCategorized() { var _this$owner = this.owner, config = _this$owner.config, state = _this$owner.state; return config.axis_x_type.indexOf("category") >= 0 || state.hasRadar; }, _proto.isCustomX = function isCustomX() { var config = this.owner.config; return !this.isTimeSeries() && (config.data_x || notEmpty(config.data_xs)); }, _proto.isTimeSeries = function isTimeSeries(id) { return id === void 0 && (id = "x"), this.owner.config["axis_" + id + "_type"] === "timeseries"; }, _proto.isLog = function isLog(id) { return id === void 0 && (id = "x"), this.owner.config["axis_" + id + "_type"] === "log"; }, _proto.isTimeSeriesY = function isTimeSeriesY() { return this.isTimeSeries("y"); }, _proto.getAxisType = function getAxisType(id) { id === void 0 && (id = "x"); var type = "linear"; return this.isTimeSeries(id) ? type = "time" : this.isLog(id) && (type = "log"), type; }, _proto.init = function init() { var _this = this, $$ = this.owner, config = $$.config, _$$$$el = $$.$el, main = _$$$$el.main, axis = _$$$$el.axis, clip = $$.state.clip, isRotated = config.axis_rotated, target = ["x", "y"]; config.axis_y2_show && target.push("y2"), target.forEach(function (v) { var classAxis = _this.getAxisClassName(v), classLabel = config_classes["axis" + v.toUpperCase() + "Label"]; axis[v] = main.append("g").attr("class", classAxis).attr("clip-path", function () { var res = null; return v === "x" ? res = clip.pathXAxis : v === "y" && (res = clip.pathYAxis), res; }).attr("transform", $$.getTranslate(v)).style("visibility", config["axis_" + v + "_show"] ? "visible" : "hidden"), axis[v].append("text").attr("class", classLabel).attr("transform", ["rotate(-90)", null][v === "x" ? +!isRotated : +isRotated]).style("text-anchor", function () { return _this.textAnchorForAxisLabel(v); }), _this.generateAxes(v); }); } /** * Set axis orient according option value * @private */ , _proto.setOrient = function setOrient() { var $$ = this.owner, _$$$config = $$.config, isRotated = _$$$config.axis_rotated, yInner = _$$$config.axis_y_inner, y2Inner = _$$$config.axis_y2_inner; this.orient = { x: isRotated ? "left" : "bottom", y: isRotated ? yInner ? "top" : "bottom" : yInner ? "right" : "left", y2: isRotated ? y2Inner ? "bottom" : "top" : y2Inner ? "left" : "right", subX: isRotated ? "left" : "bottom" }; } /** * Generate axes * It's used when axis' axes option is set * @param {string} id Axis id * @private */ , _proto.generateAxes = function generateAxes(id) { var d3Axis, $$ = this.owner, config = $$.config, axes = [], axesConfig = config["axis_" + id + "_axes"], isRotated = config.axis_rotated; id === "x" ? d3Axis = isRotated ? external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_.axisLeft : external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_.axisBottom : id === "y" ? d3Axis = isRotated ? external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_.axisBottom : external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_.axisLeft : id === "y2" && (d3Axis = isRotated ? external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_.axisTop : external_commonjs_d3_axis_commonjs2_d3_axis_amd_d3_axis_root_d3_.axisRight), axesConfig.length && axesConfig.forEach(function (v) { var tick = v.tick || {}, scale = $$.scale[id].copy(); v.domain && scale.domain(v.domain), axes.push(d3Axis(scale).ticks(tick.count).tickFormat(isFunction(tick.format) ? tick.format.bind($$.api) : function (x) { return x; }).tickValues(tick.values).tickSizeOuter(tick.outer === !1 ? 0 : 6)); }), this.axesList[id] = axes; } /** * Update axes nodes * @private */ , _proto.updateAxes = function updateAxes() { var _this2 = this, $$ = this.owner, config = $$.config, main = $$.$el.main; Object.keys(this.axesList).forEach(function (id) { var axesConfig = config["axis_" + id + "_axes"], scale = $$.scale[id].copy(), range = scale.range(); _this2.axesList[id].forEach(function (v, i) { var axisRange = v.scale().range(); // adjust range value with the current // https://github.com/naver/billboard.js/issues/859 range.every(function (v, i) { return v === axisRange[i]; }) || v.scale().range(range); var className = _this2.getAxisClassName(id) + "-" + (i + 1), g = main.select("." + className.replace(/\s/, ".")); g.empty() ? g = main.append("g").attr("class", className).style("visibility", config["axis_" + id + "_show"] ? "visible" : "hidden").call(v) : (axesConfig[i].domain && scale.domain(axesConfig[i].domain), _this2.x.helper.transitionise(g).call(v.scale(scale))), g.attr("transform", $$.getTranslate(id, i + 1)); }); }); } /** * Set Axis & tick values * called from: updateScales() * @param {string} id Axis id string * @param {d3Scale} scale Scale * @param {boolean} outerTick If show outer tick * @param {boolean} noTransition If with no transition * @private */ , _proto.setAxis = function setAxis(id, scale, outerTick, noTransition) { var $$ = this.owner; id !== "subX" && (this.tick[id] = this.getTickValues(id)), this[id] = this.getAxis(id, scale, outerTick, // do not transit x Axis on zoom and resizing // https://github.com/naver/billboard.js/issues/1949 !!(id === "x" && ($$.scale.zoom || $$.config.subchart_show || $$.state.resizing)) || noTransition); } // called from : getMaxTickWidth() , _proto.getAxis = function getAxis(id, scale, outerTick, noTransition, noTickTextRotate) { var tickFormat, $$ = this.owner, config = $$.config, isX = /^(x|subX)$/.test(id), type = isX ? "x" : id, isCategory = isX && this.isCategorized(), orient = this.orient[id], tickTextRotate = noTickTextRotate ? 0 : $$.getAxisTickRotate(type); if (isX) tickFormat = $$.format.xAxisTick;else { var fn = config["axis_" + id + "_tick_format"]; isFunction(fn) && (tickFormat = fn.bind($$.api)); } var tickValues = this.tick[type], axisParams = mergeObj({ outerTick: outerTick, noTransition: noTransition, config: config, id: id, tickTextRotate: tickTextRotate }, isX && { isCategory: isCategory, tickMultiline: config.axis_x_tick_multiline, tickWidth: config.axis_x_tick_width, tickTitle: isCategory && config.axis_x_tick_tooltip && $$.api.categories(), orgXScale: $$.scale.x }); isX || (axisParams.tickStepSize = config["axis_" + type + "_tick_stepSize"]); var axis = new AxisRenderer(axisParams).scale(isX && $$.scale.zoom || scale).orient(orient); if (isX && this.isTimeSeries() && tickValues && !isFunction(tickValues)) { var _fn = parseDate.bind($$); tickValues = tickValues.map(function (v) { return _fn(v); }); } else !isX && this.isTimeSeriesY() && ( // https://github.com/d3/d3/blob/master/CHANGES.md#time-intervals-d3-time axis.ticks(config.axis_y_tick_time_value), tickValues = null); tickValues && axis.tickValues(tickValues), axis.tickFormat(tickFormat || !isX && $$.isStackNormalized() && function (x) { return x + "%"; }), isCategory && (axis.tickCentered(config.axis_x_tick_centered), isEmpty(config.axis_x_tick_culling) && (config.axis_x_tick_culling = !1)); var tickCount = config["axis_" + type + "_tick_count"]; return tickCount && axis.ticks(tickCount), axis; }, _proto.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) { var values, $$ = this.owner, config = $$.config, fit = config.axis_x_tick_fit, count = config.axis_x_tick_count; return (fit || count && fit) && (values = $$.mapTargetsToUniqueXs(targets), this.isCategorized() && count > values.length && (count = values.length), values = this.generateTickValues(values, count, this.isTimeSeries())), axis ? axis.tickValues(values) : this.x && (this.x.tickValues(values), this.subX && this.subX.tickValues(values)), values; }, _proto.getId = function getId(id) { var _this$owner2 = this.owner, config = _this$owner2.config, scale = _this$owner2.scale, axis = config.data_axes[id]; return axis && scale[axis] || (axis = "y"), axis; }, _proto.getXAxisTickFormat = function getXAxisTickFormat() { var currFormat, $$ = this.owner, config = $$.config, format = $$.format, tickFormat = config.axis_x_tick_format, isTimeSeries = this.isTimeSeries(), isCategorized = this.isCategorized(); return tickFormat ? isFunction(tickFormat) ? currFormat = tickFormat.bind($$.api) : isTimeSeries && (currFormat = function (date) { return date ? format.axisTime(tickFormat)(date) : ""; }) : currFormat = isTimeSeries ? format.defaultAxisTime : isCategorized ? $$.categoryName : function (v) { return v < 0 ? v.toFixed(0) : v; }, isFunction(currFormat) ? function (v) { return currFormat.apply($$, isCategorized ? [v, $$.categoryName(v)] : [v]); } : currFormat; }, _proto.getTickValues = function getTickValues(id) { var $$ = this.owner, tickValues = $$.config["axis_" + id + "_tick_values"], axis = $$[id + "Axis"]; return (isFunction(tickValues) ? tickValues.call($$.api) : tickValues) || (axis ? axis.tickValues() : undefined); }, _proto.getLabelOptionByAxisId = function getLabelOptionByAxisId(id) { return this.owner.config["axis_" + id + "_label"]; }, _proto.getLabelText = function getLabelText(id) { var option = this.getLabelOptionByAxisId(id); return isString(option) ? option : option ? option.text : null; }, _proto.setLabelText = function setLabelText(id, text) { var $$ = this.owner, config = $$.config, option = this.getLabelOptionByAxisId(id); isString(option) ? config["axis_" + id + "_label"] = text : option && (option.text = text); }, _proto.getLabelPosition = function getLabelPosition(id, defaultPosition) { var isRotated = this.owner.config.axis_rotated, option = this.getLabelOptionByAxisId(id), position = isObjectType(option) && option.position ? option.position : defaultPosition[+!isRotated], has = function (v) { return !!~position.indexOf(v); }; return { isInner: has("inner"), isOuter: has("outer"), isLeft: has("left"), isCenter: has("center"), isRight: has("right"), isTop: has("top"), isMiddle: has("middle"), isBottom: has("bottom") }; }, _proto.getAxisLabelPosition = function getAxisLabelPosition(id) { return this.getLabelPosition(id, id === "x" ? ["inner-top", "inner-right"] : ["inner-right", "inner-top"]); }, _proto.getLabelPositionById = function getLabelPositionById(id) { return this.getAxisLabelPosition(id); }, _proto.xForAxisLabel = function xForAxisLabel(id) { var $$ = this.owner, _$$$state = $$.state, width = _$$$state.width, height = _$$$state.height, position = this.getAxisLabelPosition(id), x = position.isMiddle ? -height / 2 : 0; return this.isHorizontal($$, id !== "x") ? x = position.isLeft ? 0 : position.isCenter ? width / 2 : width : position.isBottom && (x = -height), x; }, _proto.dxForAxisLabel = function dxForAxisLabel(id) { var $$ = this.owner, position = this.getAxisLabelPosition(id), dx = position.isBottom ? "0.5em" : "0"; return this.isHorizontal($$, id !== "x") ? dx = position.isLeft ? "0.5em" : position.isRight ? "-0.5em" : "0" : position.isTop && (dx = "-0.5em"), dx; }, _proto.textAnchorForAxisLabel = function textAnchorForAxisLabel(id) { var $$ = this.owner, position = this.getAxisLabelPosition(id), anchor = position.isMiddle ? "middle" : "end"; return this.isHorizontal($$, id !== "x") ? anchor = position.isLeft ? "start" : position.isCenter ? "middle" : "end" : position.isBottom && (anchor = "start"), anchor; }, _proto.dyForAxisLabel = function dyForAxisLabel(id) { var dy, $$ = this.owner, config = $$.config, isRotated = config.axis_rotated, isInner = this.getAxisLabelPosition(id).isInner, tickRotate = config["axis_" + id + "_tick_rotate"] ? $$.getHorizontalAxisHeight(id) : 0, maxTickWidth = this.getMaxTickWidth(id); if (id === "x") { var xHeight = config.axis_x_height; dy = isRotated ? isInner ? "1.2em" : -25 - maxTickWidth : isInner ? "-0.5em" : xHeight ? xHeight - 10 : tickRotate ? tickRotate - 10 : "3em"; } else dy = { y: ["-0.5em", 10, "3em", "1.2em", 10], y2: ["1.2em", -20, "-2.2em", "-0.5em", 15] }[id], dy = isRotated ? isInner ? dy[0] : tickRotate ? tickRotate * (id === "y2" ? -1 : 1) - dy[1] : dy[2] : isInner ? dy[3] : (dy[4] + (config["axis_" + id + "_inner"] ? 0 : maxTickWidth + dy[4])) * (id === "y" ? -1 : 1); return dy; }, _proto.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) { var $$ = this.owner, config = $$.config, current = $$.state.current, _$$$$el2 = $$.$el, svg = _$$$$el2.svg, chart = _$$$$el2.chart, currentTickMax = current.maxTickWidths[id], maxWidth = 0; if (withoutRecompute || !config["axis_" + id + "_show"] || $$.filterTargetsToShow().length === 0) return currentTickMax.size; if (svg) { var isYAxis = /^y2?$/.test(id), targetsToShow = $$.filterTargetsToShow($$.data.targets), scale = $$.scale[id].copy().domain($$["get" + (isYAxis ? "Y" : "X") + "Domain"](targetsToShow, id)), domain = scale.domain(), isDomainSame = domain[0] === domain[1] && domain.every(function (v) { return v > 0; }), isCurrentMaxTickDomainSame = isArray(currentTickMax.domain) && currentTickMax.domain[0] === currentTickMax.domain[1] && currentTickMax.domain.every(function (v) { return v > 0; }); // do not compute if domain or currentMaxTickDomain is same if (isDomainSame || isCurrentMaxTickDomainSame) return currentTickMax.size; // reset old max state value to prevent from new data loading currentTickMax.domain = domain, isYAxis || currentTickMax.ticks.splice(0); var axis = this.getAxis(id, scale, !1, !1, !0), tickCount = config["axis_" + id + "_tick_count"], tickValues = config["axis_" + id + "_tick_values"]; !tickValues && tickCount && axis.tickValues(this.generateTickValues(domain, tickCount, isYAxis ? this.isTimeSeriesY() : this.isTimeSeries())), isYAxis || this.updateXAxisTickValues(targetsToShow, axis); var dummy = chart.append("svg").style("visibility", "hidden").style("position", "fixed").style("top", "0px").style("left", "0px"); axis.create(dummy), dummy.selectAll("text").each(function (d, i) { var currentTextWidth = this.getBoundingClientRect().width; maxWidth = Math.max(maxWidth, currentTextWidth), isYAxis || (currentTickMax.ticks[i] = currentTextWidth); }), dummy.remove(); } return maxWidth > 0 && (currentTickMax.size = maxWidth), currentTickMax.size; }, _proto.getXAxisTickTextY2Overflow = function getXAxisTickTextY2Overflow(defaultPadding) { var $$ = this.owner, axis = $$.axis, config = $$.config, state = $$.state, xAxisTickRotate = $$.getAxisTickRotate("x"); if ((axis.isCategorized() || axis.isTimeSeries()) && config.axis_x_tick_fit && !config.axis_x_tick_culling && !config.axis_x_tick_multiline && xAxisTickRotate > 0 && xAxisTickRotate < 90) { var widthWithoutCurrentPaddingLeft = state.current.width - $$.getCurrentPaddingLeft(), maxOverflow = this.getXAxisTickMaxOverflow(xAxisTickRotate, widthWithoutCurrentPaddingLeft - defaultPadding), xAxisTickTextY2Overflow = Math.max(0, maxOverflow) + defaultPadding; // for display inconsistencies between browsers return Math.min(xAxisTickTextY2Overflow, widthWithoutCurrentPaddingLeft / 2); } return 0; }, _proto.getXAxisTickMaxOverflow = function getXAxisTickMaxOverflow(xAxisTickRotate, widthWithoutCurrentPaddingLeft) { for (var $$ = this.owner, axis = $$.axis, config = $$.config, state = $$.state, isTimeSeries = axis.isTimeSeries(), tickTextWidths = state.current.maxTickWidths.x.ticks, tickCount = tickTextWidths.length, _state$axis$x$padding = state.axis.x.padding, left = _state$axis$x$padding.left, right = _state$axis$x$padding.right, maxOverflow = 0, remaining = tickCount - (isTimeSeries && config.axis_x_tick_fit ? .5 : 0), i = 0; i < tickCount; i++) { var tickIndex = i + 1, rotatedTickTextWidth = Math.cos(Math.PI * xAxisTickRotate / 180) * tickTextWidths[i], ticksBeforeTickText = tickIndex - (isTimeSeries ? 1 : .5) + left; // Skip ticks if there are no ticks before them if (!(ticksBeforeTickText <= 0)) { var tickLength = (widthWithoutCurrentPaddingLeft - rotatedTickTextWidth) / ticksBeforeTickText; maxOverflow = Math.max(maxOverflow, rotatedTickTextWidth - tickLength / 2 - ((remaining - tickIndex) * tickLength + right * tickLength)); } } var filteredTargets = $$.filterTargetsToShow($$.data.targets), tickOffset = 0; if (!isTimeSeries && config.axis_x_tick_count <= filteredTargets.length && filteredTargets[0].values.length) { var scale = getScale($$.axis.getAxisType("x"), 0, widthWithoutCurrentPaddingLeft - maxOverflow).domain([left * -1, $$.getXDomainMax($$.data.targets) + 1 + right]); tickOffset = Math.ceil((scale(1) - scale(0)) / 2); } return maxOverflow + tickOffset; } /** * Get x Axis padding * @param {number} tickCount Tick count * @returns {object} Padding object values with 'left' & 'right' key * @private */ , _proto.getXAxisPadding = function getXAxisPadding(tickCount) { var $$ = this.owner, padding = $$.config.axis_x_padding; if (isEmpty(padding) ? padding = { left: 0, right: 0 } : (padding.left = padding.left || 0, padding.right = padding.right || 0), $$.axis.isTimeSeries()) { var firstX = +$$.getXDomainMin($$.data.targets), lastX = +$$.getXDomainMax($$.data.targets), timeDiff = lastX - firstX, range = timeDiff + padding.left + padding.right, left = 0, _right = 0; if (tickCount && range) { var relativeTickWidth = timeDiff / tickCount / range; left = padding.left / range / relativeTickWidth, _right = padding.right / range / relativeTickWidth; } padding = { left: left, right: _right }; } return padding; }, _proto.updateLabels = function updateLabels(withTransition) { var _this3 = this, $$ = this.owner, main = $$.$el.main, labels = { x: main.select("." + config_classes.axisX + " ." + config_classes.axisXLabel), y: main.select("." + config_classes.axisY + " ." + config_classes.axisYLabel), y2: main.select("." + config_classes.axisY2 + " ." + config_classes.axisY2Label) }; Object.keys(labels).filter(function (id) { return !labels[id].empty(); }).forEach(function (v) { var node = labels[v]; (withTransition ? node.transition() : node).attr("x", function () { return _this3.xForAxisLabel(v); }).attr("dx", function () { return _this3.dxForAxisLabel(v); }).attr("dy", function () { return _this3.dyForAxisLabel(v); }).text(function () { return _this3.getLabelText(v); }); }); }, _proto.getPadding = function getPadding(padding, key, defaultValue, domainLength) { var p = isNumber(padding) ? padding : padding[key]; return isValue(p) ? this.convertPixelsToAxisPadding(p, domainLength) : defaultValue; }, _proto.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) { var $$ = this.owner, config = $$.config, _$$$state2 = $$.state, width = _$$$state2.width, height = _$$$state2.height, length = config.axis_rotated ? width : height; return domainLength * (pixels / length); }, _proto.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) { var tickValues = values; if (tickCount) { var targetCount = isFunction(tickCount) ? tickCount() : tickCount; // compute ticks according to tickCount if (targetCount === 1) tickValues = [values[0]];else if (targetCount === 2) tickValues = [values[0], values[values.length - 1]];else if (targetCount > 2) { var tickValue, isCategorized = this.isCategorized(), count = targetCount - 2, start = values[0], end = values[values.length - 1]; tickValues = [start]; for (var i = 0; i < count; i++) tickValue = +start + (end - start) / (count + 1) * (i + 1), tickValues.push(forTimeSeries ? new Date(tickValue) : isCategorized ? Math.round(tickValue) : tickValue); tickValues.push(end); } } return forTimeSeries || (tickValues = tickValues.sort(function (a, b) { return a - b; })), tickValues; }, _proto.generateTransitions = function generateTransitions(duration) { var $$ = this.owner, axis = $$.$el.axis, _map = ["x", "y", "y2", "subX"].map(function (v) { var ax = axis[v]; return ax && duration && (ax = ax.transition().duration(duration)), ax; }), axisX = _map[0], axisY = _map[1], axisY2 = _map[2], axisSubX = _map[3]; return { axisX: axisX, axisY: axisY, axisY2: axisY2, axisSubX: axisSubX }; }, _proto.redraw = function redraw(transitions, isHidden, isInit) { var _this4 = this, $$ = this.owner, config = $$.config, $el = $$.$el, opacity = isHidden ? "0" : "1"; ["x", "y", "y2", "subX"].forEach(function (id) { var axis = _this4[id], $axis = $el.axis[id]; axis && $axis && (!isInit && !config.transition_duration && (axis.config.withoutTransition = !0), $axis.style("opacity", opacity), axis.create(transitions["axis" + capitalize(id)])); }), this.updateAxes(); } /** * Redraw axis * @param {Array} targetsToShow targets data to be shown * @param {object} wth option object * @param {d3.Transition} transitions Transition object * @param {object} flow flow object * @param {boolean} isInit called from initialization * @private */ , _proto.redrawAxis = function redrawAxis(targetsToShow, wth, transitions, flow, isInit) { var xDomainForZoom, _this5 = this, $$ = this.owner, config = $$.config, scale = $$.scale, $el = $$.$el, hasZoom = !!scale.zoom; !hasZoom && this.isCategorized() && targetsToShow.length === 0 && scale.x.domain([0, $el.axis.x.selectAll(".tick").size()]), scale.x && targetsToShow.length ? (!hasZoom && $$.updateXDomain(targetsToShow, wth.UpdateXDomain, wth.UpdateOrgXDomain, wth.TrimXDomain), !config.axis_x_tick_values && this.updateXAxisTickValues(targetsToShow)) : this.x && (this.x.tickValues([]), this.subX && this.subX.tickValues([])), config.zoom_rescale && !flow && (xDomainForZoom = scale.x.orgDomain()), ["y", "y2"].forEach(function (key) { var axisScale = scale[key]; if (axisScale) { var tickValues = config["axis_" + key + "_tick_values"], tickCount = config["axis_" + key + "_tick_count"]; if (axisScale.domain($$.getYDomain(targetsToShow, key, xDomainForZoom)), !tickValues && tickCount) { var _axis = $$.axis[key], domain = axisScale.domain(); _axis.tickValues(_this5.generateTickValues(domain, domain.every(function (v) { return v === 0; }) ? 1 : tickCount, _this5.isTimeSeriesY())); } } }), this.redraw(transitions, $$.hasArcType(), isInit), this.updateLabels(wth.Transition), (wth.UpdateXDomain || wth.UpdateXAxis || wth.Y) && targetsToShow.length && this.setCulling(), wth.Y && (scale.subY && scale.subY.domain($$.getYDomain(targetsToShow, "y")), scale.subY2 && scale.subY2.domain($$.getYDomain(targetsToShow, "y2"))); } /** * Set manual culling * @private */ , _proto.setCulling = function setCulling() { var $$ = this.owner, config = $$.config, _$$$state3 = $$.state, clip = _$$$state3.clip, current = _$$$state3.current, $el = $$.$el; ["subX", "x", "y", "y2"].forEach(function (type) { var axis = $el.axis[type], id = type === "subX" ? "x" : type, toCull = config["axis_" + id + "_tick_culling"]; // subchart x axis should be aligned with x axis culling if (axis && toCull) { var intervalForCulling, tickText = axis.selectAll(".tick text"), tickValues = sortValue(tickText.data()), tickSize = tickValues.length, cullingMax = config["axis_" + id + "_tick_culling_max"]; if (tickSize) { for (var i = 1; i < tickSize; i++) if (tickSize / i < cullingMax) { intervalForCulling = i; break; } tickText.each(function (d) { this.style.display = tickValues.indexOf(d) % intervalForCulling ? "none" : "block"; }); } else tickText.style("display", "block"); // set/unset x_axis_tick_clippath if (type === "x") { var clipPath = current.maxTickWidths.x.clipPath ? clip.pathXAxisTickTexts : null; $el.svg.selectAll("." + config_classes.axisX + " .tick text").attr("clip-path", clipPath); } } }); }, Axis; }(); ;// CONCATENATED MODULE: ./src/ChartInternal/interactions/eventrect.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var eventrect = ({ /** * Initialize the area that detects the event. * Add a container for the zone that detects the event. * @private */ initEventRect: function initEventRect() { var $$ = this; $$.$el.main.select("." + config_classes.chart).append("g").attr("class", config_classes.eventRects).style("fill-opacity", "0"); }, /** * Redraws the area that detects the event. * @private */ redrawEventRect: function redrawEventRect() { var $$ = this, config = $$.config, state = $$.state, $el = $$.$el, isMultipleX = $$.isMultipleX(); if ($el.eventRect) $$.updateEventRect($el.eventRect, !0);else { var eventRects = $$.$el.main.select("." + config_classes.eventRects).style("cursor", config.zoom_enabled && config.zoom_type !== "drag" ? config.axis_rotated ? "ns-resize" : "ew-resize" : null).classed(config_classes.eventRectsMultiple, isMultipleX).classed(config_classes.eventRectsSingle, !isMultipleX), eventRectUpdate = eventRects.selectAll("." + config_classes.eventRect).data([0]).enter().append("rect"); // append event <rect> // bind event to <rect> element // bind draggable selection $$.updateEventRect(eventRectUpdate), isMultipleX ? $$.generateEventRectsForMultipleXs(eventRectUpdate) : $$.generateEventRectsForSingleX(eventRectUpdate), eventRectUpdate.call($$.getDraggableSelection()), $el.eventRect = eventRectUpdate, $$.state.inputType !== "touch" || $el.svg.on("touchstart.eventRect") || $$.hasArcType() || $$.bindTouchOnEventRect(isMultipleX); } if (!isMultipleX) { // Set data and update eventReceiver.data var xAxisTickValues = $$.getMaxDataCountTarget(); // update data's index value to be alinged with the x Axis $$.updateDataIndexByX(xAxisTickValues), $$.updateXs(xAxisTickValues), $$.updatePointClass && $$.updatePointClass(!0), state.eventReceiver.data = xAxisTickValues; } $$.updateEventRectData(); }, bindTouchOnEventRect: function bindTouchOnEventRect(isMultipleX) { var startPx, $$ = this, config = $$.config, state = $$.state, _$$$$el = $$.$el, eventRect = _$$$$el.eventRect, svg = _$$$$el.svg, selectRect = function (context) { if (isMultipleX) $$.selectRectForMultipleXs(context);else { var index = $$.getDataIndexFromEvent(state.event); $$.callOverOutForTouch(index), index === -1 ? $$.unselectRect() : $$.selectRectForSingle(context, eventRect, index); } }, unselectRect = function () { $$.unselectRect(), $$.callOverOutForTouch(); }, preventDefault = config.interaction_inputType_touch.preventDefault, isPrevented = isboolean(preventDefault) && preventDefault || !1, preventThreshold = !isNaN(preventDefault) && preventDefault || null, preventEvent = function (event) { var eventType = event.type, touch = event.changedTouches[0], currentXY = touch["client" + (config.axis_rotated ? "Y" : "X")]; eventType === "touchstart" ? isPrevented ? event.preventDefault() : preventThreshold !== null && (startPx = currentXY) : eventType === "touchmove" && (isPrevented || startPx === !0 || preventThreshold !== null && Math.abs(startPx - currentXY) >= preventThreshold) && (startPx = !0, event.preventDefault()); }; // bind touch events eventRect.on("touchstart", function (event) { state.event = event, $$.updateEventRect(); }).on("touchstart.eventRect touchmove.eventRect", function (event) { if (state.event = event, !eventRect.empty() && eventRect.classed(config_classes.eventRect)) { // if touch points are > 1, means doing zooming interaction. In this case do not execute tooltip codes. if (state.dragging || state.flowing || $$.hasArcType() || event.touches.length > 1) return; preventEvent(event), selectRect(eventRect.node()); } else unselectRect(); }, !0).on("touchend.eventRect", function (event) { state.event = event, !eventRect.empty() && eventRect.classed(config_classes.eventRect) && ($$.hasArcType() || !$$.toggleShape || state.cancelClick) && state.cancelClick && (state.cancelClick = !1); }, !0), svg.on("touchstart", function (event) { state.event = event; var target = event.target; target && target !== eventRect.node() && unselectRect(); }); }, /** * Update event rect size * @param {d3Selection} eventRect Event <rect> element * @param {boolean} force Force to update * @private */ updateEventRect: function updateEventRect(eventRect, force) { force === void 0 && (force = !1); var $$ = this, state = $$.state, $el = $$.$el, _state = state, eventReceiver = _state.eventReceiver, width = _state.width, height = _state.height, rendered = _state.rendered, resizing = _state.resizing, rectElement = eventRect || $el.eventRect; (!rendered || resizing || force) && (rectElement.attr("x", 0).attr("y", 0).attr("width", width).attr("height", height), !rendered && rectElement.attr("class", config_classes.eventRect)), function updateClientRect() { eventReceiver && (eventReceiver.rect = rectElement.node().getBoundingClientRect()); }(); }, /** * Updates the location and size of the eventRect. * @private */ updateEventRectData: function updateEventRectData() { var x, y, w, h, $$ = this, config = $$.config, scale = $$.scale, state = $$.state, xScale = scale.zoom || scale.x, isRotated = config.axis_rotated; if ($$.isMultipleX()) // TODO: rotated not supported yet x = 0, y = 0, w = state.width, h = state.height;else { var rectW, rectX; if ($$.axis.isCategorized()) rectW = $$.getEventRectWidth(), rectX = function (d) { return xScale(d.x) - rectW / 2; };else { var getPrevNextX = function (_ref) { var index = _ref.index; return { prev: $$.getPrevX(index), next: $$.getNextX(index) }; }; rectW = function (d) { var x = getPrevNextX(d); // if there this is a single data point make the eventRect full width (or height) return x.prev === null && x.next === null ? isRotated ? state.height : state.width : (x.prev === null && (x.prev = xScale.domain()[0]), x.next === null && (x.next = xScale.domain()[1]), Math.max(0, (xScale(x.next) - xScale(x.prev)) / 2)); }, rectX = function (d) { var x = getPrevNextX(d), thisX = d.x; // if there this is a single data point position the eventRect at 0 return x.prev === null && x.next === null ? 0 : (x.prev === null && (x.prev = xScale.domain()[0]), (xScale(thisX) + xScale(x.prev)) / 2); }; } x = isRotated ? 0 : rectX, y = isRotated ? rectX : 0, w = isRotated ? state.width : rectW, h = isRotated ? rectW : state.height; } var eventReceiver = state.eventReceiver, call = function (fn, v) { return isFunction(fn) ? fn(v) : fn; }; // reset for possible remains coords data before the data loading eventReceiver.coords.splice(eventReceiver.data.length), eventReceiver.data.forEach(function (d, i) { eventReceiver.coords[i] = { x: call(x, d), y: call(y, d), w: call(w, d), h: call(h, d) }; }); }, selectRectForMultipleXs: function selectRectForMultipleXs(context) { var $$ = this, config = $$.config, state = $$.state, targetsToShow = $$.filterTargetsToShow($$.data.targets); // do nothing when dragging if (!(state.dragging || $$.hasArcType(targetsToShow))) { var mouse = getPointer(state.event, context), closest = $$.findClosestFromTargets(targetsToShow, mouse); if (state.mouseover && (!closest || closest.id !== state.mouseover.id) && (config.data_onout.call($$.api, state.mouseover), state.mouseover = undefined), !closest) return void $$.unselectRect(); var sameXData = $$.isBubbleType(closest) || $$.isScatterType(closest) || !config.tooltip_grouped ? [closest] : $$.filterByX(targetsToShow, closest.x), selectedData = sameXData.map(function (d) { return $$.addName(d); }); // show tooltip when cursor is close to some point $$.showTooltip(selectedData, context), $$.expandCirclesBars(closest.index, closest.id, !0), $$.showGridFocus(selectedData), ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && ($$.$el.svg.select("." + config_classes.eventRect).style("cursor", "pointer"), !state.mouseover && (config.data_onover.call($$.api, closest), state.mouseover = closest)); } }, /** * Unselect EventRect. * @private */ unselectRect: function unselectRect() { var $$ = this, config = $$.config, _$$$$el2 = $$.$el, bar = _$$$$el2.bar, circle = _$$$$el2.circle, tooltip = _$$$$el2.tooltip; $$.$el.svg.select("." + config_classes.eventRect).style("cursor", null), $$.hideGridFocus(), tooltip && ($$.hideTooltip(), $$._handleLinkedCharts(!1)), circle && !config.point_focus_only && $$.unexpandCircles(), bar && $$.unexpandBars(); }, /** * Create eventRect for each data on the x-axis. * Register touch and drag events. * @param {object} eventRectEnter d3.select(CLASS.eventRects) object. * @returns {object} d3.select(CLASS.eventRects) object. * @private */ generateEventRectsForSingleX: function generateEventRectsForSingleX(eventRectEnter) { var $$ = this, config = $$.config, state = $$.state, eventReceiver = state.eventReceiver, rect = eventRectEnter.style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null).on("click", function (event) { state.event = event; var _eventReceiver = eventReceiver, currentIdx = _eventReceiver.currentIdx, data = _eventReceiver.data, d = data[currentIdx === -1 ? $$.getDataIndexFromEvent(event) : currentIdx]; $$.clickHandlerForSingleX.bind(this)(d, $$); }); if (state.inputType === "mouse") { var getData = function (event) { var index = event ? $$.getDataIndexFromEvent(event) : eventReceiver.currentIdx; return index > -1 ? eventReceiver.data[index] : null; }; rect.on("mouseover", function (event) { state.event = event, $$.updateEventRect(); }).on("mousemove", function (event) { var d = getData(event); // do nothing while dragging/flowing if (state.event = event, !(state.dragging || state.flowing || $$.hasArcType() || !d || config.tooltip_grouped && d && d.index === eventReceiver.currentIdx)) { var index = d.index; $$.isStepType(d) && config.line_step_type === "step-after" && getPointer(event, this)[0] < $$.scale.x($$.getXValue(d.id, index)) && (index -= 1), index !== eventReceiver.currentIdx && ($$.setOverOut(!1, eventReceiver.currentIdx), eventReceiver.currentIdx = index), index === -1 ? $$.unselectRect() : $$.selectRectForSingle(this, rect, index), $$.setOverOut(index !== -1, index); } }).on("mouseout", function (event) { state.event = event; // chart is destroyed !config || $$.hasArcType() || eventReceiver.currentIdx === -1 || ( // reset the event current index $$.unselectRect(), $$.setOverOut(!1, eventReceiver.currentIdx), eventReceiver.currentIdx = -1); }); } return rect; }, clickHandlerForSingleX: function clickHandlerForSingleX(d, ctx) { var $$ = ctx, config = $$.config, state = $$.state, main = $$.$el.main; if (!d || $$.hasArcType() || state.cancelClick) return void (state.cancelClick && (state.cancelClick = !1)); var index = d.index; main.selectAll("." + config_classes.shape + "-" + index).each(function (d2) { (config.data_selection_grouped || $$.isWithinShape(this, d2)) && ($$.toggleShape && $$.toggleShape(this, d2, index), config.data_onclick.bind($$.api)(d2, this)); }); }, /** * Create an eventRect, * Register touch and drag events. * @param {object} eventRectEnter d3.select(CLASS.eventRects) object. * @private */ generateEventRectsForMultipleXs: function generateEventRectsForMultipleXs(eventRectEnter) { var $$ = this, state = $$.state; eventRectEnter.on("click", function (event) { state.event = event, $$.clickHandlerForMultipleXS.bind(this)($$); }), state.inputType === "mouse" && eventRectEnter.on("mouseover mousemove", function (event) { state.event = event, $$.selectRectForMultipleXs(this); }).on("mouseout", function (event) { state.event = event; // chart is destroyed !$$.config || $$.hasArcType() || $$.unselectRect(); }); }, clickHandlerForMultipleXS: function clickHandlerForMultipleXS(ctx) { var $$ = ctx, config = $$.config, state = $$.state, targetsToShow = $$.filterTargetsToShow($$.data.targets); if (!$$.hasArcType(targetsToShow)) { var mouse = getPointer(state.event, this), closest = $$.findClosestFromTargets(targetsToShow, mouse); !closest || ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) && $$.$el.main.selectAll("." + config_classes.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll("." + config_classes.shape + "-" + closest.index).each(function () { (config.data_selection_grouped || $$.isWithinShape(this, closest)) && ($$.toggleShape && $$.toggleShape(this, closest, closest.index), config.data_onclick.bind($$.api)(closest, this)); }); } // select if selection enabled } }); // EXTERNAL MODULE: external {"commonjs":"d3-ease","commonjs2":"d3-ease","amd":"d3-ease","root":"d3"} var external_commonjs_d3_ease_commonjs2_d3_ease_amd_d3_ease_root_d3_ = __webpack_require__(11); ;// CONCATENATED MODULE: ./src/ChartInternal/interactions/flow.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var interactions_flow = ({ /** * Generate flow * @param {object} args option object * @returns {Function} * @private */ generateFlow: function generateFlow(args) { var $$ = this, data = $$.data, state = $$.state, $el = $$.$el; return function () { var flowLength = args.flow.length; // set flag state.flowing = !0, data.targets.forEach(function (d) { d.values.splice(0, flowLength); }), $$.updateXGrid && $$.updateXGrid(!0); // target elements var elements = {}; ["axis.x", "grid.x", "gridLines.x", "region.list", "text", "bar", "line", "area", "circle"].forEach(function (v) { var name = v.split("."), node = $el[name[0]]; node && name.length > 1 && (node = node[name[1]]), node && node.size() && (elements[v] = node); }), $$.hideGridFocus(), $$.setFlowList(elements, args); }; }, /** * Set flow list * @param {object} elements Target elements * @param {object} args option object * @private */ setFlowList: function setFlowList(elements, args) { var n, $$ = this, flow = args.flow, targets = args.targets, _flow = flow, _flow$duration = _flow.duration, duration = _flow$duration === void 0 ? args.duration : _flow$duration, flowIndex = _flow.index, flowLength = _flow.length, orgDataCount = _flow.orgDataCount, transform = $$.getFlowTransform(targets, orgDataCount, flowIndex, flowLength), wait = generateWait(); wait.add(Object.keys(elements).map(function (v) { return n = elements[v].transition().ease(external_commonjs_d3_ease_commonjs2_d3_ease_amd_d3_ease_root_d3_.easeLinear).duration(duration), n = v === "axis.x" ? n.call(function (g) { $$.axis.x.setTransition(g).create(g); }) : v === "region.list" ? n.filter($$.isRegionOnX).attr("transform", transform) : n.attr("transform", transform), n; })), n.call(wait, function () { $$.cleanUpFlow(elements, args); }); }, /** * Clean up flow * @param {object} elements Target elements * @param {object} args option object * @private */ cleanUpFlow: function cleanUpFlow(elements, args) { var $$ = this, config = $$.config, state = $$.state, svg = $$.$el.svg, isRotated = config.axis_rotated, flow = args.flow, shape = args.shape, xv = args.xv, _shape$pos = shape.pos, cx = _shape$pos.cx, cy = _shape$pos.cy, xForText = _shape$pos.xForText, yForText = _shape$pos.yForText, _flow2 = flow, _flow2$done = _flow2.done, done = _flow2$done === void 0 ? function () {} : _flow2$done, flowLength = _flow2.length; // draw again for removing flowed elements and reverting attr // callback for end of flow flowLength && (["circle", "text", "shape", "eventRect"].forEach(function (v) { var target = []; for (var i = 0; i < flowLength; i++) target.push("." + config_classes[v] + "-" + i); svg.selectAll("." + config_classes[v + "s"]) // circles, shapes, texts, eventRects .selectAll(target).remove(); }), svg.select("." + config_classes.xgrid).remove()), Object.keys(elements).forEach(function (v) { var n = elements[v]; if (v !== "axis.x" && n.attr("transform", null), v === "grid.x") n.attr(state.xgridAttr);else if (v === "gridLines.x") n.attr("x1", isRotated ? 0 : xv).attr("x2", isRotated ? state.width : xv);else if (v === "gridLines.x") n.select("line").attr("x1", isRotated ? 0 : xv).attr("x2", isRotated ? state.width : xv), n.select("text").attr("x", isRotated ? state.width : 0).attr("y", xv);else if (/^(area|bar|line)$/.test(v)) n.attr("d", shape.type[v]);else if (v === "text") n.attr("x", xForText).attr("y", yForText).style("fill-opacity", $$.opacityForText.bind($$));else if (v !== "circle") v === "region.list" && n.select("rect").filter($$.isRegionOnX).attr("x", $$.regionX.bind($$)).attr("width", $$.regionWidth.bind($$));else if ($$.isCirclePoint()) n.attr("cx", cx).attr("cy", cy);else { var xFunc = function (d) { return cx(d) - config.point_r; }, yFunc = function (d) { return cy(d) - config.point_r; }; n.attr("x", xFunc).attr("y", yFunc).attr("cx", cx) // when pattern is used, it possibly contain 'circle' also. .attr("cy", cy); } }), config.interaction_enabled && $$.redrawEventRect(), done.call($$.api), state.flowing = !1; }, /** * Get flow transform value * @param {object} targets target * @param {number} orgDataCount original data count * @param {number} flowIndex flow index * @param {number} flowLength flow length * @returns {string} * @private */ getFlowTransform: function getFlowTransform(targets, orgDataCount, flowIndex, flowLength) { var translateX, $$ = this, data = $$.data, x = $$.scale.x, dataValues = data.targets[0].values, flowStart = $$.getValueOnIndex(dataValues, flowIndex), flowEnd = $$.getValueOnIndex(dataValues, flowIndex + flowLength), orgDomain = x.domain(), domain = $$.updateXDomain(targets, !0, !0); orgDataCount ? orgDataCount === 1 || (flowStart && flowStart.x) === (flowEnd && flowEnd.x) ? translateX = x(orgDomain[0]) - x(domain[0]) : translateX = $$.axis.isTimeSeries() ? x(orgDomain[0]) - x(domain[0]) : x(flowStart.x) - x(flowEnd.x) : dataValues.length === 1 ? $$.axis.isTimeSeries() ? (flowStart = $$.getValueOnIndex(dataValues, 0), flowEnd = $$.getValueOnIndex(dataValues, dataValues.length - 1), translateX = x(flowStart.x) - x(flowEnd.x)) : translateX = diffDomain(domain) / 2 : translateX = x(orgDomain[0]) - x(domain[0]); var scaleX = diffDomain(orgDomain) / diffDomain(domain); return "translate(" + translateX + ",0) scale(" + scaleX + ",1)"; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/clip.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var clip = ({ initClip: function initClip() { var $$ = this, clip = $$.state.clip; // MEMO: clipId needs to be unique because it conflicts when multiple charts exist // Define 'clip-path' attribute values clip.id = $$.state.datetimeId + "-clip", clip.idXAxis = clip.id + "-xaxis", clip.idYAxis = clip.id + "-yaxis", clip.idGrid = clip.id + "-grid", clip.path = $$.getClipPath(clip.id), clip.pathXAxis = $$.getClipPath(clip.idXAxis), clip.pathYAxis = $$.getClipPath(clip.idYAxis), clip.pathGrid = $$.getClipPath(clip.idGrid); }, getClipPath: function getClipPath(id) { var $$ = this, config = $$.config; if (!config.clipPath && /-clip$/.test(id) || !config.axis_x_clipPath && /-clip-xaxis$/.test(id) || !config.axis_y_clipPath && /-clip-yaxis$/.test(id)) return null; var isIE9 = !!win.navigator && win.navigator.appVersion.toLowerCase().indexOf("msie 9.") >= 0; return "url(" + (isIE9 ? "" : browser_doc.URL.split("#")[0]) + "#" + id + ")"; }, appendClip: function appendClip(parent, id) { id && parent.append("clipPath").attr("id", id).append("rect"); }, /** * Set x Axis clipPath dimension * @param {d3Selecton} node clipPath <rect> selection * @private */ setXAxisClipPath: function setXAxisClipPath(node) { var $$ = this, config = $$.config, _$$$state = $$.state, margin = _$$$state.margin, width = _$$$state.width, height = _$$$state.height, isRotated = config.axis_rotated, left = Math.max(30, margin.left) - (isRotated ? 0 : 20), x = isRotated ? -(1 + left) : -(left - 1), y = -Math.max(15, margin.top), w = isRotated ? margin.left + 20 : width + 10 + left, h = (isRotated ? margin.top + height + 10 : margin.bottom) + 20; node.attr("x", x).attr("y", y).attr("width", w).attr("height", h); }, /** * Set y Axis clipPath dimension * @param {d3Selecton} node clipPath <rect> selection * @private */ setYAxisClipPath: function setYAxisClipPath(node) { var $$ = this, config = $$.config, _$$$state2 = $$.state, margin = _$$$state2.margin, width = _$$$state2.width, height = _$$$state2.height, isRotated = config.axis_rotated, left = Math.max(30, margin.left) - (isRotated ? 20 : 0), isInner = config.axis_y_inner, x = isInner ? -1 : isRotated ? -(1 + left) : -(left - 1), y = -(isRotated ? 20 : margin.top), w = (isRotated ? width + 15 + left : margin.left + 20) + (isInner ? 20 : 0), h = (isRotated ? margin.bottom : margin.top + height) + 10; node.attr("x", x).attr("y", y).attr("width", w).attr("height", h); }, updateXAxisTickClip: function updateXAxisTickClip() { var $$ = this, config = $$.config, _$$$state3 = $$.state, clip = _$$$state3.clip, xAxisHeight = _$$$state3.xAxisHeight, defs = $$.$el.defs, newXAxisHeight = $$.getHorizontalAxisHeight("x"); if (defs && !clip.idXAxisTickTexts) { var clipId = clip.id + "-xaxisticktexts"; $$.appendClip(defs, clipId), clip.pathXAxisTickTexts = $$.getClipPath(clip.idXAxisTickTexts), clip.idXAxisTickTexts = clipId; } !config.axis_x_tick_multiline && $$.getAxisTickRotate("x") && newXAxisHeight !== xAxisHeight && ($$.setXAxisTickClipWidth(), $$.setXAxisTickTextClipPathWidth()), $$.state.xAxisHeight = newXAxisHeight; }, setXAxisTickClipWidth: function setXAxisTickClipWidth() { var $$ = this, config = $$.config, maxTickWidths = $$.state.current.maxTickWidths, xAxisTickRotate = $$.getAxisTickRotate("x"); if (!config.axis_x_tick_multiline && xAxisTickRotate) { var sinRotation = Math.sin(Math.PI / 180 * Math.abs(xAxisTickRotate)); maxTickWidths.x.clipPath = ($$.getHorizontalAxisHeight("x") - 20) / sinRotation; } else maxTickWidths.x.clipPath = null; }, setXAxisTickTextClipPathWidth: function setXAxisTickTextClipPathWidth() { var $$ = this, _$$$state4 = $$.state, clip = _$$$state4.clip, current = _$$$state4.current, svg = $$.$el.svg; svg && svg.select("#" + clip.idXAxisTickTexts + " rect").attr("width", current.maxTickWidths.x.clipPath).attr("height", 30); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/grid.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ // Grid position and text anchor helpers var getGridTextAnchor = function (d) { return isValue(d.position) || "end"; }, getGridTextDx = function (d) { return d.position === "start" ? 4 : d.position === "middle" ? 0 : -4; }; /** * Get grid text x value getter function * @param {boolean} isX Is x Axis * @param {number} width Width value * @param {number} height Height value * @returns {Function} * @private */ function getGridTextX(isX, width, height) { return function (d) { var x = isX ? 0 : width; return d.position === "start" ? x = isX ? -height : 0 : d.position === "middle" && (x = (isX ? -height : width) / 2), x; }; } /** * Update coordinate attributes value * @param {d3.selection} el Target node * @param {string} type Type * @private */ function smoothLines(el, type) { type === "grid" && el.each(function () { var g = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this); ["x1", "x2", "y1", "y2"].forEach(function (v) { return g.attr(v, Math.ceil(+g.attr(v))); }); }); } /* harmony default export */ var grid = ({ hasGrid: function hasGrid() { var config = this.config; return ["x", "y"].some(function (v) { return config["grid_" + v + "_show"] || config["grid_" + v + "_lines"].length; }); }, initGrid: function initGrid() { var $$ = this; $$.hasGrid() && $$.initGridLines(), $$.initFocusGrid(); }, initGridLines: function initGridLines() { var $$ = this, config = $$.config, clip = $$.state.clip, $el = $$.$el; (config.grid_x_lines.length || config.grid_y_lines.length) && ($el.gridLines.main = $el.main.insert("g", "." + config_classes.chart + (config.grid_lines_front ? " + *" : "")).attr("clip-path", clip.pathGrid).attr("class", config_classes.grid + " " + config_classes.gridLines), $el.gridLines.main.append("g").attr("class", config_classes.xgridLines), $el.gridLines.main.append("g").attr("class", config_classes.ygridLines), $el.gridLines.x = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.selectAll)([])); }, updateXGrid: function updateXGrid(withoutUpdate) { var $$ = this, config = $$.config, scale = $$.scale, state = $$.state, _$$$$el = $$.$el, main = _$$$$el.main, grid = _$$$$el.grid, isRotated = config.axis_rotated, xgridData = $$.generateGridData(config.grid_x_type, scale.x), tickOffset = $$.axis.isCategorized() ? $$.axis.x.tickOffset() : 0, pos = function (d) { return (scale.zoom || scale.x)(d) + tickOffset * (isRotated ? -1 : 1); }; state.xgridAttr = isRotated ? { "x1": 0, "x2": state.width, "y1": pos, "y2": pos } : { "x1": pos, "x2": pos, "y1": 0, "y2": state.height }, grid.x = main.select("." + config_classes.xgrids).selectAll("." + config_classes.xgrid).data(xgridData), grid.x.exit().remove(), grid.x = grid.x.enter().append("line").attr("class", config_classes.xgrid).merge(grid.x), withoutUpdate || grid.x.each(function () { var grid = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this); Object.keys(state.xgridAttr).forEach(function (id) { grid.attr(id, state.xgridAttr[id]).style("opacity", function () { return grid.attr(isRotated ? "y1" : "x1") === (isRotated ? state.height : 0) ? "0" : "1"; }); }); }); }, updateYGrid: function updateYGrid() { var $$ = this, config = $$.config, state = $$.state, _$$$$el2 = $$.$el, grid = _$$$$el2.grid, main = _$$$$el2.main, isRotated = config.axis_rotated, gridValues = $$.axis.y.tickValues() || $$.scale.y.ticks(config.grid_y_ticks), pos = function (d) { return Math.ceil($$.scale.y(d)); }; grid.y = main.select("." + config_classes.ygrids).selectAll("." + config_classes.ygrid).data(gridValues), grid.y.exit().remove(), grid.y = grid.y.enter().append("line").attr("class", config_classes.ygrid).merge(grid.y), grid.y.attr("x1", isRotated ? pos : 0).attr("x2", isRotated ? pos : state.width).attr("y1", isRotated ? 0 : pos).attr("y2", isRotated ? state.height : pos), smoothLines(grid.y, "grid"); }, updateGrid: function updateGrid(duration) { var $$ = this, _$$$$el3 = $$.$el, grid = _$$$$el3.grid, gridLines = _$$$$el3.gridLines; // hide if arc type gridLines.main || $$.initGridLines(), grid.main.style("visibility", $$.hasArcType() ? "hidden" : "visible"), $$.hideGridFocus(), $$.updateXGridLines(duration), $$.updateYGridLines(duration); }, /** * Update X Grid lines * @param {number} duration Dration value * @private */ updateXGridLines: function updateXGridLines(duration) { var $$ = this, config = $$.config, _$$$$el4 = $$.$el, gridLines = _$$$$el4.gridLines, main = _$$$$el4.main, isRotated = config.axis_rotated; config.grid_x_show && $$.updateXGrid(); var xLines = main.select("." + config_classes.xgridLines).selectAll("." + config_classes.xgridLine).data(config.grid_x_lines); // exit xLines.exit().transition().duration(duration).style("opacity", "0").remove(); // enter var xgridLine = xLines.enter().append("g"); xgridLine.append("line").style("opacity", "0"), xgridLine.append("text").attr("transform", isRotated ? "" : "rotate(-90)").attr("dy", -5).style("opacity", "0"), xLines = xgridLine.merge(xLines), xLines.attr("class", function (d) { return (config_classes.xgridLine + " " + (d.class || "")).trim(); }).select("text").attr("text-anchor", getGridTextAnchor).attr("dx", getGridTextDx).transition().duration(duration).text(function (d) { return d.text; }).transition().style("opacity", "1"), gridLines.x = xLines; }, /** * Update Y Grid lines * @param {number} duration Duration value * @private */ updateYGridLines: function updateYGridLines(duration) { var $$ = this, config = $$.config, _$$$state = $$.state, width = _$$$state.width, height = _$$$state.height, $el = $$.$el, isRotated = config.axis_rotated; config.grid_y_show && $$.updateYGrid(); var ygridLines = $el.main.select("." + config_classes.ygridLines).selectAll("." + config_classes.ygridLine).data(config.grid_y_lines); // exit ygridLines.exit().transition().duration(duration).style("opacity", "0").remove(); // enter var ygridLine = ygridLines.enter().append("g"); ygridLine.append("line").style("opacity", "0"), ygridLine.append("text").attr("transform", isRotated ? "rotate(-90)" : "").style("opacity", "0"), ygridLines = ygridLine.merge(ygridLines); // update var yv = $$.yv.bind($$); ygridLines.attr("class", function (d) { return (config_classes.ygridLine + " " + (d.class || "")).trim(); }).select("line").transition().duration(duration).attr("x1", isRotated ? yv : 0).attr("x2", isRotated ? yv : width).attr("y1", isRotated ? 0 : yv).attr("y2", isRotated ? height : yv).transition().style("opacity", "1"), ygridLines.select("text").attr("text-anchor", getGridTextAnchor).attr("dx", getGridTextDx).transition().duration(duration).attr("dy", -5).attr("x", getGridTextX(isRotated, width, height)).attr("y", yv).text(function (d) { return d.text; }).transition().style("opacity", "1"), $el.gridLines.y = ygridLines; }, redrawGrid: function redrawGrid(withTransition) { var $$ = this, isRotated = $$.config.axis_rotated, _$$$state2 = $$.state, width = _$$$state2.width, height = _$$$state2.height, gridLines = $$.$el.gridLines, xv = $$.xv.bind($$), lines = gridLines.x.select("line"), texts = gridLines.x.select("text"); return lines = (withTransition ? lines.transition() : lines).attr("x1", isRotated ? 0 : xv).attr("x2", isRotated ? width : xv).attr("y1", isRotated ? xv : 0).attr("y2", isRotated ? xv : height), texts = (withTransition ? texts.transition() : texts).attr("x", getGridTextX(!isRotated, width, height)).attr("y", xv).text(function (d) { return d.text; }), [lines.style("opacity", "1"), texts.style("opacity", "1")]; }, initFocusGrid: function initFocusGrid() { var $$ = this, config = $$.config, clip = $$.state.clip, $el = $$.$el, isFront = config.grid_front, className = "." + config_classes[isFront && $el.gridLines.main ? "gridLines" : "chart"] + (isFront ? " + *" : ""), grid = $el.main.insert("g", className).attr("clip-path", clip.pathGrid).attr("class", config_classes.grid); $el.grid.main = grid, config.grid_x_show && grid.append("g").attr("class", config_classes.xgrids), config.grid_y_show && grid.append("g").attr("class", config_classes.ygrids), config.interaction_enabled && config.grid_focus_show && (grid.append("g").attr("class", config_classes.xgridFocus).append("line").attr("class", config_classes.xgridFocus), config.grid_focus_y && !config.tooltip_grouped && grid.append("g").attr("class", config_classes.ygridFocus).append("line").attr("class", config_classes.ygridFocus)); }, /** * Show grid focus line * @param {Array} data Selected data * @private */ showGridFocus: function showGridFocus(data) { var $$ = this, config = $$.config, _$$$state3 = $$.state, width = _$$$state3.width, height = _$$$state3.height, isRotated = config.axis_rotated, focusEl = $$.$el.main.selectAll("line." + config_classes.xgridFocus + ", line." + config_classes.ygridFocus), dataToShow = (data || [focusEl.datum()]).filter(function (d) { return d && isValue($$.getBaseValue(d)); }); // Hide when bubble/scatter/stanford plot exists if (!(!config.tooltip_show || dataToShow.length === 0 || $$.hasType("bubble") || $$.hasArcType())) { var isEdge = config.grid_focus_edge && !config.tooltip_grouped, xx = $$.xx.bind($$); focusEl.style("visibility", "visible").data(dataToShow.concat(dataToShow)).each(function (d) { var xy, el = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), pos = { x: xx(d), y: $$.getYScaleById(d.id)(d.value) }; if (el.classed(config_classes.xgridFocus)) xy = isRotated ? [null, // x1 pos.x, // y1 isEdge ? pos.y : width, // x2 pos.x // y2 ] : [pos.x, isEdge ? pos.y : null, pos.x, height];else { var isY2 = $$.axis.getId(d.id) === "y2"; xy = isRotated ? [pos.y, // x1 isEdge && !isY2 ? pos.x : null, // y1 pos.y, // x2 isEdge && isY2 ? pos.x : height // y2 ] : [isEdge && isY2 ? pos.x : null, pos.y, isEdge && !isY2 ? pos.x : width, pos.y]; } ["x1", "y1", "x2", "y2"].forEach(function (v, i) { return el.attr(v, xy[i]); }); }), smoothLines(focusEl, "grid"), $$.showCircleFocus && $$.showCircleFocus(data); } }, hideGridFocus: function hideGridFocus() { var $$ = this, _$$$state4 = $$.state, inputType = _$$$state4.inputType, resizing = _$$$state4.resizing, main = $$.$el.main; inputType !== "mouse" && resizing || (main.selectAll("line." + config_classes.xgridFocus + ", line." + config_classes.ygridFocus).style("visibility", "hidden"), $$.hideCircleFocus && $$.hideCircleFocus()); }, updateGridFocus: function updateGridFocus() { var $$ = this, _$$$state5 = $$.state, inputType = _$$$state5.inputType, width = _$$$state5.width, height = _$$$state5.height, resizing = _$$$state5.resizing, grid = $$.$el.grid, xgridFocus = grid.main.select("line." + config_classes.xgridFocus); if (inputType === "touch") xgridFocus.empty() ? resizing && $$.showCircleFocus() : $$.showGridFocus();else { var _isRotated = $$.config.axis_rotated; xgridFocus.attr("x1", _isRotated ? 0 : -10).attr("x2", _isRotated ? width : -10).attr("y1", _isRotated ? -10 : 0).attr("y2", _isRotated ? -10 : height); } // need to return 'true' as of being pushed to the redraw list // ref: getRedrawList() return !0; }, generateGridData: function generateGridData(type, scale) { var $$ = this, tickNum = $$.$el.main.select("." + config_classes.axisX).selectAll(".tick").size(), gridData = []; if (type === "year") { var xDomain = $$.getXDomain(), firstYear = xDomain[0].getFullYear(), lastYear = xDomain[1].getFullYear(); for (var i = firstYear; i <= lastYear; i++) gridData.push(new Date(i + "-01-01 00:00:00")); } else gridData = scale.ticks(10), gridData.length > tickNum && (gridData = gridData.filter(function (d) { return (d + "").indexOf(".") < 0; })); return gridData; }, getGridFilterToRemove: function getGridFilterToRemove(params) { return params ? function (line) { var found = !1; return (isArray(params) ? params.concat() : [params]).forEach(function (param) { ("value" in param && line.value === param.value || "class" in param && line.class === param.class) && (found = !0); }), found; } : function () { return !0; }; }, removeGridLines: function removeGridLines(params, forX) { var $$ = this, config = $$.config, toRemove = $$.getGridFilterToRemove(params), classLines = forX ? config_classes.xgridLines : config_classes.ygridLines, classLine = forX ? config_classes.xgridLine : config_classes.ygridLine; $$.$el.main.select("." + classLines).selectAll("." + classLine).filter(toRemove).transition().duration(config.transition_duration).style("opacity", "0").remove(); var gridLines = "grid_" + (forX ? "x" : "y") + "_lines"; config[gridLines] = config[gridLines].filter(function toShow(line) { return !toRemove(line); }); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/region.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ // selection /* harmony default export */ var region = ({ initRegion: function initRegion() { var $$ = this, $el = $$.$el; $el.region.main = $el.main.append("g").attr("clip-path", $$.state.clip.path).attr("class", config_classes.regions); }, updateRegion: function updateRegion(duration) { var $$ = this, config = $$.config, $el = $$.$el; $el.region.main || $$.initRegion(), $el.region.main.style("visibility", $$.hasArcType() ? "hidden" : "visible"); // select <g> element var list = $el.main.select("." + config_classes.regions).selectAll("." + config_classes.region).data(config.regions); list.exit().transition().duration(duration).style("opacity", "0").remove(), list = list.enter().append("g").merge(list).attr("class", $$.classRegion.bind($$)), list.append("rect").style("fill-opacity", "0"), $el.region.list = list; }, redrawRegion: function redrawRegion(withTransition) { var $$ = this, regions = $$.$el.region.list.select("rect"); return regions = (withTransition ? regions.transition() : regions).attr("x", $$.regionX.bind($$)).attr("y", $$.regionY.bind($$)).attr("width", $$.regionWidth.bind($$)).attr("height", $$.regionHeight.bind($$)), [(withTransition ? regions.transition() : regions).style("fill-opacity", function (d) { return isValue(d.opacity) ? d.opacity : "0.1"; }).on("end", function () { (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this.parentNode).selectAll("rect:not([x])").remove(); })]; }, getRegionXY: function getRegionXY(type, d) { var currScale, $$ = this, config = $$.config, scale = $$.scale, isRotated = config.axis_rotated, isX = type === "x", key = "start", pos = 0; return d.axis === "y" || d.axis === "y2" ? (!isX && (key = "end"), (isX ? isRotated : !isRotated) && key in d && (currScale = scale[d.axis], pos = currScale(d[key]))) : (isX ? !isRotated : isRotated) && key in d && (currScale = scale.zoom || scale.x, pos = currScale($$.axis.isTimeSeries() ? parseDate.call($$, d[key]) : d[key])), pos; }, regionX: function regionX(d) { return this.getRegionXY("x", d); }, regionY: function regionY(d) { return this.getRegionXY("y", d); }, getRegionSize: function getRegionSize(type, d) { var currScale, $$ = this, config = $$.config, scale = $$.scale, state = $$.state, isRotated = config.axis_rotated, isWidth = type === "width", start = $$[isWidth ? "regionX" : "regionY"](d), key = "end", end = state[type]; return d.axis === "y" || d.axis === "y2" ? (!isWidth && (key = "start"), (isWidth ? isRotated : !isRotated) && key in d && (currScale = scale[d.axis], end = currScale(d[key]))) : (isWidth ? !isRotated : isRotated) && key in d && (currScale = scale.zoom || scale.x, end = currScale($$.axis.isTimeSeries() ? parseDate.call($$, d[key]) : d[key])), end < start ? 0 : end - start; }, regionWidth: function regionWidth(d) { return this.getRegionSize("width", d); }, regionHeight: function regionHeight(d) { return this.getRegionSize("height", d); }, isRegionOnX: function isRegionOnX(d) { return !d.axis || d.axis === "x"; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/size.axis.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var size_axis = ({ /** * Get Axis size according its position * @param {string} id Axis id value - x, y or y2 * @returns {number} size Axis size value * @private */ getAxisSize: function getAxisSize(id) { var $$ = this, isRotated = $$.config.axis_rotated; return isRotated && id === "x" || !isRotated && /y2?/.test(id) ? $$.getAxisWidthByAxisId(id, !0) : $$.getHorizontalAxisHeight(id); }, getAxisWidthByAxisId: function getAxisWidthByAxisId(id, withoutRecompute) { var $$ = this; if ($$.axis) { var position = $$.axis && $$.axis.getLabelPositionById(id); return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 20 : 40); } return 40; }, getHorizontalAxisHeight: function getHorizontalAxisHeight(id) { var $$ = this, config = $$.config, state = $$.state, _state = state, current = _state.current, rotatedPadding = _state.rotatedPadding, isLegendRight = _state.isLegendRight, isLegendInset = _state.isLegendInset, isRotated = config.axis_rotated, h = 30; if (id === "x" && !config.axis_x_show) return 8; if (id === "x" && config.axis_x_height) return config.axis_x_height; if (id === "y" && !config.axis_y_show) return !config.legend_show || isLegendRight || isLegendInset ? 1 : 10; if (id === "y2" && !config.axis_y2_show) return rotatedPadding.top; var rotate = $$.getAxisTickRotate(id); // Calculate x/y axis height when tick rotated return (id === "x" && !isRotated || /y2?/.test(id) && isRotated) && rotate && (h = 30 + $$.axis.getMaxTickWidth(id) * Math.cos(Math.PI * (90 - Math.abs(rotate)) / 180), !config.axis_x_tick_multiline && current.height && h > current.height / 2 && (h = current.height / 2)), h + ($$.axis.getLabelPositionById(id).isInner ? 0 : 10) + (id !== "y2" || isRotated ? 0 : -10); }, getEventRectWidth: function getEventRectWidth() { return Math.max(0, this.axis.x.tickInterval()); }, /** * Get axis tick test rotate value * @param {string} id Axis id * @returns {number} rotate value * @private */ getAxisTickRotate: function getAxisTickRotate(id) { var $$ = this, axis = $$.axis, config = $$.config, state = $$.state, $el = $$.$el, rotate = config["axis_" + id + "_tick_rotate"]; if (id === "x") { var allowedXAxisTypes = axis.isCategorized() || axis.isTimeSeries(); if (config.axis_x_tick_fit && allowedXAxisTypes) { var xTickCount = config.axis_x_tick_count, currentXTicksLength = state.current.maxTickWidths.x.ticks.length, tickCount = 0; xTickCount ? tickCount = xTickCount > currentXTicksLength ? currentXTicksLength : xTickCount : currentXTicksLength && (tickCount = currentXTicksLength), tickCount !== state.axis.x.tickCount && (state.axis.x.padding = $$.axis.getXAxisPadding(tickCount)), state.axis.x.tickCount = tickCount; } $el.svg && config.axis_x_tick_fit && !config.axis_x_tick_multiline && !config.axis_x_tick_culling && config.axis_x_tick_autorotate && allowedXAxisTypes && (rotate = $$.needToRotateXAxisTickTexts() ? config.axis_x_tick_rotate : 0); } return rotate; }, /** * Check weather axis tick text needs to be rotated * @returns {boolean} * @private */ needToRotateXAxisTickTexts: function needToRotateXAxisTickTexts() { var $$ = this, _$$$state = $$.state, axis = _$$$state.axis, current = _$$$state.current, xAxisLength = current.width - $$.getCurrentPaddingLeft(!1) - $$.getCurrentPaddingRight(), tickCountWithPadding = axis.x.tickCount + axis.x.padding.left + axis.x.padding.right, maxTickWidth = $$.axis.getMaxTickWidth("x"), tickLength = tickCountWithPadding ? xAxisLength / tickCountWithPadding : 0; return maxTickWidth > tickLength; } }); ;// CONCATENATED MODULE: ./src/config/Options/data/axis.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Axis based chart data config options */ /* harmony default export */ var data_axis = ({ /** * Specify the keys of the x values for each data.<br><br> * This option can be used if we want to show the data that has different x values. * @name data․xs * @memberof Options * @type {object} * @default {} * @example * data: { * xs: { * data1: "x1", * data2: "x2" * } * } */ data_xs: {}, /** * Set a format specifier to parse string specifed as x. * @name data․xFormat * @memberof Options * @type {string} * @default %Y-%m-%d * @example * data: { * x: "x", * columns: [ * ["x", "01012019", "02012019", "03012019"], * ["data1", 30, 200, 100] * ], * // Format specifier to parse as datetime for given 'x' string value * xFormat: "%m%d%Y" * }, * axis: { * x: { * type: "timeseries" * } * } * @see [D3's time specifier](https://github.com/d3/d3-time-format#locale_format) */ data_xFormat: "%Y-%m-%d", /** * Set localtime format to parse x axis. * @name data․xLocaltime * @memberof Options * @type {boolean} * @default true * @example * data: { * xLocaltime: false * } */ data_xLocaltime: !0, /** * Sort on x axis. * @name data․xSort * @memberof Options * @type {boolean} * @default true * @example * data: { * xSort: false * } */ data_xSort: !0, /** * Set y axis the data related to. y and y2 can be used. * - **NOTE:** If all data is related to one of the axes, the domain of axis without related data will be replaced by the domain from the axis with related data * @name data․axes * @memberof Options * @type {object} * @default {} * @example * data: { * axes: { * data1: "y", * data2: "y2" * } * } */ data_axes: {}, /** * Define regions for each data.<br> * The values must be an array for each data and it should include an object that has `start`, `end` and `style`. * - The object type should be as: * - start {number}: Start data point number. If not set, the start will be the first data point. * - [end] {number}: End data point number. If not set, the end will be the last data point. * - [style.dasharray="2 2"] {object}: The first number specifies a distance for the filled area, and the second a distance for the unfilled area. * - **NOTE:** Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions. * @name data․regions * @memberof Options * @type {object} * @default {} * @example * data: { * regions: { * data1: [{ * start: 1, * end: 2, * style: { * dasharray: "5 2" * } * }, { * start: 3 * }], * ... * } * } */ data_regions: {}, /** * Set the stacking to be normalized * - **NOTE:** * - For stacking, '[data.groups](#.data%25E2%2580%25A4groups)' option should be set * - y Axis will be set in percentage value (0 ~ 100%) * - Must have postive values * @name data․stack․normalize * @memberof Options * @type {boolean} * @default false * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataStackNormalized) * @example * data: { * stack: { * normalize: true * } * } */ data_stack_normalize: !1 }); ;// CONCATENATED MODULE: ./src/config/Options/axis/x.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * x Axis config options */ /* harmony default export */ var axis_x = ({ /** * Set clip-path attribute for x axis element * @name axis․x․clipPath * @memberof Options * @type {boolean} * @default true * @see [Demo]() * @example * // don't set 'clip-path' attribute * clipPath: false */ axis_x_clipPath: !0, /** * Show or hide x axis. * @name axis․x․show * @memberof Options * @type {boolean} * @default true * @example * axis: { * x: { * show: false * } * } */ axis_x_show: !0, /** * Set type of x axis.<br><br> * **Available Values:** * - category * - indexed * - log * - timeseries * * **NOTE:**<br> * - **log** type: * - the x values specified by [`data.x`](#.data%25E2%2580%25A4x)(or by any equivalent option), must be exclusively-positive. * - x axis min value should be >= 0. * * @name axis․x․type * @memberof Options * @type {string} * @default indexed * @see [Demo: indexed](https://naver.github.io/billboard.js/demo/#Chart.AreaChart) * @see [Demo: timeseries](https://naver.github.io/billboard.js/demo/#Chart.TimeseriesChart) * @see [Demo: category](https://naver.github.io/billboard.js/demo/#Data.CategoryData) * @see [Demo: log](https://naver.github.io/billboard.js/demo/#Axis.LogScales) * @example * axis: { * x: { * type: "timeseries" * } * } */ axis_x_type: "indexed", /** * Set how to treat the timezone of x values.<br> * If true, treat x value as localtime. If false, convert to UTC internally. * @name axis․x․localtime * @memberof Options * @type {boolean} * @default true * @example * axis: { * x: { * localtime: false * } * } */ axis_x_localtime: !0, /** * Set category names on category axis. * This must be an array that includes category names in string. If category names are included in the date by data.x option, this is not required. * @name axis․x․categories * @memberof Options * @type {Array} * @default [] * @example * axis: { * x: { * categories: ["Category 1", "Category 2", ...] * } * } */ axis_x_categories: [], /** * centerize ticks on category axis. * @name axis․x․tick․centered * @memberof Options * @type {boolean} * @default false * @example * axis: { * x: { * tick: { * centered: true * } * } * } */ axis_x_tick_centered: !1, /** * A function to format tick value. Format string is also available for timeseries data. * @name axis․x․tick․format * @memberof Options * @type {Function|string} * @default undefined * @see [D3's time specifier](https://github.com/d3/d3-time-format#locale_format) * @example * axis: { * x: { * tick: { * // for timeseries, a 'datetime' object is given as parameter * format: function(x) { * return x.getFullYear(); * } * * // for category, index(Number) and categoryName(String) are given as parameter * format: function(index, categoryName) { * return categoryName.substr(0, 10); * }, * * // for timeseries format specifier * format: "%Y-%m-%d %H:%M:%S" * } * } * } */ axis_x_tick_format: undefined, /** * Setting for culling ticks.<br><br> * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.<br><br> * We can change the number of ticks to be shown by axis.x.tick.culling.max. * @name axis․x․tick․culling * @memberof Options * @type {boolean} * @default * - true for indexed axis and timeseries axis * - false for category axis * @example * axis: { * x: { * tick: { * culling: false * } * } * } */ axis_x_tick_culling: {}, /** * The number of tick texts will be adjusted to less than this value. * @name axis․x․tick․culling․max * @memberof Options * @type {number} * @default 10 * @example * axis: { * x: { * tick: { * culling: { * max: 5 * } * } * } * } */ axis_x_tick_culling_max: 10, /** * The number of x axis ticks to show.<br><br> * This option hides tick lines together with tick text. If this option is used on timeseries axis, the ticks position will be determined precisely and not nicely positioned (e.g. it will have rough second value). * @name axis․x․tick․count * @memberof Options * @type {number} * @default undefined * @example * axis: { * x: { * tick: { * count: 5 * } * } * } */ axis_x_tick_count: undefined, /** * Show or hide x axis tick line. * @name axis․x․tick․show * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.HideTickLineText) * @example * axis: { * x: { * tick: { * show: false * } * } * } */ axis_x_tick_show: !0, /** * Show or hide x axis tick text. * @name axis․x․tick․text․show * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.HideTickLineText) * @example * axis: { * x: { * tick: { * text: { * show: false * } * } * } * } */ axis_x_tick_text_show: !0, /** * Set the x Axis tick text's position relatively its original position * @name axis․x․tick․text․position * @memberof Options * @type {object} * @default {x: 0, y:0} * @example * axis: { * x: { * tick: { * text: { * position: { * x: 10, * y: 10 * } * } * } * } * } */ axis_x_tick_text_position: { x: 0, y: 0 }, /** * Fit x axis ticks. * - **true**: ticks will be positioned nicely to have same intervals. * - **false**: ticks will be positioned according to x value of the data points. * @name axis․x․tick․fit * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.XAxisTickFitting) * @see [Demo: for timeseries zoom](https://naver.github.io/billboard.js/demo/#Axis.XAxisTickTimeseries) * @example * axis: { * x: { * tick: { * fit: false * } * } * } */ axis_x_tick_fit: !0, /** * Set the x values of ticks manually.<br><br> * If this option is provided, the position of the ticks will be determined based on those values.<br> * This option works with `timeseries` data and the x values will be parsed accoding to the type of the value and data.xFormat option. * @name axis․x․tick․values * @memberof Options * @type {Array|Function} * @default null * @example * axis: { * x: { * tick: { * values: [1, 2, 4, 8, 16, 32, ...], * * // an Array value should be returned * values: function() { * return [ ... ]; * } * } * } * } */ axis_x_tick_values: null, /** * Rotate x axis tick text if there is not enough space for 'category' and 'timeseries' type axis. * - **NOTE:** The conditions where `autorotate` is enabled are: * - axis.x.type='category' or 'timeseries * - axis.x.tick.multiline=false * - axis.x.tick.culling=false * - axis.x.tick.fit=true * - **NOTE:** axis.x.tick.clippath=false is necessary for calculating the overflow padding between the end of x axis and the width of the SVG * @name axis․x․tick․autorotate * @memberof Options * @type {boolean} * @default false * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.XAxisTickAutorotate) * @example * axis: { * x: { * tick: { * rotate: 15, * autorotate: true, * multiline: false, * culling: false, * fit: true * }, * clipPath: false * } * } */ axis_x_tick_autorotate: !1, /** * Rotate x axis tick text. * - If you set negative value, it will rotate to opposite direction. * - Applied when [`axis.rotated`](#.axis%25E2%2580%25A4rotated) option is `false`. * - As long as `axis_x_tick_fit` is set to `true` it will calculate an overflow for the y2 axis and add this value to the right padding. * @name axis․x․tick․rotate * @memberof Options * @type {number} * @default 0 * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.RotateXAxisTickText) * @example * axis: { * x: { * tick: { * rotate: 60 * } * } * } */ axis_x_tick_rotate: 0, /** * Show x axis outer tick. * @name axis․x․tick․outer * @memberof Options * @type {boolean} * @default true * @example * axis: { * x: { * tick: { * outer: false * } * } * } */ axis_x_tick_outer: !0, /** * Set tick text to be multiline * - **NOTE:** * > When x tick text contains `\n`, it's used as line break and 'axis.x.tick.width' option is ignored. * @name axis․x․tick․multiline * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.XAxisTickMultiline) * @example * axis: { * x: { * tick: { * multiline: false * } * } * } * @example * // example of line break with '\n' * // In this case, 'axis.x.tick.width' is ignored * data: { * x: "x", * columns: [ * ["x", "long\ntext", "Another\nLong\nText"], * ... * ], * } */ axis_x_tick_multiline: !0, /** * Set tick width * - **NOTE:** * > When x tick text contains `\n`, this option is ignored. * @name axis․x․tick․width * @memberof Options * @type {number} * @default null * @example * axis: { * x: { * tick: { * width: 50 * } * } * } */ axis_x_tick_width: null, /** * Set to display system tooltip(via 'title' attribute) for tick text * - **NOTE:** Only available for category axis type (`axis.x.type='category'`) * @name axis․x․tick․tooltip * @memberof Options * @type {boolean} * @default false * @example * axis: { * x: { * tick: { * tooltip: true * } * } * } */ axis_x_tick_tooltip: !1, /** * Set max value of x axis range. * @name axis․x․max * @memberof Options * @property {number} max Set the max value * @property {boolean} [max.fit=false] When specified `max.value` is greater than the bound data value, setting `true` will make x axis max to be fitted to the bound data max value. * - **NOTE:** If the bound data max value is greater than the `max.value`, the x axis max will be limited as the given `max.value`. * @property {number} [max.value] Set the max value * @example * axis: { * x: { * max: 100, * * max: { * // 'fit=true' will make x axis max to be limited as the bound data value max when 'max.value' is greater. * // - when bound data max is '10' and max.value: '100' ==> x axis max will be '10' * // - when bound data max is '1000' and max.value: '100' ==> x axis max will be '100' * fit: true, * value: 100 * } * } * } */ axis_x_max: undefined, /** * Set min value of x axis range. * @name axis․x․min * @memberof Options * @property {number} min Set the min value * @property {boolean} [min.fit=false] When specified `min.value` is lower than the bound data value, setting `true` will make x axis min to be fitted to the bound data min value. * - **NOTE:** If the bound data min value is lower than the `min.value`, the x axis min will be limited as the given `min.value`. * @property {number} [min.value] Set the min value * @example * axis: { * x: { * min: -100, * * min: { * // 'fit=true' will make x axis min to be limited as the bound data value min when 'min.value' is lower. * // - when bound data min is '-10' and min.value: '-100' ==> x axis min will be '-10' * // - when bound data min is '-1000' and min.value: '-100' ==> x axis min will be '-100' * fit: true, * value: -100 * } * } * } */ axis_x_min: undefined, /** * Set padding for x axis.<br><br> * If this option is set, the range of x axis will increase/decrease according to the values. * If no padding is needed in the rage of x axis, 0 should be set. * - **NOTE:** * The padding values aren't based on pixels. It differs according axis types<br> * - **category:** The unit of tick value * ex. the given value `1`, is same as the width of 1 tick width * - **timeseries:** Numeric time value * ex. the given value `1000*60*60*24`, which is numeric time equivalent of a day, is same as the width of 1 tick width * @name axis․x․padding * @memberof Options * @type {object|number} * @default {} * @example * axis: { * x: { * padding: { * // when axis type is 'category' * left: 1, // set left padding width of equivalent value of a tick's width * right: 0.5 // set right padding width as half of equivalent value of tick's width * * // when axis type is 'timeseries' * left: 1000*60*60*24, // set left padding width of equivalent value of a day tick's width * right: 1000*60*60*12 // set right padding width as half of equivalent value of a day tick's width * }, * * // or set both values at once. * padding: 10 * } * } */ axis_x_padding: {}, /** * Set height of x axis.<br><br> * The height of x axis can be set manually by this option. If you need more space for x axis, please use this option for that. The unit is pixel. * @name axis․x․height * @memberof Options * @type {number} * @default undefined * @example * axis: { * x: { * height: 20 * } * } */ axis_x_height: undefined, /** * Set default extent for subchart and zoom. This can be an array or function that returns an array. * @name axis․x․extent * @memberof Options * @type {Array|Function} * @default undefined * @example * axis: { * x: { * // extent range as a pixel value * extent: [0, 200], * * // when axis is 'timeseries', parsable datetime string * extent: ["2019-03-01", "2019-03-05"], * * // return extent value * extent: function(domain, scale) { * var extent = domain.map(function(v) { * return scale(v); * }); * * // it should return a format of array * // ex) [0, 584] * return extent; * } * } * } */ axis_x_extent: undefined, /** * Set label on x axis.<br><br> * You can set x axis label and change its position by this option. * `string` and `object` can be passed and we can change the poisiton by passing object that has position key.<br> * Available position differs according to the axis direction (vertical or horizontal). * If string set, the position will be the default. * * - **If it's horizontal axis:** * - inner-right [default] * - inner-center * - inner-left * - outer-right * - outer-center * - outer-left * - **If it's vertical axis:** * - inner-top [default] * - inner-middle * - inner-bottom * - outer-top * - outer-middle * - outer-bottom * @name axis․x․label * @memberof Options * @type {string|object} * @default undefined * @example * axis: { * x: { * label: "Your X Axis" * } * } * * axis: { * x: { * label: { * text: "Your X Axis", * position: "outer-center" * } * } * } */ axis_x_label: {}, /** * Set additional axes for x Axis. * - **NOTE:** Axis' scale is based on x Axis value if domain option isn't set. * * Each axis object should consist with following options: * * | Name | Type | Default | Description | * | --- | --- | --- | --- | * | domain | Array | - | Set the domain value | * | tick.outer | boolean | true | Show outer tick | * | tick.format | Function | - | Set formatter for tick text | * | tick.count | Number | - | Set the number of y axis ticks | * | tick.values | Array | - | Set tick values manually | * @name axis․x․axes * @memberof Options * @type {Array} * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.MultiAxes) * @see [Demo: Domain](https://naver.github.io/billboard.js/demo/#Axis.MultiAxesDomain) * @example * x: { * axes: [ * { * // if set, will not be correlated with the main x Axis domain value * domain: [0, 1000], * tick: { * outer: false, * format: function(x) { * return x + "%"; * }, * count: 2, * values: [10, 20, 30] * } * }, * ... * ] * } */ axis_x_axes: [] }); ;// CONCATENATED MODULE: ./src/config/Options/axis/y.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * y Axis config options */ /* harmony default export */ var y = ({ /** * Set clip-path attribute for y axis element * - **NOTE**: `clip-path` attribute for y Axis is set only when `axis.y.inner` option is true. * @name axis․y․clipPath * @memberof Options * @type {boolean} * @default true * @example * // don't set 'clip-path' attribute * clipPath: false */ axis_y_clipPath: !0, /** * Show or hide y axis. * @name axis․y․show * @memberof Options * @type {boolean} * @default true * @example * axis: { * y: { * show: false * } * } */ axis_y_show: !0, /** * Set type of y axis.<br><br> * **Available Values:** * - indexed * - log * - timeseries * * **NOTE:**<br> * - **log** type: * - the bound data values must be exclusively-positive. * - y axis min value should be >= 0. * - [`data.groups`](#.data%25E2%2580%25A4groups)(stacked data) option aren't supported. * * @name axis․y․type * @memberof Options * @type {string} * @default "indexed" * @see [Demo: log](https://naver.github.io/billboard.js/demo/#Axis.LogScales) * @example * axis: { * y: { * type: "log" * } * } */ axis_y_type: "indexed", /** * Set max value of y axis. * - **NOTE:** Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0). * @name axis․y․max * @memberof Options * @type {number} * @default undefined * @example * axis: { * y: { * max: 1000 * } * } */ axis_y_max: undefined, /** * Set min value of y axis. * - **NOTE:** * Padding will be added based on this value, so if you don't need the padding, please set axis.y.padding to disable it (e.g. axis.y.padding = 0). * @name axis․y․min * @memberof Options * @type {number} * @default undefined * @example * axis: { * y: { * min: 1000 * } * } */ axis_y_min: undefined, /** * Change the direction of y axis.<br><br> * If true set, the direction will be from the top to the bottom. * @name axis․y․inverted * @memberof Options * @type {boolean} * @default false * @example * axis: { * y: { * inverted: true * } * } */ axis_y_inverted: !1, /** * Set center value of y axis. * @name axis․y․center * @memberof Options * @type {number} * @default undefined * @example * axis: { * y: { * center: 0 * } * } */ axis_y_center: undefined, /** * Show y axis inside of the chart. * @name axis․y․inner * @memberof Options * @type {boolean} * @default false * @example * axis: { * y: { * inner: true * } * } */ axis_y_inner: !1, /** * Set label on y axis.<br><br> * You can set y axis label and change its position by this option. This option works in the same way as [axis.x.label](#.axis%25E2%2580%25A4x%25E2%2580%25A4label). * @name axis․y․label * @memberof Options * @type {string|object} * @default {} * @see [axis.x.label](#.axis%25E2%2580%25A4x%25E2%2580%25A4label) for position string value. * @example * axis: { * y: { * label: "Your Y Axis" * } * } * * axis: { * y: { * label: { * text: "Your Y Axis", * position: "outer-middle" * } * } * } */ axis_y_label: {}, /** * Set formatter for y axis tick text.<br><br> * This option accepts d3.format object as well as a function you define. * @name axis․y․tick․format * @memberof Options * @type {Function} * @default undefined * @example * axis: { * y: { * tick: { * format: function(x) { * return x.getFullYear(); * } * } * } * } */ axis_y_tick_format: undefined, /** * Setting for culling ticks.<br><br> * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.<br><br> * We can change the number of ticks to be shown by axis.y.tick.culling.max. * @name axis․y․tick․culling * @memberof Options * @type {boolean} * @default false * @example * axis: { * y: { * tick: { * culling: false * } * } * } */ axis_y_tick_culling: !1, /** * The number of tick texts will be adjusted to less than this value. * @name axis․y․tick․culling․max * @memberof Options * @type {number} * @default 5 * @example * axis: { * y: { * tick: { * culling: { * max: 5 * } * } * } * } */ axis_y_tick_culling_max: 5, /** * Show y axis outer tick. * @name axis․y․tick․outer * @memberof Options * @type {boolean} * @default true * @example * axis: { * y: { * tick: { * outer: false * } * } * } */ axis_y_tick_outer: !0, /** * Set y axis tick values manually. * @name axis․y․tick․values * @memberof Options * @type {Array|Function} * @default null * @example * axis: { * y: { * tick: { * values: [100, 1000, 10000], * * // an Array value should be returned * values: function() { * return [ ... ]; * } * } * } * } */ axis_y_tick_values: null, /** * Rotate y axis tick text. * - If you set negative value, it will rotate to opposite direction. * - Applied when [`axis.rotated`](#.axis%25E2%2580%25A4rotated) option is `true`. * @name axis․y․tick․rotate * @memberof Options * @type {number} * @default 0 * @example * axis: { * y: { * tick: { * rotate: 60 * } * } * } */ axis_y_tick_rotate: 0, /** * Set the number of y axis ticks.<br><br> * - **NOTE:** The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful. * @name axis․y․tick․count * @memberof Options * @type {number} * @default undefined * @example * axis: { * y: { * tick: { * count: 5 * } * } * } */ axis_y_tick_count: undefined, /** * Show or hide y axis tick line. * @name axis․y․tick․show * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.HideTickLineText) * @example * axis: { * y: { * tick: { * show: false * } * } * } */ axis_y_tick_show: !0, /** * Set axis tick step(interval) size. * - **NOTE:** Will be ignored if `axis.y.tick.count` or `axis.y.tick.values` options are set. * @name axis․y․tick․stepSize * @memberof Options * @type {number} * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.StepSizeForYAxis) * @example * axis: { * y: { * tick: { * // tick value will step as indicated interval value. * // ex) 'stepSize=15' ==> [0, 15, 30, 45, 60] * stepSize: 15 * } * } * } */ axis_y_tick_stepSize: null, /** * Show or hide y axis tick text. * @name axis․y․tick․text․show * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.HideTickLineText) * @example * axis: { * y: { * tick: { * text: { * show: false * } * } * } * } */ axis_y_tick_text_show: !0, /** * Set the y Axis tick text's position relatively its original position * @name axis․y․tick․text․position * @memberof Options * @type {object} * @default {x: 0, y:0} * @example * axis: { * y: { * tick: { * text: { * position: { * x: 10, * y: 10 * } * } * } * } * } */ axis_y_tick_text_position: { x: 0, y: 0 }, /** * Set the number of y axis ticks.<br><br> * - **NOTE:** The position of the ticks will be calculated precisely, so the values on the ticks will not be rounded nicely. In the case, axis.y.tick.format or axis.y.tick.values will be helpful. * @name axis․y․tick․time * @memberof Options * @private * @type {object} * @property {object} time time object * @property {Function} [time.value] D3's time interval function (https://github.com/d3/d3-time#intervals) * @example * axis: { * y: { * tick: { * time: { * // ticks at 15-minute intervals * // https://github.com/d3/d3-scale/blob/master/README.md#time_ticks * value: d3.timeMinute.every(15) * } * } * } * } */ // @TODO: not fully implemented yet axis_y_tick_time_value: undefined, /** * Set padding for y axis.<br><br> * You can set padding for y axis to create more space on the edge of the axis. * This option accepts object and it can include top and bottom. top, bottom will be treated as pixels. * * - **NOTE:** * - Given values are translated relative to the y Axis domain value for padding * - For area and bar type charts, [area.zerobased](#.area) or [bar.zerobased](#.bar) options should be set to 'false` to get padded bottom. * @name axis․y․padding * @memberof Options * @type {object|number} * @default {} * @example * axis: { * y: { * padding: { * top: 0, * bottom: 0 * }, * * // or set both values at once. * padding: 10 * } * } */ axis_y_padding: {}, /** * Set default range of y axis.<br><br> * This option set the default value for y axis when there is no data on init. * @name axis․y․default * @memberof Options * @type {Array} * @default undefined * @example * axis: { * y: { * default: [0, 1000] * } * } */ axis_y_default: undefined, /** * Set additional axes for y Axis. * - **NOTE:** Axis' scale is based on y Axis value if domain option isn't set. * * Each axis object should consist with following options: * * | Name | Type | Default | Description | * | --- | --- | --- | --- | * | domain | Array | - | Set the domain value | * | tick.outer | boolean | true | Show outer tick | * | tick.format | Function | - | Set formatter for tick text | * | tick.count | Number | - | Set the number of y axis ticks | * | tick.values | Array | - | Set tick values manually | * @name axis․y․axes * @memberof Options * @type {Array} * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.MultiAxes) * @see [Demo: Domain](https://naver.github.io/billboard.js/demo/#Axis.MultiAxesDomain) * @example * y: { * axes: [ * { * // if set, will not be correlated with the main y Axis domain value * domain: [0, 1000], * tick: { * outer: false, * format: function(x) { * return x + "%"; * }, * count: 2, * values: [10, 20, 30] * } * }, * ... * ] * } */ axis_y_axes: [] }); ;// CONCATENATED MODULE: ./src/config/Options/axis/y2.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * y2 Axis config options */ /* harmony default export */ var y2 = ({ /** * Show or hide y2 axis. * - **NOTE**: * - When set to `false` will not generate y2 axis node. In this case, all 'y2' axis related functionality won't work properly. * - If need to use 'y2' related options while y2 isn't visible, set the value `true` and control visibility by css display property. * @name axis․y2․show * @memberof Options * @type {boolean} * @default false * @example * axis: { * y2: { * show: true * } * } */ axis_y2_show: !1, /** * Set type of y2 axis.<br><br> * **Available Values:** * - indexed * - log * - timeseries * * **NOTE:**<br> * - **log** type: * - the bound data values must be exclusively-positive. * - y2 axis min value should be >= 0. * - [`data.groups`](#.data%25E2%2580%25A4groups)(stacked data) option aren't supported. * * @name axis․y2․type * @memberof Options * @type {string} * @default "indexed" * @see [Demo: log](https://naver.github.io/billboard.js/demo/#Axis.LogScales) * @example * axis: { * y2: { * type: "indexed" * } * } */ axis_y2_type: "indexed", /** * Set max value of y2 axis. * @name axis․y2․max * @memberof Options * @type {number} * @default undefined * @example * axis: { * y2: { * max: 1000 * } * } */ axis_y2_max: undefined, /** * Set min value of y2 axis. * @name axis․y2․min * @memberof Options * @type {number} * @default undefined * @example * axis: { * y2: { * min: -1000 * } * } */ axis_y2_min: undefined, /** * Change the direction of y2 axis.<br><br> * If true set, the direction will be from the top to the bottom. * @name axis․y2․inverted * @memberof Options * @type {boolean} * @default false * @example * axis: { * y2: { * inverted: true * } * } */ axis_y2_inverted: !1, /** * Set center value of y2 axis. * @name axis․y2․center * @memberof Options * @type {number} * @default undefined * @example * axis: { * y2: { * center: 0 * } * } */ axis_y2_center: undefined, /** * Show y2 axis inside of the chart. * @name axis․y2․inner * @memberof Options * @type {boolean} * @default false * @example * axis: { * y2: { * inner: true * } * } */ axis_y2_inner: !1, /** * Set label on y2 axis.<br><br> * You can set y2 axis label and change its position by this option. This option works in the same way as [axis.x.label](#.axis%25E2%2580%25A4x%25E2%2580%25A4label). * @name axis․y2․label * @memberof Options * @type {string|object} * @default {} * @see [axis.x.label](#.axis%25E2%2580%25A4x%25E2%2580%25A4label) for position string value. * @example * axis: { * y2: { * label: "Your Y2 Axis" * } * } * * axis: { * y2: { * label: { * text: "Your Y2 Axis", * position: "outer-middle" * } * } * } */ axis_y2_label: {}, /** * Set formatter for y2 axis tick text.<br><br> * This option works in the same way as axis.y.format. * @name axis․y2․tick․format * @memberof Options * @type {Function} * @default undefined * @example * axis: { * y2: { * tick: { * format: d3.format("$,") * //or format: function(d) { return "$" + d; } * } * } * } */ axis_y2_tick_format: undefined, /** * Setting for culling ticks.<br><br> * If true is set, the ticks will be culled, then only limitted tick text will be shown. This option does not hide the tick lines. If false is set, all of ticks will be shown.<br><br> * We can change the number of ticks to be shown by axis.y.tick.culling.max. * @name axis․y2․tick․culling * @memberof Options * @type {boolean} * @default false * @example * axis: { * y2: { * tick: { * culling: false * } * } * } */ axis_y2_tick_culling: !1, /** * The number of tick texts will be adjusted to less than this value. * @name axis․y2․tick․culling․max * @memberof Options * @type {number} * @default 5 * @example * axis: { * y2: { * tick: { * culling: { * max: 5 * } * } * } * } */ axis_y2_tick_culling_max: 5, /** * Show or hide y2 axis outer tick. * @name axis․y2․tick․outer * @memberof Options * @type {boolean} * @default true * @example * axis: { * y2: { * tick: { * outer: false * } * } * } */ axis_y2_tick_outer: !0, /** * Set y2 axis tick values manually. * @name axis․y2․tick․values * @memberof Options * @type {Array|Function} * @default null * @example * axis: { * y2: { * tick: { * values: [100, 1000, 10000], * * // an Array value should be returned * values: function() { * return [ ... ]; * } * } * } * } */ axis_y2_tick_values: null, /** * Rotate y2 axis tick text. * - If you set negative value, it will rotate to opposite direction. * - Applied when [`axis.rotated`](#.axis%25E2%2580%25A4rotated) option is `true`. * @name axis․y2․tick․rotate * @memberof Options * @type {number} * @default 0 * @example * axis: { * y2: { * tick: { * rotate: 60 * } * } * } */ axis_y2_tick_rotate: 0, /** * Set the number of y2 axis ticks. * - **NOTE:** This works in the same way as axis.y.tick.count. * @name axis․y2․tick․count * @memberof Options * @type {number} * @default undefined * @example * axis: { * y2: { * tick: { * count: 5 * } * } * } */ axis_y2_tick_count: undefined, /** * Show or hide y2 axis tick line. * @name axis․y2․tick․show * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.HideTickLineText) * @example * axis: { * y2: { * tick: { * show: false * } * } * } */ axis_y2_tick_show: !0, /** * Set axis tick step(interval) size. * - **NOTE:** Will be ignored if `axis.y2.tick.count` or `axis.y2.tick.values` options are set. * @name axis․y2․tick․stepSize * @memberof Options * @type {number} * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.StepSizeForYAxis) * @example * axis: { * y2: { * tick: { * // tick value will step as indicated interval value. * // ex) 'stepSize=15' ==> [0, 15, 30, 45, 60] * stepSize: 15 * } * } * } */ axis_y2_tick_stepSize: null, /** * Show or hide y2 axis tick text. * @name axis․y2․tick․text․show * @memberof Options * @type {boolean} * @default true * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.HideTickLineText) * @example * axis: { * y2: { * tick: { * text: { * show: false * } * } * } * } */ axis_y2_tick_text_show: !0, /** * Set the y2 Axis tick text's position relatively its original position * @name axis․y2․tick․text․position * @memberof Options * @type {object} * @default {x: 0, y:0} * @example * axis: { * y2: { * tick: { * text: { * position: { * x: 10, * y: 10 * } * } * } * } * } */ axis_y2_tick_text_position: { x: 0, y: 0 }, /** * Set padding for y2 axis.<br><br> * You can set padding for y2 axis to create more space on the edge of the axis. * This option accepts object and it can include top and bottom. top, bottom will be treated as pixels. * * - **NOTE:** * - Given values are translated relative to the y2 Axis domain value for padding * - For area and bar type charts, [area.zerobased](#.area) or [bar.zerobased](#.bar) options should be set to 'false` to get padded bottom. * @name axis․y2․padding * @memberof Options * @type {object|number} * @default {} * @example * axis: { * y2: { * padding: { * top: 100, * bottom: 100 * } * * // or set both values at once. * padding: 10 * } */ axis_y2_padding: {}, /** * Set default range of y2 axis.<br><br> * This option set the default value for y2 axis when there is no data on init. * @name axis․y2․default * @memberof Options * @type {Array} * @default undefined * @example * axis: { * y2: { * default: [0, 1000] * } * } */ axis_y2_default: undefined, /** * Set additional axes for y2 Axis. * - **NOTE:** Axis' scale is based on y2 Axis value if domain option isn't set. * * Each axis object should consist with following options: * * | Name | Type | Default | Description | * | --- | --- | --- | --- | * | domain | Array | - | Set the domain value | * | tick.outer | boolean | true | Show outer tick | * | tick.format | Function | - | Set formatter for tick text | * | tick.count | Number | - | Set the number of y axis ticks | * | tick.values | Array | - | Set tick values manually | * @name axis․y2․axes * @memberof Options * @type {Array} * @see [Demo](https://naver.github.io/billboard.js/demo/#Axis.MultiAxes) * @see [Demo: Domain](https://naver.github.io/billboard.js/demo/#Axis.MultiAxesDomain) * @example * y2: { * axes: [ * { * // if set, will not be correlated with the main y2 Axis domain value * domain: [0, 1000], * tick: { * outer: false, * format: function(x) { * return x + "%"; * }, * count: 2, * values: [10, 20, 30] * } * }, * ... * ] * } */ axis_y2_axes: [] }); ;// CONCATENATED MODULE: ./src/config/Options/axis/axis.ts function axis_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function axis_objectSpread(target) { for (var source, i = 1; i < arguments.length; i++) source = arguments[i] == null ? {} : arguments[i], i % 2 ? axis_ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : axis_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); return target; } /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * y Axis config options */ /* harmony default export */ var axis_axis = (axis_objectSpread(axis_objectSpread(axis_objectSpread({ /** * Switch x and y axis position. * @name axis․rotated * @memberof Options * @type {boolean} * @default false * @example * axis: { * rotated: true * } */ axis_rotated: !1 }, axis_x), y), y2)); ;// CONCATENATED MODULE: ./src/config/Options/common/grid.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * grid config options */ /* harmony default export */ var common_grid = ({ /** * Set related options * @name grid * @memberof Options * @type {object} * @property {boolean} [front=false] Set 'grid & focus lines' to be positioned over grid lines and chart elements. * @property {object} x Grid x object * @property {boolean} [x.show=false] Show grids along x axis. * @property {Array} [x.lines=[]] Show additional grid lines along x axis.<br> * This option accepts array including object that has value, text, position and class. text, position and class are optional. For position, start, middle and end (default) are available. * If x axis is category axis, value can be category name. If x axis is timeseries axis, value can be date string, Date object and unixtime integer. * @property {object} y Grid y object * @property {boolean} [y.show=false] Show grids along x axis. * @property {Array} [y.lines=[]] Show additional grid lines along y axis.<br> * This option accepts array including object that has value, text, position and class. * @property {number} [y.ticks=10] Number of y grids to be shown. * @property {object} focus Grid focus object * @property {boolean} [focus.edge=false] Show edged focus grid line.<br>**NOTE:** Available when [`tooltip.grouped=false`](#.tooltip) option is set. * @property {boolean} [focus.show=true] Show grid line when focus. * @property {boolean} [focus.y=false] Show y coordinate focus grid line.<br>**NOTE:** Available when [`tooltip.grouped=false`](#.tooltip) option is set. * @property {object} lines Grid lines object * @property {boolean} [lines.front=true] Set grid lines to be positioned over chart elements. * @default undefined * @see [Demo](https://naver.github.io/billboard.js/demo/#Grid.GridLines) * @see [Demo: X Grid Lines](https://naver.github.io/billboard.js/demo/#Grid.OptionalXGridLines) * @see [Demo: Y Grid Lines](https://naver.github.io/billboard.js/demo/#Grid.OptionalYGridLines) * @example * grid: { * x: { * show: true, * lines: [ * {value: 2, text: "Label on 2"}, * {value: 5, text: "Label on 5", class: "label-5"}, * {value: 6, text: "Label on 6", position: "start"} * ] * }, * y: { * show: true, * lines: [ * {value: 100, text: "Label on 100"}, * {value: 200, text: "Label on 200", class: "label-200"}, * {value: 300, text: "Label on 300", position: 'middle'} * ], * ticks: 5 * }, * front: true, * focus: { * show: false, * * // Below options are available when 'tooltip.grouped=false' option is set * edge: true, * y: true * }, * lines: { * front: false * } * } */ grid_x_show: !1, grid_x_type: "tick", grid_x_lines: [], grid_y_show: !1, grid_y_lines: [], grid_y_ticks: 10, grid_focus_edge: !1, grid_focus_show: !0, grid_focus_y: !1, grid_front: !1, grid_lines_front: !0 }); ;// CONCATENATED MODULE: ./src/config/resolver/axis.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Modules exports for Axis based chart */ // Chart // ChartInternal // Axis based options var api = [api_axis, api_category, grid_x, grid_y, flow, group, api_regions, x]; var internal = [Axis, clip, eventrect, interactions_flow, grid, region, size_axis]; var options = [data_axis, axis_axis, common_grid]; // EXTERNAL MODULE: external {"commonjs":"d3-interpolate","commonjs2":"d3-interpolate","amd":"d3-interpolate","root":"d3"} var external_commonjs_d3_interpolate_commonjs2_d3_interpolate_amd_d3_interpolate_root_d3_ = __webpack_require__(12); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/arc.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var arc = ({ initPie: function initPie() { var $$ = this, config = $$.config, dataType = config.data_type, padding = config.pie_padding, startingAngle = config[dataType + "_startingAngle"] || 0, padAngle = ($$.hasType("pie") && padding ? padding * .01 : config[dataType + "_padAngle"]) || 0; $$.pie = (0,external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.pie)().startAngle(startingAngle).endAngle(startingAngle + 2 * Math.PI).padAngle(padAngle).value(function (d) { return d.values.reduce(function (a, b) { return a + b.value; }, 0); }).sort($$.getSortCompareFn.bind($$)(!0)); }, updateRadius: function updateRadius() { var $$ = this, config = $$.config, state = $$.state, padding = config.pie_padding, w = config.gauge_width || config.donut_width, gaugeArcWidth = $$.filterTargetsToShow($$.data.targets).length * config.gauge_arcs_minWidth; state.radiusExpanded = Math.min(state.arcWidth, state.arcHeight) / 2 * ($$.hasMultiArcGauge() ? .85 : 1), state.radius = state.radiusExpanded * .95, state.innerRadiusRatio = w ? (state.radius - w) / state.radius : .6, state.gaugeArcWidth = w || (gaugeArcWidth <= state.radius - state.innerRadius ? state.radius - state.innerRadius : gaugeArcWidth <= state.radius ? gaugeArcWidth : state.radius); var innerRadius = config.pie_innerRadius || (padding ? padding * (state.innerRadiusRatio + .1) : 0); // NOTE: inner/outerRadius can be an object by user setting, only for 'pie' type state.outerRadius = config.pie_outerRadius, state.innerRadius = $$.hasType("donut") || $$.hasType("gauge") ? state.radius * state.innerRadiusRatio : innerRadius; }, /** * Get pie's inner & outer radius value * @param {object|undefined} d Data object * @returns {object} * @private */ getRadius: function getRadius(d) { var $$ = this, data = d && d.data, _$$$state = $$.state, innerRadius = _$$$state.innerRadius, outerRadius = _$$$state.outerRadius; return !isNumber(innerRadius) && data && (innerRadius = innerRadius[data.id] || 0), isObject(outerRadius) && data && data.id in outerRadius ? outerRadius = outerRadius[data.id] : !isNumber(outerRadius) && (outerRadius = $$.state.radius), { innerRadius: innerRadius, outerRadius: outerRadius }; }, updateArc: function updateArc() { var $$ = this; $$.updateRadius(), $$.svgArc = $$.getSvgArc(), $$.svgArcExpanded = $$.getSvgArcExpanded(); }, getArcLength: function getArcLength() { var $$ = this, config = $$.config, arcLengthInPercent = config.gauge_arcLength * 3.6, len = 2 * (arcLengthInPercent / 360); return arcLengthInPercent < -360 ? len = -2 : arcLengthInPercent > 360 && (len = 2), len * Math.PI; }, getStartAngle: function getStartAngle() { var $$ = this, config = $$.config, isFullCircle = config.gauge_fullCircle, defaultStartAngle = -1 * Math.PI / 2, defaultEndAngle = Math.PI / 2, startAngle = config.gauge_startingAngle; return !isFullCircle && startAngle <= defaultStartAngle ? startAngle = defaultStartAngle : !isFullCircle && startAngle >= defaultEndAngle ? startAngle = defaultEndAngle : (startAngle > Math.PI || startAngle < -1 * Math.PI) && (startAngle = Math.PI), startAngle; }, updateAngle: function updateAngle(dValue) { var $$ = this, config = $$.config, state = $$.state, pie = $$.pie, d = dValue, found = !1; if (!config) return null; var gStart = $$.getStartAngle(), radius = config.gauge_fullCircle ? $$.getArcLength() : gStart * -2; if (d.data && $$.isGaugeType(d.data) && !$$.hasMultiArcGauge()) { // to prevent excluding total data sum during the init(when data.hide option is used), use $$.rendered state value var totalSum = $$.getTotalDataSum(state.rendered), gEnd = radius * (totalSum / (config.gauge_max - config.gauge_min)); pie = pie.startAngle(gStart).endAngle(gEnd + gStart); } if (pie($$.filterTargetsToShow()).forEach(function (t, i) { found || t.data.id !== d.data.id || (found = !0, d = t, d.index = i); }), isNaN(d.startAngle) && (d.startAngle = 0), isNaN(d.endAngle) && (d.endAngle = d.startAngle), d.data && $$.hasMultiArcGauge()) { var gMin = config.gauge_min, gMax = config.gauge_max, gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : gMax - gMin; d.startAngle = gStart, d.endAngle = gStart + radius / (gMax - gMin) * gValue; } return found ? d : null; }, getSvgArc: function getSvgArc() { var $$ = this, state = $$.state, singleArcWidth = state.gaugeArcWidth / $$.filterTargetsToShow($$.data.targets).length, hasMultiArcGauge = $$.hasMultiArcGauge(), arc = (0,external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.arc)().innerRadius(function (d) { var _$$$getRadius = $$.getRadius(d), innerRadius = _$$$getRadius.innerRadius; return hasMultiArcGauge ? state.radius - singleArcWidth * (d.index + 1) : isNumber(innerRadius) ? innerRadius : 0; }).outerRadius(function (d) { var _$$$getRadius2 = $$.getRadius(d), outerRadius = _$$$getRadius2.outerRadius; return hasMultiArcGauge ? state.radius - singleArcWidth * d.index : outerRadius; }), newArc = function (d, withoutUpdate) { var path = "M 0 0"; if (d.value || d.data) { var updated = !withoutUpdate && $$.updateAngle(d); withoutUpdate ? path = arc(d) : updated && (path = arc(updated)); } return path; }; return newArc.centroid = arc.centroid, newArc; }, getSvgArcExpanded: function getSvgArcExpanded(rate) { var $$ = this, state = $$.state, newRate = rate || 1, singleArcWidth = state.gaugeArcWidth / $$.filterTargetsToShow($$.data.targets).length, hasMultiArcGauge = $$.hasMultiArcGauge(), expandWidth = Math.min(state.radiusExpanded * newRate - state.radius, singleArcWidth * .8 - (1 - newRate) * 100), arc = (0,external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.arc)().innerRadius(function (d) { return hasMultiArcGauge ? state.radius - singleArcWidth * (d.index + 1) : $$.getRadius(d).innerRadius; }).outerRadius(function (d) { var radius; if (hasMultiArcGauge) radius = state.radius - singleArcWidth * d.index + expandWidth;else { var _$$$getRadius3 = $$.getRadius(d), outerRadius = _$$$getRadius3.outerRadius, radiusExpanded = state.radiusExpanded; state.radius !== outerRadius && (radiusExpanded -= Math.abs(state.radius - outerRadius)), radius = radiusExpanded * newRate; } return radius; }); return function (d) { var updated = $$.updateAngle(d); return updated ? arc(updated) : "M 0 0"; }; }, getArc: function getArc(d, withoutUpdate, force) { return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : "M 0 0"; }, transformForArcLabel: function transformForArcLabel(d) { var $$ = this, config = $$.config, radiusExpanded = $$.state.radiusExpanded, updated = $$.updateAngle(d), translate = ""; if (updated) if ($$.hasMultiArcGauge()) { var y1 = Math.sin(updated.endAngle - Math.PI / 2), x = Math.cos(updated.endAngle - Math.PI / 2) * (radiusExpanded + 25), y = y1 * (radiusExpanded + 15 - Math.abs(y1 * 10)) + 3; translate = "translate(" + x + "," + y + ")"; } else if (!$$.hasType("gauge") || $$.data.targets.length > 1) { var _$$$getRadius4 = $$.getRadius(d), outerRadius = _$$$getRadius4.outerRadius, c = this.svgArc.centroid(updated), x = isNaN(c[0]) ? 0 : c[0], y = isNaN(c[1]) ? 0 : c[1], h = Math.sqrt(x * x + y * y), ratio = $$.hasType("donut") && config.donut_label_ratio || $$.hasType("pie") && config.pie_label_ratio; ratio = ratio ? isFunction(ratio) ? ratio.bind($$.api)(d, outerRadius, h) : ratio : outerRadius && (h ? (36 / outerRadius > .375 ? 1.175 - 36 / outerRadius : .8) * outerRadius / h : 0), translate = "translate(" + x * ratio + "," + y * ratio + ")"; } return translate; }, convertToArcData: function convertToArcData(d) { return this.addName({ id: d.data ? d.data.id : d.id, value: d.value, ratio: this.getRatio("arc", d), index: d.index }); }, textForArcLabel: function textForArcLabel(selection) { var $$ = this, hasGauge = $$.hasType("gauge"); $$.shouldShowArcLabel() && selection.style("fill", $$.updateTextColor.bind($$)).each(function (d) { var node = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), updated = $$.updateAngle(d), ratio = $$.getRatio("arc", updated), isUnderThreshold = $$.meetsLabelThreshold(ratio, $$.hasType("donut") && "donut" || $$.hasType("gauge") && "gauge" || $$.hasType("pie") && "pie"); if (isUnderThreshold) { var value = (updated || d).value, text = ($$.getArcLabelFormat() || $$.defaultArcValueFormat)(value, ratio, d.data.id).toString(); setTextValue(node, text, [-1, 1], hasGauge); } else node.text(""); }); }, expandArc: function expandArc(targetIds) { var $$ = this, transiting = $$.state.transiting, $el = $$.$el; // MEMO: avoid to cancel transition if (transiting) { var interval = setInterval(function () { transiting || (clearInterval(interval), $el.legend.selectAll("." + config_classes.legendItemFocused).size() > 0 && $$.expandArc(targetIds)); }, 10); return; } var newTargetIds = $$.mapToTargetIds(targetIds); $el.svg.selectAll($$.selectorTargets(newTargetIds, "." + config_classes.chartArc)).each(function (d) { if ($$.shouldExpand(d.data.id)) { var expandDuration = $$.getExpandConfig(d.data.id, "duration"), svgArcExpandedSub = $$.getSvgArcExpanded($$.getExpandConfig(d.data.id, "rate")); (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).selectAll("path").transition().duration(expandDuration).attr("d", $$.svgArcExpanded).transition().duration(expandDuration * 2).attr("d", svgArcExpandedSub); } }); }, unexpandArc: function unexpandArc(targetIds) { var $$ = this, transiting = $$.state.transiting, svg = $$.$el.svg; if (!transiting) { var newTargetIds = $$.mapToTargetIds(targetIds); svg.selectAll($$.selectorTargets(newTargetIds, "." + config_classes.chartArc)).selectAll("path").transition().duration(function (d) { return $$.getExpandConfig(d.data.id, "duration"); }).attr("d", $$.svgArc), svg.selectAll("" + config_classes.arc).style("opacity", "1"); } }, /** * Get expand config value * @param {string} id data ID * @param {string} key config key: 'duration | rate' * @returns {number} * @private */ getExpandConfig: function getExpandConfig(id, key) { var type, $$ = this, config = $$.config; return $$.isDonutType(id) ? type = "donut" : $$.isGaugeType(id) ? type = "gauge" : $$.isPieType(id) && (type = "pie"), type ? config[type + "_expand_" + key] : { duration: 50, rate: .98 }[key]; }, shouldExpand: function shouldExpand(id) { var $$ = this, config = $$.config; return $$.isDonutType(id) && config.donut_expand || $$.isGaugeType(id) && config.gauge_expand || $$.isPieType(id) && config.pie_expand; }, shouldShowArcLabel: function shouldShowArcLabel() { var $$ = this, config = $$.config; return ["pie", "donut", "gauge"].some(function (v) { return $$.hasType(v) && config[v + "_label_show"]; }); }, getArcLabelFormat: function getArcLabelFormat() { var $$ = this, config = $$.config, format = config.pie_label_format; return $$.hasType("gauge") ? format = config.gauge_label_format : $$.hasType("donut") && (format = config.donut_label_format), isFunction(format) ? format.bind($$.api) : format; }, getArcTitle: function getArcTitle() { var $$ = this, type = $$.hasType("donut") && "donut" || $$.hasType("gauge") && "gauge"; return type ? $$.config[type + "_title"] : ""; }, updateTargetsForArc: function updateTargetsForArc(targets) { var $$ = this, $el = $$.$el, hasGauge = $$.hasType("gauge"), classChartArc = $$.getChartClass("Arc"), classArcs = $$.getClass("arcs", !0), classFocus = $$.classFocus.bind($$), chartArcs = $el.main.select("." + config_classes.chartArcs), mainPieUpdate = chartArcs.selectAll("." + config_classes.chartArc).data($$.pie(targets)).attr("class", function (d) { return classChartArc(d) + classFocus(d.data); }), mainPieEnter = mainPieUpdate.enter().append("g").attr("class", classChartArc); mainPieEnter.append("g").attr("class", classArcs).merge(mainPieUpdate), mainPieEnter.append("text").attr("dy", hasGauge && !$$.hasMultiTargets() ? "-.1em" : ".35em").style("opacity", "0").style("text-anchor", "middle").style("pointer-events", "none"), $el.text = chartArcs.selectAll("." + config_classes.target + " text"); }, initArc: function initArc() { var $$ = this, $el = $$.$el; $el.arcs = $el.main.select("." + config_classes.chart).append("g").attr("class", config_classes.chartArcs).attr("transform", $$.getTranslate("arc")), $$.setArcTitle(); }, /** * Set arc title text * @private */ setArcTitle: function setArcTitle() { var $$ = this, title = $$.getArcTitle(), hasGauge = $$.hasType("gauge"); if (title) { var text = $$.$el.arcs.append("text").attr("class", config_classes[hasGauge ? "chartArcsGaugeTitle" : "chartArcsTitle"]).style("text-anchor", "middle"); hasGauge && text.attr("dy", "-0.3em").style("font-size", "27px"), setTextValue(text, title, hasGauge ? undefined : [-.6, 1.35], !0); } }, redrawArc: function redrawArc(duration, durationForExit, withTransform) { var $$ = this, config = $$.config, state = $$.state, main = $$.$el.main, hasInteraction = config.interaction_enabled, isSelectable = hasInteraction && config.data_selection_isselectable, mainArc = main.selectAll("." + config_classes.arcs).selectAll("." + config_classes.arc).data($$.arcData.bind($$)); // bind arc events mainArc.exit().transition().duration(durationForExit).style("opacity", "0").remove(), mainArc = mainArc.enter().append("path").attr("class", $$.getClass("arc", !0)).style("fill", function (d) { return $$.color(d.data); }).style("cursor", function (d) { return isSelectable && isSelectable.bind($$.api)(d) ? "pointer" : null; }).style("opacity", "0").each(function (d) { $$.isGaugeType(d.data) && (d.startAngle = config.gauge_startingAngle, d.endAngle = config.gauge_startingAngle), this._current = d; }).merge(mainArc), $$.hasType("gauge") && ($$.updateGaugeMax(), $$.hasMultiArcGauge() && $$.redrawMultiArcGauge()), mainArc.attr("transform", function (d) { return !$$.isGaugeType(d.data) && withTransform ? "scale(0)" : ""; }).style("opacity", function (d) { return d === this._current ? "0" : "1"; }).each(function () { state.transiting = !0; }).transition().duration(duration).attrTween("d", function (d) { var updated = $$.updateAngle(d); if (!updated) return function () { return "M 0 0"; }; isNaN(this._current.startAngle) && (this._current.startAngle = 0), isNaN(this._current.endAngle) && (this._current.endAngle = this._current.startAngle); var interpolate = (0,external_commonjs_d3_interpolate_commonjs2_d3_interpolate_amd_d3_interpolate_root_d3_.interpolate)(this._current, updated); return this._current = interpolate(0), function (t) { var interpolated = interpolate(t); // data.id will be updated by interporator return interpolated.data = d.data, $$.getArc(interpolated, !0); }; }).attr("transform", withTransform ? "scale(1)" : "").style("fill", function (d) { var color; return $$.levelColor ? (color = $$.levelColor(d.data.values[0].value), config.data_colors[d.data.id] = color) : color = $$.color(d.data), color; }) // Where gauge reading color would receive customization. .style("opacity", "1").call(endall, function () { if ($$.levelColor) { var path = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), d = path.datum(); $$.updateLegendItemColor(d.data.id, path.style("fill")); } state.transiting = !1, callFn(config.onrendered, $$.api); }), hasInteraction && $$.bindArcEvent(mainArc), $$.hasType("gauge") && $$.redrawBackgroundArcs(), $$.redrawArcText(duration); }, redrawBackgroundArcs: function redrawBackgroundArcs() { var $$ = this, config = $$.config, state = $$.state, hasMultiArcGauge = $$.hasMultiArcGauge(), isFullCircle = config.gauge_fullCircle, startAngle = $$.getStartAngle(), endAngle = isFullCircle ? startAngle + $$.getArcLength() : startAngle * -1, backgroundArc = $$.$el.arcs.select((hasMultiArcGauge ? "g" : "") + "." + config_classes.chartArcsBackground); if (hasMultiArcGauge) { var index = 0; backgroundArc = backgroundArc.selectAll("path." + config_classes.chartArcsBackground).data($$.data.targets), backgroundArc.enter().append("path").attr("class", function (d, i) { return config_classes.chartArcsBackground + " " + config_classes.chartArcsBackground + "-" + i; }).merge(backgroundArc).style("fill", config.gauge_background || null).attr("d", function (_ref2) { var id = _ref2.id; if (state.hiddenTargetIds.indexOf(id) >= 0) return "M 0 0"; var d = { data: [{ value: config.gauge_max }], startAngle: startAngle, endAngle: endAngle, index: index++ }; return $$.getArc(d, !0, !0); }), backgroundArc.exit().remove(); } else backgroundArc.attr("d", function () { var d = { data: [{ value: config.gauge_max }], startAngle: startAngle, endAngle: endAngle }; return $$.getArc(d, !0, !0); }); }, bindArcEvent: function bindArcEvent(arc) { // eslint-disable-next-line function selectArc(_this, arcData, id) { $$.expandArc(id), $$.api.focus(id), $$.toggleFocusLegend(id, !0), $$.showTooltip([arcData], _this); } // eslint-disable-next-line function unselectArc(arcData) { var id = arcData && arcData.id || undefined; $$.unexpandArc(id), $$.api.revert(), $$.revertLegend(), $$.hideTooltip(); } var $$ = this, config = $$.config, state = $$.state, isTouch = state.inputType === "touch", isMouse = state.inputType === "mouse"; // touch events if (arc.on("click", function (event, d, i) { var arcData, updated = $$.updateAngle(d); updated && (arcData = $$.convertToArcData(updated), $$.toggleShape && $$.toggleShape(this, arcData, i), config.data_onclick.bind($$.api)(arcData, this)); }), isMouse && arc.on("mouseover", function (event, d) { if (!state.transiting) // skip while transiting { state.event = event; var updated = $$.updateAngle(d), arcData = updated ? $$.convertToArcData(updated) : null, id = arcData && arcData.id || undefined; selectArc(this, arcData, id), $$.setOverOut(!0, arcData); } }).on("mouseout", function (event, d) { if (!state.transiting) // skip while transiting { state.event = event; var updated = $$.updateAngle(d), arcData = updated ? $$.convertToArcData(updated) : null; unselectArc(), $$.setOverOut(!1, arcData); } }).on("mousemove", function (event, d) { var updated = $$.updateAngle(d), arcData = updated ? $$.convertToArcData(updated) : null; state.event = event, $$.showTooltip([arcData], this); }), isTouch && $$.hasArcType() && !$$.radars) { var getEventArc = function (event) { var touch = event.changedTouches[0], eventArc = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(browser_doc.elementFromPoint(touch.clientX, touch.clientY)); return eventArc; }; $$.$el.svg.on("touchstart touchmove", function (event) { if (!state.transiting) // skip while transiting { var eventArc = getEventArc(event), datum = eventArc.datum(), updated = datum && datum.data && datum.data.id ? $$.updateAngle(datum) : null, arcData = updated ? $$.convertToArcData(updated) : null, id = arcData && arcData.id || undefined; $$.callOverOutForTouch(arcData), isUndefined(id) ? unselectArc() : selectArc(this, arcData, id); } }); } }, redrawArcText: function redrawArcText(duration) { var text, $$ = this, config = $$.config, state = $$.state, _$$$$el = $$.$el, main = _$$$$el.main, arcs = _$$$$el.arcs, hasGauge = $$.hasType("gauge"), hasMultiArcGauge = $$.hasMultiArcGauge(); if (hasGauge && $$.data.targets.length === 1 && config.gauge_title || (text = main.selectAll("." + config_classes.chartArc).select("text").style("opacity", "0").attr("class", function (d) { return $$.isGaugeType(d.data) ? config_classes.gaugeValue : null; }).call($$.textForArcLabel.bind($$)).attr("transform", $$.transformForArcLabel.bind($$)).style("font-size", function (d) { return $$.isGaugeType(d.data) && $$.data.targets.length === 1 && !hasMultiArcGauge ? Math.round(state.radius / 5) + "px" : null; }).transition().duration(duration).style("opacity", function (d) { return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? "1" : "0"; }), hasMultiArcGauge && text.attr("dy", "-.1em")), main.select("." + config_classes.chartArcsTitle).style("opacity", $$.hasType("donut") || hasGauge ? "1" : "0"), hasGauge) { var isFullCircle = config.gauge_fullCircle; isFullCircle && text && text.attr("dy", "" + (hasMultiArcGauge ? 0 : Math.round(state.radius / 14))), config.gauge_label_show && (arcs.select("." + config_classes.chartArcsGaugeUnit).attr("dy", (isFullCircle ? 1.5 : .75) + "em").text(config.gauge_units), arcs.select("." + config_classes.chartArcsGaugeMin).attr("dx", -1 * (state.innerRadius + (state.radius - state.innerRadius) / (isFullCircle ? 1 : 2)) + "px").attr("dy", "1.2em").text($$.textForGaugeMinMax(config.gauge_min, !1)), !isFullCircle && arcs.select("." + config_classes.chartArcsGaugeMax).attr("dx", state.innerRadius + (state.radius - state.innerRadius) / 2 + "px").attr("dy", "1.2em").text($$.textForGaugeMinMax(config.gauge_max, !0))); } } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/area.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var shape_area = ({ initArea: function initArea(mainLine) { var $$ = this, config = $$.config; mainLine.insert("g", "." + config_classes[config.area_front ? "circles" : "lines"]).attr("class", $$.getClass("areas", !0)); }, updateAreaGradient: function updateAreaGradient() { var $$ = this, config = $$.config, datetimeId = $$.state.datetimeId, defs = $$.$el.defs; $$.data.targets.forEach(function (d) { var id = datetimeId + "-areaGradient" + $$.getTargetSelectorSuffix(d.id); if ($$.isAreaType(d) && defs.select("#" + id).empty()) { var color = $$.color(d), _config$area_linearGr = config.area_linearGradient, _config$area_linearGr2 = _config$area_linearGr.x, x = _config$area_linearGr2 === void 0 ? [0, 0] : _config$area_linearGr2, _config$area_linearGr3 = _config$area_linearGr.y, y = _config$area_linearGr3 === void 0 ? [0, 1] : _config$area_linearGr3, _config$area_linearGr4 = _config$area_linearGr.stops, stops = _config$area_linearGr4 === void 0 ? [[0, color, 1], [1, color, 0]] : _config$area_linearGr4, linearGradient = defs.append("linearGradient").attr("id", "" + id).attr("x1", x[0]).attr("x2", x[1]).attr("y1", y[0]).attr("y2", y[1]); stops.forEach(function (v) { var stopColor = isFunction(v[1]) ? v[1].bind($$.api)(d.id) : v[1]; linearGradient.append("stop").attr("offset", v[0]).attr("stop-color", stopColor || color).attr("stop-opacity", v[2]); }); } }); }, updateAreaColor: function updateAreaColor(d) { var $$ = this; return $$.config.area_linearGradient ? "url(#" + $$.state.datetimeId + "-areaGradient" + $$.getTargetSelectorSuffix(d.id) + ")" : $$.color(d); }, /** * Generate/Update elements * @param {number} durationForExit Transition duration for exit elements * @param {boolean} isSub Subchart draw * @private */ updateArea: function updateArea(durationForExit, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, config = $$.config, state = $$.state, $el = $$.$el, $root = isSub ? $el.subchart : $el; config.area_linearGradient && $$.updateAreaGradient(); var area = $root.main.selectAll("." + config_classes.areas).selectAll("." + config_classes.area).data($$.lineData.bind($$)); area.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $root.area = area.enter().append("path").attr("class", $$.getClass("area", !0)).style("fill", $$.updateAreaColor.bind($$)).style("opacity", function () { return state.orgAreaOpacity = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).style("opacity"), "0"; }).merge(area), area.style("opacity", state.orgAreaOpacity); }, /** * Redraw function * @param {Function} drawFn Retuned functino from .generateDrawCandlestick() * @param {boolean} withTransition With or without transition * @param {boolean} isSub Subchart draw * @returns {Array} */ redrawArea: function redrawArea(drawFn, withTransition, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, _ref = isSub ? this.$el.subchart : this.$el, area = _ref.area, orgAreaOpacity = $$.state.orgAreaOpacity; return [(withTransition ? area.transition(getRandom()) : area).attr("d", drawFn).style("fill", $$.updateAreaColor.bind($$)).style("opacity", function (d) { return ($$.isAreaRangeType(d) ? orgAreaOpacity / 1.75 : orgAreaOpacity) + ""; })]; }, /** * Generate area path data * @param {object} areaIndices Indices * @param {boolean} isSub Weather is sub axis * @returns {Function} * @private */ generateDrawArea: function generateDrawArea(areaIndices, isSub) { var $$ = this, config = $$.config, lineConnectNull = config.line_connectNull, isRotated = config.axis_rotated, getPoints = $$.generateGetAreaPoints(areaIndices, isSub), yScale = $$.getYScaleById.bind($$), xValue = function (d) { return (isSub ? $$.subxx : $$.xx).call($$, d); }, value0 = function (d, i) { return $$.isGrouped(d.id) ? getPoints(d, i)[0][1] : yScale(d.id, isSub)($$.isAreaRangeType(d) ? $$.getRangedData(d, "high") : $$.getShapeYMin(d.id)); }, value1 = function (d, i) { return $$.isGrouped(d.id) ? getPoints(d, i)[1][1] : yScale(d.id, isSub)($$.isAreaRangeType(d) ? $$.getRangedData(d, "low") : d.value); }; return function (d) { var path, values = lineConnectNull ? $$.filterRemoveNull(d.values) : d.values, x0 = 0, y0 = 0; if ($$.isAreaType(d)) { var area = (0,external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.area)(); area = isRotated ? area.y(xValue).x0(value0).x1(value1) : area.x(xValue) // @ts-ignore .y0(config.area_above ? 0 : value0).y1(value1), lineConnectNull || (area = area.defined(function (d) { return $$.getBaseValue(d) !== null; })), $$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = area.curve($$.getCurve(d))(values); } else values[0] && (x0 = $$.scale.x(values[0].x), y0 = $$.getYScaleById(d.id)(values[0].value)), path = isRotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0; return path || "M 0 0"; }; }, generateGetAreaPoints: function generateGetAreaPoints(areaIndices, isSub) { // partial duplication of generateGetBarPoints var $$ = this, config = $$.config, x = $$.getShapeX(0, areaIndices, isSub), y = $$.getShapeY(!!isSub), areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, isSub), yScale = $$.getYScaleById.bind($$); return function (d, i) { var y0 = yScale.call($$, d.id, isSub)($$.getShapeYMin(d.id)), offset = areaOffset(d, i) || y0, posX = x(d), posY = y(d); // 1 point that marks the area position return config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), [[posX, offset], [posX, posY - (y0 - offset)], [posX, posY - (y0 - offset)], // needed for compatibility [posX, offset] // needed for compatibility ]; }; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/bar.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var bar = ({ initBar: function initBar() { var $el = this.$el; $el.bar = $el.main.select("." + config_classes.chart) // should positioned at the beginning of the shape node to not overlap others .insert("g", ":first-child").attr("class", config_classes.chartBars); }, updateTargetsForBar: function updateTargetsForBar(targets) { var $$ = this, config = $$.config, $el = $$.$el, classChartBar = $$.getChartClass("Bar"), classBars = $$.getClass("bars", !0), classFocus = $$.classFocus.bind($$), isSelectable = config.interaction_enabled && config.data_selection_isselectable; $el.bar || $$.initBar(); var mainBarUpdate = $$.$el.main.select("." + config_classes.chartBars).selectAll("." + config_classes.chartBar).data(targets).attr("class", function (d) { return classChartBar(d) + classFocus(d); }), mainBarEnter = mainBarUpdate.enter().append("g").attr("class", classChartBar).style("opacity", "0").style("pointer-events", "none"); // Bars for each data mainBarEnter.append("g").attr("class", classBars).style("cursor", function (d) { return isSelectable && isSelectable.bind($$.api)(d) ? "pointer" : null; }); }, /** * Generate/Update elements * @param {number} durationForExit Transition duration for exit elements * @param {boolean} isSub Subchart draw * @private */ updateBar: function updateBar(durationForExit, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, $root = isSub ? $$.$el.subchart : $$.$el, classBar = $$.getClass("bar", !0), initialOpacity = $$.initialOpacity.bind($$), bar = $root.main.selectAll("." + config_classes.bars).selectAll("." + config_classes.bar).data($$.labelishData.bind($$)); bar.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $root.bar = bar.enter().append("path").attr("class", classBar).style("fill", $$.color).merge(bar).style("opacity", initialOpacity); }, /** * Redraw function * @param {Function} drawFn Retuned functino from .generateDrawCandlestick() * @param {boolean} withTransition With or without transition * @param {boolean} isSub Subchart draw * @returns {Array} */ redrawBar: function redrawBar(drawFn, withTransition, isSub) { isSub === void 0 && (isSub = !1); var _ref = isSub ? this.$el.subchart : this.$el, bar = _ref.bar; return [(withTransition ? bar.transition(getRandom()) : bar).attr("d", drawFn).style("fill", this.color).style("opacity", "1")]; }, getBars: function getBars(i, id) { var $$ = this, main = $$.$el.main, suffix = isValue(i) ? "-" + i : ""; return (id ? main.selectAll("." + config_classes.bars + $$.getTargetSelectorSuffix(id)) : main).selectAll("." + config_classes.bar + suffix); }, expandBars: function expandBars(i, id, reset) { var $$ = this; reset && $$.unexpandBars(), $$.getBars(i, id).classed(config_classes.EXPANDED, !0); }, unexpandBars: function unexpandBars(i) { this.getBars(i).classed(config_classes.EXPANDED, !1); }, generateDrawBar: function generateDrawBar(barIndices, isSub) { var $$ = this, config = $$.config, getPoints = $$.generateGetBarPoints(barIndices, isSub), isRotated = config.axis_rotated, isGrouped = config.data_groups.length, barRadius = config.bar_radius, barRadiusRatio = config.bar_radius_ratio, getRadius = isNumber(barRadius) && barRadius > 0 ? function () { return barRadius; } : isNumber(barRadiusRatio) ? function (w) { return w * barRadiusRatio; } : null; return function (d, i) { // 4 points that make a bar var points = getPoints(d, i), indexX = +isRotated, indexY = +!indexX, isNegative = d.value < 0, pathRadius = ["", ""], radius = 0; // switch points if axis is rotated, not applicable for sub chart if (getRadius && !isGrouped) { var index = isRotated ? indexY : indexX, barW = points[2][index] - points[0][index]; radius = getRadius(barW); var arc = "a" + radius + "," + radius + " " + (isNegative ? "1 0 0" : "0 0 1") + " "; pathRadius[+!isRotated] = "" + arc + radius + "," + radius, pathRadius[+isRotated] = "" + arc + [-radius, radius][isRotated ? "sort" : "reverse"](), isNegative && pathRadius.reverse(); } // path string data shouldn't be containing new line chars // https://github.com/naver/billboard.js/issues/530 var path = isRotated ? "H" + (points[1][indexX] - radius) + " " + pathRadius[0] + "V" + (points[2][indexY] - radius) + " " + pathRadius[1] + "H" + points[3][indexX] : "V" + (points[1][indexY] + (isNegative ? -radius : radius)) + " " + pathRadius[0] + "H" + (points[2][indexX] - radius) + " " + pathRadius[1] + "V" + points[3][indexY]; return "M" + points[0][indexX] + "," + points[0][indexY] + path + "z"; }; }, generateGetBarPoints: function generateGetBarPoints(barIndices, isSub) { var $$ = this, config = $$.config, axis = isSub ? $$.axis.subX : $$.axis.x, barTargetsNum = $$.getIndicesMax(barIndices) + 1, barW = $$.getBarW("bar", axis, barTargetsNum), barX = $$.getShapeX(barW, barIndices, !!isSub), barY = $$.getShapeY(!!isSub), barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub), yScale = $$.getYScaleById.bind($$); return function (d, i) { var y0 = yScale.call($$, d.id, isSub)($$.getShapeYMin(d.id)), offset = barOffset(d, i) || y0, width = isNumber(barW) ? barW : barW[d.id] || barW._$width, posX = barX(d), posY = barY(d); config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0), posY -= y0 - offset; var startPosX = posX + width; // 4 points that make a bar return [[posX, offset], [posX, posY], [startPosX, posY], [startPosX, offset]]; }; }, isWithinBar: function isWithinBar(that) { var mouse = getPointer(this.state.event, that), list = getRectSegList(that), _list = list, seg0 = _list[0], seg1 = _list[1], x = Math.min(seg0.x, seg1.x), y = Math.min(seg0.y, seg1.y), offset = this.config.bar_sensitivity, _that$getBBox = that.getBBox(), width = _that$getBBox.width, height = _that$getBBox.height, isWithin = x - offset < mouse[0] && mouse[0] < x + width + offset && y - offset < mouse[1] && mouse[1] < y + height + offset; return isWithin; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/candlestick.ts function candlestick_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function candlestick_objectSpread(target) { for (var source, i = 1; i < arguments.length; i++) source = arguments[i] == null ? {} : arguments[i], i % 2 ? candlestick_ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : candlestick_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); return target; } /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var candlestick = ({ initCandlestick: function initCandlestick() { var $el = this.$el; $el.candlestick = $el.main.select("." + config_classes.chart) // should positioned at the beginning of the shape node to not overlap others .append("g").attr("class", config_classes.chartCandlesticks); }, /** * Update targets by its data * called from: ChartInternal.updateTargets() * @param {Array} targets Filtered target by type * @private */ updateTargetsForCandlestick: function updateTargetsForCandlestick(targets) { var $$ = this, $el = $$.$el, classChart = $$.getChartClass("Candlestick"), classFocus = $$.classFocus.bind($$); $el.candlestick || $$.initCandlestick(); var mainUpdate = $$.$el.main.select("." + config_classes.chartCandlesticks).selectAll("." + config_classes.chartCandlestick).data(targets).attr("class", function (d) { return classChart(d) + classFocus(d); }); mainUpdate.enter().append("g").attr("class", classChart).style("pointer-events", "none"); }, /** * Generate/Update elements * @param {number} durationForExit Transition duration for exit elements * @param {boolean} isSub Subchart draw * @private */ updateCandlestick: function updateCandlestick(durationForExit, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, $el = $$.$el, $root = isSub ? $el.subchart : $el, classSetter = $$.getClass("candlestick", !0), initialOpacity = $$.initialOpacity.bind($$), candlestick = $root.main.selectAll("." + config_classes.chartCandlestick).selectAll("." + config_classes.candlestick).data($$.labelishData.bind($$)); candlestick.exit().transition().duration(durationForExit).style("opacity", "0").remove(); var candlestickEnter = candlestick.enter().filter(function (d) { return d.value; }).append("g").attr("class", classSetter); candlestickEnter.append("line"), candlestickEnter.append("path"), $root.candlestick || ($root.candlestick = {}), $root.candlestick = candlestick.merge(candlestickEnter).style("opacity", initialOpacity); }, /** * Get draw function * @param {object} indices Indice data * @param {boolean} isSub Subchart draw * @returns {Function} * @private */ generateDrawCandlestick: function generateDrawCandlestick(indices, isSub) { var $$ = this, config = $$.config, getPoints = $$.generateGetCandlestickPoints(indices, isSub), isRotated = config.axis_rotated, downColor = config.candlestick_color_down; return function (d, i, g) { var _value, points = getPoints(d, i), value = $$.getCandlestickData(d), isUp = (_value = value) == null ? void 0 : _value._isUp, indexX = +isRotated; g.classed && g.classed(config_classes[isUp ? "valueUp" : "valueDown"], !0); var path = isRotated ? "H" + points[1][1] + " V" + points[1][0] + " H" + points[0][1] : "V" + points[1][1] + " H" + points[1][0] + " V" + points[0][1]; g.select("path").attr("d", "M" + points[0][indexX] + "," + points[0][+!indexX] + path + "z").style("fill", function (d) { var color = isUp ? $$.color(d) : isObject(downColor) ? downColor[d.id] : downColor; return color || $$.color(d); }); // set line position var line = g.select("line"), pos = isRotated ? { x1: points[2][1], x2: points[2][2], y1: points[2][0], y2: points[2][0] } : { x1: points[2][0], x2: points[2][0], y1: points[2][1], y2: points[2][2] }; for (var x in pos) line.attr(x, pos[x]); }; }, /** * Generate shape drawing points * @param {object} indices Indice data * @param {boolean} isSub Subchart draw * @returns {Function} */ generateGetCandlestickPoints: function generateGetCandlestickPoints(indices, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, config = $$.config, axis = isSub ? $$.axis.subX : $$.axis.x, targetsNum = $$.getIndicesMax(indices) + 1, barW = $$.getBarW("candlestick", axis, targetsNum), x = $$.getShapeX(barW, indices, !!isSub), y = $$.getShapeY(!!isSub), shapeOffset = $$.getShapeOffset($$.isBarType, indices, !!isSub), yScale = $$.getYScaleById.bind($$); return function (d, i) { var points, y0 = yScale.call($$, d.id, isSub)($$.getShapeYMin(d.id)), offset = shapeOffset(d, i) || y0, width = isNumber(barW) ? barW : barW[d.id] || barW._$width, value = $$.getCandlestickData(d); if (value) { var posX = { start: x(d), end: 0 }; posX.end = posX.start + width; var posY = { start: y(value.open), end: y(value.close) }, posLine = { x: posX.start + width / 2, high: y(value.high), low: y(value.low) }; config.axis_rotated && (d.value > 0 && posY.start < y0 || d.value < 0 && y0 < posY.start) && (posY.start = y0), posY.start -= y0 - offset, points = [[posX.start, posY.start], [posX.end, posY.end], [posLine.x, posLine.low, posLine.high]]; } else points = [[0, 0], [0, 0], [0, 0, 0]]; return points; }; }, /** * Redraw function * @param {Function} drawFn Retuned functino from .generateDrawCandlestick() * @param {boolean} withTransition With or without transition * @param {boolean} isSub Subchart draw * @returns {Array} */ redrawCandlestick: function redrawCandlestick(drawFn, withTransition, isSub) { isSub === void 0 && (isSub = !1); var _ref = isSub ? this.$el.subchart : this.$el, candlestick = _ref.candlestick, rand = getRandom(!0); return [candlestick.each(function (d, i) { var g = withTransition ? (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).transition(rand) : (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this); drawFn(d, i, g); }).style("opacity", "1")]; }, /** * Get candlestick data as object * @param {object} param Data object * @param {Array|object} param.value Data value * @returns {object|null} Converted data object * @private */ getCandlestickData: function getCandlestickData(_ref2) { var d, value = _ref2.value; if (isArray(value)) { var open = value[0], high = value[1], low = value[2], close = value[3], _value$ = value[4], volume = _value$ !== void 0 && _value$; d = { open: open, high: high, low: low, close: close }, volume !== !1 && (d.volume = volume); } else isObject(value) && (d = candlestick_objectSpread({}, value)); return d && (d._isUp = d.close >= d.open), d || null; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/gauge.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var gauge = ({ initGauge: function initGauge() { var $$ = this, config = $$.config, arcs = $$.$el.arcs, appendText = function (className) { arcs.append("text").attr("class", className).style("text-anchor", "middle").style("pointer-events", "none"); }; if ($$.hasType("gauge")) { var hasMulti = $$.hasMultiArcGauge(); arcs.append(hasMulti ? "g" : "path").attr("class", config_classes.chartArcsBackground).style("fill", !hasMulti && config.gauge_background || null), config.gauge_units && appendText(config_classes.chartArcsGaugeUnit), config.gauge_label_show && (appendText(config_classes.chartArcsGaugeMin), !config.gauge_fullCircle && appendText(config_classes.chartArcsGaugeMax)); } }, updateGaugeMax: function updateGaugeMax() { var $$ = this, config = $$.config, state = $$.state, hasMultiGauge = $$.hasMultiArcGauge(), max = hasMultiGauge ? $$.getMinMaxData().max[0].value : $$.getTotalDataSum(state.rendered); max > config.gauge_max && (config.gauge_max = max); }, redrawMultiArcGauge: function redrawMultiArcGauge() { var $$ = this, config = $$.config, state = $$.state, $el = $$.$el, hiddenTargetIds = $$.state.hiddenTargetIds, arcLabelLines = $el.main.selectAll("." + config_classes.arcs).selectAll("." + config_classes.arcLabelLine).data($$.arcData.bind($$)), mainArcLabelLine = arcLabelLines.enter().append("rect").attr("class", function (d) { return config_classes.arcLabelLine + " " + config_classes.target + " " + config_classes.target + "-" + d.data.id; }).merge(arcLabelLines); mainArcLabelLine.style("fill", function (d) { return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data); }).style("display", config.gauge_label_show ? "" : "none").each(function (d) { var lineLength = 0, lineThickness = 2, x = 0, y = 0, transform = ""; if (hiddenTargetIds.indexOf(d.data.id) < 0) { var updated = $$.updateAngle(d), innerLineLength = state.gaugeArcWidth / $$.filterTargetsToShow($$.data.targets).length * (updated.index + 1), lineAngle = updated.endAngle - Math.PI / 2, arcInnerRadius = state.radius - innerLineLength, linePositioningAngle = lineAngle - (arcInnerRadius === 0 ? 0 : 1 / arcInnerRadius); lineLength = state.radiusExpanded - state.radius + innerLineLength, x = Math.cos(linePositioningAngle) * arcInnerRadius, y = Math.sin(linePositioningAngle) * arcInnerRadius, transform = "rotate(" + lineAngle * 180 / Math.PI + ", " + x + ", " + y + ")"; } (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).attr("x", x).attr("y", y).attr("width", lineLength).attr("height", lineThickness).attr("transform", transform).style("stroke-dasharray", "0, " + (lineLength + lineThickness) + ", 0"); }); }, textForGaugeMinMax: function textForGaugeMinMax(value, isMax) { var $$ = this, config = $$.config, format = config.gauge_label_extents; return isFunction(format) ? format.bind($$.api)(value, isMax) : value; }, getGaugeLabelHeight: function getGaugeLabelHeight() { var config = this.config; return this.config.gauge_label_show && !config.gauge_fullCircle ? 20 : 0; }, getPaddingBottomForGauge: function getPaddingBottomForGauge() { var $$ = this; return $$.getGaugeLabelHeight() * ($$.config.gauge_label_show ? 2 : 2.5); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/bubble.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var bubble = ({ /** * Initializer * @private */ initBubble: function initBubble() { var $$ = this, config = $$.config; $$.hasType("bubble") && (config.point_show = !0, config.point_type = "circle", config.point_sensitivity = 25); }, /** * Get user agent's computed value * @returns {number} * @private */ getBaseLength: function getBaseLength() { var $$ = this, _$$$state = $$.state, width = _$$$state.width, height = _$$$state.height, cacheKey = KEY.bubbleBaseLength, baseLength = $$.cache.get(cacheKey); return baseLength || $$.cache.add(cacheKey, baseLength = getMinMax("min", [width, height])), baseLength; }, /** * Get the radius value for bubble circle * @param {object} d Data object * @returns {number} * @private */ getBubbleR: function getBubbleR(d) { var $$ = this, maxR = $$.config.bubble_maxR; isFunction(maxR) ? maxR = maxR.bind($$.api)(d) : !isNumber(maxR) && (maxR = $$.getBaseLength() / ($$.getMaxDataCount() * 2) + 12); var max = getMinMax("max", $$.getMinMaxData().max.map(function (d) { return $$.isBubbleZType(d) ? $$.getBubbleZData(d.value, "y") : isObject(d.value) ? d.value.mid : d.value; })), maxArea = maxR * maxR * Math.PI, area = ($$.isBubbleZType(d) ? $$.getBubbleZData(d.value, "z") : d.value) * (maxArea / max); return Math.sqrt(area / Math.PI); }, /** * Get bubble dimension data * @param {object|Array} d data value * @param {string} type - y or z * @returns {number} * @private */ getBubbleZData: function getBubbleZData(d, type) { return isObject(d) ? d[type] : d[type === "y" ? 0 : 1]; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/line.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var line = ({ initLine: function initLine() { var $el = this.$el; $el.line = $el.main.select("." + config_classes.chart).append("g").attr("class", config_classes.chartLines); }, updateTargetsForLine: function updateTargetsForLine(t) { var $$ = this, _$$$$el = $$.$el, area = _$$$$el.area, line = _$$$$el.line, main = _$$$$el.main, classChartLine = $$.getChartClass("Line"), classLines = $$.getClass("lines", !0), classFocus = $$.classFocus.bind($$); line || $$.initLine(); var targets = t.filter(function (d) { return !($$.isScatterType(d) || $$.isBubbleType(d)); }), mainLineUpdate = main.select("." + config_classes.chartLines).selectAll("." + config_classes.chartLine).data(targets).attr("class", function (d) { return classChartLine(d) + classFocus(d); }), mainLineEnter = mainLineUpdate.enter().append("g").attr("class", classChartLine).style("opacity", "0").style("pointer-events", "none"); // Lines for each data mainLineEnter.append("g").attr("class", classLines), $$.hasTypeOf("Area") && $$.initArea(!area && mainLineEnter.empty() ? mainLineUpdate : mainLineEnter), $$.updateTargetForCircle(targets, mainLineEnter); }, /** * Generate/Update elements * @param {number} durationForExit Transition duration for exit elements * @param {boolean} isSub Subchart draw * @private */ updateLine: function updateLine(durationForExit, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, extraLineClasses = $$.format.extraLineClasses, $el = $$.$el, $root = isSub ? $el.subchart : $el, line = $root.main.selectAll("." + config_classes.lines).selectAll("." + config_classes.line).data($$.lineData.bind($$)); line.exit().transition().duration(durationForExit).style("opacity", "0").remove(), $root.line = line.enter().append("path").attr("class", function (d) { return $$.getClass("line", !0)(d) + " " + (extraLineClasses(d) || ""); }).style("stroke", $$.color).merge(line).style("opacity", $$.initialOpacity.bind($$)).style("shape-rendering", function (d) { return $$.isStepType(d) ? "crispEdges" : ""; }).attr("transform", null); }, /** * Redraw function * @param {Function} drawFn Retuned functino from .generateDrawCandlestick() * @param {boolean} withTransition With or without transition * @param {boolean} isSub Subchart draw * @returns {Array} */ redrawLine: function redrawLine(drawFn, withTransition, isSub) { isSub === void 0 && (isSub = !1); var _ref = isSub ? this.$el.subchart : this.$el, line = _ref.line; return [(withTransition ? line.transition(getRandom()) : line).attr("d", drawFn).style("stroke", this.color).style("opacity", "1")]; }, /** * Get the curve interpolate * @param {Array} d Data object * @returns {Function} * @private */ getCurve: function getCurve(d) { var $$ = this, isRotatedStepType = $$.config.axis_rotated && $$.isStepType(d); // when is step & rotated, should be computed in different way // https://github.com/naver/billboard.js/issues/471 return isRotatedStepType ? function (context) { var step = $$.getInterpolate(d)(context); // keep the original method return step.orgPoint = step.point, step.pointRotated = function (x, y) { this._point === 1 && (this._point = 2); var y1 = this._y * (1 - this._t) + y * this._t; this._context.lineTo(this._x, y1), this._context.lineTo(x, y1), this._x = x, this._y = y; }, step.point = function (x, y) { this._point === 0 ? this.orgPoint(x, y) : this.pointRotated(x, y); }, step; } : $$.getInterpolate(d); }, generateDrawLine: function generateDrawLine(lineIndices, isSub) { var $$ = this, config = $$.config, scale = $$.scale, lineConnectNull = config.line_connectNull, isRotated = config.axis_rotated, getPoints = $$.generateGetLinePoints(lineIndices, isSub), yScale = $$.getYScaleById.bind($$), xValue = function (d) { return (isSub ? $$.subxx : $$.xx).call($$, d); }, yValue = function (d, i) { return $$.isGrouped(d.id) ? getPoints(d, i)[0][1] : yScale(d.id, isSub)($$.getBaseValue(d)); }, line = (0,external_commonjs_d3_shape_commonjs2_d3_shape_amd_d3_shape_root_d3_.line)(); line = isRotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue), lineConnectNull || (line = line.defined(function (d) { return $$.getBaseValue(d) !== null; })); var x = isSub ? scale.subX : scale.x; return function (d) { var path, y = yScale(d.id, isSub), values = lineConnectNull ? $$.filterRemoveNull(d.values) : d.values, x0 = 0, y0 = 0; if ($$.isLineType(d)) { var regions = config.data_regions[d.id]; regions ? path = $$.lineWithRegions(values, x, y, regions) : ($$.isStepType(d) && (values = $$.convertValuesToStep(values)), path = line.curve($$.getCurve(d))(values)); } else values[0] && (x0 = x(values[0].x), y0 = y(values[0].value)), path = isRotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0; return path || "M 0 0"; }; }, lineWithRegions: function lineWithRegions(d, x, y, _regions) { var xp, yp, diff, diffx2, $$ = this, config = $$.config, isRotated = config.axis_rotated, isTimeSeries = $$.axis.isTimeSeries(), xOffset = $$.axis.isCategorized() ? .5 : 0, regions = [], dasharray = "2 2", isWithinRegions = function (withinX, withinRegions) { for (var reg, i = 0; reg = withinRegions[i]; i++) if (reg.start < withinX && withinX <= reg.end) return reg.style; return !1; }; // Check start/end of regions if (isDefined(_regions)) { var getValue = function (v, def) { return isUndefined(v) ? def : isTimeSeries ? parseDate.call($$, v) : v; }; for (var reg, i = 0; reg = _regions[i]; i++) { var start = getValue(reg.start, d[0].x), end = getValue(reg.end, d[d.length - 1].x), style = reg.style || { dasharray: dasharray }; regions[i] = { start: start, end: end, style: style }; } } // Set scales var xValue = isRotated ? function (dt) { return y(dt.value); } : function (dt) { return x(dt.x); }, yValue = isRotated ? function (dt) { return x(dt.x); } : function (dt) { return y(dt.value); }, generateM = function (points) { return "M" + points[0][0] + "," + points[0][1] + "L" + points[1][0] + "," + points[1][1]; }, sWithRegion = isTimeSeries ? function (d0, d1, k, timeseriesDiff) { var x0 = d0.x.getTime(), xDiff = d1.x - d0.x, xv0 = new Date(x0 + xDiff * k), xv1 = new Date(x0 + xDiff * (k + timeseriesDiff)), points = isRotated ? [[y(yp(k)), x(xv0)], [y(yp(k + diff)), x(xv1)]] : [[x(xv0), y(yp(k))], [x(xv1), y(yp(k + diff))]]; return generateM(points); } : function (d0, d1, k, otherDiff) { var points = isRotated ? [[y(yp(k), !0), x(xp(k))], [y(yp(k + otherDiff), !0), x(xp(k + otherDiff))]] : [[x(xp(k), !0), y(yp(k))], [x(xp(k + otherDiff), !0), y(yp(k + otherDiff))]]; return generateM(points); }, axisType = { x: $$.axis.getAxisType("x"), y: $$.axis.getAxisType("y") }, path = ""; for (var data, _i = 0; data = d[_i]; _i++) { var prevData = d[_i - 1], hasPrevData = prevData && isValue(prevData.value), style = isWithinRegions(data.x, regions); // https://github.com/naver/billboard.js/issues/1172 if (isValue(data.value)) // Draw as normal if (isUndefined(regions) || !style || !hasPrevData) path += "" + (_i && hasPrevData ? "L" : "M") + xValue(data) + "," + yValue(data);else if (hasPrevData) { try { style = style.dasharray.split(" "); } catch (e) { style = dasharray.split(" "); } // Draw with region // TODO: Fix for horizotal charts xp = getScale(axisType.x, prevData.x + xOffset, data.x + xOffset), yp = getScale(axisType.y, prevData.value, data.value); var dx = x(data.x) - x(prevData.x), dy = y(data.value) - y(prevData.value), dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)); diff = style[0] / dd, diffx2 = diff * style[1]; for (var _j = diff; _j <= 1; _j += diffx2) path += sWithRegion(prevData, data, _j, diff), _j + diffx2 >= 1 && (path += sWithRegion(prevData, data, 1, 0)); } } return path; }, isWithinStep: function isWithinStep(that, y) { return Math.abs(y - getPointer(this.state.event, that)[1]) < 30; }, shouldDrawPointsForLine: function shouldDrawPointsForLine(d) { var linePoint = this.config.line_point; return linePoint === !0 || isArray(linePoint) && linePoint.indexOf(d.id) !== -1; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/point.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ var getTransitionName = function () { return getRandom(); }; /* harmony default export */ var point = ({ hasValidPointType: function hasValidPointType(type) { return /^(circle|rect(angle)?|polygon|ellipse|use)$/i.test(type || this.config.point_type); }, hasValidPointDrawMethods: function hasValidPointDrawMethods(type) { var pointType = type || this.config.point_type; return isObjectType(pointType) && isFunction(pointType.create) && isFunction(pointType.update); }, initialOpacityForCircle: function initialOpacityForCircle(d) { var config = this.config, withoutFadeIn = this.state.withoutFadeIn, opacity = config.point_opacity; return isUndefined(opacity) && (opacity = this.getBaseValue(d) !== null && withoutFadeIn[d.id] ? this.opacityForCircle(d) : "0"), opacity; }, opacityForCircle: function opacityForCircle(d) { var config = this.config, opacity = config.point_opacity; return isUndefined(opacity) && (opacity = config.point_show && !config.point_focus_only ? "1" : "0", opacity = isValue(this.getBaseValue(d)) ? this.isBubbleType(d) || this.isScatterType(d) ? "0.5" : opacity : "0"), opacity; }, initCircle: function initCircle() { var $$ = this, main = $$.$el.main; $$.point = $$.generatePoint(), ($$.hasType("bubble") || $$.hasType("scatter")) && main.select("." + config_classes.chartCircles).empty() && main.select("." + config_classes.chart).append("g").attr("class", config_classes.chartCircles); }, updateTargetForCircle: function updateTargetForCircle(targetsValue, enterNodeValue) { var _this = this, $$ = this, config = $$.config, data = $$.data, $el = $$.$el, selectionEnabled = config.interaction_enabled && config.data_selection_enabled, isSelectable = selectionEnabled && config.data_selection_isselectable, classCircles = $$.getClass("circles", !0); if (config.point_show) { $el.circle || $$.initCircle(); var targets = targetsValue, enterNode = enterNodeValue; // only for scatter & bubble type should generate seprate <g> node if (!targets) { targets = data.targets.filter(function (d) { return _this.isScatterType(d) || _this.isBubbleType(d); }); var mainCircle = $el.main.select("." + config_classes.chartCircles).style("pointer-events", "none").selectAll("." + config_classes.circles).data(targets).attr("class", classCircles); mainCircle.exit().remove(), enterNode = mainCircle.enter(); } // Circles for each data point on lines selectionEnabled && enterNode.append("g").attr("class", function (d) { return $$.generateClass(config_classes.selectedCircles, d.id); }), enterNode.append("g").attr("class", classCircles).style("cursor", function (d) { return isSelectable && isSelectable(d) ? "pointer" : null; }), selectionEnabled && targets.forEach(function (t) { $el.main.selectAll("." + config_classes.selectedCircles + $$.getTargetSelectorSuffix(t.id)).selectAll("" + config_classes.selectedCircle).each(function (d) { d.value = t.values[d.index].value; }); }); } }, updateCircle: function updateCircle(isSub) { isSub === void 0 && (isSub = !1); var $$ = this, config = $$.config, state = $$.state, $el = $$.$el, focusOnly = config.point_focus_only, $root = isSub ? $el.subchart : $el; if (config.point_show && !state.toggling) { var circles = $root.main.selectAll("." + config_classes.circles).selectAll("." + config_classes.circle).data(function (d) { return $$.isLineType(d) && $$.shouldDrawPointsForLine(d) || $$.isBubbleType(d) || $$.isRadarType(d) || $$.isScatterType(d) ? focusOnly ? [d.values[0]] : d.values : []; }); circles.exit().remove(), circles.enter().filter(Boolean).append($$.point("create", this, $$.pointR.bind($$), $$.color)), $root.circle = $root.main.selectAll("." + config_classes.circles + " ." + config_classes.circle).style("stroke", $$.color).style("opacity", $$.initialOpacityForCircle.bind($$)); } }, redrawCircle: function redrawCircle(cx, cy, withTransition, flow, isSub) { isSub === void 0 && (isSub = !1); var $$ = this, rendered = $$.state.rendered, $el = $$.$el, $root = isSub ? $el.subchart : $el, selectedCircles = $root.main.selectAll("." + config_classes.selectedCircle); if (!$$.config.point_show) return []; var fn = $$.point("update", $$, cx, cy, $$.color, withTransition, flow, selectedCircles), posAttr = $$.isCirclePoint() ? "c" : "", t = getRandom(), opacityStyleFn = $$.opacityForCircle.bind($$), mainCircles = []; return $root.circle.each(function (d) { var result = fn.bind(this)(d); result = (withTransition || !rendered ? result.transition(t) : result).style("opacity", opacityStyleFn), mainCircles.push(result); }), [mainCircles, (withTransition ? selectedCircles.transition() : selectedCircles).attr(posAttr + "x", cx).attr(posAttr + "y", cy)]; }, /** * Show focused data point circle * @param {object} d Selected data * @private */ showCircleFocus: function showCircleFocus(d) { var $$ = this, config = $$.config, _$$$state = $$.state, hasRadar = _$$$state.hasRadar, resizing = _$$$state.resizing, toggling = _$$$state.toggling, transiting = _$$$state.transiting, $el = $$.$el, circle = $el.circle; if (transiting === !1 && config.point_focus_only && circle) { var cx = (hasRadar ? $$.radarCircleX : $$.circleX).bind($$), cy = (hasRadar ? $$.radarCircleY : $$.circleY).bind($$), withTransition = toggling || isUndefined(d), fn = $$.point("update", $$, cx, cy, $$.color, !resizing && withTransition); d && (circle = circle.filter(function (t) { var data = d.filter(function (v) { return v.id === t.id; }); return !!data.length && (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).datum(data[0]); })), circle.attr("class", this.updatePointClass.bind(this)).style("opacity", "1").each(function (d) { var id = d.id, index = d.index, value = d.value, visibility = "hidden"; isValue(value) && (fn.bind(this)(d), $$.expandCircles(index, id), visibility = ""), this.style.visibility = visibility; }); } }, /** * Hide focused data point circle * @private */ hideCircleFocus: function hideCircleFocus() { var $$ = this, config = $$.config, circle = $$.$el.circle; config.point_focus_only && circle && ($$.unexpandCircles(), circle.style("visibility", "hidden")); }, circleX: function circleX(d) { return this.xx(d); }, updateCircleY: function updateCircleY(isSub) { isSub === void 0 && (isSub = !1); var $$ = this, getPoints = $$.generateGetLinePoints($$.getShapeIndices($$.isLineType), isSub); return function (d, i) { var id = d.id; return $$.isGrouped(id) ? getPoints(d, i)[0][1] : $$.getYScaleById(id, isSub)($$.getBaseValue(d)); }; }, getCircles: function getCircles(i, id) { var $$ = this, suffix = isValue(i) ? "-" + i : ""; return (id ? $$.$el.main.selectAll("." + config_classes.circles + $$.getTargetSelectorSuffix(id)) : $$.$el.main).selectAll("." + config_classes.circle + suffix); }, expandCircles: function expandCircles(i, id, reset) { var $$ = this, r = $$.pointExpandedR.bind($$); reset && $$.unexpandCircles(); var circles = $$.getCircles(i, id).classed(config_classes.EXPANDED, !0), scale = r(circles) / $$.config.point_r, ratio = 1 - scale; $$.isCirclePoint() ? circles.attr("r", r) : circles.each(function () { var point = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this); if (this.tagName === "circle") point.attr("r", r);else { var _this$getBBox = this.getBBox(), width = _this$getBBox.width, height = _this$getBBox.height, x = ratio * (+point.attr("x") + width / 2), y = ratio * (+point.attr("y") + height / 2); point.attr("transform", "translate(" + x + " " + y + ") scale(" + scale + ")"); } }); }, unexpandCircles: function unexpandCircles(i) { var $$ = this, r = $$.pointR.bind($$), circles = $$.getCircles(i).filter(function () { return (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.EXPANDED); }).classed(config_classes.EXPANDED, !1); circles.attr("r", r), $$.isCirclePoint() || circles.attr("transform", "scale(" + r(circles) / $$.config.point_r + ")"); }, pointR: function (d) { var $$ = this, config = $$.config, pointR = config.point_r, r = pointR; return $$.isBubbleType(d) ? r = $$.getBubbleR(d) : isFunction(pointR) && (r = pointR.bind($$.api)(d)), r; }, pointExpandedR: function pointExpandedR(d) { var $$ = this, config = $$.config, scale = $$.isBubbleType(d) ? 1.15 : 1.75; return config.point_focus_expand_enabled ? config.point_focus_expand_r || $$.pointR(d) * scale : $$.pointR(d); }, pointSelectR: function pointSelectR(d) { var $$ = this, selectR = $$.config.point_select_r; return isFunction(selectR) ? selectR(d) : selectR || $$.pointR(d) * 4; }, isWithinCircle: function isWithinCircle(node, r) { var mouse = getPointer(this.state.event, node), element = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(node), prefix = this.isCirclePoint(node) ? "c" : "", cx = +element.attr(prefix + "x"), cy = +element.attr(prefix + "y"); // if node don't have cx/y or x/y attribute value if (!(cx || cy) && node.nodeType === 1) { var _getBoundingRect = getBoundingRect(node), x = _getBoundingRect.x, y = _getBoundingRect.y; cx = x, cy = y; } return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < (r || this.config.point_sensitivity); }, insertPointInfoDefs: function insertPointInfoDefs(point, id) { var $$ = this, copyAttr = function (from, target) { for (var name, attribs = from.attributes, i = 0; name = attribs[i]; i++) name = name.name, target.setAttribute(name, from.getAttribute(name)); }, doc = new DOMParser().parseFromString(point, "image/svg+xml"), node = doc.documentElement, clone = browser_doc.createElementNS(external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.namespaces.svg, node.nodeName.toLowerCase()); if (clone.id = id, clone.style.fill = "inherit", clone.style.stroke = "inherit", copyAttr(node, clone), node.childNodes && node.childNodes.length) { var parent = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(clone); "innerHTML" in clone ? parent.html(node.innerHTML) : toArray(node.childNodes).forEach(function (v) { copyAttr(v, parent.append(v.tagName).node()); }); } $$.$el.defs.node().appendChild(clone); }, pointFromDefs: function pointFromDefs(id) { return this.$el.defs.select("#" + id); }, updatePointClass: function updatePointClass(d) { var $$ = this, circle = $$.$el.circle, pointClass = !1; return (isObject(d) || circle) && (pointClass = d === !0 ? circle.each(function (d) { var className = $$.getClass("circle", !0)(d); this.getAttribute("class").indexOf(config_classes.EXPANDED) > -1 && (className += " " + config_classes.EXPANDED), this.setAttribute("class", className); }) : $$.getClass("circle", !0)(d)), pointClass; }, generateGetLinePoints: function generateGetLinePoints(lineIndices, isSub) { // partial duplication of generateGetBarPoints var $$ = this, config = $$.config, x = $$.getShapeX(0, lineIndices, isSub), y = $$.getShapeY(isSub), lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, isSub), yScale = $$.getYScaleById.bind($$); return function (d, i) { var y0 = yScale.call($$, d.id, isSub)($$.getShapeYMin(d.id)), offset = lineOffset(d, i) || y0, posX = x(d), posY = y(d); config.axis_rotated && (d.value > 0 && posY < y0 || d.value < 0 && y0 < posY) && (posY = y0); // 1 point that marks the line position var point = [posX, posY - (y0 - offset)]; return [point, point, // from here and below, needed for compatibility point, point]; }; }, generatePoint: function generatePoint() { var $$ = this, config = $$.config, datetimeId = $$.state.datetimeId, ids = [], pattern = notEmpty(config.point_pattern) ? config.point_pattern : [config.point_type]; return function (method, context) { for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) args[_key - 2] = arguments[_key]; return function (d) { var id = $$.getTargetSelectorSuffix(d.id || d.data && d.data.id || d), element = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this); ids.indexOf(id) < 0 && ids.push(id); var point = pattern[ids.indexOf(id) % pattern.length]; if ($$.hasValidPointType(point)) point = $$[point];else if (!$$.hasValidPointDrawMethods(point)) { var pointId = datetimeId + "-point" + id, pointFromDefs = $$.pointFromDefs(pointId); if (pointFromDefs.size() < 1 && $$.insertPointInfoDefs(point, pointId), method === "create") return $$.custom.create.bind(context).apply(void 0, [element, pointId].concat(args)); if (method === "update") return $$.custom.update.bind(context).apply(void 0, [element].concat(args)); } return point[method].bind(context).apply(void 0, [element].concat(args)); }; }; }, custom: { create: function create(element, id, sizeFn, fillStyleFn) { return element.append("use").attr("xlink:href", "#" + id).attr("class", this.updatePointClass.bind(this)).style("fill", fillStyleFn).node(); }, update: function update(element, xPosFn, yPosFn, fillStyleFn, withTransition, flow, selectedCircles) { var _element$node$getBBox = element.node().getBBox(), width = _element$node$getBBox.width, height = _element$node$getBBox.height, xPosFn2 = function (d) { return xPosFn(d) - width / 2; }, mainCircles = element; if (withTransition) { var transitionName = getTransitionName(); flow && mainCircles.attr("x", xPosFn2), mainCircles = mainCircles.transition(transitionName), selectedCircles && selectedCircles.transition(getTransitionName()); } return mainCircles.attr("x", xPosFn2).attr("y", function yPosFn2(d) { return yPosFn(d) - height / 2; }).style("fill", fillStyleFn); } }, // 'circle' data point circle: { create: function create(element, sizeFn, fillStyleFn) { return element.append("circle").attr("class", this.updatePointClass.bind(this)).attr("r", sizeFn).style("fill", fillStyleFn).node(); }, update: function update(element, xPosFn, yPosFn, fillStyleFn, withTransition, flow, selectedCircles) { var $$ = this, mainCircles = element; if ($$.hasType("bubble") && mainCircles.attr("r", $$.pointR.bind($$)), withTransition) { var transitionName = getTransitionName(); flow && mainCircles.attr("cx", xPosFn), mainCircles.attr("cx") && (mainCircles = mainCircles.transition(transitionName)), selectedCircles && selectedCircles.transition(getTransitionName()); } return mainCircles.attr("cx", xPosFn).attr("cy", yPosFn).style("fill", fillStyleFn); } }, // 'rectangle' data point rectangle: { create: function create(element, sizeFn, fillStyleFn) { var rectSizeFn = function (d) { return sizeFn(d) * 2; }; return element.append("rect").attr("class", this.updatePointClass.bind(this)).attr("width", rectSizeFn).attr("height", rectSizeFn).style("fill", fillStyleFn).node(); }, update: function update(element, xPosFn, yPosFn, fillStyleFn, withTransition, flow, selectedCircles) { var $$ = this, r = $$.config.point_r, rectXPosFn = function (d) { return xPosFn(d) - r; }, mainCircles = element; if (withTransition) { var transitionName = getTransitionName(); flow && mainCircles.attr("x", rectXPosFn), mainCircles = mainCircles.transition(transitionName), selectedCircles && selectedCircles.transition(getTransitionName()); } return mainCircles.attr("x", rectXPosFn).attr("y", function rectYPosFn(d) { return yPosFn(d) - r; }).style("fill", fillStyleFn); } } }); ;// CONCATENATED MODULE: ./src/ChartInternal/shape/radar.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Get the position value * @param {boolean} isClockwise If the direction is clockwise * @param {string} type Coordinate type 'x' or 'y' * @param {number} edge Number of edge * @param {number} pos The indexed position * @param {number} range Range value * @param {number} ratio Ratio value * @returns {number} * @private */ function getPosition(isClockwise, type, edge, pos, range, ratio) { var index = isClockwise && pos > 0 ? edge - pos : pos, r = 2 * Math.PI, func = type === "x" ? Math.sin : Math.cos; return range * (1 - ratio * func(index * r / edge)); } // cache key var cacheKey = KEY.radarPoints; /* harmony default export */ var radar = ({ initRadar: function initRadar() { var $$ = this, config = $$.config, current = $$.state.current, $el = $$.$el; $$.hasType("radar") && ($el.radar = $el.main.select("." + config_classes.chart).append("g").attr("class", config_classes.chartRadars), $el.radar.levels = $el.radar.append("g").attr("class", config_classes.levels), $el.radar.axes = $el.radar.append("g").attr("class", config_classes.axis), $el.radar.shapes = $el.radar.append("g").attr("class", config_classes.shapes), current.dataMax = config.radar_axis_max || $$.getMinMaxData().max[0].value); }, getRadarSize: function getRadarSize() { var $$ = this, config = $$.config, _$$$state = $$.state, arcWidth = _$$$state.arcWidth, arcHeight = _$$$state.arcHeight, padding = config.axis_x_categories.length < 4 ? -20 : 10, size = (Math.min(arcWidth, arcHeight) - padding) / 2; return [size, size]; }, updateTargetsForRadar: function updateTargetsForRadar(targets) { var $$ = this, config = $$.config; isEmpty(config.axis_x_categories) && (config.axis_x_categories = getRange(0, getMinMax("max", targets.map(function (v) { return v.values.length; })))), $$.generateRadarPoints(); }, getRadarPosition: function getRadarPosition(type, index, range, ratio) { var $$ = this, config = $$.config, _$$$getRadarSize = $$.getRadarSize(), width = _$$$getRadarSize[0], height = _$$$getRadarSize[1], edge = config.axis_x_categories.length, isClockwise = config.radar_direction_clockwise, pos = toArray(type).map(function (v) { return getPosition(isClockwise, v, edge, index, isDefined(range) ? range : type === "x" ? width : height, isNumber(ratio) ? ratio : config.radar_size_ratio); }); return pos.length === 1 ? pos[0] : pos; }, /** * Generate data points * @private */ generateRadarPoints: function generateRadarPoints() { var $$ = this, targets = $$.data.targets, _$$$getRadarSize2 = $$.getRadarSize(), width = _$$$getRadarSize2[0], height = _$$$getRadarSize2[1], points = $$.cache.get(cacheKey) || {}, size = points._size; size && (size.width === width || size.height === height) || (targets.forEach(function (d) { points[d.id] = d.values.map(function (v, i) { return $$.getRadarPosition(["x", "y"], i, undefined, $$.getRatio("radar", v)); }); }), points._size = { width: width, height: height }, $$.cache.add(cacheKey, points)); }, redrawRadar: function redrawRadar(durationForExit) { var $$ = this, _$$$$el = $$.$el, radar = _$$$$el.radar, main = _$$$$el.main, translate = $$.getTranslate("radar"); translate && (radar.attr("transform", translate), main.select("." + config_classes.chartTexts).attr("transform", translate), $$.generateRadarPoints(), $$.updateRadarLevel(), $$.updateRadarAxes(), $$.updateRadarShape(durationForExit)); }, generateGetRadarPoints: function generateGetRadarPoints() { var points = this.cache.get(cacheKey); return function (d, i) { var point = points[d.id][i]; return [point, point, point, point]; }; }, updateRadarLevel: function updateRadarLevel() { var $$ = this, config = $$.config, state = $$.state, radar = $$.$el.radar, _$$$getRadarSize3 = $$.getRadarSize(), width = _$$$getRadarSize3[0], height = _$$$getRadarSize3[1], depth = config.radar_level_depth, edge = config.axis_x_categories.length, showText = config.radar_level_text_show, radarLevels = radar.levels, levelData = getRange(0, depth), radius = config.radar_size_ratio * Math.min(width, height), levelRatio = levelData.map(function (l) { return radius * ((l + 1) / depth); }), levelTextFormat = (config.radar_level_text_format || function () {}).bind($$.api), points = levelData.map(function (v) { var range = levelRatio[v], pos = getRange(0, edge).map(function (i) { return $$.getRadarPosition(["x", "y"], i, range, 1).join(","); }); return pos.join(" "); }), level = radarLevels.selectAll("." + config_classes.level).data(levelData); level.exit().remove(); var levelEnter = level.enter().append("g").attr("class", function (d, i) { return config_classes.level + " " + config_classes.level + "-" + i; }); levelEnter.append("polygon").style("visibility", config.radar_level_show ? null : "hidden"), showText && (radarLevels.select("text").empty() && radarLevels.append("text").attr("dx", "-.5em").attr("dy", "-.7em").style("text-anchor", "end").text(function () { return levelTextFormat(0); }), levelEnter.append("text").attr("dx", "-.5em").style("text-anchor", "end").text(function (d) { return levelTextFormat(state.current.dataMax / levelData.length * (d + 1)); })), levelEnter.merge(level).attr("transform", function (d) { return "translate(" + (width - levelRatio[d]) + ", " + (height - levelRatio[d]) + ")"; }).selectAll("polygon").attr("points", function (d) { return points[d]; }), showText && radarLevels.selectAll("text").attr("x", function (d) { return isUndefined(d) ? width : points[d].split(",")[0]; }).attr("y", function (d) { return isUndefined(d) ? height : 0; }); }, updateRadarAxes: function updateRadarAxes() { var $$ = this, config = $$.config, radar = $$.$el.radar, _$$$getRadarSize4 = $$.getRadarSize(), width = _$$$getRadarSize4[0], height = _$$$getRadarSize4[1], categories = config.axis_x_categories, axis = radar.axes.selectAll("g").data(categories); axis.exit().remove(); var axisEnter = axis.enter().append("g").attr("class", function (d, i) { return config_classes.axis + "-" + i; }); // axis text if (config.radar_axis_line_show && axisEnter.append("line"), config.radar_axis_text_show && axisEnter.append("text"), axis = axisEnter.merge(axis), config.radar_axis_line_show && axis.select("line").attr("x1", width).attr("y1", height).attr("x2", function (d, i) { return $$.getRadarPosition("x", i); }).attr("y2", function (d, i) { return $$.getRadarPosition("y", i); }), config.radar_axis_text_show) { var _config$radar_axis_te = config.radar_axis_text_position, _config$radar_axis_te2 = _config$radar_axis_te.x, x = _config$radar_axis_te2 === void 0 ? 0 : _config$radar_axis_te2, _config$radar_axis_te3 = _config$radar_axis_te.y, y = _config$radar_axis_te3 === void 0 ? 0 : _config$radar_axis_te3; axis.select("text").style("text-anchor", "middle").attr("dy", ".5em").call(function (selection) { selection.each(function (d) { setTextValue((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), d + "", [-.6, 1.2]); }); }).datum(function (d, i) { return { index: i }; }).attr("transform", function (d) { isUndefined(this.width) && (this.width = this.getBoundingClientRect().width / 2); var posX = $$.getRadarPosition("x", d.index, undefined, 1), posY = Math.round($$.getRadarPosition("y", d.index, undefined, 1)); return posX > width ? posX += this.width + x : Math.round(posX) < width && (posX -= this.width + x), posY > height ? (posY / 2 === height && this.firstChild.tagName === "tspan" && this.firstChild.setAttribute("dy", "0em"), posY += y) : posY < height && (posY -= y), "translate(" + posX + " " + posY + ")"; }); } $$.bindEvent(); }, bindEvent: function bindEvent() { var $$ = this, config = $$.config, state = $$.state, _$$$$el2 = $$.$el, radar = _$$$$el2.radar, svg = _$$$$el2.svg, focusOnly = config.point_focus_only, _state = state, inputType = _state.inputType, transiting = _state.transiting; if (config.interaction_enabled) { var isMouse = inputType === "mouse", getIndex = function (event) { var target = event.target; // in case of multilined axis text /tspan/i.test(target.tagName) && (target = target.parentNode); var d = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(target).datum(); return d && Object.keys(d).length === 1 ? d.index : undefined; }, hide = function (event) { var index = getIndex(event), noIndex = isUndefined(index); (isMouse || noIndex) && ($$.hideTooltip(), focusOnly ? $$.hideCircleFocus() : $$.unexpandCircles(), isMouse ? $$.setOverOut(!1, index) : noIndex && $$.callOverOutForTouch()); }; radar.axes.selectAll("text").on(isMouse ? "mouseover " : "touchstart", function (event) { if (!transiting) // skip while transiting { state.event = event; var index = getIndex(event); $$.selectRectForSingle(svg.node(), null, index), isMouse ? $$.setOverOut(!0, index) : $$.callOverOutForTouch(index); } }).on("mouseout", isMouse ? hide : null), isMouse || svg.on("touchstart", hide); } }, updateRadarShape: function updateRadarShape(durationForExit) { var $$ = this, targets = $$.data.targets.filter(function (d) { return $$.isRadarType(d); }), points = $$.cache.get(cacheKey), areas = $$.$el.radar.shapes.selectAll("polygon").data(targets), areasEnter = areas.enter().append("g").attr("class", $$.getChartClass("Radar")); areas.exit().transition().duration(durationForExit).remove(), areasEnter.append("polygon").merge(areas).style("fill", $$.color).style("stroke", $$.color).attr("points", function (d) { return points[d.id].join(" "); }), $$.updateTargetForCircle(targets, areasEnter); }, /** * Get data point x coordinate * @param {object} d Data object * @returns {number} * @private */ radarCircleX: function radarCircleX(d) { return this.cache.get(cacheKey)[d.id][d.index][0]; }, /** * Get data point y coordinate * @param {object} d Data object * @returns {number} * @private */ radarCircleY: function radarCircleY(d) { return this.cache.get(cacheKey)[d.id][d.index][1]; } }); ;// CONCATENATED MODULE: ./src/config/Options/common/point.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * point config options */ /* harmony default export */ var common_point = ({ /** * Set point options * @name point * @memberof Options * @type {object} * @property {object} point Point object * @property {boolean} [point.show=true] Whether to show each point in line. * @property {number|Function} [point.r=2.5] The radius size of each point. * - **NOTE:** Disabled for 'bubble' type * @property {boolean} [point.focus.expand.enabled=true] Whether to expand each point on focus. * @property {number} [point.focus.expand.r=point.r*1.75] The radius size of each point on focus. * - **NOTE:** For 'bubble' type, the default is `bubbleSize*1.15` * @property {boolean} [point.focus.only=false] Show point only when is focused. * @property {number|null} [point.opacity=undefined] Set point opacity value. * - **NOTE:** * - `null` will make to not set inline 'opacity' css prop. * - when no value(or undefined) is set, it defaults to set opacity value according its chart types. * @property {number} [point.sensitivity=10] The senstivity value for interaction boundary. * @property {number} [point.select.r=point.r*4] The radius size of each point on selected. * @property {string} [point.type="circle"] The type of point to be drawn * - **NOTE:** * - If chart has 'bubble' type, only circle can be used. * - For IE, non circle point expansions are not supported due to lack of transform support. * - **Available Values:** * - circle * - rectangle * @property {Array} [point.pattern=[]] The type of point or svg shape as string, to be drawn for each line * - **NOTE:** * - This is an `experimental` feature and can have some unexpected behaviors. * - If chart has 'bubble' type, only circle can be used. * - For IE, non circle point expansions are not supported due to lack of transform support. * - **Available Values:** * - circle * - rectangle * - svg shape tag interpreted as string<br> * (ex. `<polygon points='2.5 0 0 5 5 5'></polygon>`) * @see [Demo: point type](https://naver.github.io/billboard.js/demo/#Point.RectanglePoints) * @see [Demo: point focus only](https://naver.github.io/billboard.js/demo/#Point.FocusOnly) * @example * point: { * show: false, * r: 5, * * // or customize the radius * r: function(d) { * ... * return r; * }, * * focus: { * expand: { * enabled: true, * r: 1 * }, * only: true * }, * * // do not set inline 'opacity' css prop setting * opacity: null, * * // set every data point's opacity value * opacity: 0.7, * * select: { * r: 3 * }, * * // having lower value, means how closer to be for interaction * sensitivity: 3, * * // valid values are "circle" or "rectangle" * type: "rectangle", * * // or indicate as pattern * pattern: [ * "circle", * "rectangle", * "<polygon points='0 6 4 0 -4 0'></polygon>" * ], * } */ point_show: !0, point_r: 2.5, point_sensitivity: 10, point_focus_expand_enabled: !0, point_focus_expand_r: undefined, point_focus_only: !1, point_opacity: undefined, point_pattern: [], point_select_r: undefined, point_type: "circle" }); ;// CONCATENATED MODULE: ./src/config/Options/shape/area.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * area config options */ /* harmony default export */ var Options_shape_area = ({ /** * Set area options * @name area * @memberof Options * @type {object} * @property {object} area Area object * @property {boolean} [area.above=false] Set background area above the data chart line. * @property {boolean} [area.front=true] Set area node to be positioned over line node. * @property {boolean|object} [area.linearGradient=false] Set the linear gradient on area.<br><br> * Or customize by giving below object value: * - x {Array}: `x1`, `x2` value * - y {Array}: `y1`, `y2` value * - stops {Array}: Each item should be having `[offset, stop-color, stop-opacity]` values. * @property {boolean} [area.zerobased=true] Set if min or max value will be 0 on area chart. * @see [MDN's <linearGradient>](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/linearGradient), [<stop>](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/stop) * @see [Demo](https://naver.github.io/billboard.js/demo/#Chart.AreaChart) * @see [Demo: above](https://naver.github.io/billboard.js/demo/#AreaChartOptions.Above) * @see [Demo: linearGradient](https://naver.github.io/billboard.js/demo/#AreaChartOptions.LinearGradient) * @example * area: { * above: true, * zerobased: false, * * // <g class='bb-areas'> will be positioned behind the line <g class='bb-lines'> in stacking order * front: false, * * // will generate follwing linearGradient: * // <linearGradient x1="0" x2="0" y1="0" y2="1"> * // <stop offset="0" stop-color="$DATA_COLOR" stop-opacity="1"></stop> * // <stop offset="1" stop-color="$DATA_COLOR" stop-opacity="0"></stop> * // </linearGradient> * linearGradient: true, * * // Or customized gradient * linearGradient: { * x: [0, 0], // x1, x2 attributes * y: [0, 0], // y1, y2 attributes * stops: [ * // offset, stop-color, stop-opacity * [0, "#7cb5ec", 1], * * // setting 'null' for stop-color, will set its original data color * [0.5, null, 0], * * // setting 'function' for stop-color, will pass data id as argument. * // It should return color string or null value * [1, function(id) { return id === "data1" ? "red" : "blue"; }, 0], * ] * } * } */ area_above: !1, area_front: !0, area_linearGradient: !1, area_zerobased: !0 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/bar.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * bar config options */ /* harmony default export */ var shape_bar = ({ /** * Set bar options * @name bar * @memberof Options * @type {object} * @property {object} bar Bar object * @property {number} [bar.label.threshold=0] Set threshold ratio to show/hide labels. * @property {number} [bar.padding=0] The padding pixel value between each bar. * @property {number} [bar.radius] Set the radius of bar edge in pixel. * - **NOTE:** Works only for non-stacked bar * @property {number} [bar.radius.ratio] Set the radius ratio of bar edge in relative the bar's width. * @property {number} [bar.sensitivity=2] The senstivity offset value for interaction boundary. * @property {number} [bar.width] Change the width of bar chart. * @property {number} [bar.width.ratio=0.6] Change the width of bar chart by ratio. * @property {number} [bar.width.max] The maximum width value for ratio. * @property {number} [bar.width.dataname] Change the width of bar for indicated dataset only. * - **NOTE:** * - Works only for non-stacked bar * - Bars are centered accoding its total width value * @property {number} [bar.width.dataname.ratio=0.6] Change the width of bar chart by ratio. * @property {number} [bar.width.dataname.max] The maximum width value for ratio. * @property {boolean} [bar.zerobased=true] Set if min or max value will be 0 on bar chart. * @see [Demo: bar padding](https://naver.github.io/billboard.js/demo/#BarChartOptions.BarPadding) * @see [Demo: bar radius](https://naver.github.io/billboard.js/demo/#BarChartOptions.BarRadius) * @see [Demo: bar width](https://naver.github.io/billboard.js/demo/#BarChartOptions.BarWidth) * @see [Demo: bar width variant](https://naver.github.io/billboard.js/demo/#BarChartOptions.BarWidthVariant) * @example * bar: { * padding: 1, * * // the 'radius' option can be used only for non-stacking bars * radius: 10, * // or * radius: { * ratio: 0.5 * } * * label: { * // 0.1(10%) ratio value means, the minimum ratio to show text label relative to the y Axis domain range value. * // if data value is below than 0.1, text label will be hidden. * threshold: 0.1, * }, * * // will not have offset between each bar elements for interaction * sensitivity: 0, * * width: 10, * * // or * width: { * ratio: 0.2, * max: 20 * }, * * // or specify width per dataset * width: { * data1: 20, * data2: { * ratio: 0.2, * max: 20 * } * }, * * zerobased: false * } */ bar_label_threshold: 0, bar_padding: 0, bar_radius: undefined, bar_radius_ratio: undefined, bar_sensitivity: 2, bar_width: undefined, bar_width_ratio: .6, bar_width_max: undefined, bar_zerobased: !0 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/bubble.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * bubble config options */ /* harmony default export */ var shape_bubble = ({ /** * Set bubble options * @name bubble * @memberof Options * @type {object} * @property {object} bubble bubble object * @property {number|Function} [bubble.maxR=35] Set the max bubble radius value * @property {boolean} [bubble.zerobased=false] Set if min or max value will be 0 on bubble chart. * @example * bubble: { * // ex) If 100 is the highest value among data bound, the representation bubble of 100 will have radius of 50. * // And the lesser will have radius relatively from tha max value. * maxR: 50, * * // or set radius callback * maxR: function(d) { * // ex. of d param - {x: Fri Oct 06 2017 00:00:00 GMT+0900, value: 80, id: "data2", index: 5} * ... * return Math.sqrt(d.value * 2); * }, * zerobased: false * } */ bubble_maxR: 35, bubble_zerobased: !1 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/candlestick.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * candlestick config options */ /* harmony default export */ var shape_candlestick = ({ /** * Set candlestick options * @name candlestick * @memberof Options * @type {object} * @property {object} candlestick Candlestick object * @property {number} [candlestick.width] Change the width. * @property {number} [candlestick.width.ratio=0.6] Change the width by ratio. * @property {number} [candlestick.width.max] The maximum width value for ratio. * @property {number} [candlestick.width.dataname] Change the width for indicated dataset only. * @property {number} [candlestick.width.dataname.ratio=0.6] Change the width of bar chart by ratio. * @property {number} [candlestick.width.dataname.max] The maximum width value for ratio. * @property {object} [candlestick.color] Color setting. * @property {string|object} [candlestick.color.down] Change down(bearish) value color. * @property {string} [candlestick.color.down.dataname] Change down value color for indicated dataset only. * * @see [Demo](https://naver.github.io/billboard.js/demo/##Chart.CandlestickChart) * @example * candlestick: { * width: 10, * * // or * width: { * ratio: 0.2, * max: 20 * }, * * // or specify width per dataset * width: { * data1: 20, * data2: { * ratio: 0.2, * max: 20 * } * }, * color: { * // spcify bearish color * down: "red", * * // or specify color per dataset * down: { * data1: "red", * data2: "blue", * } * } * } */ candlestick_width: undefined, candlestick_width_ratio: .6, candlestick_width_max: undefined, candlestick_color_down: "red" }); ;// CONCATENATED MODULE: ./src/config/Options/shape/line.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * line config options */ /* harmony default export */ var shape_line = ({ /** * Set line options * @name line * @memberof Options * @type {object} * @property {object} line Line object * @property {boolean} [line.connectNull=false] Set if null data point will be connected or not.<br> * If true set, the region of null data will be connected without any data point. If false set, the region of null data will not be connected and get empty. * @property {Array} [line.classes=undefined] If set, used to set a css class on each line. * @property {boolean} [line.step.type=step] Change step type for step chart.<br> * **Available values:** * - step * - step-before * - step-after * @property {boolean|Array} [line.point=true] Set to false to not draw points on linecharts. Or pass an array of line ids to draw points for. * @property {boolean} [line.zerobased=false] Set if min or max value will be 0 on line chart. * @example * line: { * connectNull: true, * classes: [ * "line-class1", * "line-class2" * ], * step: { * type: "step-after" * }, * * // hide all data points ('point.show=false' also has similar effect) * point: false, * * // show data points for only indicated datas * point: [ * "data1", "data3" * ], * * zerobased: false * } */ line_connectNull: !1, line_step_type: "step", line_zerobased: !1, line_classes: undefined, line_point: !0 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/scatter.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * scatter config options */ /* harmony default export */ var scatter = ({ /** * Set scatter options * @name scatter * @memberof Options * @type {object} * @property {object} [scatter] scatter object * @property {boolean} [scatter.zerobased=false] Set if min or max value will be 0 on scatter chart. * @example * scatter: { * connectNull: true, * step: { * type: "step-after" * }, * * // hide all data points ('point.show=false' also has similar effect) * point: false, * * // show data points for only indicated datas * point: [ * "data1", "data3" * ], * * zerobased: false * } */ scatter_zerobased: !1 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/spline.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * x Axis config options */ /* harmony default export */ var spline = ({ /** * Set spline options * - **Available interpolation type values:** * - basis (d3.curveBasis) * - basis-closed (d3.curveBasisClosed) * - basis-open (d3.curveBasisOpen) * - bundle (d3.curveBundle) * - cardinal (d3.curveCardinal) * - cardinal-closed (d3.curveCardinalClosed) * - cardinal-open (d3.curveCardinalOpen) * - catmull-rom (d3.curveCatmullRom) * - catmull-rom-closed (d3.curveCatmullRomClosed) * - catmull-rom-open (d3.curveCatmullRomOpen) * - monotone-x (d3.curveMonotoneX) * - monotone-y (d3.curveMonotoneY) * - natural (d3.curveNatural) * - linear-closed (d3.curveLinearClosed) * - linear (d3.curveLinear) * - step (d3.curveStep) * - step-after (d3.curveStepAfter) * - step-before (d3.curveStepBefore) * @name spline * @memberof Options * @type {object} * @property {object} spline Spline object * @property {object} spline.interpolation Spline interpolation object * @property {string} [spline.interpolation.type="cardinal"] Interpolation type * @see [Interpolation (d3 v4)](http://bl.ocks.org/emmasaunders/c25a147970def2b02d8c7c2719dc7502) * @example * spline: { * interpolation: { * type: "cardinal" * } * } */ spline_interpolation_type: "cardinal" }); ;// CONCATENATED MODULE: ./src/config/Options/shape/donut.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * donut config options */ /* harmony default export */ var donut = ({ /** * Set donut options * @name donut * @memberof Options * @type {object} * @property {object} donut Donut object * @property {boolean} [donut.label.show=true] Show or hide label on each donut piece. * @property {Function} [donut.label.format] Set formatter for the label on each donut piece. * @property {number} [donut.label.threshold=0.05] Set threshold ratio to show/hide labels. * @property {number|Function} [donut.label.ratio=undefined] Set ratio of labels position. * @property {boolean} [donut.expand=true] Enable or disable expanding donut pieces. * @property {number} [donut.expand.rate=0.98] Set expand rate. * @property {number} [donut.expand.duration=50] Set expand transition time in ms. * @property {number} [donut.width] Set width of donut chart. * @property {string} [donut.title=""] Set title of donut chart. Use `\n` character for line break. * @property {number} [donut.padAngle=0] Set padding between data. * @property {number} [donut.startingAngle=0] Set starting angle where data draws. * @example * donut: { * label: { * show: false, * format: function(value, ratio, id) { * return d3.format("$")(value); * * // to multiline, return with '\n' character * // return value +"%\nLine1\n2Line2"; * }, * * // 0.1(10%) ratio value means, the minimum ratio to show text label relative to the total value. * // if data value is below than 0.1, text label will be hidden. * threshold: 0.1, * * // set ratio callback. Should return ratio value * ratio: function(d, radius, h) { * ... * return ratio; * }, * // or set ratio number * ratio: 0.5 * }, * * // disable expand transition for interaction * expand: false, * * expand: { * // set duration of expand transition to 500ms. * duration: 500, * * // set expand area rate * rate: 1 * }, * * width: 10, * padAngle: 0.2, * startingAngle: 1, * title: "Donut Title" * * // title with line break * title: "Title1\nTitle2" * } */ donut_label_show: !0, donut_label_format: undefined, donut_label_threshold: .05, donut_label_ratio: undefined, donut_width: undefined, donut_title: "", donut_expand: {}, donut_expand_rate: .98, donut_expand_duration: 50, donut_padAngle: 0, donut_startingAngle: 0 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/gauge.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * gauge config options */ /* harmony default export */ var shape_gauge = ({ /** * Set gauge options * @name gauge * @memberof Options * @type {object} * @property {object} gauge Gauge object * @property {boolean} [gauge.background=""] Set background color. (The `.bb-chart-arcs-background` element) * @property {boolean} [gauge.fullCircle=false] Show full circle as donut. When set to 'true', the max label will not be showed due to start and end points are same location. * @property {boolean} [gauge.label.show=true] Show or hide label on gauge. * @property {Function} [gauge.label.format] Set formatter for the label on gauge. Label text can be multilined with `\n` character. * @property {Function} [gauge.label.extents] Set customized min/max label text. * @property {number} [gauge.label.threshold=0] Set threshold ratio to show/hide labels. * @property {boolean} [gauge.expand=true] Enable or disable expanding gauge. * @property {number} [gauge.expand.rate=0.98] Set expand rate. * @property {number} [gauge.expand.duration=50] Set the expand transition time in milliseconds. * @property {number} [gauge.min=0] Set min value of the gauge. * @property {number} [gauge.max=100] Set max value of the gauge. * @property {number} [gauge.startingAngle=-1 * Math.PI / 2] Set starting angle where data draws. * * **Limitations:** * - when `gauge.fullCircle=false`: * - -1 * Math.PI / 2 <= startingAngle <= Math.PI / 2 * - `startingAngle <= -1 * Math.PI / 2` defaults to `-1 * Math.PI / 2` * - `startingAngle >= Math.PI / 2` defaults to `Math.PI / 2` * - when `gauge.fullCircle=true`: * - -1 * Math.PI < startingAngle < Math.PI * - `startingAngle < -1 * Math.PI` defaults to `Math.PI` * - `startingAngle > Math.PI` defaults to `Math.PI` * @property {number} [gauge.arcLength=100] Set the length of the arc to be drawn in percent from -100 to 100.<br> * Negative value will draw the arc **counterclockwise**. * * **Limitations:** * - -100 <= arcLength (in percent) <= 100 * - 'arcLength < -100' defaults to -100 * - 'arcLength > 100' defaults to 100 * @property {string} [gauge.title=""] Set title of gauge chart. Use `\n` character for line break. * @property {string} [gauge.units] Set units of the gauge. * @property {number} [gauge.width] Set width of gauge chart. * @property {string} [gauge.type="single"] Set type of gauge to be displayed.<br><br> * **Available Values:** * - single * - multi * @property {string} [gauge.arcs.minWidth=5] Set minimal width of gauge arcs until the innerRadius disappears. * @see [Demo: archLength](https://naver.github.io/billboard.js/demo/#GaugeChartOptions.GaugeArcLength) * @see [Demo: startingAngle](https://naver.github.io/billboard.js/demo/#GaugeChartOptions.GaugeStartingAngle) * @example * gauge: { * background: "#eee", // will set 'fill' css prop for '.bb-chart-arcs-background' classed element. * fullCircle: false, * label: { * show: false, * format: function(value, ratio) { * return value; * * // to multiline, return with '\n' character * // return value +"%\nLine1\n2Line2"; * }, * * extents: function(value, isMax) { * return (isMax ? "Max:" : "Min:") + value; * }, * * // 0.1(10%) ratio value means, the minimum ratio to show text label relative to the total value. * // if data value is below than 0.1, text label will be hidden. * threshold: 0.1, * }, * * // disable expand transition for interaction * expand: false, * * expand: { * // set duration of expand transition to 500ms. * duration: 500, * * // set expand area rate * rate: 1 * }, * * min: -100, * max: 200, * type: "single" // or 'multi' * title: "Title Text", * units: "%", * width: 10, * startingAngle: -1 * Math.PI / 2, * arcLength: 100, * arcs: { * minWidth: 5 * } * } */ gauge_background: "", gauge_fullCircle: !1, gauge_label_show: !0, gauge_label_format: undefined, gauge_label_extents: undefined, gauge_label_threshold: 0, gauge_min: 0, gauge_max: 100, gauge_type: "single", gauge_startingAngle: -1 * Math.PI / 2, gauge_arcLength: 100, gauge_title: "", gauge_units: undefined, gauge_width: undefined, gauge_arcs_minWidth: 5, gauge_expand: {}, gauge_expand_rate: .98, gauge_expand_duration: 50 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/pie.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * x Axis config options */ /* harmony default export */ var pie = ({ /** * Set pie options * @name pie * @memberof Options * @type {object} * @property {object} pie Pie object * @property {boolean} [pie.label.show=true] Show or hide label on each pie piece. * @property {Function} [pie.label.format] Set formatter for the label on each pie piece. * @property {number} [pie.label.threshold=0.05] Set threshold ratio to show/hide labels. * @property {number|Function} [pie.label.ratio=undefined] Set ratio of labels position. * @property {boolean|object} [pie.expand=true] Enable or disable expanding pie pieces. * @property {number} [pie.expand.rate=0.98] Set expand rate. * @property {number} [pie.expand.duration=50] Set expand transition time in ms. * @property {number|object} [pie.innerRadius=0] Sets the inner radius of pie arc. * @property {number|object|undefined} [pie.outerRadius=undefined] Sets the outer radius of pie arc. * @property {number} [pie.padAngle=0] Set padding between data. * @property {number} [pie.padding=0] Sets the gap between pie arcs. * @property {number} [pie.startingAngle=0] Set starting angle where data draws. * @see [Demo: expand.rate](https://naver.github.io/billboard.js/demo/#PieChartOptions.ExpandRate) * @see [Demo: innerRadius](https://naver.github.io/billboard.js/demo/#PieChartOptions.InnerRadius) * @see [Demo: outerRadius](https://naver.github.io/billboard.js/demo/#PieChartOptions.OuterRadius) * @see [Demo: startingAngle](https://naver.github.io/billboard.js/demo/#PieChartOptions.StartingAngle) * @example * pie: { * label: { * show: false, * format: function(value, ratio, id) { * return d3.format("$")(value); * * // to multiline, return with '\n' character * // return value +"%\nLine1\n2Line2"; * }, * * // 0.1(10%) ratio value means, the minimum ratio to show text label relative to the total value. * // if data value is below than 0.1, text label will be hidden. * threshold: 0.1, * * // set ratio callback. Should return ratio value * ratio: function(d, radius, h) { * ... * return ratio; * }, * // or set ratio number * ratio: 0.5 * }, * * // disable expand transition for interaction * expand: false, * * expand: { * // set duration of expand transition to 500ms. * duration: 500, * * // set expand area rate * rate: 1 * }, * * innerRadius: 0, * * // set different innerRadius for each data * innerRadius: { * data1: 10, * data2: 0 * }, * * outerRadius: 100, * * // set different outerRadius for each data * outerRadius: { * data1: 50, * data2: 100 * } * * padAngle: 0.1, * padding: 0, * startingAngle: 1 * } */ pie_label_show: !0, pie_label_format: undefined, pie_label_threshold: .05, pie_label_ratio: undefined, pie_expand: {}, pie_expand_rate: .98, pie_expand_duration: 50, pie_innerRadius: 0, pie_outerRadius: undefined, pie_padAngle: 0, pie_padding: 0, pie_startingAngle: 0 }); ;// CONCATENATED MODULE: ./src/config/Options/shape/radar.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * x Axis config options */ /* harmony default export */ var shape_radar = ({ /** * Set radar options * - **NOTE:** * > When x tick text contains `\n`, it's used as line break. * @name radar * @memberof Options * @type {object} * @property {object} radar Radar object * @property {number} [radar.axis.max=undefined] The max value of axis. If not given, it'll take the max value from the given data. * @property {boolean} [radar.axis.line.show=true] Show or hide axis line. * @property {number} [radar.axis.text.position.x=0] x coordinate position, relative the original. * @property {number} [radar.axis.text.position.y=0] y coordinate position, relative the original. * @property {boolean} [radar.axis.text.show=true] Show or hide axis text. * @property {boolean} [radar.direction.clockwise=false] Set the direction to be drawn. * @property {number} [radar.level.depth=3] Set the level depth. * @property {boolean} [radar.level.show=true] Show or hide level. * @property {Function} [radar.level.text.format] Set format function for the level value.<br>- Default value: `(x) => x % 1 === 0 ? x : x.toFixed(2)` * @property {boolean} [radar.level.text.show=true] Show or hide level text. * @property {number} [radar.size.ratio=0.87] Set size ratio. * @see [Demo](https://naver.github.io/billboard.js/demo/#Chart.RadarChart) * @see [Demo: radar axis](https://naver.github.io/billboard.js/demo/#RadarChartOptions.RadarAxis) * @see [Demo: radar level](https://naver.github.io/billboard.js/demo/#RadarChartOptions.RadarLevel) * @see [Demo: radar size](https://naver.github.io/billboard.js/demo/#RadarChartOptions.RadarSize) * @see [Demo: radar axis multiline](https://naver.github.io/billboard.js/demo/#RadarChartOptions.RadarAxisMultiline) * @example * radar: { * axis: { * max: 50, * line: { * show: false * }, * text: { * position: { * x: 0, * y: 0 * }, * show: false * } * }, * direction: { * clockwise: true * }, * level: { * show: false, * text: { * format: function(x) { * return x + "%"; * }, * show: true * } * }, * size: { * ratio: 0.7 * } * } */ radar_axis_max: undefined, radar_axis_line_show: !0, radar_axis_text_show: !0, radar_axis_text_position: {}, radar_level_depth: 3, radar_level_show: !0, radar_level_text_format: function radar_level_text_format(x) { return x % 1 === 0 ? x : x.toFixed(2); }, radar_level_text_show: !0, radar_size_ratio: .87, radar_direction_clockwise: !1 }); ;// CONCATENATED MODULE: ./src/config/resolver/shape.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ // Axis // Shape // Options // Non-Axis based /** * Extend Axis * @param {Array} module Module to be extended * @param {Array} option Option object to be extended * @private */ function extendAxis(module, option) { extend(ChartInternal.prototype, internal.concat(module)), extend(Chart.prototype, api), Options.setOptions(options.concat(option || [])); } /** * Extend Line type modules * @param {object} module Module to be extended * @param {Array} option Option object to be extended * @private */ function extendLine(module, option) { extendAxis([point, line].concat(module || [])), Options.setOptions([common_point, shape_line].concat(option || [])); } /** * Extend Arc type modules * @param {Array} module Module to be extended * @param {Array} option Option object to be extended * @private */ function extendArc(module, option) { extend(ChartInternal.prototype, [arc].concat(module || [])), Options.setOptions(option); } // Area types var _area = function area() { return extendLine(shape_area, [Options_shape_area]), (_area = function area() { return TYPE.AREA; })(); }, areaLineRange = function () { return extendLine(shape_area, [Options_shape_area]), (areaLineRange = function () { return TYPE.AREA_LINE_RANGE; })(); }, areaSpline = function () { return extendLine(shape_area, [Options_shape_area, spline]), (areaSpline = function () { return TYPE.AREA_SPLINE; })(); }, areaSplineRange = function () { return extendLine(shape_area, [Options_shape_area, spline]), (areaSplineRange = function () { return TYPE.AREA_SPLINE_RANGE; })(); }, areaStep = function () { return extendLine(shape_area, [Options_shape_area]), (areaStep = function () { return TYPE.AREA_STEP; })(); }, resolver_shape_line = function () { return extendLine(), (resolver_shape_line = function () { return TYPE.LINE; })(); }, shape_spline = function () { return extendLine(undefined, [spline]), (shape_spline = function () { return TYPE.SPLINE; })(); }, step = function () { return extendLine(), (step = function () { return TYPE.STEP; })(); }, shape_donut = function () { return extendArc(undefined, [donut]), (shape_donut = function () { return TYPE.DONUT; })(); }, resolver_shape_gauge = function () { return extendArc([gauge], [shape_gauge]), (resolver_shape_gauge = function () { return TYPE.GAUGE; })(); }, shape_pie = function () { return extendArc(undefined, [pie]), (shape_pie = function () { return TYPE.PIE; })(); }, resolver_shape_radar = function () { return extendArc([point, radar], [common_point, shape_radar]), (resolver_shape_radar = function () { return TYPE.RADAR; })(); }, resolver_shape_bar = function () { return extendAxis([bar], shape_bar), (resolver_shape_bar = function () { return TYPE.BAR; })(); }, resolver_shape_bubble = function () { return extendAxis([point, bubble], [shape_bubble, common_point]), (resolver_shape_bubble = function () { return TYPE.BUBBLE; })(); }, resolver_shape_candlestick = function () { return extendAxis([candlestick], [shape_candlestick]), (resolver_shape_candlestick = function () { return TYPE.CANDLESTICK; })(); }, shape_scatter = function () { return extendAxis([point], [common_point, scatter]), (shape_scatter = function () { return TYPE.SCATTER; })(); }; ;// CONCATENATED MODULE: ./src/Chart/api/selection.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var selection = ({ /** * Get selected data points.<br><br> * By this API, you can get selected data points information. To use this API, data.selection.enabled needs to be set true. * @function selected * @instance * @memberof Chart * @param {string} [targetId] You can filter the result by giving target id that you want to get. If not given, all of data points will be returned. * @returns {Array} dataPoint Array of the data points.<br>ex.) `[{x: 1, value: 200, id: "data1", index: 1, name: "data1"}, ...]` * @example * // all selected data points will be returned. * chart.selected(); * // --> ex.) [{x: 1, value: 200, id: "data1", index: 1, name: "data1"}, ... ] * * // all selected data points of data1 will be returned. * chart.selected("data1"); */ selected: function selected(targetId) { var $$ = this.internal, dataPoint = []; return $$.$el.main.selectAll("." + (config_classes.shapes + $$.getTargetSelectorSuffix(targetId))).selectAll("." + config_classes.shape).filter(function () { return (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this).classed(config_classes.SELECTED); }).each(function (d) { return dataPoint.push(d); }), dataPoint; }, /** * Set data points to be selected. ([`data.selection.enabled`](Options.html#.data%25E2%2580%25A4selection%25E2%2580%25A4enabled) option should be set true to use this method) * @function select * @instance * @memberof Chart * @param {string|Array} [ids] id value to get selected. * @param {Array} [indices] The index array of data points. If falsy value given, will select all data points. * @param {boolean} [resetOther] Unselect already selected. * @example * // select all data points * chart.select(); * * // select all from 'data2' * chart.select("data2"); * * // select all from 'data1' and 'data2' * chart.select(["data1", "data2"]); * * // select from 'data1', indices 2 and unselect others selected * chart.select("data1", [2], true); * * // select from 'data1', indices 0, 3 and 5 * chart.select("data1", [0, 3, 5]); */ select: function select(ids, indices, resetOther) { var $$ = this.internal, config = $$.config, $el = $$.$el; config.data_selection_enabled && $el.main.selectAll("." + config_classes.shapes).selectAll("." + config_classes.shape).each(function (d, i) { var shape = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), id = d.data ? d.data.id : d.id, toggle = $$.getToggle(this, d).bind($$), isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0, isTargetIndex = !indices || indices.indexOf(i) >= 0, isSelected = shape.classed(config_classes.SELECTED); // line/area selection not supported yet shape.classed(config_classes.line) || shape.classed(config_classes.area) || (isTargetId && isTargetIndex ? config.data_selection_isselectable.bind($$.api)(d) && !isSelected && toggle(!0, shape.classed(config_classes.SELECTED, !0), d, i) : isDefined(resetOther) && resetOther && isSelected && toggle(!1, shape.classed(config_classes.SELECTED, !1), d, i)); }); }, /** * Set data points to be un-selected. * @function unselect * @instance * @memberof Chart * @param {string|Array} [ids] id value to be unselected. * @param {Array} [indices] The index array of data points. If falsy value given, will select all data points. * @example * // unselect all data points * chart.unselect(); * * // unselect all from 'data1' * chart.unselect("data1"); * * // unselect from 'data1', indices 2 * chart.unselect("data1", [2]); */ unselect: function unselect(ids, indices) { var $$ = this.internal, config = $$.config, $el = $$.$el; config.data_selection_enabled && $el.main.selectAll("." + config_classes.shapes).selectAll("." + config_classes.shape).each(function (d, i) { var shape = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), id = d.data ? d.data.id : d.id, toggle = $$.getToggle(this, d).bind($$), isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0, isTargetIndex = !indices || indices.indexOf(i) >= 0, isSelected = shape.classed(config_classes.SELECTED); // line/area selection not supported yet shape.classed(config_classes.line) || shape.classed(config_classes.area) || isTargetId && isTargetIndex && config.data_selection_isselectable.bind($$.api)(d) && isSelected && toggle(!1, shape.classed(config_classes.SELECTED, !1), d, i); }); } }); ;// CONCATENATED MODULE: ./src/Chart/api/subchart.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var subchart = ({ subchart: { /** * Show subchart * - **NOTE:** for ESM imports, needs to import 'subchart' exports and instantiate it by calling `subchart()`. * @function subchart․show * @instance * @memberof Chart * @example * // for ESM imports, needs to import 'subchart' and must be instantiated first to enable subchart's API. * import {subchart} from "billboard.js"; * * const chart = bb.generate({ * ... * subchart: { * // need to be instantiated by calling 'subchart()' * enabled: subchart() * * // in case don't want subchart to be shown at initialization, instantiate with '!subchart()' * enabled: !subchart() * } * }); * * chart.subchart.show(); */ show: function () { var $$ = this.internal, subchart = $$.$el.subchart, config = $$.config, show = config.subchart_show; if (!show) { config.subchart_show = !show, subchart.main || $$.initSubchart(); var $target = subchart.main.selectAll("." + config_classes.target); // need to cover when new data has been loaded $$.data.targets.length !== $target.size() && ($$.updateSizes(), $$.updateTargetsForSubchart($$.data.targets), $target = subchart.main.selectAll("." + config_classes.target)), $target.style("opacity", "1"), subchart.main.style("display", null), this.flush(); } }, /** * Hide generated subchart * - **NOTE:** for ESM imports, needs to import 'subchart' exports and instantiate it by calling `subchart()`. * @function subchart․hide * @instance * @memberof Chart * @example * chart.subchart.hide(); */ hide: function hide() { var $$ = this.internal, subchart = $$.$el.subchart, config = $$.config; config.subchart_show && subchart.main.style("display") !== "none" && (config.subchart_show = !1, subchart.main.style("display", "none"), this.flush()); }, /** * Toggle the visiblity of subchart * - **NOTE:** for ESM imports, needs to import 'subchart' exports and instantiate it by calling `subchart()`. * @function subchart․toggle * @instance * @memberof Chart * @example * // When subchart is hidden, will be shown * // When subchart is shown, will be hidden * chart.subchart.toggle(); */ toggle: function toggle() { var $$ = this.internal, config = $$.config; this.subchart[config.subchart_show ? "hide" : "show"](); } } }); // EXTERNAL MODULE: external {"commonjs":"d3-zoom","commonjs2":"d3-zoom","amd":"d3-zoom","root":"d3"} var external_commonjs_d3_zoom_commonjs2_d3_zoom_amd_d3_zoom_root_d3_ = __webpack_require__(14); ;// CONCATENATED MODULE: ./src/Chart/api/zoom.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Check if the given domain is within zoom range * @param {Array} domain domain value * @param {Array} range zoom range value * @returns {boolean} * @private */ function withinRange(domain, range) { var min = range[0], max = range[1]; return domain.every(function (v, i) { return i === 0 ? v >= min : v <= max; }); } /** * Zoom by giving x domain. * - **NOTE:** * - For `wheel` type zoom, the minimum zoom range will be set as the given domain. To get the initial state, [.unzoom()](#unzoom) should be called. * - To be used [zoom.enabled](Options.html#.zoom) option should be set as `truthy`. * @function zoom * @instance * @memberof Chart * @param {Array} domainValue If domain is given, the chart will be zoomed to the given domain. If no argument is given, the current zoomed domain will be returned. * @returns {Array} domain value in array * @example * // Zoom to specified domain * chart.zoom([10, 20]); * * // Get the current zoomed domain * chart.zoom(); */ var zoom = function (domainValue) { var resultDomain, $$ = this.internal, config = $$.config, scale = $$.scale, domain = domainValue; if (!(config.zoom_enabled && domain)) resultDomain = scale.zoom ? scale.zoom.domain() : scale.x.orgDomain();else if ($$.axis.isTimeSeries() && (domain = domain.map(function (x) { return parseDate.bind($$)(x); })), withinRange(domain, $$.getZoomDomain())) { if ($$.api.tooltip.hide(), config.subchart_show) { var xScale = scale.zoom || scale.x; $$.brush.getSelection().call($$.brush.move, [xScale(domain[0]), xScale(domain[1])]), resultDomain = domain; } else scale.x.domain(domain), scale.zoom = scale.x, $$.axis.x.scale(scale.zoom), resultDomain = scale.zoom.orgDomain(); $$.redraw({ withTransition: !0, withY: config.zoom_rescale, withDimension: !1 }), $$.setZoomResetButton(), callFn(config.zoom_onzoom, $$.api, resultDomain); } return resultDomain; }; extend(zoom, { /** * Enable and disable zooming. * @function zoom․enable * @instance * @memberof Chart * @param {string|boolean} enabled Possible string values are "wheel" or "drag". If enabled is true, "wheel" will be used. If false is given, zooming will be disabled.<br>When set to false, the current zooming status will be reset. * @example * // Enable zooming using the mouse wheel * chart.zoom.enable(true); * // Or * chart.zoom.enable("wheel"); * * // Enable zooming by dragging * chart.zoom.enable("drag"); * * // Disable zooming * chart.zoom.enable(false); */ enable: function enable(enabled) { var $$ = this.internal, config = $$.config; /^(drag|wheel)$/.test(enabled) && (config.zoom_type = enabled), config.zoom_enabled = !!enabled, $$.zoom ? enabled === !1 && $$.bindZoomEvent(!1) : ($$.initZoom(), $$.bindZoomEvent()), $$.updateAndRedraw(); }, /** * Set or get x Axis maximum zoom range value * @function zoom․max * @instance * @memberof Chart * @param {number} [max] maximum value to set for zoom * @returns {number} zoom max value * @example * // Set maximum range value * chart.zoom.max(20); */ max: function max(_max) { var $$ = this.internal, config = $$.config, xDomain = $$.org.xDomain; return (_max === 0 || _max) && (config.zoom_x_max = getMinMax("max", [xDomain[1], _max])), config.zoom_x_max; }, /** * Set or get x Axis minimum zoom range value * @function zoom․min * @instance * @memberof Chart * @param {number} [min] minimum value to set for zoom * @returns {number} zoom min value * @example * // Set minimum range value * chart.zoom.min(-1); */ min: function min(_min) { var $$ = this.internal, config = $$.config, xDomain = $$.org.xDomain; return (_min === 0 || _min) && (config.zoom_x_min = getMinMax("min", [xDomain[0], _min])), config.zoom_x_min; }, /** * Set zoom range * @function zoom․range * @instance * @memberof Chart * @param {object} [range] zoom range * @returns {object} zoom range value * { * min: 0, * max: 100 * } * @example * chart.zoom.range({ * min: 10, * max: 100 * }); */ range: function range(_range) { var zoom = this.zoom; if (isObject(_range)) { var min = _range.min, max = _range.max; isDefined(min) && zoom.min(min), isDefined(max) && zoom.max(max); } return { min: zoom.min(), max: zoom.max() }; } }); /* harmony default export */ var api_zoom = ({ zoom: zoom, /** * Unzoom zoomed area * @function unzoom * @instance * @memberof Chart * @example * chart.unzoom(); */ unzoom: function unzoom() { var $$ = this.internal, config = $$.config; if ($$.scale.zoom) { config.subchart_show ? $$.brush.getSelection().call($$.brush.move, null) : $$.zoom.updateTransformScale(external_commonjs_d3_zoom_commonjs2_d3_zoom_amd_d3_zoom_root_d3_.zoomIdentity), $$.updateZoom(!0), $$.zoom.resetBtn && $$.zoom.resetBtn.style("display", "none"); // reset transform var eventRects = $$.$el.main.select("." + config_classes.eventRects); (0,external_commonjs_d3_zoom_commonjs2_d3_zoom_amd_d3_zoom_root_d3_.zoomTransform)(eventRects.node()) !== external_commonjs_d3_zoom_commonjs2_d3_zoom_amd_d3_zoom_root_d3_.zoomIdentity && $$.zoom.transform(eventRects, external_commonjs_d3_zoom_commonjs2_d3_zoom_amd_d3_zoom_root_d3_.zoomIdentity), $$.redraw({ withTransition: !0, withUpdateXDomain: !0, withUpdateOrgXDomain: !0, withY: config.zoom_rescale }); } } }); // EXTERNAL MODULE: external {"commonjs":"d3-color","commonjs2":"d3-color","amd":"d3-color","root":"d3"} var external_commonjs_d3_color_commonjs2_d3_color_amd_d3_color_root_d3_ = __webpack_require__(13); ;// CONCATENATED MODULE: ./src/ChartInternal/interactions/drag.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * Module used for data.selection.draggable option */ /* harmony default export */ var drag = ({ /** * Called when dragging. * Data points can be selected. * @private * @param {object} mouse Object */ drag: function drag(mouse) { var $$ = this, config = $$.config, state = $$.state, main = $$.$el.main, isSelectionGrouped = config.data_selection_grouped, isSelectable = config.interaction_enabled && config.data_selection_isselectable; if (!$$.hasArcType() && config.data_selection_enabled && ( // do nothing if not selectable !config.zoom_enabled || $$.zoom.altDomain) && config.data_selection_multiple // skip when single selection because drag is used for multiple selection ) { var _ref = state.dragStart || [0, 0], sx = _ref[0], sy = _ref[1], mx = mouse[0], my = mouse[1], minX = Math.min(sx, mx), maxX = Math.max(sx, mx), minY = isSelectionGrouped ? state.margin.top : Math.min(sy, my), maxY = isSelectionGrouped ? state.height : Math.max(sy, my); main.select("." + config_classes.dragarea).attr("x", minX).attr("y", minY).attr("width", maxX - minX).attr("height", maxY - minY), main.selectAll("." + config_classes.shapes).selectAll("." + config_classes.shape).filter(function (d) { return isSelectable && isSelectable.bind($$.api)(d); }).each(function (d, i) { var toggle, shape = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this), isSelected = shape.classed(config_classes.SELECTED), isIncluded = shape.classed(config_classes.INCLUDED), isWithin = !1; if (shape.classed(config_classes.circle)) { var x = +shape.attr("cx") * 1, y = +shape.attr("cy") * 1; toggle = $$.togglePoint, isWithin = minX < x && x < maxX && minY < y && y < maxY; } else if (shape.classed(config_classes.bar)) { var _getPathBox = getPathBox(this), _x = _getPathBox.x, y = _getPathBox.y, width = _getPathBox.width, height = _getPathBox.height; toggle = $$.togglePath, isWithin = !(maxX < _x || _x + width < minX) && !(maxY < y || y + height < minY); } else // line/area selection not supported yet return; // @ts-ignore isWithin ^ isIncluded && (shape.classed(config_classes.INCLUDED, !isIncluded), shape.classed(config_classes.SELECTED, !isSelected), toggle.call($$, !isSelected, shape, d, i)); }); } }, /** * Called when the drag starts. * Adds and Shows the drag area. * @private * @param {object} mouse Object */ dragstart: function dragstart(mouse) { var $$ = this, config = $$.config, state = $$.state, main = $$.$el.main; $$.hasArcType() || !config.data_selection_enabled || (state.dragStart = mouse, main.select("." + config_classes.chart).append("rect").attr("class", config_classes.dragarea).style("opacity", "0.1"), $$.setDragStatus(!0)); }, /** * Called when the drag finishes. * Removes the drag area. * @private */ dragend: function dragend() { var $$ = this, config = $$.config, main = $$.$el.main; $$.hasArcType() || !config.data_selection_enabled || (main.select("." + config_classes.dragarea).transition().duration(100).style("opacity", "0").remove(), main.selectAll("." + config_classes.shape).classed(config_classes.INCLUDED, !1), $$.setDragStatus(!1)); } }); ;// CONCATENATED MODULE: ./src/ChartInternal/internals/selection.ts function selection_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function selection_objectSpread(target) { for (var source, i = 1; i < arguments.length; i++) source = arguments[i] == null ? {} : arguments[i], i % 2 ? selection_ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : selection_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); return target; } /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var internals_selection = (selection_objectSpread(selection_objectSpread({}, drag), {}, { /** * Select a point * @param {object} target Target point * @param {object} d Data object * @param {number} i Index number * @private */ selectPoint: function selectPoint(target, d, i) { var $$ = this, config = $$.config, main = $$.$el.main, isRotated = config.axis_rotated, cx = (isRotated ? $$.circleY : $$.circleX).bind($$), cy = (isRotated ? $$.circleX : $$.circleY).bind($$), r = $$.pointSelectR.bind($$); // add selected-circle on low layer g callFn(config.data_onselected, $$.api, d, target.node()), main.select("." + config_classes.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + config_classes.selectedCircle + "-" + i).data([d]).enter().append("circle").attr("class", function () { return $$.generateClass(config_classes.selectedCircle, i); }).attr("cx", cx).attr("cy", cy).attr("stroke", $$.color).attr("r", function (d2) { return $$.pointSelectR(d2) * 1.4; }).transition().duration(100).attr("r", r); }, /** * Unelect a point * @param {object} target Target point * @param {object} d Data object * @param {number} i Index number * @private */ unselectPoint: function unselectPoint(target, d, i) { var $$ = this, config = $$.config, $el = $$.$el; // remove selected-circle from low layer g callFn(config.data_onunselected, $$.api, d, target.node()), $el.main.select("." + config_classes.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll("." + config_classes.selectedCircle + "-" + i).transition().duration(100).attr("r", 0).remove(); }, /** * Toggles the selection of points * @param {boolean} selected whether or not to select. * @param {object} target Target object * @param {object} d Data object * @param {number} i Index number * @private */ togglePoint: function togglePoint(selected, target, d, i) { var method = (selected ? "" : "un") + "selectPoint"; this[method](target, d, i); }, /** * Select a path * @param {object} target Target path * @param {object} d Data object * @private */ selectPath: function selectPath(target, d) { var $$ = this, config = $$.config; callFn(config.data_onselected, $$.api, d, target.node()), config.interaction_brighten && target.transition().duration(100).style("fill", function () { return (0,external_commonjs_d3_color_commonjs2_d3_color_amd_d3_color_root_d3_.rgb)($$.color(d)).brighter(.75); }); }, /** * Unelect a path * @private * @param {object} target Target path * @param {object} d Data object */ unselectPath: function unselectPath(target, d) { var $$ = this, config = $$.config; callFn(config.data_onunselected, $$.api, d, target.node()), config.interaction_brighten && target.transition().duration(100).style("fill", function () { return $$.color(d); }); }, /** * Toggles the selection of lines * @param {boolean} selected whether or not to select. * @param {object} target Target object * @param {object} d Data object * @param {number} i Index number * @private */ togglePath: function togglePath(selected, target, d, i) { this[(selected ? "" : "un") + "selectPath"](target, d, i); }, /** * Returns the toggle method of the target * @param {object} that shape * @param {object} d Data object * @returns {Function} toggle method * @private */ getToggle: function getToggle(that, d) { var $$ = this; return that.nodeName === "path" ? $$.togglePath : $$.isStepType(d) ? function () {} : // circle is hidden in step chart, so treat as within the click area $$.togglePoint; }, /** * Toggles the selection of shapes * @param {object} that shape * @param {object} d Data object * @param {number} i Index number * @private */ toggleShape: function toggleShape(that, d, i) { var toggledShape, $$ = this, config = $$.config, main = $$.$el.main, shape = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(that), isSelected = shape.classed(config_classes.SELECTED), toggle = $$.getToggle(that, d).bind($$); if (config.data_selection_enabled && config.data_selection_isselectable.bind($$.api)(d)) { if (!config.data_selection_multiple) { var selector = "." + config_classes.shapes; config.data_selection_grouped && (selector += $$.getTargetSelectorSuffix(d.id)), main.selectAll(selector).selectAll("." + config_classes.shape).each(function (d, i) { var shape = (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(this); shape.classed(config_classes.SELECTED) && (toggledShape = shape, toggle(!1, shape.classed(config_classes.SELECTED, !1), d, i)); }); } toggledShape && toggledShape.node() === shape.node() || (shape.classed(config_classes.SELECTED, !isSelected), toggle(!isSelected, shape, d, i)); } } })); ;// CONCATENATED MODULE: ./src/ChartInternal/interactions/subchart.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var interactions_subchart = ({ /** * Initialize the brush. * @private */ initBrush: function initBrush() { var $$ = this, config = $$.config, scale = $$.scale, subchart = $$.$el.subchart, isRotated = config.axis_rotated; $$.brush = isRotated ? (0,external_commonjs_d3_brush_commonjs2_d3_brush_amd_d3_brush_root_d3_.brushY)() : (0,external_commonjs_d3_brush_commonjs2_d3_brush_amd_d3_brush_root_d3_.brushX)(); // set "brush" event var lastDomain, timeout, brushHandler = function () { $$.redrawForBrush(); }, getBrushSize = function () { var brush = $$.$el.svg.select("." + config_classes.brush + " .overlay"), brushSize = { width: 0, height: 0 }; return brush.size() && (brushSize.width = +brush.attr("width"), brushSize.height = +brush.attr("height")), brushSize[isRotated ? "width" : "height"]; }; // set the brush extent $$.brush.on("start", function () { $$.state.inputType === "touch" && $$.hideTooltip(), brushHandler(); }).on("brush", brushHandler).on("end", function () { lastDomain = scale.x.orgDomain(); }), $$.brush.updateResize = function () { var _this = this; timeout && clearTimeout(timeout), timeout = setTimeout(function () { var selection = _this.getSelection(); lastDomain && (0,external_commonjs_d3_brush_commonjs2_d3_brush_amd_d3_brush_root_d3_.brushSelection)(selection.node()) && _this.move(selection, lastDomain.map(scale.subX.orgScale())); }, 0); }, $$.brush.update = function () { var extent = this.extent()(); return extent[1].filter(function (v) { return isNaN(v); }).length === 0 && subchart.main && subchart.main.select("." + config_classes.brush).call(this), this; }, $$.brush.scale = function (scale) { var h = config.subchart_size_height || getBrushSize(), extent = $$.getExtent(); // [[x0, y0], [x1, y1]], where [x0, y0] is the top-left corner and [x1, y1] is the bottom-right corner // when extent updates, brush selection also be re-applied // https://github.com/d3/d3/issues/2918 !extent && scale.range ? extent = [[0, 0], [scale.range()[1], h]] : isArray(extent) && (extent = extent.map(function (v, i) { return [v, i > 0 ? h : i]; })), isRotated && extent[1].reverse(), this.extent(extent), this.update(); }, $$.brush.getSelection = function () { return (// @ts-ignore subchart.main ? subchart.main.select("." + config_classes.brush) : (0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)([]) ); }; }, /** * Initialize the subchart. * @private */ initSubchart: function initSubchart() { var $$ = this, config = $$.config, _$$$state = $$.state, clip = _$$$state.clip, hasAxis = _$$$state.hasAxis, _$$$$el = $$.$el, defs = _$$$$el.defs, svg = _$$$$el.svg, subchart = _$$$$el.subchart, axis = _$$$$el.axis; if (hasAxis) { var visibility = config.subchart_show ? "visible" : "hidden", clipId = clip.id + "-subchart", clipPath = $$.getClipPath(clipId); clip.idSubchart = clipId, $$.appendClip(defs, clipId), $$.initBrush(), subchart.main = svg.append("g").classed(config_classes.subchart, !0).attr("transform", $$.getTranslate("context")); var main = subchart.main; main.style("visibility", visibility), main.append("g").attr("clip-path", clipPath).attr("class", config_classes.chart), ["bar", "line", "bubble", "candlestick", "scatter"].forEach(function (v) { var type = capitalize(/^(bubble|scatter)$/.test(v) ? "circle" : v); if ($$.hasType(v) || $$.hasTypeOf(type)) { var chart = main.select("." + config_classes.chart), chartClassName = config_classes["chart" + type + "s"]; chart.select("." + chartClassName).empty() && chart.append("g").attr("class", chartClassName); } }), main.append("g").attr("clip-path", clipPath).attr("class", config_classes.brush).call($$.brush), axis.subX = main.append("g").attr("class", config_classes.axisX).attr("transform", $$.getTranslate("subX")).attr("clip-path", config.axis_rotated ? "" : clip.pathXAxis).style("visibility", config.subchart_axis_x_show ? visibility : "hidden"); } }, /** * Update sub chart * @param {object} targets $$.data.targets * @private */ updateTargetsForSubchart: function updateTargetsForSubchart(targets) { var $$ = this, config = $$.config, state = $$.state, main = $$.$el.subchart.main; config.subchart_show && (["bar", "line", "bubble", "candlestick", "scatter"].filter(function (v) { return $$.hasType(v) || $$.hasTypeOf(capitalize(v)); }).forEach(function (v) { var isPointType = /^(bubble|scatter)$/.test(v), name = capitalize(isPointType ? "circle" : v), chartClass = $$.getChartClass(name, !0), shapeClass = $$.getClass(isPointType ? "circles" : v + "s", !0), shapeChart = main.select("." + config_classes["chart" + (name + "s")]); if (isPointType) { var circle = shapeChart.selectAll("." + config_classes.circles).data(targets.filter($$["is" + capitalize(v) + "Type"].bind($$))).attr("class", shapeClass); circle.exit().remove(), circle.enter().append("g").attr("class", shapeClass); } else { var shapeUpdate = shapeChart.selectAll("." + config_classes["chart" + name]).attr("class", chartClass).data(targets.filter($$["is" + name + "Type"].bind($$))), shapeEnter = shapeUpdate.enter().append("g").style("opacity", "0").attr("class", chartClass).append("g").attr("class", shapeClass); // Area shapeUpdate.exit().remove(), v === "line" && $$.hasTypeOf("Area") && shapeEnter.append("g").attr("class", $$.getClass("areas", !0)); } }), main.selectAll("." + config_classes.brush + " rect").attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? state.width2 : state.height2)); }, /** * Redraw subchart. * @private * @param {boolean} withSubchart whether or not to show subchart * @param {number} duration duration * @param {object} shape Shape's info */ redrawSubchart: function redrawSubchart(withSubchart, duration, shape) { var $$ = this, config = $$.config, main = $$.$el.subchart.main, state = $$.state, withTransition = !!duration; // subchart if (main.style("visibility", config.subchart_show ? "visible" : "hidden"), config.subchart_show && (state.event && state.event.type === "zoom" && $$.brush.update(), withSubchart && (brushEmpty($$) || $$.brush.update(), Object.keys(shape.type).forEach(function (v) { var name = capitalize(v), drawFn = $$["generateDraw" + name](shape.indices[v], !0); $$["update" + name](duration, !0), $$["redraw" + name](drawFn, withTransition, !0); }), $$.hasType("bubble") || $$.hasType("scatter")))) // update subchart elements if needed { var cx = shape.pos.cx, cy = $$.updateCircleY(!0); $$.updateCircle(!0), $$.redrawCircle(cx, cy, withTransition, undefined, !0); } }, /** * Redraw the brush. * @private */ redrawForBrush: function redrawForBrush() { var $$ = this, _$$$config = $$.config, onBrush = _$$$config.subchart_onbrush, withY = _$$$config.zoom_rescale, scale = $$.scale; $$.redraw({ withTransition: !1, withY: withY, withSubchart: !1, withUpdateXDomain: !0, withDimension: !1 }), onBrush.bind($$.api)(scale.x.orgDomain()); }, /** * Transform context * @param {boolean} withTransition indicates transition is enabled * @param {object} transitions The return value of the generateTransitions method of Axis. * @private */ transformContext: function transformContext(withTransition, transitions) { var subXAxis, $$ = this, main = $$.$el.subchart.main; transitions && transitions.axisSubX ? subXAxis = transitions.axisSubX : (subXAxis = main.select("." + config_classes.axisX), withTransition && (subXAxis = subXAxis.transition())), main.attr("transform", $$.getTranslate("context")), subXAxis.attr("transform", $$.getTranslate("subX")); }, /** * Get extent value * @returns {Array} default extent * @private */ getExtent: function getExtent() { var $$ = this, config = $$.config, scale = $$.scale, extent = config.axis_x_extent; if (extent) if (isFunction(extent)) extent = extent.bind($$.api)($$.getXDomain($$.data.targets), scale.subX);else if ($$.axis.isTimeSeries() && extent.every(isNaN)) { var fn = parseDate.bind($$); extent = extent.map(function (v) { return scale.subX(fn(v)); }); } return extent; } }); ;// CONCATENATED MODULE: ./src/ChartInternal/interactions/zoom.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /* harmony default export */ var interactions_zoom = ({ /** * Initialize zoom. * @private */ initZoom: function initZoom() { var $$ = this; $$.scale.zoom = null, $$.generateZoom(), $$.initZoomBehaviour(); }, /** * Bind zoom event * @param {boolean} bind Weather bind or unbound * @private */ bindZoomEvent: function bindZoomEvent(bind) { bind === void 0 && (bind = !0); var $$ = this, config = $$.config, main = $$.$el.main, zoomEnabled = config.zoom_enabled, eventRects = main.select("." + config_classes.eventRects); zoomEnabled && bind ? !config.subchart_show && $$.bindZoomOnEventRect(eventRects, config.zoom_type) : bind === !1 && ($$.api.unzoom(), eventRects.on(".zoom", null).on(".drag", null)); }, /** * Generate zoom * @private */ generateZoom: function generateZoom() { var $$ = this, config = $$.config, org = $$.org, scale = $$.scale, zoom = (0,external_commonjs_d3_zoom_commonjs2_d3_zoom_amd_d3_zoom_root_d3_.zoom)().duration(0).on("start", $$.onZoomStart.bind($$)).on("zoom", $$.onZoom.bind($$)).on("end", $$.onZoomEnd.bind($$)); // get zoom extent // @ts-ignore // @ts-ignore /** * Update scale according zoom transform value * @param {object} transform transform object * @private */ // @ts-ignore zoom.orgScaleExtent = function () { var extent = config.zoom_extent || [1, 10]; return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])]; }, zoom.updateScaleExtent = function () { var ratio = diffDomain($$.scale.x.orgDomain()) / diffDomain($$.getZoomDomain()), extent = this.orgScaleExtent(); return this.scaleExtent([extent[0] * ratio, extent[1] * ratio]), this; }, zoom.updateTransformScale = function (transform) { org.xScale && org.xScale.range(scale.x.range()); // rescale from the original scale var newScale = transform[config.axis_rotated ? "rescaleY" : "rescaleX"](org.xScale || scale.x), domain = $$.trimXDomain(newScale.domain()), rescale = config.zoom_rescale; newScale.domain(domain, org.xDomain), scale.zoom = $$.getCustomizedScale(newScale), $$.axis.x.scale(scale.zoom), rescale && (!org.xScale && (org.xScale = scale.x.copy()), scale.x.domain(domain)); }, $$.zoom = zoom; }, /** * 'start' event listener * @param {object} event Event object * @private */ onZoomStart: function onZoomStart(event) { var $$ = this, sourceEvent = event.sourceEvent; sourceEvent && ($$.zoom.startEvent = sourceEvent, $$.state.zooming = !0, callFn($$.config.zoom_onzoomstart, $$.api, event)); }, /** * 'zoom' event listener * @param {object} event Event object * @private */ onZoom: function onZoom(event) { var $$ = this, config = $$.config, scale = $$.scale, org = $$.org, sourceEvent = event.sourceEvent; if (config.zoom_enabled && event.sourceEvent && $$.filterTargetsToShow($$.data.targets).length !== 0 && (scale.zoom || !(sourceEvent.type.indexOf("touch") > -1) || sourceEvent.touches.length !== 1)) { var isMousemove = sourceEvent.type === "mousemove", isZoomOut = sourceEvent.wheelDelta < 0, transform = event.transform; !isMousemove && isZoomOut && scale.x.domain().every(function (v, i) { return v !== org.xDomain[i]; }) && scale.x.domain(org.xDomain), $$.zoom.updateTransformScale(transform), $$.axis.isCategorized() && scale.x.orgDomain()[0] === org.xDomain[0] && scale.x.domain([org.xDomain[0] - 1e-10, scale.x.orgDomain()[1]]), $$.redraw({ withTransition: !1, withY: config.zoom_rescale, withSubchart: !1, withEventRect: !1, withDimension: !1 }), $$.state.cancelClick = isMousemove, callFn(config.zoom_onzoom, $$.api, scale.zoom.domain()); } }, /** * 'end' event listener * @param {object} event Event object * @private */ onZoomEnd: function onZoomEnd(event) { var $$ = this, config = $$.config, scale = $$.scale, startEvent = $$.zoom.startEvent, e = event && event.sourceEvent; startEvent && startEvent.type.indexOf("touch") > -1 && (startEvent = startEvent.changedTouches[0], e = e.changedTouches[0]); // if click, do nothing. otherwise, click interaction will be canceled. !startEvent || e && startEvent.clientX === e.clientX && startEvent.clientY === e.clientY || ($$.redrawEventRect(), $$.updateZoom(), $$.state.zooming = !1, callFn(config.zoom_onzoomend, $$.api, scale[scale.zoom ? "zoom" : "subX"].domain())); }, /** * Get zoom domain * @returns {Array} zoom domain * @private */ getZoomDomain: function getZoomDomain() { var $$ = this, config = $$.config, org = $$.org, _org$xDomain = org.xDomain, min = _org$xDomain[0], max = _org$xDomain[1]; return isDefined(config.zoom_x_min) && (min = getMinMax("min", [min, config.zoom_x_min])), isDefined(config.zoom_x_max) && (max = getMinMax("max", [max, config.zoom_x_max])), [min, max]; }, /** * Update zoom * @param {boolean} force Force unzoom * @private */ updateZoom: function updateZoom(force) { var $$ = this, _$$$scale = $$.scale, subX = _$$$scale.subX, x = _$$$scale.x, zoom = _$$$scale.zoom; if (zoom) { var zoomDomain = zoom.domain(), xDomain = subX.domain(), delta = .015, isfullyShown = (zoomDomain[0] <= xDomain[0] || zoomDomain[0] - delta <= xDomain[0]) && (xDomain[1] <= zoomDomain[1] || xDomain[1] <= zoomDomain[1] - delta); (force || isfullyShown) && ($$.axis.x.scale(subX), x.domain(subX.orgDomain()), $$.scale.zoom = null); } }, /** * Attach zoom event on <rect> * @param {d3.selection} eventRects evemt <rect> element * @param {string} type zoom type * @private */ bindZoomOnEventRect: function bindZoomOnEventRect(eventRects, type) { var $$ = this, behaviour = type === "drag" ? $$.zoomBehaviour : $$.zoom; // Since Chrome 89, wheel zoom not works properly // Applying the workaround: https://github.com/d3/d3-zoom/issues/231#issuecomment-802305692 $$.$el.svg.on("wheel", function () {}), eventRects.call(behaviour).on("dblclick.zoom", null); }, /** * Initialize the drag behaviour used for zooming. * @private */ initZoomBehaviour: function initZoomBehaviour() { var zoomRect, $$ = this, config = $$.config, state = $$.state, isRotated = config.axis_rotated, start = 0, end = 0, prop = { axis: isRotated ? "y" : "x", attr: isRotated ? "height" : "width", index: isRotated ? 1 : 0 }; $$.zoomBehaviour = (0,external_commonjs_d3_drag_commonjs2_d3_drag_amd_d3_drag_root_d3_.drag)().clickDistance(4).on("start", function (event) { state.event = event, $$.setDragStatus(!0), $$.unselectRect(), zoomRect || (zoomRect = $$.$el.main.append("rect").attr("clip-path", state.clip.path).attr("class", config_classes.zoomBrush).attr("width", isRotated ? state.width : 0).attr("height", isRotated ? 0 : state.height)), start = getPointer(event, this)[prop.index], end = start, zoomRect.attr(prop.axis, start).attr(prop.attr, 0), $$.onZoomStart(event); }).on("drag", function (event) { end = getPointer(event, this)[prop.index], zoomRect.attr(prop.axis, Math.min(start, end)).attr(prop.attr, Math.abs(end - start)); }).on("end", function (event) { var _ref, scale = $$.scale.zoom || $$.scale.x; if (state.event = event, $$.setDragStatus(!1), zoomRect.attr(prop.axis, 0).attr(prop.attr, 0), start > end && (_ref = [end, start], start = _ref[0], end = _ref[1], _ref), start < 0 && (end += Math.abs(start), start = 0), start !== end) $$.api.zoom([start, end].map(function (v) { return scale.invert(v); })), $$.onZoomEnd(event);else if ($$.isMultipleX()) $$.clickHandlerForMultipleXS.bind(this)($$);else { var _getPointer = getPointer(event), x = _getPointer[0], y = _getPointer[1], target = browser_doc.elementFromPoint(x, y); $$.clickHandlerForSingleX.bind(target)((0,external_commonjs_d3_selection_commonjs2_d3_selection_amd_d3_selection_root_d3_.select)(target).datum(), $$); } }); }, setZoomResetButton: function setZoomResetButton() { var $$ = this, config = $$.config, resetButton = config.zoom_resetButton; resetButton && config.zoom_type === "drag" && ($$.zoom.resetBtn ? $$.zoom.resetBtn.style("display", null) : $$.zoom.resetBtn = $$.$el.chart.append("div").classed(config_classes.button, !0).append("span").on("click", function () { isFunction(resetButton.onclick) && resetButton.onclick.bind($$.api)(this), $$.api.unzoom(); }).classed(config_classes.buttonZoomReset, !0).text(resetButton.text || "Reset Zoom")); } }); ;// CONCATENATED MODULE: ./src/config/Options/data/selection.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * data.selection config options */ /* harmony default export */ var data_selection = ({ /** * Set data selection enabled<br><br> * If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected). * - **NOTE:** for ESM imports, needs to import 'selection' exports and instantiate it by calling `selection()`. * - `enabled: selection()` * @name data․selection․enabled * @memberof Options * @type {boolean} * @default false * @see [Demo](https://naver.github.io/billboard.js/demo/#Data.DataSelection) * @example * data: { * selection: { * enabled: true * } * } * @example * // importing ESM * import bb, {selection} from "billboard.js"; * * data: { * selection: { * enabled: selection(), * ... * } * } */ data_selection_enabled: !1, /** * Set grouped selection enabled.<br><br> * If this option set true, multiple data points that have same x value will be selected by one selection. * @name data․selection․grouped * @memberof Options * @type {boolean} * @default false * @example * data: { * selection: { * grouped: true * } * } */ data_selection_grouped: !1, /** * Set a callback for each data point to determine if it's selectable or not.<br><br> * The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean. * @name data․selection․isselectable * @memberof Options * @type {Function} * @default function() { return true; } * @example * data: { * selection: { * isselectable: function(d) { ... } * } * } */ data_selection_isselectable: function data_selection_isselectable() { return !0; }, /** * Set multiple data points selection enabled.<br><br> * If this option set true, multile data points can have the selected state at the same time. If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected. * @name data․selection․multiple * @memberof Options * @type {boolean} * @default true * @example * data: { * selection: { * multiple: false * } * } */ data_selection_multiple: !0, /** * Enable to select data points by dragging. * If this option set true, data points can be selected by dragging. * - **NOTE:** If this option set true, scrolling on the chart will be disabled because dragging event will handle the event. * @name data․selection․draggable * @memberof Options * @type {boolean} * @default false * @example * data: { * selection: { * draggable: true * } * } */ data_selection_draggable: !1, /** * Set a callback for on data selection. * @name data․onselected * @memberof Options * @type {Function} * @default function() {} * @example * data: { * onselected: function(d, element) { * // d - ex) {x: 4, value: 150, id: "data1", index: 4, name: "data1"} * // element - <circle> * ... * } * } */ data_onselected: function data_onselected() {}, /** * Set a callback for on data un-selection. * @name data․onunselected * @memberof Options * @type {Function} * @default function() {} * @example * data: { * onunselected: function(d, element) { * // d - ex) {x: 4, value: 150, id: "data1", index: 4, name: "data1"} * // element - <circle> * ... * } * } */ data_onunselected: function data_onunselected() {} }); ;// CONCATENATED MODULE: ./src/config/Options/interaction/subchart.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * x Axis config options */ /* harmony default export */ var interaction_subchart = ({ /** * Set subchart options. * - **NOTE:** Not supported for `bubble`, `scatter` and non-Axis based(pie, donut, gauge, radar) types. * @name subchart * @memberof Options * @type {object} * @property {object} subchart Subchart object * @property {boolean} [subchart.show=false] Show sub chart on the bottom of the chart. * - **NOTE:** for ESM imports, needs to import 'subchart' exports and instantiate it by calling `subchart()`. * - `show: subchart()` * @property {boolean} [subchart.axis.x.show=true] Show or hide x axis. * @property {boolean} [subchart.axis.x.tick.show=true] Show or hide x axis tick line. * @property {boolean} [subchart.axis.x.tick.text.show=true] Show or hide x axis tick text. * @property {number} [subchart.size.height] Change the height of the subchart. * @property {Function} [subchart.onbrush] Set callback for brush event.<br> * Specified function receives the current zoomed x domain. * @see [Demo](https://naver.github.io/billboard.js/demo/#Interaction.SubChart) * @example * subchart: { * show: true, * size: { * height: 20 * }, * axis: { * x: { * show: true, * tick: { * show: true, * text: { * show: false * } * } * } * }, * onbrush: function(domain) { ... } * } * @example * // importing ESM * import bb, {subchart} from "billboard.js"; * * subchart: { * show: subchart(), * ... * } */ subchart_show: !1, subchart_size_height: 60, subchart_axis_x_show: !0, subchart_axis_x_tick_show: !0, subchart_axis_x_tick_text_show: !0, subchart_onbrush: function subchart_onbrush() {} }); ;// CONCATENATED MODULE: ./src/config/Options/interaction/zoom.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ /** * zoom config options */ /* harmony default export */ var interaction_zoom = ({ /** * Set zoom options * @name zoom * @memberof Options * @type {object} * @property {object} zoom Zoom object * @property {boolean} [zoom.enabled=false] Enable zooming. * - **NOTE:** for ESM imports, needs to import 'zoom' exports and instantiate it by calling `zoom()`. * - `enabled: zoom()` * @property {string} [zoom.type='wheel'] Set zoom interaction type. * - **Available types:** * - wheel * - drag * @property {boolean} [zoom.rescale=false] Enable to rescale after zooming.<br> * If true set, y domain will be updated according to the zoomed region. * @property {Array} [zoom.extent=[1, 10]] Change zoom extent. * @property {number|Date} [zoom.x.min] Set x Axis minimum zoom range * @property {number|Date} [zoom.x.max] Set x Axis maximum zoom range * @property {Function} [zoom.onzoomstart=undefined] Set callback that is called when zooming starts.<br> * Specified function receives the zoom event. * @property {Function} [zoom.onzoom=undefined] Set callback that is called when the chart is zooming.<br> * Specified function receives the zoomed domain. * @property {Function} [zoom.onzoomend=undefined] Set callback that is called when zooming ends.<br> * Specified function receives the zoomed domain. * @property {boolean|object} [zoom.resetButton=true] Set to display zoom reset button for 'drag' type zoom * @property {Function} [zoom.resetButton.onclick] Set callback when clicks the reset button. The callback will receive reset button element reference as argument. * @property {string} [zoom.resetButton.text='Reset Zoom'] Text value for zoom reset button. * @see [Demo:zoom](https://naver.github.io/billboard.js/demo/#Interaction.Zoom) * @see [Demo:drag zoom](https://naver.github.io/billboard.js/demo/#Interaction.DragZoom) * @example * zoom: { * enabled: true, * type: "drag", * rescale: true, * extent: [1, 100] // enable more zooming * x: { * min: -1, // set min range * max: 10 // set max range * }, * onzoomstart: function(event) { ... }, * onzoom: function(domain) { ... }, * onzoomend: function(domain) { ... }, * * // show reset button when is zoomed-in * resetButton: true, * * resetButton: { * // onclick callback when reset button is clicked * onclick: function(button) { * button; // Reset button element reference * ... * }, * * // customized text value for reset zoom button * text: "Unzoom" * } * } * @example * // importing ESM * import bb, {zoom} from "billboard.js"; * * zoom: { * enabled: zoom(), * ... * } */ zoom_enabled: !1, zoom_type: "wheel", zoom_extent: undefined, zoom_privileged: !1, zoom_rescale: !1, zoom_onzoom: undefined, zoom_onzoomstart: undefined, zoom_onzoomend: undefined, zoom_resetButton: !0, zoom_x_min: undefined, zoom_x_max: undefined }); ;// CONCATENATED MODULE: ./src/config/resolver/interaction.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license */ // Chart // ChartInternal // Axis based options var _selectionModule = function selectionModule() { return extend(ChartInternal.prototype, internals_selection), extend(Chart.prototype, selection), Options.setOptions([data_selection]), (_selectionModule = function selectionModule() { return !0; })(); }, subchartModule = function () { return extend(ChartInternal.prototype, interactions_subchart), extend(Chart.prototype, subchart), Options.setOptions([interaction_subchart]), (subchartModule = function () { return !0; })(); }, zoomModule = function () { return extend(ChartInternal.prototype, interactions_zoom), extend(Chart.prototype, api_zoom), Options.setOptions([interaction_zoom]), (zoomModule = function () { return !0; })(); }; ;// CONCATENATED MODULE: ./src/core.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard project is licensed under the MIT license */ // eslint-disable-next-line no-use-before-define var _defaults = {}, bb = { /** * Version information * @property {string} version version * @example * bb.version; // "1.0.0" * @memberof bb */ version: "3.0.2", /** * Generate chart * - **NOTE:** Bear in mind for the possiblity of ***throwing an error***, during the generation when: * - Unused option value is given. * - ex) For `data.type="pie"` option, setting 'axis' option can cause unexpected generation error. * - Insufficient value is given for certain option used. * - ex) `data: { x: "x", columns: [["x"], ["data1", 30, 200, 100]] }` * @param {Options} config chart options * @memberof bb * @returns {Chart} * @see {@link Options} for different generation options * @see {@link Chart} for different methods API * @example * <!-- chart holder --> * <div id="LineChart"></div> * @example * // Generate chart with options * var chart = bb.generate({ * "bindto": "#LineChart" * "data": { * "columns": [ * ["data1", 30, 200, 100, 400, 150, 250], * ["data2", 50, 20, 10, 40, 15, 25] * ], * "type": "line" * } * }); * * // call some API * // ex) get the data of 'data1' * chart.data("data1"); * @example * // Generate chart by importing ESM * // Import types to be used only, where this will make smaller bundle size. * import bb, { * area, * areaLineRange, * areaSpline, * areaSplineRange, * areaStep, * bar, * bubble, * donut, * gauge, * line, * pie, * radar, * scatter, * spline, * step * } * * bb.generate({ * "bindto": "#LineChart" * "data": { * "columns": [ * ["data1", 30, 200, 100, 400, 150, 250], * ["data2", 50, 20, 10, 40, 15, 25] * ] * }, * type: line(), * * // or * types: { * data1: bar(), * data2: step() * } * }); */ generate: function generate(config) { var options = mergeObj({}, _defaults, config), inst = new Chart(options); return inst.internal.charts = this.instance, this.instance.push(inst), inst; }, /** * Set or get global default options. * - **NOTE:** * - The options values settings are valid within page context only. * - If is called multiple times, will override the last value. * @param {Options} options chart options * @memberof bb * @returns {Options} * @see {@link Options} * @example * // Set same option value as for `.generate()` * bb.defaults({ * data: { * type: "bar" * } * }); * * bb.defaults(); // {data:{type: "bar"}} * * // data.type defaults to 'bar' * var chart = bb.generate({ ... }); */ defaults: function defaults(options) { return isObject(options) && (_defaults = options), _defaults; }, /** * An array containing instance created * @property {Array} instance instance array * @example * // generate charts * var chart1 = bb.generate(...); * var chart2 = bb.generate(...); * * bb.instance; // [ chart1, chart2, ... ] * @memberof bb */ instance: [], /** * Namespace for plugins * @property {object} plugin plugin namespace * @example * // Stanford diagram plugin * bb.plugin.stanford; * @memberof bb */ plugin: {} }; /** * @namespace bb * @version 3.0.2 */ ;// CONCATENATED MODULE: ./src/index.ts /** * Copyright (c) 2017 ~ present NAVER Corp. * billboard project is licensed under the MIT license */ // extends shape modules Object.keys(resolver_shape_namespaceObject).forEach(function (v) { return resolver_shape_namespaceObject[v](); }), Object.keys(resolver_interaction_namespaceObject).forEach(function (v) { return resolver_interaction_namespaceObject[v](); }); }(); /******/ return __webpack_exports__; /******/ })() ; });����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/dygraph-combined.js�������������������������������������������������0000664�0000000�0000000�00000364753�14136337723�0022151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! @license Copyright 2014 Dan Vanderkam (danvdk@gmail.com) MIT-licensed (http://opensource.org/licenses/MIT) */ !function(t){"use strict";for(var e,a,i={},r=function(){},n="memory".split(","),o="assert,clear,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn".split(",");e=n.pop();)t[e]=t[e]||i;for(;a=o.pop();)t[a]=t[a]||r}(this.console=this.console||{}),function(){"use strict";CanvasRenderingContext2D.prototype.installPattern=function(t){if("undefined"!=typeof this.isPatternInstalled)throw"Must un-install old line pattern before installing a new one.";this.isPatternInstalled=!0;var e=[0,0],a=[],i=this.beginPath,r=this.lineTo,n=this.moveTo,o=this.stroke;this.uninstallPattern=function(){this.beginPath=i,this.lineTo=r,this.moveTo=n,this.stroke=o,this.uninstallPattern=void 0,this.isPatternInstalled=void 0},this.beginPath=function(){a=[],i.call(this)},this.moveTo=function(t,e){a.push([[t,e]]),n.call(this,t,e)},this.lineTo=function(t,e){var i=a[a.length-1];i.push([t,e])},this.stroke=function(){if(0===a.length)return void o.call(this);for(var i=0;i<a.length;i++)for(var s=a[i],l=s[0][0],h=s[0][1],p=1;p<s.length;p++){var g=s[p][0],d=s[p][1];this.save();var u=g-l,c=d-h,y=Math.sqrt(u*u+c*c),_=Math.atan2(c,u);this.translate(l,h),n.call(this,0,0),this.rotate(_);for(var v=e[0],f=0;y>f;){var x=t[v];f+=e[1]?e[1]:x,f>y?(e=[v,f-y],f=y):e=[(v+1)%t.length,0],v%2===0?r.call(this,f,0):n.call(this,f,0),v=(v+1)%t.length}this.restore(),l=g,h=d}o.call(this),a=[]}},CanvasRenderingContext2D.prototype.uninstallPattern=function(){throw"Must install a line pattern before uninstalling it."}}();var DygraphOptions=function(){return function(){"use strict";var t=function(t){this.dygraph_=t,this.yAxes_=[],this.xAxis_={},this.series_={},this.global_=this.dygraph_.attrs_,this.user_=this.dygraph_.user_attrs_||{},this.labels_=[],this.highlightSeries_=this.get("highlightSeriesOpts")||{},this.reparseSeries()};t.AXIS_STRING_MAPPINGS_={y:0,Y:0,y1:0,Y1:0,y2:1,Y2:1},t.axisToIndex_=function(e){if("string"==typeof e){if(t.AXIS_STRING_MAPPINGS_.hasOwnProperty(e))return t.AXIS_STRING_MAPPINGS_[e];throw"Unknown axis : "+e}if("number"==typeof e){if(0===e||1===e)return e;throw"Dygraphs only supports two y-axes, indexed from 0-1."}if(e)throw"Unknown axis : "+e;return 0},t.prototype.reparseSeries=function(){var e=this.get("labels");if(e){this.labels_=e.slice(1),this.yAxes_=[{series:[],options:{}}],this.xAxis_={options:{}},this.series_={};var a=!this.user_.series;if(a){for(var i=0,r=0;r<this.labels_.length;r++){var n=this.labels_[r],o=this.user_[n]||{},s=0,l=o.axis;"object"==typeof l&&(s=++i,this.yAxes_[s]={series:[n],options:l}),l||this.yAxes_[0].series.push(n),this.series_[n]={idx:r,yAxis:s,options:o}}for(var r=0;r<this.labels_.length;r++){var n=this.labels_[r],o=this.series_[n].options,l=o.axis;if("string"==typeof l){if(!this.series_.hasOwnProperty(l))return void console.error("Series "+n+" wants to share a y-axis with series "+l+", which does not define its own axis.");var s=this.series_[l].yAxis;this.series_[n].yAxis=s,this.yAxes_[s].series.push(n)}}}else for(var r=0;r<this.labels_.length;r++){var n=this.labels_[r],o=this.user_.series[n]||{},s=t.axisToIndex_(o.axis);this.series_[n]={idx:r,yAxis:s,options:o},this.yAxes_[s]?this.yAxes_[s].series.push(n):this.yAxes_[s]={series:[n],options:{}}}var h=this.user_.axes||{};Dygraph.update(this.yAxes_[0].options,h.y||{}),this.yAxes_.length>1&&Dygraph.update(this.yAxes_[1].options,h.y2||{}),Dygraph.update(this.xAxis_.options,h.x||{})}},t.prototype.get=function(t){var e=this.getGlobalUser_(t);return null!==e?e:this.getGlobalDefault_(t)},t.prototype.getGlobalUser_=function(t){return this.user_.hasOwnProperty(t)?this.user_[t]:null},t.prototype.getGlobalDefault_=function(t){return this.global_.hasOwnProperty(t)?this.global_[t]:Dygraph.DEFAULT_ATTRS.hasOwnProperty(t)?Dygraph.DEFAULT_ATTRS[t]:null},t.prototype.getForAxis=function(t,e){var a,i;if("number"==typeof e)a=e,i=0===a?"y":"y2";else{if("y1"==e&&(e="y"),"y"==e)a=0;else if("y2"==e)a=1;else{if("x"!=e)throw"Unknown axis "+e;a=-1}i=e}var r=-1==a?this.xAxis_:this.yAxes_[a];if(r){var n=r.options;if(n.hasOwnProperty(t))return n[t]}if("x"!==e||"logscale"!==t){var o=this.getGlobalUser_(t);if(null!==o)return o}var s=Dygraph.DEFAULT_ATTRS.axes[i];return s.hasOwnProperty(t)?s[t]:this.getGlobalDefault_(t)},t.prototype.getForSeries=function(t,e){if(e===this.dygraph_.getHighlightSeries()&&this.highlightSeries_.hasOwnProperty(t))return this.highlightSeries_[t];if(!this.series_.hasOwnProperty(e))throw"Unknown series: "+e;var a=this.series_[e],i=a.options;return i.hasOwnProperty(t)?i[t]:this.getForAxis(t,a.yAxis)},t.prototype.numAxes=function(){return this.yAxes_.length},t.prototype.axisForSeries=function(t){return this.series_[t].yAxis},t.prototype.axisOptions=function(t){return this.yAxes_[t].options},t.prototype.seriesForAxis=function(t){return this.yAxes_[t].series},t.prototype.seriesNames=function(){return this.labels_};return t}()}(),DygraphLayout=function(){"use strict";var t=function(t){this.dygraph_=t,this.points=[],this.setNames=[],this.annotations=[],this.yAxes_=null,this.xTicks_=null,this.yTicks_=null};return t.prototype.addDataset=function(t,e){this.points.push(e),this.setNames.push(t)},t.prototype.getPlotArea=function(){return this.area_},t.prototype.computePlotArea=function(){var t={x:0,y:0};t.w=this.dygraph_.width_-t.x-this.dygraph_.getOption("rightGap"),t.h=this.dygraph_.height_;var e={chart_div:this.dygraph_.graphDiv,reserveSpaceLeft:function(e){var a={x:t.x,y:t.y,w:e,h:t.h};return t.x+=e,t.w-=e,a},reserveSpaceRight:function(e){var a={x:t.x+t.w-e,y:t.y,w:e,h:t.h};return t.w-=e,a},reserveSpaceTop:function(e){var a={x:t.x,y:t.y,w:t.w,h:e};return t.y+=e,t.h-=e,a},reserveSpaceBottom:function(e){var a={x:t.x,y:t.y+t.h-e,w:t.w,h:e};return t.h-=e,a},chartRect:function(){return{x:t.x,y:t.y,w:t.w,h:t.h}}};this.dygraph_.cascadeEvents_("layout",e),this.area_=t},t.prototype.setAnnotations=function(t){this.annotations=[];for(var e=this.dygraph_.getOption("xValueParser")||function(t){return t},a=0;a<t.length;a++){var i={};if(!t[a].xval&&void 0===t[a].x)return void console.error("Annotations must have an 'x' property");if(t[a].icon&&(!t[a].hasOwnProperty("width")||!t[a].hasOwnProperty("height")))return void console.error("Must set width and height when setting annotation.icon property");Dygraph.update(i,t[a]),i.xval||(i.xval=e(i.x)),this.annotations.push(i)}},t.prototype.setXTicks=function(t){this.xTicks_=t},t.prototype.setYAxes=function(t){this.yAxes_=t},t.prototype.evaluate=function(){this._xAxis={},this._evaluateLimits(),this._evaluateLineCharts(),this._evaluateLineTicks(),this._evaluateAnnotations()},t.prototype._evaluateLimits=function(){var t=this.dygraph_.xAxisRange();this._xAxis.minval=t[0],this._xAxis.maxval=t[1];var e=t[1]-t[0];this._xAxis.scale=0!==e?1/e:1,this.dygraph_.getOptionForAxis("logscale","x")&&(this._xAxis.xlogrange=Dygraph.log10(this._xAxis.maxval)-Dygraph.log10(this._xAxis.minval),this._xAxis.xlogscale=0!==this._xAxis.xlogrange?1/this._xAxis.xlogrange:1);for(var a=0;a<this.yAxes_.length;a++){var i=this.yAxes_[a];i.minyval=i.computedValueRange[0],i.maxyval=i.computedValueRange[1],i.yrange=i.maxyval-i.minyval,i.yscale=0!==i.yrange?1/i.yrange:1,this.dygraph_.getOption("logscale")&&(i.ylogrange=Dygraph.log10(i.maxyval)-Dygraph.log10(i.minyval),i.ylogscale=0!==i.ylogrange?1/i.ylogrange:1,(!isFinite(i.ylogrange)||isNaN(i.ylogrange))&&console.error("axis "+a+" of graph at "+i.g+" can't be displayed in log scale for range ["+i.minyval+" - "+i.maxyval+"]"))}},t.calcXNormal_=function(t,e,a){return a?(Dygraph.log10(t)-Dygraph.log10(e.minval))*e.xlogscale:(t-e.minval)*e.scale},t.calcYNormal_=function(t,e,a){if(a){var i=1-(Dygraph.log10(e)-Dygraph.log10(t.minyval))*t.ylogscale;return isFinite(i)?i:0/0}return 1-(e-t.minyval)*t.yscale},t.prototype._evaluateLineCharts=function(){for(var e=this.dygraph_.getOption("stackedGraph"),a=this.dygraph_.getOptionForAxis("logscale","x"),i=0;i<this.points.length;i++){for(var r=this.points[i],n=this.setNames[i],o=this.dygraph_.getOption("connectSeparatedPoints",n),s=this.dygraph_.axisPropertiesForSeries(n),l=this.dygraph_.attributes_.getForSeries("logscale",n),h=0;h<r.length;h++){var p=r[h];p.x=t.calcXNormal_(p.xval,this._xAxis,a);var g=p.yval;e&&(p.y_stacked=t.calcYNormal_(s,p.yval_stacked,l),null===g||isNaN(g)||(g=p.yval_stacked)),null===g&&(g=0/0,o||(p.yval=0/0)),p.y=t.calcYNormal_(s,g,l)}this.dygraph_.dataHandler_.onLineEvaluated(r,s,l)}},t.prototype._evaluateLineTicks=function(){var t,e,a,i;for(this.xticks=[],t=0;t<this.xTicks_.length;t++)e=this.xTicks_[t],a=e.label,i=this.dygraph_.toPercentXCoord(e.v),i>=0&&1>i&&this.xticks.push([i,a]);for(this.yticks=[],t=0;t<this.yAxes_.length;t++)for(var r=this.yAxes_[t],n=0;n<r.ticks.length;n++)e=r.ticks[n],a=e.label,i=this.dygraph_.toPercentYCoord(e.v,t),i>0&&1>=i&&this.yticks.push([t,i,a])},t.prototype._evaluateAnnotations=function(){var t,e={};for(t=0;t<this.annotations.length;t++){var a=this.annotations[t];e[a.xval+","+a.series]=a}if(this.annotated_points=[],this.annotations&&this.annotations.length)for(var i=0;i<this.points.length;i++){var r=this.points[i];for(t=0;t<r.length;t++){var n=r[t],o=n.xval+","+n.name;o in e&&(n.annotation=e[o],this.annotated_points.push(n))}}},t.prototype.removeAllDatasets=function(){delete this.points,delete this.setNames,delete this.setPointsLengths,delete this.setPointsOffsets,this.points=[],this.setNames=[],this.setPointsLengths=[],this.setPointsOffsets=[]},t}(),DygraphCanvasRenderer=function(){"use strict";var t=function(t,e,a,i){if(this.dygraph_=t,this.layout=i,this.element=e,this.elementContext=a,this.height=t.height_,this.width=t.width_,!this.isIE&&!Dygraph.isCanvasSupported(this.element))throw"Canvas is not supported.";if(this.area=i.getPlotArea(),this.dygraph_.isUsingExcanvas_)this._createIEClipArea();else if(!Dygraph.isAndroid()){var r=this.dygraph_.canvas_ctx_;r.beginPath(),r.rect(this.area.x,this.area.y,this.area.w,this.area.h),r.clip(),r=this.dygraph_.hidden_ctx_,r.beginPath(),r.rect(this.area.x,this.area.y,this.area.w,this.area.h),r.clip()}};return t.prototype.clear=function(){var t;if(this.isIE)try{this.clearDelay&&(this.clearDelay.cancel(),this.clearDelay=null),t=this.elementContext}catch(e){return}t=this.elementContext,t.clearRect(0,0,this.width,this.height)},t.prototype.render=function(){this._updatePoints(),this._renderLineChart()},t.prototype._createIEClipArea=function(){function t(t){if(0!==t.w&&0!==t.h){var i=document.createElement("div");i.className=e,i.style.backgroundColor=r,i.style.position="absolute",i.style.left=t.x+"px",i.style.top=t.y+"px",i.style.width=t.w+"px",i.style.height=t.h+"px",a.appendChild(i)}}for(var e="dygraph-clip-div",a=this.dygraph_.graphDiv,i=a.childNodes.length-1;i>=0;i--)a.childNodes[i].className==e&&a.removeChild(a.childNodes[i]);for(var r=document.bgColor,n=this.dygraph_.graphDiv;n!=document;){var o=n.currentStyle.backgroundColor;if(o&&"transparent"!=o){r=o;break}n=n.parentNode}var s=this.area;t({x:0,y:0,w:s.x,h:this.height}),t({x:s.x,y:0,w:this.width-s.x,h:s.y}),t({x:s.x+s.w,y:0,w:this.width-s.x-s.w,h:this.height}),t({x:s.x,y:s.y+s.h,w:this.width-s.x,h:this.height-s.h-s.y})},t._getIteratorPredicate=function(e){return e?t._predicateThatSkipsEmptyPoints:null},t._predicateThatSkipsEmptyPoints=function(t,e){return null!==t[e].yval},t._drawStyledLine=function(e,a,i,r,n,o,s){var l=e.dygraph,h=l.getBooleanOption("stepPlot",e.setName);Dygraph.isArrayLike(r)||(r=null);var p=l.getBooleanOption("drawGapEdgePoints",e.setName),g=e.points,d=e.setName,u=Dygraph.createIterator(g,0,g.length,t._getIteratorPredicate(l.getBooleanOption("connectSeparatedPoints",d))),c=r&&r.length>=2,y=e.drawingContext;y.save(),c&&y.installPattern(r);var _=t._drawSeries(e,u,i,s,n,p,h,a);t._drawPointsOnLine(e,_,o,a,s),c&&y.uninstallPattern(),y.restore()},t._drawSeries=function(t,e,a,i,r,n,o,s){var l,h,p=null,g=null,d=null,u=[],c=!0,y=t.drawingContext;y.beginPath(),y.strokeStyle=s,y.lineWidth=a;for(var _=e.array_,v=e.end_,f=e.predicate_,x=e.start_;v>x;x++){if(h=_[x],f){for(;v>x&&!f(_,x);)x++;if(x==v)break;h=_[x]}if(null===h.canvasy||h.canvasy!=h.canvasy)o&&null!==p&&(y.moveTo(p,g),y.lineTo(h.canvasx,g)),p=g=null;else{if(l=!1,n||!p){e.nextIdx_=x,e.next(),d=e.hasNext?e.peek.canvasy:null;var m=null===d||d!=d;l=!p&&m,n&&(!c&&!p||e.hasNext&&m)&&(l=!0)}null!==p?a&&(o&&(y.moveTo(p,g),y.lineTo(h.canvasx,g)),y.lineTo(h.canvasx,h.canvasy)):y.moveTo(h.canvasx,h.canvasy),(r||l)&&u.push([h.canvasx,h.canvasy,h.idx]),p=h.canvasx,g=h.canvasy}c=!1}return y.stroke(),u},t._drawPointsOnLine=function(t,e,a,i,r){for(var n=t.drawingContext,o=0;o<e.length;o++){var s=e[o];n.save(),a.call(t.dygraph,t.dygraph,t.setName,n,s[0],s[1],i,r,s[2]),n.restore()}},t.prototype._updatePoints=function(){for(var t=this.layout.points,e=t.length;e--;)for(var a=t[e],i=a.length;i--;){var r=a[i];r.canvasx=this.area.w*r.x+this.area.x,r.canvasy=this.area.h*r.y+this.area.y}},t.prototype._renderLineChart=function(t,e){var a,i,r=e||this.elementContext,n=this.layout.points,o=this.layout.setNames;this.colors=this.dygraph_.colorsMap_;var s=this.dygraph_.getOption("plotter"),l=s;Dygraph.isArrayLike(l)||(l=[l]);var h={};for(a=0;a<o.length;a++){i=o[a];var p=this.dygraph_.getOption("plotter",i);p!=s&&(h[i]=p)}for(a=0;a<l.length;a++)for(var g=l[a],d=a==l.length-1,u=0;u<n.length;u++)if(i=o[u],!t||i==t){var c=n[u],y=g;if(i in h){if(!d)continue;y=h[i]}var _=this.colors[i],v=this.dygraph_.getOption("strokeWidth",i);r.save(),r.strokeStyle=_,r.lineWidth=v,y({points:c,setName:i,drawingContext:r,color:_,strokeWidth:v,dygraph:this.dygraph_,axis:this.dygraph_.axisPropertiesForSeries(i),plotArea:this.area,seriesIndex:u,seriesCount:n.length,singleSeriesName:t,allSeriesPoints:n}),r.restore()}},t._Plotters={linePlotter:function(e){t._linePlotter(e)},fillPlotter:function(e){t._fillPlotter(e)},errorPlotter:function(e){t._errorPlotter(e)}},t._linePlotter=function(e){var a=e.dygraph,i=e.setName,r=e.strokeWidth,n=a.getNumericOption("strokeBorderWidth",i),o=a.getOption("drawPointCallback",i)||Dygraph.Circles.DEFAULT,s=a.getOption("strokePattern",i),l=a.getBooleanOption("drawPoints",i),h=a.getNumericOption("pointSize",i);n&&r&&t._drawStyledLine(e,a.getOption("strokeBorderColor",i),r+2*n,s,l,o,h),t._drawStyledLine(e,e.color,r,s,l,o,h)},t._errorPlotter=function(e){var a=e.dygraph,i=e.setName,r=a.getBooleanOption("errorBars")||a.getBooleanOption("customBars");if(r){var n=a.getBooleanOption("fillGraph",i);n&&console.warn("Can't use fillGraph option with error bars");var o,s=e.drawingContext,l=e.color,h=a.getNumericOption("fillAlpha",i),p=a.getBooleanOption("stepPlot",i),g=e.points,d=Dygraph.createIterator(g,0,g.length,t._getIteratorPredicate(a.getBooleanOption("connectSeparatedPoints",i))),u=0/0,c=0/0,y=[-1,-1],_=Dygraph.toRGB_(l),v="rgba("+_.r+","+_.g+","+_.b+","+h+")";s.fillStyle=v,s.beginPath();for(var f=function(t){return null===t||void 0===t||isNaN(t)};d.hasNext;){var x=d.next();!p&&f(x.y)||p&&!isNaN(c)&&f(c)?u=0/0:(o=[x.y_bottom,x.y_top],p&&(c=x.y),isNaN(o[0])&&(o[0]=x.y),isNaN(o[1])&&(o[1]=x.y),o[0]=e.plotArea.h*o[0]+e.plotArea.y,o[1]=e.plotArea.h*o[1]+e.plotArea.y,isNaN(u)||(p?(s.moveTo(u,y[0]),s.lineTo(x.canvasx,y[0]),s.lineTo(x.canvasx,y[1])):(s.moveTo(u,y[0]),s.lineTo(x.canvasx,o[0]),s.lineTo(x.canvasx,o[1])),s.lineTo(u,y[1]),s.closePath()),y=o,u=x.canvasx)}s.fill()}},t._fastCanvasProxy=function(t){var e=[],a=null,i=null,r=1,n=2,o=0,s=function(t){if(!(e.length<=1)){for(var a=e.length-1;a>0;a--){var i=e[a];if(i[0]==n){var o=e[a-1];o[1]==i[1]&&o[2]==i[2]&&e.splice(a,1)}}for(var a=0;a<e.length-1;){var i=e[a];i[0]==n&&e[a+1][0]==n?e.splice(a,1):a++}if(e.length>2&&!t){var s=0;e[0][0]==n&&s++;for(var l=null,h=null,a=s;a<e.length;a++){var i=e[a];if(i[0]==r)if(null===l&&null===h)l=a,h=a;else{var p=i[2];p<e[l][2]?l=a:p>e[h][2]&&(h=a)}}var g=e[l],d=e[h];e.splice(s,e.length-s),h>l?(e.push(g),e.push(d)):l>h?(e.push(d),e.push(g)):e.push(g)}}},l=function(a){s(a);for(var l=0,h=e.length;h>l;l++){var p=e[l];p[0]==r?t.lineTo(p[1],p[2]):p[0]==n&&t.moveTo(p[1],p[2])}e.length&&(i=e[e.length-1][1]),o+=e.length,e=[]},h=function(t,r,n){var o=Math.round(r);if(null===a||o!=a){var s=a-i>1,h=o-a>1,p=s||h;l(p),a=o}e.push([t,r,n])};return{moveTo:function(t,e){h(n,t,e)},lineTo:function(t,e){h(r,t,e)},stroke:function(){l(!0),t.stroke()},fill:function(){l(!0),t.fill()},beginPath:function(){l(!0),t.beginPath()},closePath:function(){l(!0),t.closePath()},_count:function(){return o}}},t._fillPlotter=function(e){if(!e.singleSeriesName&&0===e.seriesIndex){for(var a=e.dygraph,i=a.getLabels().slice(1),r=i.length;r>=0;r--)a.visibility()[r]||i.splice(r,1);var n=function(){for(var t=0;t<i.length;t++)if(a.getBooleanOption("fillGraph",i[t]))return!0;return!1}();if(n)for(var o,s,l=e.plotArea,h=e.allSeriesPoints,p=h.length,g=a.getNumericOption("fillAlpha"),d=a.getBooleanOption("stackedGraph"),u=a.getColors(),c={},y=function(t,e,a,i){if(t.lineTo(e,a),d)for(var r=i.length-1;r>=0;r--){var n=i[r];t.lineTo(n[0],n[1])}},_=p-1;_>=0;_--){var v=e.drawingContext,f=i[_];if(a.getBooleanOption("fillGraph",f)){var x=a.getBooleanOption("stepPlot",f),m=u[_],D=a.axisPropertiesForSeries(f),w=1+D.minyval*D.yscale;0>w?w=0:w>1&&(w=1),w=l.h*w+l.y;var A,b=h[_],T=Dygraph.createIterator(b,0,b.length,t._getIteratorPredicate(a.getBooleanOption("connectSeparatedPoints",f))),E=0/0,C=[-1,-1],L=Dygraph.toRGB_(m),P="rgba("+L.r+","+L.g+","+L.b+","+g+")";v.fillStyle=P,v.beginPath();var S,O=!0;(b.length>2*a.width_||Dygraph.FORCE_FAST_PROXY)&&(v=t._fastCanvasProxy(v));for(var M,R=[];T.hasNext;)if(M=T.next(),Dygraph.isOK(M.y)||x){if(d){if(!O&&S==M.xval)continue;O=!1,S=M.xval,o=c[M.canvasx];var F;F=void 0===o?w:s?o[0]:o,A=[M.canvasy,F],x?-1===C[0]?c[M.canvasx]=[M.canvasy,w]:c[M.canvasx]=[M.canvasy,C[0]]:c[M.canvasx]=M.canvasy}else A=isNaN(M.canvasy)&&x?[l.y+l.h,w]:[M.canvasy,w];isNaN(E)?(v.moveTo(M.canvasx,A[1]),v.lineTo(M.canvasx,A[0])):(x?(v.lineTo(M.canvasx,C[0]),v.lineTo(M.canvasx,A[0])):v.lineTo(M.canvasx,A[0]),d&&(R.push([E,C[1]]),R.push(s&&o?[M.canvasx,o[1]]:[M.canvasx,A[1]]))),C=A,E=M.canvasx}else y(v,E,C[1],R),R=[],E=0/0,null===M.y_stacked||isNaN(M.y_stacked)||(c[M.canvasx]=l.h*M.y_stacked+l.y);s=x,A&&M&&(y(v,M.canvasx,A[1],R),R=[]),v.fill()}}}},t}(),Dygraph=function(){"use strict";var t=function(t,e,a,i){this.is_initial_draw_=!0,this.readyFns_=[],void 0!==i?(console.warn("Using deprecated four-argument dygraph constructor"),this.__old_init__(t,e,a,i)):this.__init__(t,e,a)};return t.NAME="Dygraph",t.VERSION="1.1.1",t.__repr__=function(){return"["+t.NAME+" "+t.VERSION+"]"},t.toString=function(){return t.__repr__()},t.DEFAULT_ROLL_PERIOD=1,t.DEFAULT_WIDTH=480,t.DEFAULT_HEIGHT=320,t.ANIMATION_STEPS=12,t.ANIMATION_DURATION=200,t.KMB_LABELS=["K","M","B","T","Q"],t.KMG2_BIG_LABELS=["k","M","G","T","P","E","Z","Y"],t.KMG2_SMALL_LABELS=["m","u","n","p","f","a","z","y"],t.numberValueFormatter=function(e,a){var i=a("sigFigs");if(null!==i)return t.floatFormat(e,i);var r,n=a("digitsAfterDecimal"),o=a("maxNumberWidth"),s=a("labelsKMB"),l=a("labelsKMG2");if(r=0!==e&&(Math.abs(e)>=Math.pow(10,o)||Math.abs(e)<Math.pow(10,-n))?e.toExponential(n):""+t.round_(e,n),s||l){var h,p=[],g=[];s&&(h=1e3,p=t.KMB_LABELS),l&&(s&&console.warn("Setting both labelsKMB and labelsKMG2. Pick one!"),h=1024,p=t.KMG2_BIG_LABELS,g=t.KMG2_SMALL_LABELS);for(var d=Math.abs(e),u=t.pow(h,p.length),c=p.length-1;c>=0;c--,u/=h)if(d>=u){r=t.round_(e/u,n)+p[c];break}if(l){var y=String(e.toExponential()).split("e-");2===y.length&&y[1]>=3&&y[1]<=24&&(r=y[1]%3>0?t.round_(y[0]/t.pow(10,y[1]%3),n):Number(y[0]).toFixed(2),r+=g[Math.floor(y[1]/3)-1])}}return r},t.numberAxisLabelFormatter=function(e,a,i){return t.numberValueFormatter.call(this,e,i)},t.SHORT_MONTH_NAMES_=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],t.dateAxisLabelFormatter=function(e,a,i){var r=i("labelsUTC"),n=r?t.DateAccessorsUTC:t.DateAccessorsLocal,o=n.getFullYear(e),s=n.getMonth(e),l=n.getDate(e),h=n.getHours(e),p=n.getMinutes(e),g=n.getSeconds(e),d=n.getSeconds(e);if(a>=t.DECADAL)return""+o;if(a>=t.MONTHLY)return t.SHORT_MONTH_NAMES_[s]+" "+o;var u=3600*h+60*p+g+.001*d;return 0===u||a>=t.DAILY?t.zeropad(l)+" "+t.SHORT_MONTH_NAMES_[s]:t.hmsString_(h,p,g)},t.dateAxisFormatter=t.dateAxisLabelFormatter,t.dateValueFormatter=function(e,a){return t.dateString_(e,a("labelsUTC"))},t.Plotters=DygraphCanvasRenderer._Plotters,t.DEFAULT_ATTRS={highlightCircleSize:3,highlightSeriesOpts:null,highlightSeriesBackgroundAlpha:.5,labelsDivWidth:250,labelsDivStyles:{},labelsSeparateLines:!1,labelsShowZeroValues:!0,labelsKMB:!1,labelsKMG2:!1,showLabelsOnHighlight:!0,digitsAfterDecimal:2,maxNumberWidth:6,sigFigs:null,strokeWidth:1,strokeBorderWidth:0,strokeBorderColor:"white",axisTickSize:3,axisLabelFontSize:14,rightGap:5,showRoller:!1,xValueParser:t.dateParser,delimiter:",",sigma:2,errorBars:!1,fractions:!1,wilsonInterval:!0,customBars:!1,fillGraph:!1,fillAlpha:.15,connectSeparatedPoints:!1,stackedGraph:!1,stackedGraphNaNFill:"all",hideOverlayOnMouseOut:!0,legend:"onmouseover",stepPlot:!1,avoidMinZero:!1,xRangePad:0,yRangePad:null,drawAxesAtZero:!1,titleHeight:28,xLabelHeight:18,yLabelWidth:18,drawXAxis:!0,drawYAxis:!0,axisLineColor:"black",axisLineWidth:.3,gridLineWidth:.3,axisLabelColor:"black",axisLabelWidth:50,drawYGrid:!0,drawXGrid:!0,gridLineColor:"rgb(128,128,128)",interactionModel:null,animatedZooms:!1,showRangeSelector:!1,rangeSelectorHeight:40,rangeSelectorPlotStrokeColor:"#808FAB",rangeSelectorPlotFillColor:"#A7B1C4",showInRangeSelector:null,plotter:[t.Plotters.fillPlotter,t.Plotters.errorPlotter,t.Plotters.linePlotter],plugins:[],axes:{x:{pixelsPerLabel:70,axisLabelWidth:60,axisLabelFormatter:t.dateAxisLabelFormatter,valueFormatter:t.dateValueFormatter,drawGrid:!0,drawAxis:!0,independentTicks:!0,ticker:null},y:{axisLabelWidth:50,pixelsPerLabel:30,valueFormatter:t.numberValueFormatter,axisLabelFormatter:t.numberAxisLabelFormatter,drawGrid:!0,drawAxis:!0,independentTicks:!0,ticker:null},y2:{axisLabelWidth:50,pixelsPerLabel:30,valueFormatter:t.numberValueFormatter,axisLabelFormatter:t.numberAxisLabelFormatter,drawAxis:!0,drawGrid:!1,independentTicks:!1,ticker:null}}},t.HORIZONTAL=1,t.VERTICAL=2,t.PLUGINS=[],t.addedAnnotationCSS=!1,t.prototype.__old_init__=function(e,a,i,r){if(null!==i){for(var n=["Date"],o=0;o<i.length;o++)n.push(i[o]);t.update(r,{labels:n})}this.__init__(e,a,r)},t.prototype.__init__=function(e,a,i){if(/MSIE/.test(navigator.userAgent)&&!window.opera&&"undefined"!=typeof G_vmlCanvasManager&&"complete"!=document.readyState){var r=this;return void setTimeout(function(){r.__init__(e,a,i)},100)}if((null===i||void 0===i)&&(i={}),i=t.mapLegacyOptions_(i),"string"==typeof e&&(e=document.getElementById(e)),!e)return void console.error("Constructing dygraph with a non-existent div!");this.isUsingExcanvas_="undefined"!=typeof G_vmlCanvasManager,this.maindiv_=e,this.file_=a,this.rollPeriod_=i.rollPeriod||t.DEFAULT_ROLL_PERIOD,this.previousVerticalX_=-1,this.fractions_=i.fractions||!1,this.dateWindow_=i.dateWindow||null,this.annotations_=[],this.zoomed_x_=!1,this.zoomed_y_=!1,e.innerHTML="",""===e.style.width&&i.width&&(e.style.width=i.width+"px"),""===e.style.height&&i.height&&(e.style.height=i.height+"px"),""===e.style.height&&0===e.clientHeight&&(e.style.height=t.DEFAULT_HEIGHT+"px",""===e.style.width&&(e.style.width=t.DEFAULT_WIDTH+"px")),this.width_=e.clientWidth||i.width||0,this.height_=e.clientHeight||i.height||0,i.stackedGraph&&(i.fillGraph=!0),this.user_attrs_={},t.update(this.user_attrs_,i),this.attrs_={},t.updateDeep(this.attrs_,t.DEFAULT_ATTRS),this.boundaryIds_=[],this.setIndexByName_={},this.datasetIndex_=[],this.registeredEvents_=[],this.eventListeners_={},this.attributes_=new DygraphOptions(this),this.createInterface_(),this.plugins_=[];for(var n=t.PLUGINS.concat(this.getOption("plugins")),o=0;o<n.length;o++){var s,l=n[o];s="undefined"!=typeof l.activate?l:new l;var h={plugin:s,events:{},options:{},pluginOptions:{}},p=s.activate(this);for(var g in p)p.hasOwnProperty(g)&&(h.events[g]=p[g]);this.plugins_.push(h)}for(var o=0;o<this.plugins_.length;o++){var d=this.plugins_[o];for(var g in d.events)if(d.events.hasOwnProperty(g)){var u=d.events[g],c=[d.plugin,u];g in this.eventListeners_?this.eventListeners_[g].push(c):this.eventListeners_[g]=[c]}}this.createDragInterface_(),this.start_()},t.prototype.cascadeEvents_=function(e,a){if(!(e in this.eventListeners_))return!1;var i={dygraph:this,cancelable:!1,defaultPrevented:!1,preventDefault:function(){if(!i.cancelable)throw"Cannot call preventDefault on non-cancelable event.";i.defaultPrevented=!0},propagationStopped:!1,stopPropagation:function(){i.propagationStopped=!0}};t.update(i,a);var r=this.eventListeners_[e];if(r)for(var n=r.length-1;n>=0;n--){var o=r[n][0],s=r[n][1];if(s.call(o,i),i.propagationStopped)break}return i.defaultPrevented},t.prototype.getPluginInstance_=function(t){for(var e=0;e<this.plugins_.length;e++){var a=this.plugins_[e];if(a.plugin instanceof t)return a.plugin}return null},t.prototype.isZoomed=function(t){if(null===t||void 0===t)return this.zoomed_x_||this.zoomed_y_;if("x"===t)return this.zoomed_x_;if("y"===t)return this.zoomed_y_;throw"axis parameter is ["+t+"] must be null, 'x' or 'y'."},t.prototype.toString=function(){var t=this.maindiv_,e=t&&t.id?t.id:t;return"[Dygraph "+e+"]"},t.prototype.attr_=function(t,e){return e?this.attributes_.getForSeries(t,e):this.attributes_.get(t)},t.prototype.getOption=function(t,e){return this.attr_(t,e)},t.prototype.getNumericOption=function(t,e){return this.getOption(t,e)},t.prototype.getStringOption=function(t,e){return this.getOption(t,e)},t.prototype.getBooleanOption=function(t,e){return this.getOption(t,e)},t.prototype.getFunctionOption=function(t,e){return this.getOption(t,e)},t.prototype.getOptionForAxis=function(t,e){return this.attributes_.getForAxis(t,e)},t.prototype.optionsViewForAxis_=function(t){var e=this;return function(a){var i=e.user_attrs_.axes;return i&&i[t]&&i[t].hasOwnProperty(a)?i[t][a]:"x"===t&&"logscale"===a?!1:"undefined"!=typeof e.user_attrs_[a]?e.user_attrs_[a]:(i=e.attrs_.axes,i&&i[t]&&i[t].hasOwnProperty(a)?i[t][a]:"y"==t&&e.axes_[0].hasOwnProperty(a)?e.axes_[0][a]:"y2"==t&&e.axes_[1].hasOwnProperty(a)?e.axes_[1][a]:e.attr_(a))}},t.prototype.rollPeriod=function(){return this.rollPeriod_},t.prototype.xAxisRange=function(){return this.dateWindow_?this.dateWindow_:this.xAxisExtremes()},t.prototype.xAxisExtremes=function(){var t=this.getNumericOption("xRangePad")/this.plotter_.area.w;if(0===this.numRows())return[0-t,1+t];var e=this.rawData_[0][0],a=this.rawData_[this.rawData_.length-1][0];if(t){var i=a-e;e-=i*t,a+=i*t}return[e,a]},t.prototype.yAxisRange=function(t){if("undefined"==typeof t&&(t=0),0>t||t>=this.axes_.length)return null;var e=this.axes_[t];return[e.computedValueRange[0],e.computedValueRange[1]]},t.prototype.yAxisRanges=function(){for(var t=[],e=0;e<this.axes_.length;e++)t.push(this.yAxisRange(e));return t},t.prototype.toDomCoords=function(t,e,a){return[this.toDomXCoord(t),this.toDomYCoord(e,a)]},t.prototype.toDomXCoord=function(t){if(null===t)return null;var e=this.plotter_.area,a=this.xAxisRange();return e.x+(t-a[0])/(a[1]-a[0])*e.w},t.prototype.toDomYCoord=function(t,e){var a=this.toPercentYCoord(t,e);if(null===a)return null;var i=this.plotter_.area;return i.y+a*i.h},t.prototype.toDataCoords=function(t,e,a){return[this.toDataXCoord(t),this.toDataYCoord(e,a)]},t.prototype.toDataXCoord=function(e){if(null===e)return null;var a=this.plotter_.area,i=this.xAxisRange();if(this.attributes_.getForAxis("logscale","x")){var r=(e-a.x)/a.w,n=t.log10(i[0]),o=t.log10(i[1]),s=n+r*(o-n),l=Math.pow(t.LOG_SCALE,s);return l}return i[0]+(e-a.x)/a.w*(i[1]-i[0])},t.prototype.toDataYCoord=function(e,a){if(null===e)return null;var i=this.plotter_.area,r=this.yAxisRange(a);if("undefined"==typeof a&&(a=0),this.attributes_.getForAxis("logscale",a)){var n=(e-i.y)/i.h,o=t.log10(r[0]),s=t.log10(r[1]),l=s-n*(s-o),h=Math.pow(t.LOG_SCALE,l);return h}return r[0]+(i.y+i.h-e)/i.h*(r[1]-r[0])},t.prototype.toPercentYCoord=function(e,a){if(null===e)return null;"undefined"==typeof a&&(a=0);var i,r=this.yAxisRange(a),n=this.attributes_.getForAxis("logscale",a);if(n){var o=t.log10(r[0]),s=t.log10(r[1]);i=(s-t.log10(e))/(s-o)}else i=(r[1]-e)/(r[1]-r[0]);return i},t.prototype.toPercentXCoord=function(e){if(null===e)return null;var a,i=this.xAxisRange(),r=this.attributes_.getForAxis("logscale","x");if(r===!0){var n=t.log10(i[0]),o=t.log10(i[1]);a=(t.log10(e)-n)/(o-n)}else a=(e-i[0])/(i[1]-i[0]);return a},t.prototype.numColumns=function(){return this.rawData_?this.rawData_[0]?this.rawData_[0].length:this.attr_("labels").length:0},t.prototype.numRows=function(){return this.rawData_?this.rawData_.length:0},t.prototype.getValue=function(t,e){return 0>t||t>this.rawData_.length?null:0>e||e>this.rawData_[t].length?null:this.rawData_[t][e]},t.prototype.createInterface_=function(){var e=this.maindiv_;this.graphDiv=document.createElement("div"),this.graphDiv.style.textAlign="left",this.graphDiv.style.position="relative",e.appendChild(this.graphDiv),this.canvas_=t.createCanvas(),this.canvas_.style.position="absolute",this.hidden_=this.createPlotKitCanvas_(this.canvas_),this.canvas_ctx_=t.getContext(this.canvas_),this.hidden_ctx_=t.getContext(this.hidden_),this.resizeElements_(),this.graphDiv.appendChild(this.hidden_),this.graphDiv.appendChild(this.canvas_),this.mouseEventElement_=this.createMouseEventElement_(),this.layout_=new DygraphLayout(this);var a=this;this.mouseMoveHandler_=function(t){a.mouseMove_(t)},this.mouseOutHandler_=function(e){var i=e.target||e.fromElement,r=e.relatedTarget||e.toElement;t.isNodeContainedBy(i,a.graphDiv)&&!t.isNodeContainedBy(r,a.graphDiv)&&a.mouseOut_(e)},this.addAndTrackEvent(window,"mouseout",this.mouseOutHandler_),this.addAndTrackEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler_),this.resizeHandler_||(this.resizeHandler_=function(t){a.resize()},this.addAndTrackEvent(window,"resize",this.resizeHandler_))},t.prototype.resizeElements_=function(){this.graphDiv.style.width=this.width_+"px",this.graphDiv.style.height=this.height_+"px";var e=t.getContextPixelRatio(this.canvas_ctx_);this.canvas_.width=this.width_*e,this.canvas_.height=this.height_*e,this.canvas_.style.width=this.width_+"px",this.canvas_.style.height=this.height_+"px",1!==e&&this.canvas_ctx_.scale(e,e);var a=t.getContextPixelRatio(this.hidden_ctx_);this.hidden_.width=this.width_*a,this.hidden_.height=this.height_*a,this.hidden_.style.width=this.width_+"px",this.hidden_.style.height=this.height_+"px",1!==a&&this.hidden_ctx_.scale(a,a)},t.prototype.destroy=function(){this.canvas_ctx_.restore(),this.hidden_ctx_.restore();for(var e=this.plugins_.length-1;e>=0;e--){var a=this.plugins_.pop();a.plugin.destroy&&a.plugin.destroy()}var i=function(t){for(;t.hasChildNodes();)i(t.firstChild),t.removeChild(t.firstChild)};this.removeTrackedEvents_(),t.removeEvent(window,"mouseout",this.mouseOutHandler_),t.removeEvent(this.mouseEventElement_,"mousemove",this.mouseMoveHandler_),t.removeEvent(window,"resize",this.resizeHandler_),this.resizeHandler_=null,i(this.maindiv_);var r=function(t){for(var e in t)"object"==typeof t[e]&&(t[e]=null)};r(this.layout_),r(this.plotter_),r(this)},t.prototype.createPlotKitCanvas_=function(e){var a=t.createCanvas();return a.style.position="absolute",a.style.top=e.style.top,a.style.left=e.style.left,a.width=this.width_,a.height=this.height_,a.style.width=this.width_+"px",a.style.height=this.height_+"px",a},t.prototype.createMouseEventElement_=function(){if(this.isUsingExcanvas_){var t=document.createElement("div");return t.style.position="absolute",t.style.backgroundColor="white",t.style.filter="alpha(opacity=0)",t.style.width=this.width_+"px",t.style.height=this.height_+"px",this.graphDiv.appendChild(t),t}return this.canvas_},t.prototype.setColors_=function(){var e=this.getLabels(),a=e.length-1;this.colors_=[],this.colorsMap_={};for(var i=this.getNumericOption("colorSaturation")||1,r=this.getNumericOption("colorValue")||.5,n=Math.ceil(a/2),o=this.getOption("colors"),s=this.visibility(),l=0;a>l;l++)if(s[l]){ var h=e[l+1],p=this.attributes_.getForSeries("color",h);if(!p)if(o)p=o[l%o.length];else{var g=l%2?n+(l+1)/2:Math.ceil((l+1)/2),d=1*g/(1+a);p=t.hsvToRGB(d,i,r)}this.colors_.push(p),this.colorsMap_[h]=p}},t.prototype.getColors=function(){return this.colors_},t.prototype.getPropertiesForSeries=function(t){for(var e=-1,a=this.getLabels(),i=1;i<a.length;i++)if(a[i]==t){e=i;break}return-1==e?null:{name:t,column:e,visible:this.visibility()[e-1],color:this.colorsMap_[t],axis:1+this.attributes_.axisForSeries(t)}},t.prototype.createRollInterface_=function(){this.roller_||(this.roller_=document.createElement("input"),this.roller_.type="text",this.roller_.style.display="none",this.graphDiv.appendChild(this.roller_));var t=this.getBooleanOption("showRoller")?"block":"none",e=this.plotter_.area,a={position:"absolute",zIndex:10,top:e.y+e.h-25+"px",left:e.x+1+"px",display:t};this.roller_.size="2",this.roller_.value=this.rollPeriod_;for(var i in a)a.hasOwnProperty(i)&&(this.roller_.style[i]=a[i]);var r=this;this.roller_.onchange=function(){r.adjustRoll(r.roller_.value)}},t.prototype.createDragInterface_=function(){var e={isZooming:!1,isPanning:!1,is2DPan:!1,dragStartX:null,dragStartY:null,dragEndX:null,dragEndY:null,dragDirection:null,prevEndX:null,prevEndY:null,prevDragDirection:null,cancelNextDblclick:!1,initialLeftmostDate:null,xUnitsPerPixel:null,dateRange:null,px:0,py:0,boundedDates:null,boundedValues:null,tarp:new t.IFrameTarp,initializeMouseDown:function(e,a,i){e.preventDefault?e.preventDefault():(e.returnValue=!1,e.cancelBubble=!0);var r=t.findPos(a.canvas_);i.px=r.x,i.py=r.y,i.dragStartX=t.dragGetX_(e,i),i.dragStartY=t.dragGetY_(e,i),i.cancelNextDblclick=!1,i.tarp.cover()},destroy:function(){var t=this;if((t.isZooming||t.isPanning)&&(t.isZooming=!1,t.dragStartX=null,t.dragStartY=null),t.isPanning){t.isPanning=!1,t.draggingDate=null,t.dateRange=null;for(var e=0;e<i.axes_.length;e++)delete i.axes_[e].draggingValue,delete i.axes_[e].dragValueRange}t.tarp.uncover()}},a=this.getOption("interactionModel"),i=this,r=function(t){return function(a){t(a,i,e)}};for(var n in a)a.hasOwnProperty(n)&&this.addAndTrackEvent(this.mouseEventElement_,n,r(a[n]));if(!a.willDestroyContextMyself){var o=function(t){e.destroy()};this.addAndTrackEvent(document,"mouseup",o)}},t.prototype.drawZoomRect_=function(e,a,i,r,n,o,s,l){var h=this.canvas_ctx_;o==t.HORIZONTAL?h.clearRect(Math.min(a,s),this.layout_.getPlotArea().y,Math.abs(a-s),this.layout_.getPlotArea().h):o==t.VERTICAL&&h.clearRect(this.layout_.getPlotArea().x,Math.min(r,l),this.layout_.getPlotArea().w,Math.abs(r-l)),e==t.HORIZONTAL?i&&a&&(h.fillStyle="rgba(128,128,128,0.33)",h.fillRect(Math.min(a,i),this.layout_.getPlotArea().y,Math.abs(i-a),this.layout_.getPlotArea().h)):e==t.VERTICAL&&n&&r&&(h.fillStyle="rgba(128,128,128,0.33)",h.fillRect(this.layout_.getPlotArea().x,Math.min(r,n),this.layout_.getPlotArea().w,Math.abs(n-r))),this.isUsingExcanvas_&&(this.currentZoomRectArgs_=[e,a,i,r,n,0,0,0])},t.prototype.clearZoomRect_=function(){this.currentZoomRectArgs_=null,this.canvas_ctx_.clearRect(0,0,this.width_,this.height_)},t.prototype.doZoomX_=function(t,e){this.currentZoomRectArgs_=null;var a=this.toDataXCoord(t),i=this.toDataXCoord(e);this.doZoomXDates_(a,i)},t.prototype.doZoomXDates_=function(t,e){var a=this.xAxisRange(),i=[t,e];this.zoomed_x_=!0;var r=this;this.doAnimatedZoom(a,i,null,null,function(){r.getFunctionOption("zoomCallback")&&r.getFunctionOption("zoomCallback").call(r,t,e,r.yAxisRanges())})},t.prototype.doZoomY_=function(t,e){this.currentZoomRectArgs_=null;for(var a=this.yAxisRanges(),i=[],r=0;r<this.axes_.length;r++){var n=this.toDataYCoord(t,r),o=this.toDataYCoord(e,r);i.push([o,n])}this.zoomed_y_=!0;var s=this;this.doAnimatedZoom(null,null,a,i,function(){if(s.getFunctionOption("zoomCallback")){var t=s.xAxisRange();s.getFunctionOption("zoomCallback").call(s,t[0],t[1],s.yAxisRanges())}})},t.zoomAnimationFunction=function(t,e){var a=1.5;return(1-Math.pow(a,-t))/(1-Math.pow(a,-e))},t.prototype.resetZoom=function(){var t=!1,e=!1,a=!1;null!==this.dateWindow_&&(t=!0,e=!0);for(var i=0;i<this.axes_.length;i++)"undefined"!=typeof this.axes_[i].valueWindow&&null!==this.axes_[i].valueWindow&&(t=!0,a=!0);if(this.clearSelection(),t){this.zoomed_x_=!1,this.zoomed_y_=!1;var r=this.rawData_[0][0],n=this.rawData_[this.rawData_.length-1][0];if(!this.getBooleanOption("animatedZooms")){for(this.dateWindow_=null,i=0;i<this.axes_.length;i++)null!==this.axes_[i].valueWindow&&delete this.axes_[i].valueWindow;return this.drawGraph_(),void(this.getFunctionOption("zoomCallback")&&this.getFunctionOption("zoomCallback").call(this,r,n,this.yAxisRanges()))}var o=null,s=null,l=null,h=null;if(e&&(o=this.xAxisRange(),s=[r,n]),a){l=this.yAxisRanges();var p=this.gatherDatasets_(this.rolledSeries_,null),g=p.extremes;for(this.computeYAxisRanges_(g),h=[],i=0;i<this.axes_.length;i++){var d=this.axes_[i];h.push(null!==d.valueRange&&void 0!==d.valueRange?d.valueRange:d.extremeRange)}}var u=this;this.doAnimatedZoom(o,s,l,h,function(){u.dateWindow_=null;for(var t=0;t<u.axes_.length;t++)null!==u.axes_[t].valueWindow&&delete u.axes_[t].valueWindow;u.getFunctionOption("zoomCallback")&&u.getFunctionOption("zoomCallback").call(u,r,n,u.yAxisRanges())})}},t.prototype.doAnimatedZoom=function(e,a,i,r,n){var o,s,l=this.getBooleanOption("animatedZooms")?t.ANIMATION_STEPS:1,h=[],p=[];if(null!==e&&null!==a)for(o=1;l>=o;o++)s=t.zoomAnimationFunction(o,l),h[o-1]=[e[0]*(1-s)+s*a[0],e[1]*(1-s)+s*a[1]];if(null!==i&&null!==r)for(o=1;l>=o;o++){s=t.zoomAnimationFunction(o,l);for(var g=[],d=0;d<this.axes_.length;d++)g.push([i[d][0]*(1-s)+s*r[d][0],i[d][1]*(1-s)+s*r[d][1]]);p[o-1]=g}var u=this;t.repeatAndCleanup(function(t){if(p.length)for(var e=0;e<u.axes_.length;e++){var a=p[t][e];u.axes_[e].valueWindow=[a[0],a[1]]}h.length&&(u.dateWindow_=h[t]),u.drawGraph_()},l,t.ANIMATION_DURATION/l,n)},t.prototype.getArea=function(){return this.plotter_.area},t.prototype.eventToDomCoords=function(e){if(e.offsetX&&e.offsetY)return[e.offsetX,e.offsetY];var a=t.findPos(this.mouseEventElement_),i=t.pageX(e)-a.x,r=t.pageY(e)-a.y;return[i,r]},t.prototype.findClosestRow=function(e){for(var a=1/0,i=-1,r=this.layout_.points,n=0;n<r.length;n++)for(var o=r[n],s=o.length,l=0;s>l;l++){var h=o[l];if(t.isValidPoint(h,!0)){var p=Math.abs(h.canvasx-e);a>p&&(a=p,i=h.idx)}}return i},t.prototype.findClosestPoint=function(e,a){for(var i,r,n,o,s,l,h,p=1/0,g=this.layout_.points.length-1;g>=0;--g)for(var d=this.layout_.points[g],u=0;u<d.length;++u)o=d[u],t.isValidPoint(o)&&(r=o.canvasx-e,n=o.canvasy-a,i=r*r+n*n,p>i&&(p=i,s=o,l=g,h=o.idx));var c=this.layout_.setNames[l];return{row:h,seriesName:c,point:s}},t.prototype.findStackedPoint=function(e,a){for(var i,r,n=this.findClosestRow(e),o=0;o<this.layout_.points.length;++o){var s=this.getLeftBoundary_(o),l=n-s,h=this.layout_.points[o];if(!(l>=h.length)){var p=h[l];if(t.isValidPoint(p)){var g=p.canvasy;if(e>p.canvasx&&l+1<h.length){var d=h[l+1];if(t.isValidPoint(d)){var u=d.canvasx-p.canvasx;if(u>0){var c=(e-p.canvasx)/u;g+=c*(d.canvasy-p.canvasy)}}}else if(e<p.canvasx&&l>0){var y=h[l-1];if(t.isValidPoint(y)){var u=p.canvasx-y.canvasx;if(u>0){var c=(p.canvasx-e)/u;g+=c*(y.canvasy-p.canvasy)}}}(0===o||a>g)&&(i=p,r=o)}}}var _=this.layout_.setNames[r];return{row:n,seriesName:_,point:i}},t.prototype.mouseMove_=function(t){var e=this.layout_.points;if(void 0!==e&&null!==e){var a=this.eventToDomCoords(t),i=a[0],r=a[1],n=this.getOption("highlightSeriesOpts"),o=!1;if(n&&!this.isSeriesLocked()){var s;s=this.getBooleanOption("stackedGraph")?this.findStackedPoint(i,r):this.findClosestPoint(i,r),o=this.setSelection(s.row,s.seriesName)}else{var l=this.findClosestRow(i);o=this.setSelection(l)}var h=this.getFunctionOption("highlightCallback");h&&o&&h.call(this,t,this.lastx_,this.selPoints_,this.lastRow_,this.highlightSet_)}},t.prototype.getLeftBoundary_=function(t){if(this.boundaryIds_[t])return this.boundaryIds_[t][0];for(var e=0;e<this.boundaryIds_.length;e++)if(void 0!==this.boundaryIds_[e])return this.boundaryIds_[e][0];return 0},t.prototype.animateSelection_=function(e){var a=10,i=30;void 0===this.fadeLevel&&(this.fadeLevel=0),void 0===this.animateId&&(this.animateId=0);var r=this.fadeLevel,n=0>e?r:a-r;if(0>=n)return void(this.fadeLevel&&this.updateSelection_(1));var o=++this.animateId,s=this;t.repeatAndCleanup(function(t){s.animateId==o&&(s.fadeLevel+=e,0===s.fadeLevel?s.clearSelection():s.updateSelection_(s.fadeLevel/a))},n,i,function(){})},t.prototype.updateSelection_=function(e){this.cascadeEvents_("select",{selectedRow:this.lastRow_,selectedX:this.lastx_,selectedPoints:this.selPoints_});var a,i=this.canvas_ctx_;if(this.getOption("highlightSeriesOpts")){i.clearRect(0,0,this.width_,this.height_);var r=1-this.getNumericOption("highlightSeriesBackgroundAlpha");if(r){var n=!0;if(n){if(void 0===e)return void this.animateSelection_(1);r*=e}i.fillStyle="rgba(255,255,255,"+r+")",i.fillRect(0,0,this.width_,this.height_)}this.plotter_._renderLineChart(this.highlightSet_,i)}else if(this.previousVerticalX_>=0){var o=0,s=this.attr_("labels");for(a=1;a<s.length;a++){var l=this.getNumericOption("highlightCircleSize",s[a]);l>o&&(o=l)}var h=this.previousVerticalX_;i.clearRect(h-o-1,0,2*o+2,this.height_)}if(this.isUsingExcanvas_&&this.currentZoomRectArgs_&&t.prototype.drawZoomRect_.apply(this,this.currentZoomRectArgs_),this.selPoints_.length>0){var p=this.selPoints_[0].canvasx;for(i.save(),a=0;a<this.selPoints_.length;a++){var g=this.selPoints_[a];if(t.isOK(g.canvasy)){var d=this.getNumericOption("highlightCircleSize",g.name),u=this.getFunctionOption("drawHighlightPointCallback",g.name),c=this.plotter_.colors[g.name];u||(u=t.Circles.DEFAULT),i.lineWidth=this.getNumericOption("strokeWidth",g.name),i.strokeStyle=c,i.fillStyle=c,u.call(this,this,g.name,i,p,g.canvasy,c,d,g.idx)}}i.restore(),this.previousVerticalX_=p}},t.prototype.setSelection=function(t,e,a){this.selPoints_=[];var i=!1;if(t!==!1&&t>=0){t!=this.lastRow_&&(i=!0),this.lastRow_=t;for(var r=0;r<this.layout_.points.length;++r){var n=this.layout_.points[r],o=t-this.getLeftBoundary_(r);if(o<n.length&&n[o].idx==t){var s=n[o];null!==s.yval&&this.selPoints_.push(s)}else for(var l=0;l<n.length;++l){var s=n[l];if(s.idx==t){null!==s.yval&&this.selPoints_.push(s);break}}}}else this.lastRow_>=0&&(i=!0),this.lastRow_=-1;return this.selPoints_.length?this.lastx_=this.selPoints_[0].xval:this.lastx_=-1,void 0!==e&&(this.highlightSet_!==e&&(i=!0),this.highlightSet_=e),void 0!==a&&(this.lockedSet_=a),i&&this.updateSelection_(void 0),i},t.prototype.mouseOut_=function(t){this.getFunctionOption("unhighlightCallback")&&this.getFunctionOption("unhighlightCallback").call(this,t),this.getBooleanOption("hideOverlayOnMouseOut")&&!this.lockedSet_&&this.clearSelection()},t.prototype.clearSelection=function(){return this.cascadeEvents_("deselect",{}),this.lockedSet_=!1,this.fadeLevel?void this.animateSelection_(-1):(this.canvas_ctx_.clearRect(0,0,this.width_,this.height_),this.fadeLevel=0,this.selPoints_=[],this.lastx_=-1,this.lastRow_=-1,void(this.highlightSet_=null))},t.prototype.getSelection=function(){if(!this.selPoints_||this.selPoints_.length<1)return-1;for(var t=0;t<this.layout_.points.length;t++)for(var e=this.layout_.points[t],a=0;a<e.length;a++)if(e[a].x==this.selPoints_[0].x)return e[a].idx;return-1},t.prototype.getHighlightSeries=function(){return this.highlightSet_},t.prototype.isSeriesLocked=function(){return this.lockedSet_},t.prototype.loadedEvent_=function(t){this.rawData_=this.parseCSV_(t),this.cascadeDataDidUpdateEvent_(),this.predraw_()},t.prototype.addXTicks_=function(){var t;t=this.dateWindow_?[this.dateWindow_[0],this.dateWindow_[1]]:this.xAxisExtremes();var e=this.optionsViewForAxis_("x"),a=e("ticker")(t[0],t[1],this.plotter_.area.w,e,this);this.layout_.setXTicks(a)},t.prototype.getHandlerClass_=function(){var e;return e=this.attr_("dataHandler")?this.attr_("dataHandler"):this.fractions_?this.getBooleanOption("errorBars")?t.DataHandlers.FractionsBarsHandler:t.DataHandlers.DefaultFractionHandler:this.getBooleanOption("customBars")?t.DataHandlers.CustomBarsHandler:this.getBooleanOption("errorBars")?t.DataHandlers.ErrorBarsHandler:t.DataHandlers.DefaultHandler},t.prototype.predraw_=function(){var t=new Date;this.dataHandler_=new(this.getHandlerClass_()),this.layout_.computePlotArea(),this.computeYAxes_(),this.is_initial_draw_||(this.canvas_ctx_.restore(),this.hidden_ctx_.restore()),this.canvas_ctx_.save(),this.hidden_ctx_.save(),this.plotter_=new DygraphCanvasRenderer(this,this.hidden_,this.hidden_ctx_,this.layout_),this.createRollInterface_(),this.cascadeEvents_("predraw"),this.rolledSeries_=[null];for(var e=1;e<this.numColumns();e++){var a=this.dataHandler_.extractSeries(this.rawData_,e,this.attributes_);this.rollPeriod_>1&&(a=this.dataHandler_.rollingAverage(a,this.rollPeriod_,this.attributes_)),this.rolledSeries_.push(a)}this.drawGraph_();var i=new Date;this.drawingTimeMs_=i-t},t.PointType=void 0,t.stackPoints_=function(t,e,a,i){for(var r=null,n=null,o=null,s=-1,l=function(e){if(!(s>=e))for(var a=e;a<t.length;++a)if(o=null,!isNaN(t[a].yval)&&null!==t[a].yval){s=a,o=t[a];break}},h=0;h<t.length;++h){var p=t[h],g=p.xval;void 0===e[g]&&(e[g]=0);var d=p.yval;isNaN(d)||null===d?"none"==i?d=0:(l(h),d=n&&o&&"none"!=i?n.yval+(o.yval-n.yval)*((g-n.xval)/(o.xval-n.xval)):n&&"all"==i?n.yval:o&&"all"==i?o.yval:0):n=p;var u=e[g];r!=g&&(u+=d,e[g]=u),r=g,p.yval_stacked=u,u>a[1]&&(a[1]=u),u<a[0]&&(a[0]=u)}},t.prototype.gatherDatasets_=function(e,a){var i,r,n,o,s,l,h=[],p=[],g=[],d={},u=e.length-1;for(i=u;i>=1;i--)if(this.visibility()[i-1]){if(a){l=e[i];var c=a[0],y=a[1];for(n=null,o=null,r=0;r<l.length;r++)l[r][0]>=c&&null===n&&(n=r),l[r][0]<=y&&(o=r);null===n&&(n=0);for(var _=n,v=!0;v&&_>0;)_--,v=null===l[_][1];null===o&&(o=l.length-1);var f=o;for(v=!0;v&&f<l.length-1;)f++,v=null===l[f][1];_!==n&&(n=_),f!==o&&(o=f),h[i-1]=[n,o],l=l.slice(n,o+1)}else l=e[i],h[i-1]=[0,l.length-1];var x=this.attr_("labels")[i],m=this.dataHandler_.getExtremeYValues(l,a,this.getBooleanOption("stepPlot",x)),D=this.dataHandler_.seriesToPoints(l,x,h[i-1][0]);this.getBooleanOption("stackedGraph")&&(s=this.attributes_.axisForSeries(x),void 0===g[s]&&(g[s]=[]),t.stackPoints_(D,g[s],m,this.getBooleanOption("stackedGraphNaNFill"))),d[x]=m,p[i]=D}return{points:p,extremes:d,boundaryIds:h}},t.prototype.drawGraph_=function(){var t=new Date,e=this.is_initial_draw_;this.is_initial_draw_=!1,this.layout_.removeAllDatasets(),this.setColors_(),this.attrs_.pointSize=.5*this.getNumericOption("highlightCircleSize");var a=this.gatherDatasets_(this.rolledSeries_,this.dateWindow_),i=a.points,r=a.extremes;this.boundaryIds_=a.boundaryIds,this.setIndexByName_={};var n=this.attr_("labels");n.length>0&&(this.setIndexByName_[n[0]]=0);for(var o=0,s=1;s<i.length;s++)this.setIndexByName_[n[s]]=s,this.visibility()[s-1]&&(this.layout_.addDataset(n[s],i[s]),this.datasetIndex_[s]=o++);this.computeYAxisRanges_(r),this.layout_.setYAxes(this.axes_),this.addXTicks_();var l=this.zoomed_x_;if(this.zoomed_x_=l,this.layout_.evaluate(),this.renderGraph_(e),this.getStringOption("timingName")){var h=new Date;console.log(this.getStringOption("timingName")+" - drawGraph: "+(h-t)+"ms")}},t.prototype.renderGraph_=function(t){this.cascadeEvents_("clearChart"),this.plotter_.clear(),this.getFunctionOption("underlayCallback")&&this.getFunctionOption("underlayCallback").call(this,this.hidden_ctx_,this.layout_.getPlotArea(),this,this);var e={canvas:this.hidden_,drawingContext:this.hidden_ctx_};if(this.cascadeEvents_("willDrawChart",e),this.plotter_.render(),this.cascadeEvents_("didDrawChart",e),this.lastRow_=-1,this.canvas_.getContext("2d").clearRect(0,0,this.width_,this.height_),null!==this.getFunctionOption("drawCallback")&&this.getFunctionOption("drawCallback").call(this,this,t),t)for(this.readyFired_=!0;this.readyFns_.length>0;){var a=this.readyFns_.pop();a(this)}},t.prototype.computeYAxes_=function(){var e,a,i,r,n;if(void 0!==this.axes_&&this.user_attrs_.hasOwnProperty("valueRange")===!1)for(e=[],i=0;i<this.axes_.length;i++)e.push(this.axes_[i].valueWindow);for(this.axes_=[],a=0;a<this.attributes_.numAxes();a++)r={g:this},t.update(r,this.attributes_.axisOptions(a)),this.axes_[a]=r;if(n=this.attr_("valueRange"),n&&(this.axes_[0].valueRange=n),void 0!==e){var o=Math.min(e.length,this.axes_.length);for(i=0;o>i;i++)this.axes_[i].valueWindow=e[i]}for(a=0;a<this.axes_.length;a++)if(0===a)r=this.optionsViewForAxis_("y"+(a?"2":"")),n=r("valueRange"),n&&(this.axes_[a].valueRange=n);else{var s=this.user_attrs_.axes;s&&s.y2&&(n=s.y2.valueRange,n&&(this.axes_[a].valueRange=n))}},t.prototype.numAxes=function(){return this.attributes_.numAxes()},t.prototype.axisPropertiesForSeries=function(t){return this.axes_[this.attributes_.axisForSeries(t)]},t.prototype.computeYAxisRanges_=function(t){for(var e,a,i,r,n,o=function(t){return isNaN(parseFloat(t))},s=this.attributes_.numAxes(),l=0;s>l;l++){var h=this.axes_[l],p=this.attributes_.getForAxis("logscale",l),g=this.attributes_.getForAxis("includeZero",l),d=this.attributes_.getForAxis("independentTicks",l);if(i=this.attributes_.seriesForAxis(l),e=!0,r=.1,null!==this.getNumericOption("yRangePad")&&(e=!1,r=this.getNumericOption("yRangePad")/this.plotter_.area.h),0===i.length)h.extremeRange=[0,1];else{for(var u,c,y=1/0,_=-(1/0),v=0;v<i.length;v++)t.hasOwnProperty(i[v])&&(u=t[i[v]][0],null!==u&&(y=Math.min(u,y)),c=t[i[v]][1],null!==c&&(_=Math.max(c,_)));g&&!p&&(y>0&&(y=0),0>_&&(_=0)),y==1/0&&(y=0),_==-(1/0)&&(_=1),a=_-y,0===a&&(0!==_?a=Math.abs(_):(_=1,a=1));var f,x;if(p)if(e)f=_+r*a,x=y;else{var m=Math.exp(Math.log(a)*r);f=_*m,x=y/m}else f=_+r*a,x=y-r*a,e&&!this.getBooleanOption("avoidMinZero")&&(0>x&&y>=0&&(x=0),f>0&&0>=_&&(f=0));h.extremeRange=[x,f]}if(h.valueWindow)h.computedValueRange=[h.valueWindow[0],h.valueWindow[1]];else if(h.valueRange){var D=o(h.valueRange[0])?h.extremeRange[0]:h.valueRange[0],w=o(h.valueRange[1])?h.extremeRange[1]:h.valueRange[1];if(!e)if(h.logscale){var m=Math.exp(Math.log(a)*r);D*=m,w/=m}else a=w-D,D-=a*r,w+=a*r;h.computedValueRange=[D,w]}else h.computedValueRange=h.extremeRange;if(d){h.independentTicks=d;var A=this.optionsViewForAxis_("y"+(l?"2":"")),b=A("ticker");h.ticks=b(h.computedValueRange[0],h.computedValueRange[1],this.plotter_.area.h,A,this),n||(n=h)}}if(void 0===n)throw'Configuration Error: At least one axis has to have the "independentTicks" option activated.';for(var l=0;s>l;l++){var h=this.axes_[l];if(!h.independentTicks){for(var A=this.optionsViewForAxis_("y"+(l?"2":"")),b=A("ticker"),T=n.ticks,E=n.computedValueRange[1]-n.computedValueRange[0],C=h.computedValueRange[1]-h.computedValueRange[0],L=[],P=0;P<T.length;P++){var S=(T[P].v-n.computedValueRange[0])/E,O=h.computedValueRange[0]+S*C;L.push(O)}h.ticks=b(h.computedValueRange[0],h.computedValueRange[1],this.plotter_.area.h,A,this,L)}}},t.prototype.detectTypeFromString_=function(t){var e=!1,a=t.indexOf("-");a>0&&"e"!=t[a-1]&&"E"!=t[a-1]||t.indexOf("/")>=0||isNaN(parseFloat(t))?e=!0:8==t.length&&t>"19700101"&&"20371231">t&&(e=!0),this.setXAxisOptions_(e)},t.prototype.setXAxisOptions_=function(e){e?(this.attrs_.xValueParser=t.dateParser,this.attrs_.axes.x.valueFormatter=t.dateValueFormatter,this.attrs_.axes.x.ticker=t.dateTicker,this.attrs_.axes.x.axisLabelFormatter=t.dateAxisLabelFormatter):(this.attrs_.xValueParser=function(t){return parseFloat(t)},this.attrs_.axes.x.valueFormatter=function(t){return t},this.attrs_.axes.x.ticker=t.numericTicks,this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter)},t.prototype.parseCSV_=function(e){var a,i,r=[],n=t.detectLineDelimiter(e),o=e.split(n||"\n"),s=this.getStringOption("delimiter");-1==o[0].indexOf(s)&&o[0].indexOf(" ")>=0&&(s=" ");var l=0;"labels"in this.user_attrs_||(l=1,this.attrs_.labels=o[0].split(s),this.attributes_.reparseSeries());for(var h,p=0,g=!1,d=this.attr_("labels").length,u=!1,c=l;c<o.length;c++){var y=o[c];if(p=c,0!==y.length&&"#"!=y[0]){var _=y.split(s);if(!(_.length<2)){var v=[];if(g||(this.detectTypeFromString_(_[0]),h=this.getFunctionOption("xValueParser"),g=!0),v[0]=h(_[0],this),this.fractions_)for(i=1;i<_.length;i++)a=_[i].split("/"),2!=a.length?(console.error('Expected fractional "num/den" values in CSV data but found a value \''+_[i]+"' on line "+(1+c)+" ('"+y+"') which is not of this form."),v[i]=[0,0]):v[i]=[t.parseFloat_(a[0],c,y),t.parseFloat_(a[1],c,y)];else if(this.getBooleanOption("errorBars"))for(_.length%2!=1&&console.error("Expected alternating (value, stdev.) pairs in CSV data but line "+(1+c)+" has an odd number of values ("+(_.length-1)+"): '"+y+"'"),i=1;i<_.length;i+=2)v[(i+1)/2]=[t.parseFloat_(_[i],c,y),t.parseFloat_(_[i+1],c,y)];else if(this.getBooleanOption("customBars"))for(i=1;i<_.length;i++){var f=_[i];/^ *$/.test(f)?v[i]=[null,null,null]:(a=f.split(";"),3==a.length?v[i]=[t.parseFloat_(a[0],c,y),t.parseFloat_(a[1],c,y),t.parseFloat_(a[2],c,y)]:console.warn('When using customBars, values must be either blank or "low;center;high" tuples (got "'+f+'" on line '+(1+c)))}else for(i=1;i<_.length;i++)v[i]=t.parseFloat_(_[i],c,y);if(r.length>0&&v[0]<r[r.length-1][0]&&(u=!0),v.length!=d&&console.error("Number of columns in line "+c+" ("+v.length+") does not agree with number of labels ("+d+") "+y),0===c&&this.attr_("labels")){var x=!0;for(i=0;x&&i<v.length;i++)v[i]&&(x=!1);if(x){console.warn("The dygraphs 'labels' option is set, but the first row of CSV data ('"+y+"') appears to also contain labels. Will drop the CSV labels and use the option labels.");continue}}r.push(v)}}}return u&&(console.warn("CSV is out of order; order it correctly to speed loading."),r.sort(function(t,e){return t[0]-e[0]})),r},t.prototype.parseArray_=function(e){if(0===e.length)return console.error("Can't plot empty data set"),null;if(0===e[0].length)return console.error("Data set cannot contain an empty row"),null;var a;if(null===this.attr_("labels")){for(console.warn("Using default labels. Set labels explicitly via 'labels' in the options parameter"),this.attrs_.labels=["X"],a=1;a<e[0].length;a++)this.attrs_.labels.push("Y"+a);this.attributes_.reparseSeries()}else{var i=this.attr_("labels");if(i.length!=e[0].length)return console.error("Mismatch between number of labels ("+i+") and number of columns in array ("+e[0].length+")"),null}if(t.isDateLike(e[0][0])){this.attrs_.axes.x.valueFormatter=t.dateValueFormatter,this.attrs_.axes.x.ticker=t.dateTicker,this.attrs_.axes.x.axisLabelFormatter=t.dateAxisLabelFormatter;var r=t.clone(e);for(a=0;a<e.length;a++){if(0===r[a].length)return console.error("Row "+(1+a)+" of data is empty"),null;if(null===r[a][0]||"function"!=typeof r[a][0].getTime||isNaN(r[a][0].getTime()))return console.error("x value in row "+(1+a)+" is not a Date"),null;r[a][0]=r[a][0].getTime()}return r}return this.attrs_.axes.x.valueFormatter=function(t){return t},this.attrs_.axes.x.ticker=t.numericTicks,this.attrs_.axes.x.axisLabelFormatter=t.numberAxisLabelFormatter,e},t.prototype.parseDataTable_=function(e){var a=function(t){var e=String.fromCharCode(65+t%26);for(t=Math.floor(t/26);t>0;)e=String.fromCharCode(65+(t-1)%26)+e.toLowerCase(),t=Math.floor((t-1)/26);return e},i=e.getNumberOfColumns(),r=e.getNumberOfRows(),n=e.getColumnType(0);if("date"==n||"datetime"==n)this.attrs_.xValueParser=t.dateParser,this.attrs_.axes.x.valueFormatter=t.dateValueFormatter,this.attrs_.axes.x.ticker=t.dateTicker,this.attrs_.axes.x.axisLabelFormatter=t.dateAxisLabelFormatter;else{if("number"!=n)return console.error("only 'date', 'datetime' and 'number' types are supported for column 1 of DataTable input (Got '"+n+"')"),null;this.attrs_.xValueParser=function(t){return parseFloat(t)},this.attrs_.axes.x.valueFormatter=function(t){return t},this.attrs_.axes.x.ticker=t.numericTicks,this.attrs_.axes.x.axisLabelFormatter=this.attrs_.axes.x.valueFormatter}var o,s,l=[],h={},p=!1;for(o=1;i>o;o++){var g=e.getColumnType(o);if("number"==g)l.push(o);else if("string"==g&&this.getBooleanOption("displayAnnotations")){var d=l[l.length-1];h.hasOwnProperty(d)?h[d].push(o):h[d]=[o],p=!0}else console.error("Only 'number' is supported as a dependent type with Gviz. 'string' is only supported if displayAnnotations is true")}var u=[e.getColumnLabel(0)];for(o=0;o<l.length;o++)u.push(e.getColumnLabel(l[o])),this.getBooleanOption("errorBars")&&(o+=1);this.attrs_.labels=u,i=u.length;var c=[],y=!1,_=[];for(o=0;r>o;o++){var v=[];if("undefined"!=typeof e.getValue(o,0)&&null!==e.getValue(o,0)){if(v.push("date"==n||"datetime"==n?e.getValue(o,0).getTime():e.getValue(o,0)),this.getBooleanOption("errorBars"))for(s=0;i-1>s;s++)v.push([e.getValue(o,1+2*s),e.getValue(o,2+2*s)]);else{for(s=0;s<l.length;s++){var f=l[s];if(v.push(e.getValue(o,f)),p&&h.hasOwnProperty(f)&&null!==e.getValue(o,h[f][0])){var x={};x.series=e.getColumnLabel(f),x.xval=v[0],x.shortText=a(_.length),x.text="";for(var m=0;m<h[f].length;m++)m&&(x.text+="\n"),x.text+=e.getValue(o,h[f][m]);_.push(x)}}for(s=0;s<v.length;s++)isFinite(v[s])||(v[s]=null)}c.length>0&&v[0]<c[c.length-1][0]&&(y=!0),c.push(v)}else console.warn("Ignoring row "+o+" of DataTable because of undefined or null first column.")}y&&(console.warn("DataTable is out of order; order it correctly to speed loading."),c.sort(function(t,e){return t[0]-e[0]})),this.rawData_=c,_.length>0&&this.setAnnotations(_,!0),this.attributes_.reparseSeries()},t.prototype.cascadeDataDidUpdateEvent_=function(){this.cascadeEvents_("dataDidUpdate",{})},t.prototype.start_=function(){var e=this.file_;if("function"==typeof e&&(e=e()),t.isArrayLike(e))this.rawData_=this.parseArray_(e),this.cascadeDataDidUpdateEvent_(),this.predraw_();else if("object"==typeof e&&"function"==typeof e.getColumnRange)this.parseDataTable_(e),this.cascadeDataDidUpdateEvent_(),this.predraw_();else if("string"==typeof e){var a=t.detectLineDelimiter(e);if(a)this.loadedEvent_(e);else{var i;i=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHTTP");var r=this;i.onreadystatechange=function(){4==i.readyState&&(200===i.status||0===i.status)&&r.loadedEvent_(i.responseText)},i.open("GET",e,!0),i.send(null)}}else console.error("Unknown data format: "+typeof e)},t.prototype.updateOptions=function(e,a){"undefined"==typeof a&&(a=!1);var i=e.file,r=t.mapLegacyOptions_(e);"rollPeriod"in r&&(this.rollPeriod_=r.rollPeriod),"dateWindow"in r&&(this.dateWindow_=r.dateWindow,"isZoomedIgnoreProgrammaticZoom"in r||(this.zoomed_x_=null!==r.dateWindow)),"valueRange"in r&&!("isZoomedIgnoreProgrammaticZoom"in r)&&(this.zoomed_y_=null!==r.valueRange);var n=t.isPixelChangingOptionList(this.attr_("labels"),r);t.updateDeep(this.user_attrs_,r),this.attributes_.reparseSeries(),i?(this.cascadeEvents_("dataWillUpdate",{}),this.file_=i,a||this.start_()):a||(n?this.predraw_():this.renderGraph_(!1))},t.mapLegacyOptions_=function(t){var e={};for(var a in t)t.hasOwnProperty(a)&&"file"!=a&&t.hasOwnProperty(a)&&(e[a]=t[a]);var i=function(t,a,i){e.axes||(e.axes={}),e.axes[t]||(e.axes[t]={}),e.axes[t][a]=i},r=function(a,r,n){"undefined"!=typeof t[a]&&(console.warn("Option "+a+" is deprecated. Use the "+n+" option for the "+r+" axis instead. (e.g. { axes : { "+r+" : { "+n+" : ... } } } (see http://dygraphs.com/per-axis.html for more information."),i(r,n,t[a]),delete e[a])};return r("xValueFormatter","x","valueFormatter"),r("pixelsPerXLabel","x","pixelsPerLabel"),r("xAxisLabelFormatter","x","axisLabelFormatter"),r("xTicker","x","ticker"),r("yValueFormatter","y","valueFormatter"),r("pixelsPerYLabel","y","pixelsPerLabel"),r("yAxisLabelFormatter","y","axisLabelFormatter"),r("yTicker","y","ticker"),r("drawXGrid","x","drawGrid"),r("drawXAxis","x","drawAxis"),r("drawYGrid","y","drawGrid"),r("drawYAxis","y","drawAxis"),r("xAxisLabelWidth","x","axisLabelWidth"),r("yAxisLabelWidth","y","axisLabelWidth"),e},t.prototype.resize=function(t,e){if(!this.resize_lock){this.resize_lock=!0,null===t!=(null===e)&&(console.warn("Dygraph.resize() should be called with zero parameters or two non-NULL parameters. Pretending it was zero."),t=e=null);var a=this.width_,i=this.height_;t?(this.maindiv_.style.width=t+"px",this.maindiv_.style.height=e+"px",this.width_=t,this.height_=e):(this.width_=this.maindiv_.clientWidth,this.height_=this.maindiv_.clientHeight),(a!=this.width_||i!=this.height_)&&(this.resizeElements_(),this.predraw_()),this.resize_lock=!1}},t.prototype.adjustRoll=function(t){this.rollPeriod_=t,this.predraw_()},t.prototype.visibility=function(){for(this.getOption("visibility")||(this.attrs_.visibility=[]);this.getOption("visibility").length<this.numColumns()-1;)this.attrs_.visibility.push(!0);return this.getOption("visibility")},t.prototype.setVisibility=function(t,e){var a=this.visibility();0>t||t>=a.length?console.warn("invalid series number in setVisibility: "+t):(a[t]=e,this.predraw_())},t.prototype.size=function(){return{width:this.width_,height:this.height_}},t.prototype.setAnnotations=function(e,a){return t.addAnnotationRule(),this.annotations_=e,this.layout_?(this.layout_.setAnnotations(this.annotations_),void(a||this.predraw_())):void console.warn("Tried to setAnnotations before dygraph was ready. Try setting them in a ready() block. See dygraphs.com/tests/annotation.html")},t.prototype.annotations=function(){return this.annotations_},t.prototype.getLabels=function(){var t=this.attr_("labels");return t?t.slice():null},t.prototype.indexFromSetName=function(t){return this.setIndexByName_[t]},t.prototype.ready=function(t){this.is_initial_draw_?this.readyFns_.push(t):t.call(this,this)},t.addAnnotationRule=function(){if(!t.addedAnnotationCSS){var e="border: 1px solid black; background-color: white; text-align: center;",a=document.createElement("style");a.type="text/css",document.getElementsByTagName("head")[0].appendChild(a);for(var i=0;i<document.styleSheets.length;i++)if(!document.styleSheets[i].disabled){var r=document.styleSheets[i];try{if(r.insertRule){var n=r.cssRules?r.cssRules.length:0;r.insertRule(".dygraphDefaultAnnotation { "+e+" }",n)}else r.addRule&&r.addRule(".dygraphDefaultAnnotation",e);return void(t.addedAnnotationCSS=!0)}catch(o){}}console.warn("Unable to add default annotation CSS rule; display may be off.")}},"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=t),t}();!function(){"use strict";function t(t){var e=a.exec(t);if(!e)return null;var i=parseInt(e[1],10),r=parseInt(e[2],10),n=parseInt(e[3],10);return e[4]?{r:i,g:r,b:n,a:parseFloat(e[4])}:{r:i,g:r,b:n}}Dygraph.LOG_SCALE=10,Dygraph.LN_TEN=Math.log(Dygraph.LOG_SCALE),Dygraph.log10=function(t){return Math.log(t)/Dygraph.LN_TEN},Dygraph.DOTTED_LINE=[2,2],Dygraph.DASHED_LINE=[7,3],Dygraph.DOT_DASH_LINE=[7,2,2,2],Dygraph.getContext=function(t){return t.getContext("2d")},Dygraph.addEvent=function(t,e,a){t.addEventListener?t.addEventListener(e,a,!1):(t[e+a]=function(){a(window.event)},t.attachEvent("on"+e,t[e+a]))},Dygraph.prototype.addAndTrackEvent=function(t,e,a){Dygraph.addEvent(t,e,a),this.registeredEvents_.push({elem:t,type:e,fn:a})},Dygraph.removeEvent=function(t,e,a){if(t.removeEventListener)t.removeEventListener(e,a,!1);else{try{t.detachEvent("on"+e,t[e+a])}catch(i){}t[e+a]=null}},Dygraph.prototype.removeTrackedEvents_=function(){if(this.registeredEvents_)for(var t=0;t<this.registeredEvents_.length;t++){var e=this.registeredEvents_[t];Dygraph.removeEvent(e.elem,e.type,e.fn)}this.registeredEvents_=[]},Dygraph.cancelEvent=function(t){return t=t?t:window.event,t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),t.cancelBubble=!0,t.cancel=!0,t.returnValue=!1,!1},Dygraph.hsvToRGB=function(t,e,a){var i,r,n;if(0===e)i=a,r=a,n=a;else{var o=Math.floor(6*t),s=6*t-o,l=a*(1-e),h=a*(1-e*s),p=a*(1-e*(1-s));switch(o){case 1:i=h,r=a,n=l;break;case 2:i=l,r=a,n=p;break;case 3:i=l,r=h,n=a;break;case 4:i=p,r=l,n=a;break;case 5:i=a,r=l,n=h;break;case 6:case 0:i=a,r=p,n=l}}return i=Math.floor(255*i+.5),r=Math.floor(255*r+.5),n=Math.floor(255*n+.5),"rgb("+i+","+r+","+n+")"},Dygraph.findPos=function(t){var e=0,a=0;if(t.offsetParent)for(var i=t;;){var r="0",n="0";if(window.getComputedStyle){ var o=window.getComputedStyle(i,null);r=o.borderLeft||"0",n=o.borderTop||"0"}if(e+=parseInt(r,10),a+=parseInt(n,10),e+=i.offsetLeft,a+=i.offsetTop,!i.offsetParent)break;i=i.offsetParent}else t.x&&(e+=t.x),t.y&&(a+=t.y);for(;t&&t!=document.body;)e-=t.scrollLeft,a-=t.scrollTop,t=t.parentNode;return{x:e,y:a}},Dygraph.pageX=function(t){if(t.pageX)return!t.pageX||t.pageX<0?0:t.pageX;var e=document.documentElement,a=document.body;return t.clientX+(e.scrollLeft||a.scrollLeft)-(e.clientLeft||0)},Dygraph.pageY=function(t){if(t.pageY)return!t.pageY||t.pageY<0?0:t.pageY;var e=document.documentElement,a=document.body;return t.clientY+(e.scrollTop||a.scrollTop)-(e.clientTop||0)},Dygraph.dragGetX_=function(t,e){return Dygraph.pageX(t)-e.px},Dygraph.dragGetY_=function(t,e){return Dygraph.pageY(t)-e.py},Dygraph.isOK=function(t){return!!t&&!isNaN(t)},Dygraph.isValidPoint=function(t,e){return t?null===t.yval?!1:null===t.x||void 0===t.x?!1:null===t.y||void 0===t.y?!1:isNaN(t.x)||!e&&isNaN(t.y)?!1:!0:!1},Dygraph.floatFormat=function(t,e){var a=Math.min(Math.max(1,e||2),21);return Math.abs(t)<.001&&0!==t?t.toExponential(a-1):t.toPrecision(a)},Dygraph.zeropad=function(t){return 10>t?"0"+t:""+t},Dygraph.DateAccessorsLocal={getFullYear:function(t){return t.getFullYear()},getMonth:function(t){return t.getMonth()},getDate:function(t){return t.getDate()},getHours:function(t){return t.getHours()},getMinutes:function(t){return t.getMinutes()},getSeconds:function(t){return t.getSeconds()},getMilliseconds:function(t){return t.getMilliseconds()},getDay:function(t){return t.getDay()},makeDate:function(t,e,a,i,r,n,o){return new Date(t,e,a,i,r,n,o)}},Dygraph.DateAccessorsUTC={getFullYear:function(t){return t.getUTCFullYear()},getMonth:function(t){return t.getUTCMonth()},getDate:function(t){return t.getUTCDate()},getHours:function(t){return t.getUTCHours()},getMinutes:function(t){return t.getUTCMinutes()},getSeconds:function(t){return t.getUTCSeconds()},getMilliseconds:function(t){return t.getUTCMilliseconds()},getDay:function(t){return t.getUTCDay()},makeDate:function(t,e,a,i,r,n,o){return new Date(Date.UTC(t,e,a,i,r,n,o))}},Dygraph.hmsString_=function(t,e,a){var i=Dygraph.zeropad,r=i(t)+":"+i(e);return a&&(r+=":"+i(a)),r},Dygraph.dateString_=function(t,e){var a=Dygraph.zeropad,i=e?Dygraph.DateAccessorsUTC:Dygraph.DateAccessorsLocal,r=new Date(t),n=i.getFullYear(r),o=i.getMonth(r),s=i.getDate(r),l=i.getHours(r),h=i.getMinutes(r),p=i.getSeconds(r),g=""+n,d=a(o+1),u=a(s),c=3600*l+60*h+p,y=g+"/"+d+"/"+u;return c&&(y+=" "+Dygraph.hmsString_(l,h,p)),y},Dygraph.round_=function(t,e){var a=Math.pow(10,e);return Math.round(t*a)/a},Dygraph.binarySearch=function(t,e,a,i,r){if((null===i||void 0===i||null===r||void 0===r)&&(i=0,r=e.length-1),i>r)return-1;(null===a||void 0===a)&&(a=0);var n,o=function(t){return t>=0&&t<e.length},s=parseInt((i+r)/2,10),l=e[s];return l==t?s:l>t?a>0&&(n=s-1,o(n)&&e[n]<t)?s:Dygraph.binarySearch(t,e,a,i,s-1):t>l?0>a&&(n=s+1,o(n)&&e[n]>t)?s:Dygraph.binarySearch(t,e,a,s+1,r):-1},Dygraph.dateParser=function(t){var e,a;if((-1==t.search("-")||-1!=t.search("T")||-1!=t.search("Z"))&&(a=Dygraph.dateStrToMillis(t),a&&!isNaN(a)))return a;if(-1!=t.search("-")){for(e=t.replace("-","/","g");-1!=e.search("-");)e=e.replace("-","/");a=Dygraph.dateStrToMillis(e)}else 8==t.length?(e=t.substr(0,4)+"/"+t.substr(4,2)+"/"+t.substr(6,2),a=Dygraph.dateStrToMillis(e)):a=Dygraph.dateStrToMillis(t);return(!a||isNaN(a))&&console.error("Couldn't parse "+t+" as a date"),a},Dygraph.dateStrToMillis=function(t){return new Date(t).getTime()},Dygraph.update=function(t,e){if("undefined"!=typeof e&&null!==e)for(var a in e)e.hasOwnProperty(a)&&(t[a]=e[a]);return t},Dygraph.updateDeep=function(t,e){function a(t){return"object"==typeof Node?t instanceof Node:"object"==typeof t&&"number"==typeof t.nodeType&&"string"==typeof t.nodeName}if("undefined"!=typeof e&&null!==e)for(var i in e)e.hasOwnProperty(i)&&(null===e[i]?t[i]=null:Dygraph.isArrayLike(e[i])?t[i]=e[i].slice():a(e[i])?t[i]=e[i]:"object"==typeof e[i]?(("object"!=typeof t[i]||null===t[i])&&(t[i]={}),Dygraph.updateDeep(t[i],e[i])):t[i]=e[i]);return t},Dygraph.isArrayLike=function(t){var e=typeof t;return"object"!=e&&("function"!=e||"function"!=typeof t.item)||null===t||"number"!=typeof t.length||3===t.nodeType?!1:!0},Dygraph.isDateLike=function(t){return"object"!=typeof t||null===t||"function"!=typeof t.getTime?!1:!0},Dygraph.clone=function(t){for(var e=[],a=0;a<t.length;a++)e.push(Dygraph.isArrayLike(t[a])?Dygraph.clone(t[a]):t[a]);return e},Dygraph.createCanvas=function(){var t=document.createElement("canvas"),e=/MSIE/.test(navigator.userAgent)&&!window.opera;return e&&"undefined"!=typeof G_vmlCanvasManager&&(t=G_vmlCanvasManager.initElement(t)),t},Dygraph.getContextPixelRatio=function(t){try{var e=window.devicePixelRatio,a=t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1;return void 0!==e?e/a:1}catch(i){return 1}},Dygraph.isAndroid=function(){return/Android/.test(navigator.userAgent)},Dygraph.Iterator=function(t,e,a,i){e=e||0,a=a||t.length,this.hasNext=!0,this.peek=null,this.start_=e,this.array_=t,this.predicate_=i,this.end_=Math.min(t.length,e+a),this.nextIdx_=e-1,this.next()},Dygraph.Iterator.prototype.next=function(){if(!this.hasNext)return null;for(var t=this.peek,e=this.nextIdx_+1,a=!1;e<this.end_;){if(!this.predicate_||this.predicate_(this.array_,e)){this.peek=this.array_[e],a=!0;break}e++}return this.nextIdx_=e,a||(this.hasNext=!1,this.peek=null),t},Dygraph.createIterator=function(t,e,a,i){return new Dygraph.Iterator(t,e,a,i)},Dygraph.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}(),Dygraph.repeatAndCleanup=function(t,e,a,i){var r,n=0,o=(new Date).getTime();if(t(n),1==e)return void i();var s=e-1;!function l(){n>=e||Dygraph.requestAnimFrame.call(window,function(){var e=(new Date).getTime(),h=e-o;r=n,n=Math.floor(h/a);var p=n-r,g=n+p>s;g||n>=s?(t(s),i()):(0!==p&&t(n),l())})}()};var e={annotationClickHandler:!0,annotationDblClickHandler:!0,annotationMouseOutHandler:!0,annotationMouseOverHandler:!0,axisLabelColor:!0,axisLineColor:!0,axisLineWidth:!0,clickCallback:!0,drawCallback:!0,drawHighlightPointCallback:!0,drawPoints:!0,drawPointCallback:!0,drawXGrid:!0,drawYGrid:!0,fillAlpha:!0,gridLineColor:!0,gridLineWidth:!0,hideOverlayOnMouseOut:!0,highlightCallback:!0,highlightCircleSize:!0,interactionModel:!0,isZoomedIgnoreProgrammaticZoom:!0,labelsDiv:!0,labelsDivStyles:!0,labelsDivWidth:!0,labelsKMB:!0,labelsKMG2:!0,labelsSeparateLines:!0,labelsShowZeroValues:!0,legend:!0,panEdgeFraction:!0,pixelsPerYLabel:!0,pointClickCallback:!0,pointSize:!0,rangeSelectorPlotFillColor:!0,rangeSelectorPlotStrokeColor:!0,showLabelsOnHighlight:!0,showRoller:!0,strokeWidth:!0,underlayCallback:!0,unhighlightCallback:!0,zoomCallback:!0};Dygraph.isPixelChangingOptionList=function(t,a){var i={};if(t)for(var r=1;r<t.length;r++)i[t[r]]=!0;var n=function(t){for(var a in t)if(t.hasOwnProperty(a)&&!e[a])return!0;return!1};for(var o in a)if(a.hasOwnProperty(o))if("highlightSeriesOpts"==o||i[o]&&!a.series){if(n(a[o]))return!0}else if("series"==o||"axes"==o){var s=a[o];for(var l in s)if(s.hasOwnProperty(l)&&n(s[l]))return!0}else if(!e[o])return!0;return!1},Dygraph.Circles={DEFAULT:function(t,e,a,i,r,n,o){a.beginPath(),a.fillStyle=n,a.arc(i,r,o,0,2*Math.PI,!1),a.fill()}},Dygraph.IFrameTarp=function(){this.tarps=[]},Dygraph.IFrameTarp.prototype.cover=function(){for(var t=document.getElementsByTagName("iframe"),e=0;e<t.length;e++){var a=t[e],i=Dygraph.findPos(a),r=i.x,n=i.y,o=a.offsetWidth,s=a.offsetHeight,l=document.createElement("div");l.style.position="absolute",l.style.left=r+"px",l.style.top=n+"px",l.style.width=o+"px",l.style.height=s+"px",l.style.zIndex=999,document.body.appendChild(l),this.tarps.push(l)}},Dygraph.IFrameTarp.prototype.uncover=function(){for(var t=0;t<this.tarps.length;t++)this.tarps[t].parentNode.removeChild(this.tarps[t]);this.tarps=[]},Dygraph.detectLineDelimiter=function(t){for(var e=0;e<t.length;e++){var a=t.charAt(e);if("\r"===a)return e+1<t.length&&"\n"===t.charAt(e+1)?"\r\n":a;if("\n"===a)return e+1<t.length&&"\r"===t.charAt(e+1)?"\n\r":a}return null},Dygraph.isNodeContainedBy=function(t,e){if(null===e||null===t)return!1;for(var a=t;a&&a!==e;)a=a.parentNode;return a===e},Dygraph.pow=function(t,e){return 0>e?1/Math.pow(t,-e):Math.pow(t,e)};var a=/^rgba?\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})(?:,\s*([01](?:\.\d+)?))?\)$/;Dygraph.toRGB_=function(e){var a=t(e);if(a)return a;var i=document.createElement("div");i.style.backgroundColor=e,i.style.visibility="hidden",document.body.appendChild(i);var r;return r=window.getComputedStyle?window.getComputedStyle(i,null).backgroundColor:i.currentStyle.backgroundColor,document.body.removeChild(i),t(r)},Dygraph.isCanvasSupported=function(t){var e;try{e=t||document.createElement("canvas"),e.getContext("2d")}catch(a){var i=navigator.appVersion.match(/MSIE (\d\.\d)/),r=-1!=navigator.userAgent.toLowerCase().indexOf("opera");return!i||i[1]<6||r?!1:!0}return!0},Dygraph.parseFloat_=function(t,e,a){var i=parseFloat(t);if(!isNaN(i))return i;if(/^ *$/.test(t))return null;if(/^ *nan *$/i.test(t))return 0/0;var r="Unable to parse '"+t+"' as a number";return void 0!==a&&void 0!==e&&(r+=" on line "+(1+(e||0))+" ('"+a+"') of CSV."),console.error(r),null}}(),function(){"use strict";Dygraph.GVizChart=function(t){this.container=t},Dygraph.GVizChart.prototype.draw=function(t,e){this.container.innerHTML="","undefined"!=typeof this.date_graph&&this.date_graph.destroy(),this.date_graph=new Dygraph(this.container,t,e)},Dygraph.GVizChart.prototype.setSelection=function(t){var e=!1;t.length&&(e=t[0].row),this.date_graph.setSelection(e)},Dygraph.GVizChart.prototype.getSelection=function(){var t=[],e=this.date_graph.getSelection();if(0>e)return t;for(var a=this.date_graph.layout_.points,i=0;i<a.length;++i)t.push({row:e,column:i+1});return t}}(),function(){"use strict";var t=100;Dygraph.Interaction={},Dygraph.Interaction.maybeTreatMouseOpAsClick=function(t,e,a){a.dragEndX=Dygraph.dragGetX_(t,a),a.dragEndY=Dygraph.dragGetY_(t,a);var i=Math.abs(a.dragEndX-a.dragStartX),r=Math.abs(a.dragEndY-a.dragStartY);2>i&&2>r&&void 0!==e.lastx_&&-1!=e.lastx_&&Dygraph.Interaction.treatMouseOpAsClick(e,t,a),a.regionWidth=i,a.regionHeight=r},Dygraph.Interaction.startPan=function(t,e,a){var i,r;a.isPanning=!0;var n=e.xAxisRange();if(e.getOptionForAxis("logscale","x")?(a.initialLeftmostDate=Dygraph.log10(n[0]),a.dateRange=Dygraph.log10(n[1])-Dygraph.log10(n[0])):(a.initialLeftmostDate=n[0],a.dateRange=n[1]-n[0]),a.xUnitsPerPixel=a.dateRange/(e.plotter_.area.w-1),e.getNumericOption("panEdgeFraction")){var o=e.width_*e.getNumericOption("panEdgeFraction"),s=e.xAxisExtremes(),l=e.toDomXCoord(s[0])-o,h=e.toDomXCoord(s[1])+o,p=e.toDataXCoord(l),g=e.toDataXCoord(h);a.boundedDates=[p,g];var d=[],u=e.height_*e.getNumericOption("panEdgeFraction");for(i=0;i<e.axes_.length;i++){r=e.axes_[i];var c=r.extremeRange,y=e.toDomYCoord(c[0],i)+u,_=e.toDomYCoord(c[1],i)-u,v=e.toDataYCoord(y,i),f=e.toDataYCoord(_,i);d[i]=[v,f]}a.boundedValues=d}for(a.is2DPan=!1,a.axes=[],i=0;i<e.axes_.length;i++){r=e.axes_[i];var x={},m=e.yAxisRange(i),D=e.attributes_.getForAxis("logscale",i);D?(x.initialTopValue=Dygraph.log10(m[1]),x.dragValueRange=Dygraph.log10(m[1])-Dygraph.log10(m[0])):(x.initialTopValue=m[1],x.dragValueRange=m[1]-m[0]),x.unitsPerPixel=x.dragValueRange/(e.plotter_.area.h-1),a.axes.push(x),(r.valueWindow||r.valueRange)&&(a.is2DPan=!0)}},Dygraph.Interaction.movePan=function(t,e,a){a.dragEndX=Dygraph.dragGetX_(t,a),a.dragEndY=Dygraph.dragGetY_(t,a);var i=a.initialLeftmostDate-(a.dragEndX-a.dragStartX)*a.xUnitsPerPixel;a.boundedDates&&(i=Math.max(i,a.boundedDates[0]));var r=i+a.dateRange;if(a.boundedDates&&r>a.boundedDates[1]&&(i-=r-a.boundedDates[1],r=i+a.dateRange),e.getOptionForAxis("logscale","x")?e.dateWindow_=[Math.pow(Dygraph.LOG_SCALE,i),Math.pow(Dygraph.LOG_SCALE,r)]:e.dateWindow_=[i,r],a.is2DPan)for(var n=a.dragEndY-a.dragStartY,o=0;o<e.axes_.length;o++){var s=e.axes_[o],l=a.axes[o],h=n*l.unitsPerPixel,p=a.boundedValues?a.boundedValues[o]:null,g=l.initialTopValue+h;p&&(g=Math.min(g,p[1]));var d=g-l.dragValueRange;p&&d<p[0]&&(g-=d-p[0],d=g-l.dragValueRange),e.attributes_.getForAxis("logscale",o)?s.valueWindow=[Math.pow(Dygraph.LOG_SCALE,d),Math.pow(Dygraph.LOG_SCALE,g)]:s.valueWindow=[d,g]}e.drawGraph_(!1)},Dygraph.Interaction.endPan=Dygraph.Interaction.maybeTreatMouseOpAsClick,Dygraph.Interaction.startZoom=function(t,e,a){a.isZooming=!0,a.zoomMoved=!1},Dygraph.Interaction.moveZoom=function(t,e,a){a.zoomMoved=!0,a.dragEndX=Dygraph.dragGetX_(t,a),a.dragEndY=Dygraph.dragGetY_(t,a);var i=Math.abs(a.dragStartX-a.dragEndX),r=Math.abs(a.dragStartY-a.dragEndY);a.dragDirection=r/2>i?Dygraph.VERTICAL:Dygraph.HORIZONTAL,e.drawZoomRect_(a.dragDirection,a.dragStartX,a.dragEndX,a.dragStartY,a.dragEndY,a.prevDragDirection,a.prevEndX,a.prevEndY),a.prevEndX=a.dragEndX,a.prevEndY=a.dragEndY,a.prevDragDirection=a.dragDirection},Dygraph.Interaction.treatMouseOpAsClick=function(t,e,a){for(var i=t.getFunctionOption("clickCallback"),r=t.getFunctionOption("pointClickCallback"),n=null,o=-1,s=Number.MAX_VALUE,l=0;l<t.selPoints_.length;l++){var h=t.selPoints_[l],p=Math.pow(h.canvasx-a.dragEndX,2)+Math.pow(h.canvasy-a.dragEndY,2);!isNaN(p)&&(-1==o||s>p)&&(s=p,o=l)}var g=t.getNumericOption("highlightCircleSize")+2;if(g*g>=s&&(n=t.selPoints_[o]),n){var d={cancelable:!0,point:n,canvasx:a.dragEndX,canvasy:a.dragEndY},u=t.cascadeEvents_("pointClick",d);if(u)return;r&&r.call(t,e,n)}var d={cancelable:!0,xval:t.lastx_,pts:t.selPoints_,canvasx:a.dragEndX,canvasy:a.dragEndY};t.cascadeEvents_("click",d)||i&&i.call(t,e,t.lastx_,t.selPoints_)},Dygraph.Interaction.endZoom=function(t,e,a){e.clearZoomRect_(),a.isZooming=!1,Dygraph.Interaction.maybeTreatMouseOpAsClick(t,e,a);var i=e.getArea();if(a.regionWidth>=10&&a.dragDirection==Dygraph.HORIZONTAL){var r=Math.min(a.dragStartX,a.dragEndX),n=Math.max(a.dragStartX,a.dragEndX);r=Math.max(r,i.x),n=Math.min(n,i.x+i.w),n>r&&e.doZoomX_(r,n),a.cancelNextDblclick=!0}else if(a.regionHeight>=10&&a.dragDirection==Dygraph.VERTICAL){var o=Math.min(a.dragStartY,a.dragEndY),s=Math.max(a.dragStartY,a.dragEndY);o=Math.max(o,i.y),s=Math.min(s,i.y+i.h),s>o&&e.doZoomY_(o,s),a.cancelNextDblclick=!0}a.dragStartX=null,a.dragStartY=null},Dygraph.Interaction.startTouch=function(t,e,a){t.preventDefault(),t.touches.length>1&&(a.startTimeForDoubleTapMs=null);for(var i=[],r=0;r<t.touches.length;r++){var n=t.touches[r];i.push({pageX:n.pageX,pageY:n.pageY,dataX:e.toDataXCoord(n.pageX),dataY:e.toDataYCoord(n.pageY)})}if(a.initialTouches=i,1==i.length)a.initialPinchCenter=i[0],a.touchDirections={x:!0,y:!0};else if(i.length>=2){a.initialPinchCenter={pageX:.5*(i[0].pageX+i[1].pageX),pageY:.5*(i[0].pageY+i[1].pageY),dataX:.5*(i[0].dataX+i[1].dataX),dataY:.5*(i[0].dataY+i[1].dataY)};var o=180/Math.PI*Math.atan2(a.initialPinchCenter.pageY-i[0].pageY,i[0].pageX-a.initialPinchCenter.pageX);o=Math.abs(o),o>90&&(o=90-o),a.touchDirections={x:67.5>o,y:o>22.5}}a.initialRange={x:e.xAxisRange(),y:e.yAxisRange()}},Dygraph.Interaction.moveTouch=function(t,e,a){a.startTimeForDoubleTapMs=null;var i,r=[];for(i=0;i<t.touches.length;i++){var n=t.touches[i];r.push({pageX:n.pageX,pageY:n.pageY})}var o,s=a.initialTouches,l=a.initialPinchCenter;o=1==r.length?r[0]:{pageX:.5*(r[0].pageX+r[1].pageX),pageY:.5*(r[0].pageY+r[1].pageY)};var h={pageX:o.pageX-l.pageX,pageY:o.pageY-l.pageY},p=a.initialRange.x[1]-a.initialRange.x[0],g=a.initialRange.y[0]-a.initialRange.y[1];h.dataX=h.pageX/e.plotter_.area.w*p,h.dataY=h.pageY/e.plotter_.area.h*g;var d,u;if(1==r.length)d=1,u=1;else if(r.length>=2){var c=s[1].pageX-l.pageX;d=(r[1].pageX-o.pageX)/c;var y=s[1].pageY-l.pageY;u=(r[1].pageY-o.pageY)/y}d=Math.min(8,Math.max(.125,d)),u=Math.min(8,Math.max(.125,u));var _=!1;if(a.touchDirections.x&&(e.dateWindow_=[l.dataX-h.dataX+(a.initialRange.x[0]-l.dataX)/d,l.dataX-h.dataX+(a.initialRange.x[1]-l.dataX)/d],_=!0),a.touchDirections.y)for(i=0;1>i;i++){var v=e.axes_[i],f=e.attributes_.getForAxis("logscale",i);f||(v.valueWindow=[l.dataY-h.dataY+(a.initialRange.y[0]-l.dataY)/u,l.dataY-h.dataY+(a.initialRange.y[1]-l.dataY)/u],_=!0)}if(e.drawGraph_(!1),_&&r.length>1&&e.getFunctionOption("zoomCallback")){var x=e.xAxisRange();e.getFunctionOption("zoomCallback").call(e,x[0],x[1],e.yAxisRanges())}},Dygraph.Interaction.endTouch=function(t,e,a){if(0!==t.touches.length)Dygraph.Interaction.startTouch(t,e,a);else if(1==t.changedTouches.length){var i=(new Date).getTime(),r=t.changedTouches[0];a.startTimeForDoubleTapMs&&i-a.startTimeForDoubleTapMs<500&&a.doubleTapX&&Math.abs(a.doubleTapX-r.screenX)<50&&a.doubleTapY&&Math.abs(a.doubleTapY-r.screenY)<50?e.resetZoom():(a.startTimeForDoubleTapMs=i,a.doubleTapX=r.screenX,a.doubleTapY=r.screenY)}};var e=function(t,e,a){return e>t?e-t:t>a?t-a:0},a=function(t,a){var i=Dygraph.findPos(a.canvas_),r={left:i.x,right:i.x+a.canvas_.offsetWidth,top:i.y,bottom:i.y+a.canvas_.offsetHeight},n={x:Dygraph.pageX(t),y:Dygraph.pageY(t)},o=e(n.x,r.left,r.right),s=e(n.y,r.top,r.bottom);return Math.max(o,s)};Dygraph.Interaction.defaultModel={mousedown:function(e,i,r){if(!e.button||2!=e.button){r.initializeMouseDown(e,i,r),e.altKey||e.shiftKey?Dygraph.startPan(e,i,r):Dygraph.startZoom(e,i,r);var n=function(e){if(r.isZooming){var n=a(e,i);t>n?Dygraph.moveZoom(e,i,r):null!==r.dragEndX&&(r.dragEndX=null,r.dragEndY=null,i.clearZoomRect_())}else r.isPanning&&Dygraph.movePan(e,i,r)},o=function(t){r.isZooming?null!==r.dragEndX?Dygraph.endZoom(t,i,r):Dygraph.Interaction.maybeTreatMouseOpAsClick(t,i,r):r.isPanning&&Dygraph.endPan(t,i,r),Dygraph.removeEvent(document,"mousemove",n),Dygraph.removeEvent(document,"mouseup",o),r.destroy()};i.addAndTrackEvent(document,"mousemove",n),i.addAndTrackEvent(document,"mouseup",o)}},willDestroyContextMyself:!0,touchstart:function(t,e,a){Dygraph.Interaction.startTouch(t,e,a)},touchmove:function(t,e,a){Dygraph.Interaction.moveTouch(t,e,a)},touchend:function(t,e,a){Dygraph.Interaction.endTouch(t,e,a)},dblclick:function(t,e,a){if(a.cancelNextDblclick)return void(a.cancelNextDblclick=!1);var i={canvasx:a.dragEndX,canvasy:a.dragEndY};e.cascadeEvents_("dblclick",i)||t.altKey||t.shiftKey||e.resetZoom()}},Dygraph.DEFAULT_ATTRS.interactionModel=Dygraph.Interaction.defaultModel,Dygraph.defaultInteractionModel=Dygraph.Interaction.defaultModel,Dygraph.endZoom=Dygraph.Interaction.endZoom,Dygraph.moveZoom=Dygraph.Interaction.moveZoom,Dygraph.startZoom=Dygraph.Interaction.startZoom,Dygraph.endPan=Dygraph.Interaction.endPan,Dygraph.movePan=Dygraph.Interaction.movePan,Dygraph.startPan=Dygraph.Interaction.startPan,Dygraph.Interaction.nonInteractiveModel_={mousedown:function(t,e,a){a.initializeMouseDown(t,e,a)},mouseup:Dygraph.Interaction.maybeTreatMouseOpAsClick},Dygraph.Interaction.dragIsPanInteractionModel={mousedown:function(t,e,a){a.initializeMouseDown(t,e,a),Dygraph.startPan(t,e,a)},mousemove:function(t,e,a){a.isPanning&&Dygraph.movePan(t,e,a)},mouseup:function(t,e,a){a.isPanning&&Dygraph.endPan(t,e,a)}}}(),function(){"use strict";Dygraph.TickList=void 0,Dygraph.Ticker=void 0,Dygraph.numericLinearTicks=function(t,e,a,i,r,n){var o=function(t){return"logscale"===t?!1:i(t)};return Dygraph.numericTicks(t,e,a,o,r,n)},Dygraph.numericTicks=function(t,e,a,i,r,n){var o,s,l,h,p=i("pixelsPerLabel"),g=[];if(n)for(o=0;o<n.length;o++)g.push({v:n[o]});else{if(i("logscale")){h=Math.floor(a/p);var d=Dygraph.binarySearch(t,Dygraph.PREFERRED_LOG_TICK_VALUES,1),u=Dygraph.binarySearch(e,Dygraph.PREFERRED_LOG_TICK_VALUES,-1);-1==d&&(d=0),-1==u&&(u=Dygraph.PREFERRED_LOG_TICK_VALUES.length-1);var c=null;if(u-d>=h/4){for(var y=u;y>=d;y--){var _=Dygraph.PREFERRED_LOG_TICK_VALUES[y],v=Math.log(_/t)/Math.log(e/t)*a,f={v:_};null===c?c={tickValue:_,pixel_coord:v}:Math.abs(v-c.pixel_coord)>=p?c={tickValue:_,pixel_coord:v}:f.label="",g.push(f)}g.reverse()}}if(0===g.length){var x,m,D=i("labelsKMG2");D?(x=[1,2,4,8,16,32,64,128,256],m=16):(x=[1,2,5,10,20,50,100],m=10);var w,A,b,T,E=Math.ceil(a/p),C=Math.abs(e-t)/E,L=Math.floor(Math.log(C)/Math.log(m)),P=Math.pow(m,L);for(s=0;s<x.length&&(w=P*x[s],A=Math.floor(t/w)*w,b=Math.ceil(e/w)*w,h=Math.abs(b-A)/w,T=a/h,!(T>p));s++);for(A>b&&(w*=-1),o=0;h>=o;o++)l=A+o*w,g.push({v:l})}}var S=i("axisLabelFormatter");for(o=0;o<g.length;o++)void 0===g[o].label&&(g[o].label=S.call(r,g[o].v,0,i,r));return g},Dygraph.dateTicker=function(t,e,a,i,r,n){var o=Dygraph.pickDateTickGranularity(t,e,a,i);return o>=0?Dygraph.getDateAxis(t,e,o,i,r):[]},Dygraph.SECONDLY=0,Dygraph.TWO_SECONDLY=1,Dygraph.FIVE_SECONDLY=2,Dygraph.TEN_SECONDLY=3,Dygraph.THIRTY_SECONDLY=4,Dygraph.MINUTELY=5,Dygraph.TWO_MINUTELY=6,Dygraph.FIVE_MINUTELY=7,Dygraph.TEN_MINUTELY=8,Dygraph.THIRTY_MINUTELY=9,Dygraph.HOURLY=10,Dygraph.TWO_HOURLY=11,Dygraph.SIX_HOURLY=12,Dygraph.DAILY=13,Dygraph.TWO_DAILY=14,Dygraph.WEEKLY=15,Dygraph.MONTHLY=16,Dygraph.QUARTERLY=17,Dygraph.BIANNUAL=18,Dygraph.ANNUAL=19,Dygraph.DECADAL=20,Dygraph.CENTENNIAL=21,Dygraph.NUM_GRANULARITIES=22,Dygraph.DATEFIELD_Y=0,Dygraph.DATEFIELD_M=1,Dygraph.DATEFIELD_D=2,Dygraph.DATEFIELD_HH=3,Dygraph.DATEFIELD_MM=4,Dygraph.DATEFIELD_SS=5,Dygraph.DATEFIELD_MS=6,Dygraph.NUM_DATEFIELDS=7,Dygraph.TICK_PLACEMENT=[],Dygraph.TICK_PLACEMENT[Dygraph.SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:1,spacing:1e3},Dygraph.TICK_PLACEMENT[Dygraph.TWO_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:2,spacing:2e3},Dygraph.TICK_PLACEMENT[Dygraph.FIVE_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:5,spacing:5e3},Dygraph.TICK_PLACEMENT[Dygraph.TEN_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:10,spacing:1e4},Dygraph.TICK_PLACEMENT[Dygraph.THIRTY_SECONDLY]={datefield:Dygraph.DATEFIELD_SS,step:30,spacing:3e4},Dygraph.TICK_PLACEMENT[Dygraph.MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:1,spacing:6e4},Dygraph.TICK_PLACEMENT[Dygraph.TWO_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:2,spacing:12e4},Dygraph.TICK_PLACEMENT[Dygraph.FIVE_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:5,spacing:3e5},Dygraph.TICK_PLACEMENT[Dygraph.TEN_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:10,spacing:6e5},Dygraph.TICK_PLACEMENT[Dygraph.THIRTY_MINUTELY]={datefield:Dygraph.DATEFIELD_MM,step:30,spacing:18e5},Dygraph.TICK_PLACEMENT[Dygraph.HOURLY]={datefield:Dygraph.DATEFIELD_HH,step:1,spacing:36e5},Dygraph.TICK_PLACEMENT[Dygraph.TWO_HOURLY]={datefield:Dygraph.DATEFIELD_HH,step:2,spacing:72e5},Dygraph.TICK_PLACEMENT[Dygraph.SIX_HOURLY]={datefield:Dygraph.DATEFIELD_HH,step:6,spacing:216e5},Dygraph.TICK_PLACEMENT[Dygraph.DAILY]={datefield:Dygraph.DATEFIELD_D,step:1,spacing:864e5},Dygraph.TICK_PLACEMENT[Dygraph.TWO_DAILY]={datefield:Dygraph.DATEFIELD_D,step:2,spacing:1728e5},Dygraph.TICK_PLACEMENT[Dygraph.WEEKLY]={datefield:Dygraph.DATEFIELD_D,step:7,spacing:6048e5},Dygraph.TICK_PLACEMENT[Dygraph.MONTHLY]={datefield:Dygraph.DATEFIELD_M,step:1,spacing:2629817280},Dygraph.TICK_PLACEMENT[Dygraph.QUARTERLY]={datefield:Dygraph.DATEFIELD_M,step:3,spacing:216e5*365.2524},Dygraph.TICK_PLACEMENT[Dygraph.BIANNUAL]={datefield:Dygraph.DATEFIELD_M,step:6,spacing:432e5*365.2524},Dygraph.TICK_PLACEMENT[Dygraph.ANNUAL]={datefield:Dygraph.DATEFIELD_Y,step:1,spacing:864e5*365.2524},Dygraph.TICK_PLACEMENT[Dygraph.DECADAL]={datefield:Dygraph.DATEFIELD_Y,step:10,spacing:315578073600},Dygraph.TICK_PLACEMENT[Dygraph.CENTENNIAL]={datefield:Dygraph.DATEFIELD_Y,step:100,spacing:3155780736e3},Dygraph.PREFERRED_LOG_TICK_VALUES=function(){for(var t=[],e=-39;39>=e;e++)for(var a=Math.pow(10,e),i=1;9>=i;i++){var r=a*i;t.push(r)}return t}(),Dygraph.pickDateTickGranularity=function(t,e,a,i){for(var r=i("pixelsPerLabel"),n=0;n<Dygraph.NUM_GRANULARITIES;n++){var o=Dygraph.numDateTicks(t,e,n);if(a/o>=r)return n}return-1},Dygraph.numDateTicks=function(t,e,a){var i=Dygraph.TICK_PLACEMENT[a].spacing;return Math.round(1*(e-t)/i)},Dygraph.getDateAxis=function(t,e,a,i,r){var n=i("axisLabelFormatter"),o=i("labelsUTC"),s=o?Dygraph.DateAccessorsUTC:Dygraph.DateAccessorsLocal,l=Dygraph.TICK_PLACEMENT[a].datefield,h=Dygraph.TICK_PLACEMENT[a].step,p=Dygraph.TICK_PLACEMENT[a].spacing,g=new Date(t),d=[];d[Dygraph.DATEFIELD_Y]=s.getFullYear(g),d[Dygraph.DATEFIELD_M]=s.getMonth(g),d[Dygraph.DATEFIELD_D]=s.getDate(g),d[Dygraph.DATEFIELD_HH]=s.getHours(g),d[Dygraph.DATEFIELD_MM]=s.getMinutes(g),d[Dygraph.DATEFIELD_SS]=s.getSeconds(g),d[Dygraph.DATEFIELD_MS]=s.getMilliseconds(g);var u=d[l]%h;a==Dygraph.WEEKLY&&(u=s.getDay(g)),d[l]-=u;for(var c=l+1;c<Dygraph.NUM_DATEFIELDS;c++)d[c]=c===Dygraph.DATEFIELD_D?1:0;var y=[],_=s.makeDate.apply(null,d),v=_.getTime();if(a<=Dygraph.HOURLY)for(t>v&&(v+=p,_=new Date(v));e>=v;)y.push({v:v,label:n.call(r,_,a,i,r)}),v+=p,_=new Date(v);else for(t>v&&(d[l]+=h,_=s.makeDate.apply(null,d),v=_.getTime());e>=v;)(a>=Dygraph.DAILY||s.getHours(_)%h===0)&&y.push({v:v,label:n.call(r,_,a,i,r)}),d[l]+=h,_=s.makeDate.apply(null,d),v=_.getTime();return y},Dygraph&&Dygraph.DEFAULT_ATTRS&&Dygraph.DEFAULT_ATTRS.axes&&Dygraph.DEFAULT_ATTRS.axes.x&&Dygraph.DEFAULT_ATTRS.axes.y&&Dygraph.DEFAULT_ATTRS.axes.y2&&(Dygraph.DEFAULT_ATTRS.axes.x.ticker=Dygraph.dateTicker,Dygraph.DEFAULT_ATTRS.axes.y.ticker=Dygraph.numericTicks,Dygraph.DEFAULT_ATTRS.axes.y2.ticker=Dygraph.numericTicks)}(),Dygraph.Plugins={},Dygraph.Plugins.Annotations=function(){"use strict";var t=function(){this.annotations_=[]};return t.prototype.toString=function(){return"Annotations Plugin"},t.prototype.activate=function(t){return{clearChart:this.clearChart,didDrawChart:this.didDrawChart}},t.prototype.detachLabels=function(){for(var t=0;t<this.annotations_.length;t++){var e=this.annotations_[t];e.parentNode&&e.parentNode.removeChild(e),this.annotations_[t]=null}this.annotations_=[]},t.prototype.clearChart=function(t){this.detachLabels()},t.prototype.didDrawChart=function(t){var e=t.dygraph,a=e.layout_.annotated_points;if(a&&0!==a.length)for(var i=t.canvas.parentNode,r={position:"absolute",fontSize:e.getOption("axisLabelFontSize")+"px",zIndex:10,overflow:"hidden"},n=function(t,a,i){return function(r){var n=i.annotation;n.hasOwnProperty(t)?n[t](n,i,e,r):e.getOption(a)&&e.getOption(a)(n,i,e,r)}},o=t.dygraph.plotter_.area,s={},l=0;l<a.length;l++){var h=a[l];if(!(h.canvasx<o.x||h.canvasx>o.x+o.w||h.canvasy<o.y||h.canvasy>o.y+o.h)){var p=h.annotation,g=6;p.hasOwnProperty("tickHeight")&&(g=p.tickHeight);var d=document.createElement("div");for(var u in r)r.hasOwnProperty(u)&&(d.style[u]=r[u]);p.hasOwnProperty("icon")||(d.className="dygraphDefaultAnnotation"),p.hasOwnProperty("cssClass")&&(d.className+=" "+p.cssClass);var c=p.hasOwnProperty("width")?p.width:16,y=p.hasOwnProperty("height")?p.height:16;if(p.hasOwnProperty("icon")){var _=document.createElement("img");_.src=p.icon,_.width=c,_.height=y,d.appendChild(_)}else h.annotation.hasOwnProperty("shortText")&&d.appendChild(document.createTextNode(h.annotation.shortText));var v=h.canvasx-c/2;d.style.left=v+"px";var f=0;if(p.attachAtBottom){var x=o.y+o.h-y-g;s[v]?x-=s[v]:s[v]=0,s[v]+=g+y,f=x}else f=h.canvasy-y-g;d.style.top=f+"px",d.style.width=c+"px",d.style.height=y+"px",d.title=h.annotation.text,d.style.color=e.colorsMap_[h.name],d.style.borderColor=e.colorsMap_[h.name],p.div=d,e.addAndTrackEvent(d,"click",n("clickHandler","annotationClickHandler",h,this)),e.addAndTrackEvent(d,"mouseover",n("mouseOverHandler","annotationMouseOverHandler",h,this)),e.addAndTrackEvent(d,"mouseout",n("mouseOutHandler","annotationMouseOutHandler",h,this)),e.addAndTrackEvent(d,"dblclick",n("dblClickHandler","annotationDblClickHandler",h,this)),i.appendChild(d),this.annotations_.push(d);var m=t.drawingContext;if(m.save(),m.strokeStyle=e.colorsMap_[h.name],m.beginPath(),p.attachAtBottom){var x=f+y;m.moveTo(h.canvasx,x),m.lineTo(h.canvasx,x+g)}else m.moveTo(h.canvasx,h.canvasy),m.lineTo(h.canvasx,h.canvasy-2-g);m.closePath(),m.stroke(),m.restore()}}},t.prototype.destroy=function(){this.detachLabels()},t}(),Dygraph.Plugins.Axes=function(){"use strict";var t=function(){this.xlabels_=[],this.ylabels_=[]};return t.prototype.toString=function(){return"Axes Plugin"},t.prototype.activate=function(t){return{layout:this.layout,clearChart:this.clearChart,willDrawChart:this.willDrawChart}},t.prototype.layout=function(t){var e=t.dygraph;if(e.getOptionForAxis("drawAxis","y")){var a=e.getOptionForAxis("axisLabelWidth","y")+2*e.getOptionForAxis("axisTickSize","y");t.reserveSpaceLeft(a)}if(e.getOptionForAxis("drawAxis","x")){var i;i=e.getOption("xAxisHeight")?e.getOption("xAxisHeight"):e.getOptionForAxis("axisLabelFontSize","x")+2*e.getOptionForAxis("axisTickSize","x"),t.reserveSpaceBottom(i)}if(2==e.numAxes()){if(e.getOptionForAxis("drawAxis","y2")){var a=e.getOptionForAxis("axisLabelWidth","y2")+2*e.getOptionForAxis("axisTickSize","y2");t.reserveSpaceRight(a)}}else e.numAxes()>2&&e.error("Only two y-axes are supported at this time. (Trying to use "+e.numAxes()+")")},t.prototype.detachLabels=function(){function t(t){for(var e=0;e<t.length;e++){var a=t[e];a.parentNode&&a.parentNode.removeChild(a)}}t(this.xlabels_),t(this.ylabels_),this.xlabels_=[],this.ylabels_=[]},t.prototype.clearChart=function(t){this.detachLabels()},t.prototype.willDrawChart=function(t){function e(t){return Math.round(t)+.5}function a(t){return Math.round(t)-.5}var i=t.dygraph;if(i.getOptionForAxis("drawAxis","x")||i.getOptionForAxis("drawAxis","y")||i.getOptionForAxis("drawAxis","y2")){var r,n,o,s,l,h=t.drawingContext,p=t.canvas.parentNode,g=i.width_,d=i.height_,u=function(t){return{position:"absolute",fontSize:i.getOptionForAxis("axisLabelFontSize",t)+"px",zIndex:10,color:i.getOptionForAxis("axisLabelColor",t),width:i.getOptionForAxis("axisLabelWidth",t)+"px",lineHeight:"normal",overflow:"hidden"}},c={x:u("x"),y:u("y"),y2:u("y2")},y=function(t,e,a){var i=document.createElement("div"),r=c["y2"==a?"y2":e];for(var n in r)r.hasOwnProperty(n)&&(i.style[n]=r[n]);var o=document.createElement("div");return o.className="dygraph-axis-label dygraph-axis-label-"+e+(a?" dygraph-axis-label-"+a:""),o.innerHTML=t,i.appendChild(o),i};h.save();var _=i.layout_,v=t.dygraph.plotter_.area,f=function(t){return function(e){return i.getOptionForAxis(e,t)}};if(i.getOptionForAxis("drawAxis","y")){if(_.yticks&&_.yticks.length>0){var x=i.numAxes(),m=[f("y"),f("y2")];for(l=0;l<_.yticks.length;l++){if(s=_.yticks[l],"function"==typeof s)return;n=v.x;var D=1,w="y1",A=m[0];1==s[0]&&(n=v.x+v.w,D=-1,w="y2",A=m[1]);var b=A("axisLabelFontSize");o=v.y+s[1]*v.h,r=y(s[2],"y",2==x?w:null);var T=o-b/2;0>T&&(T=0),T+b+3>d?r.style.bottom="0":r.style.top=T+"px",0===s[0]?(r.style.left=v.x-A("axisLabelWidth")-A("axisTickSize")+"px",r.style.textAlign="right"):1==s[0]&&(r.style.left=v.x+v.w+A("axisTickSize")+"px",r.style.textAlign="left"),r.style.width=A("axisLabelWidth")+"px",p.appendChild(r),this.ylabels_.push(r)}var E=this.ylabels_[0],b=i.getOptionForAxis("axisLabelFontSize","y"),C=parseInt(E.style.top,10)+b;C>d-b&&(E.style.top=parseInt(E.style.top,10)-b/2+"px")}var L;if(i.getOption("drawAxesAtZero")){var P=i.toPercentXCoord(0);(P>1||0>P||isNaN(P))&&(P=0),L=e(v.x+P*v.w)}else L=e(v.x);h.strokeStyle=i.getOptionForAxis("axisLineColor","y"),h.lineWidth=i.getOptionForAxis("axisLineWidth","y"),h.beginPath(),h.moveTo(L,a(v.y)),h.lineTo(L,a(v.y+v.h)),h.closePath(),h.stroke(),2==i.numAxes()&&(h.strokeStyle=i.getOptionForAxis("axisLineColor","y2"),h.lineWidth=i.getOptionForAxis("axisLineWidth","y2"),h.beginPath(),h.moveTo(a(v.x+v.w),a(v.y)),h.lineTo(a(v.x+v.w),a(v.y+v.h)),h.closePath(),h.stroke())}if(i.getOptionForAxis("drawAxis","x")){if(_.xticks){var A=f("x");for(l=0;l<_.xticks.length;l++){s=_.xticks[l],n=v.x+s[0]*v.w,o=v.y+v.h,r=y(s[1],"x"),r.style.textAlign="center",r.style.top=o+A("axisTickSize")+"px";var S=n-A("axisLabelWidth")/2;S+A("axisLabelWidth")>g&&(S=g-A("axisLabelWidth"),r.style.textAlign="right"),0>S&&(S=0,r.style.textAlign="left"),r.style.left=S+"px",r.style.width=A("axisLabelWidth")+"px", p.appendChild(r),this.xlabels_.push(r)}}h.strokeStyle=i.getOptionForAxis("axisLineColor","x"),h.lineWidth=i.getOptionForAxis("axisLineWidth","x"),h.beginPath();var O;if(i.getOption("drawAxesAtZero")){var P=i.toPercentYCoord(0,0);(P>1||0>P)&&(P=1),O=a(v.y+P*v.h)}else O=a(v.y+v.h);h.moveTo(e(v.x),O),h.lineTo(e(v.x+v.w),O),h.closePath(),h.stroke()}h.restore()}},t}(),Dygraph.Plugins.ChartLabels=function(){"use strict";var t=function(){this.title_div_=null,this.xlabel_div_=null,this.ylabel_div_=null,this.y2label_div_=null};t.prototype.toString=function(){return"ChartLabels Plugin"},t.prototype.activate=function(t){return{layout:this.layout,didDrawChart:this.didDrawChart}};var e=function(t){var e=document.createElement("div");return e.style.position="absolute",e.style.left=t.x+"px",e.style.top=t.y+"px",e.style.width=t.w+"px",e.style.height=t.h+"px",e};t.prototype.detachLabels_=function(){for(var t=[this.title_div_,this.xlabel_div_,this.ylabel_div_,this.y2label_div_],e=0;e<t.length;e++){var a=t[e];a&&a.parentNode&&a.parentNode.removeChild(a)}this.title_div_=null,this.xlabel_div_=null,this.ylabel_div_=null,this.y2label_div_=null};var a=function(t,e,a,i,r){var n=document.createElement("div");n.style.position="absolute",1==a?n.style.left="0px":n.style.left=e.x+"px",n.style.top=e.y+"px",n.style.width=e.w+"px",n.style.height=e.h+"px",n.style.fontSize=t.getOption("yLabelWidth")-2+"px";var o=document.createElement("div");o.style.position="absolute",o.style.width=e.h+"px",o.style.height=e.w+"px",o.style.top=e.h/2-e.w/2+"px",o.style.left=e.w/2-e.h/2+"px",o.style.textAlign="center";var s="rotate("+(1==a?"-":"")+"90deg)";o.style.transform=s,o.style.WebkitTransform=s,o.style.MozTransform=s,o.style.OTransform=s,o.style.msTransform=s,"undefined"!=typeof document.documentMode&&document.documentMode<9&&(o.style.filter="progid:DXImageTransform.Microsoft.BasicImage(rotation="+(1==a?"3":"1")+")",o.style.left="0px",o.style.top="0px");var l=document.createElement("div");return l.className=i,l.innerHTML=r,o.appendChild(l),n.appendChild(o),n};return t.prototype.layout=function(t){this.detachLabels_();var i=t.dygraph,r=t.chart_div;if(i.getOption("title")){var n=t.reserveSpaceTop(i.getOption("titleHeight"));this.title_div_=e(n),this.title_div_.style.textAlign="center",this.title_div_.style.fontSize=i.getOption("titleHeight")-8+"px",this.title_div_.style.fontWeight="bold",this.title_div_.style.zIndex=10;var o=document.createElement("div");o.className="dygraph-label dygraph-title",o.innerHTML=i.getOption("title"),this.title_div_.appendChild(o),r.appendChild(this.title_div_)}if(i.getOption("xlabel")){var s=t.reserveSpaceBottom(i.getOption("xLabelHeight"));this.xlabel_div_=e(s),this.xlabel_div_.style.textAlign="center",this.xlabel_div_.style.fontSize=i.getOption("xLabelHeight")-2+"px";var o=document.createElement("div");o.className="dygraph-label dygraph-xlabel",o.innerHTML=i.getOption("xlabel"),this.xlabel_div_.appendChild(o),r.appendChild(this.xlabel_div_)}if(i.getOption("ylabel")){var l=t.reserveSpaceLeft(0);this.ylabel_div_=a(i,l,1,"dygraph-label dygraph-ylabel",i.getOption("ylabel")),r.appendChild(this.ylabel_div_)}if(i.getOption("y2label")&&2==i.numAxes()){var h=t.reserveSpaceRight(0);this.y2label_div_=a(i,h,2,"dygraph-label dygraph-y2label",i.getOption("y2label")),r.appendChild(this.y2label_div_)}},t.prototype.didDrawChart=function(t){var e=t.dygraph;this.title_div_&&(this.title_div_.children[0].innerHTML=e.getOption("title")),this.xlabel_div_&&(this.xlabel_div_.children[0].innerHTML=e.getOption("xlabel")),this.ylabel_div_&&(this.ylabel_div_.children[0].children[0].innerHTML=e.getOption("ylabel")),this.y2label_div_&&(this.y2label_div_.children[0].children[0].innerHTML=e.getOption("y2label"))},t.prototype.clearChart=function(){},t.prototype.destroy=function(){this.detachLabels_()},t}(),Dygraph.Plugins.Grid=function(){"use strict";var t=function(){};return t.prototype.toString=function(){return"Gridline Plugin"},t.prototype.activate=function(t){return{willDrawChart:this.willDrawChart}},t.prototype.willDrawChart=function(t){function e(t){return Math.round(t)+.5}function a(t){return Math.round(t)-.5}var i,r,n,o,s=t.dygraph,l=t.drawingContext,h=s.layout_,p=t.dygraph.plotter_.area;if(s.getOptionForAxis("drawGrid","y")){for(var g=["y","y2"],d=[],u=[],c=[],y=[],_=[],n=0;n<g.length;n++)c[n]=s.getOptionForAxis("drawGrid",g[n]),c[n]&&(d[n]=s.getOptionForAxis("gridLineColor",g[n]),u[n]=s.getOptionForAxis("gridLineWidth",g[n]),_[n]=s.getOptionForAxis("gridLinePattern",g[n]),y[n]=_[n]&&_[n].length>=2);for(o=h.yticks,l.save(),n=0;n<o.length;n++){var v=o[n][0];c[v]&&(y[v]&&l.installPattern(_[v]),l.strokeStyle=d[v],l.lineWidth=u[v],i=e(p.x),r=a(p.y+o[n][1]*p.h),l.beginPath(),l.moveTo(i,r),l.lineTo(i+p.w,r),l.closePath(),l.stroke(),y[v]&&l.uninstallPattern())}l.restore()}if(s.getOptionForAxis("drawGrid","x")){o=h.xticks,l.save();var _=s.getOptionForAxis("gridLinePattern","x"),y=_&&_.length>=2;for(y&&l.installPattern(_),l.strokeStyle=s.getOptionForAxis("gridLineColor","x"),l.lineWidth=s.getOptionForAxis("gridLineWidth","x"),n=0;n<o.length;n++)i=e(p.x+o[n][0]*p.w),r=a(p.y+p.h),l.beginPath(),l.moveTo(i,r),l.lineTo(i,p.y),l.closePath(),l.stroke();y&&l.uninstallPattern(),l.restore()}},t.prototype.destroy=function(){},t}(),Dygraph.Plugins.Legend=function(){"use strict";var t=function(){this.legend_div_=null,this.is_generated_div_=!1};t.prototype.toString=function(){return"Legend Plugin"};var e;t.prototype.activate=function(t){var e,a=t.getOption("labelsDivWidth"),i=t.getOption("labelsDiv");if(i&&null!==i)e="string"==typeof i||i instanceof String?document.getElementById(i):i;else{var r={position:"absolute",fontSize:"14px",zIndex:10,width:a+"px",top:"0px",left:t.size().width-a-2+"px",background:"white",lineHeight:"normal",textAlign:"left",overflow:"hidden"};Dygraph.update(r,t.getOption("labelsDivStyles")),e=document.createElement("div"),e.className="dygraph-legend";for(var n in r)if(r.hasOwnProperty(n))try{e.style[n]=r[n]}catch(o){console.warn("You are using unsupported css properties for your browser in labelsDivStyles")}t.graphDiv.appendChild(e),this.is_generated_div_=!0}return this.legend_div_=e,this.one_em_width_=10,{select:this.select,deselect:this.deselect,predraw:this.predraw,didDrawChart:this.didDrawChart}};var a=function(t){var e=document.createElement("span");e.setAttribute("style","margin: 0; padding: 0 0 0 1em; border: 0;"),t.appendChild(e);var a=e.offsetWidth;return t.removeChild(e),a},i=function(t){return t.replace(/&/g,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")};return t.prototype.select=function(e){var a=e.selectedX,i=e.selectedPoints,r=e.selectedRow,n=e.dygraph.getOption("legend");if("never"===n)return void(this.legend_div_.style.display="none");if("follow"===n){var o=e.dygraph.plotter_.area,s=e.dygraph.getOption("labelsDivWidth"),l=e.dygraph.getOptionForAxis("axisLabelWidth","y"),h=i[0].x*o.w+20,p=i[0].y*o.h-20;h+s+1>window.scrollX+window.innerWidth&&(h=h-40-s-(l-o.x)),e.dygraph.graphDiv.appendChild(this.legend_div_),this.legend_div_.style.left=l+h+"px",this.legend_div_.style.top=p+"px"}var g=t.generateLegendHTML(e.dygraph,a,i,this.one_em_width_,r);this.legend_div_.innerHTML=g,this.legend_div_.style.display=""},t.prototype.deselect=function(e){var i=e.dygraph.getOption("legend");"always"!==i&&(this.legend_div_.style.display="none");var r=a(this.legend_div_);this.one_em_width_=r;var n=t.generateLegendHTML(e.dygraph,void 0,void 0,r,null);this.legend_div_.innerHTML=n},t.prototype.didDrawChart=function(t){this.deselect(t)},t.prototype.predraw=function(t){if(this.is_generated_div_){t.dygraph.graphDiv.appendChild(this.legend_div_);var e=t.dygraph.plotter_.area,a=t.dygraph.getOption("labelsDivWidth");this.legend_div_.style.left=e.x+e.w-a-1+"px",this.legend_div_.style.top=e.y+"px",this.legend_div_.style.width=a+"px"}},t.prototype.destroy=function(){this.legend_div_=null},t.generateLegendHTML=function(t,a,r,n,o){if(t.getOption("showLabelsOnHighlight")!==!0)return"";var s,l,h,p,g,d=t.getLabels();if("undefined"==typeof a){if("always"!=t.getOption("legend"))return"";for(l=t.getOption("labelsSeparateLines"),s="",h=1;h<d.length;h++){var u=t.getPropertiesForSeries(d[h]);u.visible&&(""!==s&&(s+=l?"<br/>":" "),g=t.getOption("strokePattern",d[h]),p=e(g,u.color,n),s+="<span style='font-weight: bold; color: "+u.color+";'>"+p+" "+i(d[h])+"</span>")}return s}var c=t.optionsViewForAxis_("x"),y=c("valueFormatter");s=y.call(t,a,c,d[0],t,o,0),""!==s&&(s+=":");var _=[],v=t.numAxes();for(h=0;v>h;h++)_[h]=t.optionsViewForAxis_("y"+(h?1+h:""));var f=t.getOption("labelsShowZeroValues");l=t.getOption("labelsSeparateLines");var x=t.getHighlightSeries();for(h=0;h<r.length;h++){var m=r[h];if((0!==m.yval||f)&&Dygraph.isOK(m.canvasy)){l&&(s+="<br/>");var u=t.getPropertiesForSeries(m.name),D=_[u.axis-1],w=D("valueFormatter"),A=w.call(t,m.yval,D,m.name,t,o,d.indexOf(m.name)),b=m.name==x?" class='highlight'":"";s+="<span"+b+"> <b><span style='color: "+u.color+";'>"+i(m.name)+"</span></b>: "+A+"</span>"}}return s},e=function(t,e,a){var i=/MSIE/.test(navigator.userAgent)&&!window.opera;if(i)return"—";if(!t||t.length<=1)return'<div style="display: inline-block; position: relative; bottom: .5ex; padding-left: 1em; height: 1px; border-bottom: 2px solid '+e+';"></div>';var r,n,o,s,l,h=0,p=0,g=[];for(r=0;r<=t.length;r++)h+=t[r%t.length];if(l=Math.floor(a/(h-t[0])),l>1){for(r=0;r<t.length;r++)g[r]=t[r]/a;p=g.length}else{for(l=1,r=0;r<t.length;r++)g[r]=t[r]/h;p=g.length+1}var d="";for(n=0;l>n;n++)for(r=0;p>r;r+=2)o=g[r%g.length],s=r<t.length?g[(r+1)%g.length]:0,d+='<div style="display: inline-block; position: relative; bottom: .5ex; margin-right: '+s+"em; padding-left: "+o+"em; height: 1px; border-bottom: 2px solid "+e+';"></div>';return d},t}(),Dygraph.Plugins.RangeSelector=function(){"use strict";var t=function(){this.isIE_=/MSIE/.test(navigator.userAgent)&&!window.opera,this.hasTouchInterface_="undefined"!=typeof TouchEvent,this.isMobileDevice_=/mobile|android/gi.test(navigator.appVersion),this.interfaceCreated_=!1};return t.prototype.toString=function(){return"RangeSelector Plugin"},t.prototype.activate=function(t){return this.dygraph_=t,this.isUsingExcanvas_=t.isUsingExcanvas_,this.getOption_("showRangeSelector")&&this.createInterface_(),{layout:this.reserveSpace_,predraw:this.renderStaticLayer_,didDrawChart:this.renderInteractiveLayer_}},t.prototype.destroy=function(){this.bgcanvas_=null,this.fgcanvas_=null,this.leftZoomHandle_=null,this.rightZoomHandle_=null,this.iePanOverlay_=null},t.prototype.getOption_=function(t,e){return this.dygraph_.getOption(t,e)},t.prototype.setDefaultOption_=function(t,e){this.dygraph_.attrs_[t]=e},t.prototype.createInterface_=function(){this.createCanvases_(),this.isUsingExcanvas_&&this.createIEPanOverlay_(),this.createZoomHandles_(),this.initInteraction_(),this.getOption_("animatedZooms")&&(console.warn("Animated zooms and range selector are not compatible; disabling animatedZooms."),this.dygraph_.updateOptions({animatedZooms:!1},!0)),this.interfaceCreated_=!0,this.addToGraph_()},t.prototype.addToGraph_=function(){var t=this.graphDiv_=this.dygraph_.graphDiv;t.appendChild(this.bgcanvas_),t.appendChild(this.fgcanvas_),t.appendChild(this.leftZoomHandle_),t.appendChild(this.rightZoomHandle_)},t.prototype.removeFromGraph_=function(){var t=this.graphDiv_;t.removeChild(this.bgcanvas_),t.removeChild(this.fgcanvas_),t.removeChild(this.leftZoomHandle_),t.removeChild(this.rightZoomHandle_),this.graphDiv_=null},t.prototype.reserveSpace_=function(t){this.getOption_("showRangeSelector")&&t.reserveSpaceBottom(this.getOption_("rangeSelectorHeight")+4)},t.prototype.renderStaticLayer_=function(){this.updateVisibility_()&&(this.resize_(),this.drawStaticLayer_())},t.prototype.renderInteractiveLayer_=function(){this.updateVisibility_()&&!this.isChangingRange_&&(this.placeZoomHandles_(),this.drawInteractiveLayer_())},t.prototype.updateVisibility_=function(){var t=this.getOption_("showRangeSelector");if(t)this.interfaceCreated_?this.graphDiv_&&this.graphDiv_.parentNode||this.addToGraph_():this.createInterface_();else if(this.graphDiv_){this.removeFromGraph_();var e=this.dygraph_;setTimeout(function(){e.width_=0,e.resize()},1)}return t},t.prototype.resize_=function(){function t(t,e,a){var i=Dygraph.getContextPixelRatio(e);t.style.top=a.y+"px",t.style.left=a.x+"px",t.width=a.w*i,t.height=a.h*i,t.style.width=a.w+"px",t.style.height=a.h+"px",1!=i&&e.scale(i,i)}var e=this.dygraph_.layout_.getPlotArea(),a=0;this.dygraph_.getOptionForAxis("drawAxis","x")&&(a=this.getOption_("xAxisHeight")||this.getOption_("axisLabelFontSize")+2*this.getOption_("axisTickSize")),this.canvasRect_={x:e.x,y:e.y+e.h+a+4,w:e.w,h:this.getOption_("rangeSelectorHeight")},t(this.bgcanvas_,this.bgcanvas_ctx_,this.canvasRect_),t(this.fgcanvas_,this.fgcanvas_ctx_,this.canvasRect_)},t.prototype.createCanvases_=function(){this.bgcanvas_=Dygraph.createCanvas(),this.bgcanvas_.className="dygraph-rangesel-bgcanvas",this.bgcanvas_.style.position="absolute",this.bgcanvas_.style.zIndex=9,this.bgcanvas_ctx_=Dygraph.getContext(this.bgcanvas_),this.fgcanvas_=Dygraph.createCanvas(),this.fgcanvas_.className="dygraph-rangesel-fgcanvas",this.fgcanvas_.style.position="absolute",this.fgcanvas_.style.zIndex=9,this.fgcanvas_.style.cursor="default",this.fgcanvas_ctx_=Dygraph.getContext(this.fgcanvas_)},t.prototype.createIEPanOverlay_=function(){this.iePanOverlay_=document.createElement("div"),this.iePanOverlay_.style.position="absolute",this.iePanOverlay_.style.backgroundColor="white",this.iePanOverlay_.style.filter="alpha(opacity=0)",this.iePanOverlay_.style.display="none",this.iePanOverlay_.style.cursor="move",this.fgcanvas_.appendChild(this.iePanOverlay_)},t.prototype.createZoomHandles_=function(){var t=new Image;t.className="dygraph-rangesel-zoomhandle",t.style.position="absolute",t.style.zIndex=10,t.style.visibility="hidden",t.style.cursor="col-resize",/MSIE 7/.test(navigator.userAgent)?(t.width=7,t.height=14,t.style.backgroundColor="white",t.style.border="1px solid #333333"):(t.width=9,t.height=16,t.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAAXNSR0IArs4c6QAAAAZiS0dEANAAzwDP4Z7KegAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAAd0SU1FB9sHGw0cMqdt1UwAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAAaElEQVQoz+3SsRFAQBCF4Z9WJM8KCDVwownl6YXsTmCUsyKGkZzcl7zkz3YLkypgAnreFmDEpHkIwVOMfpdi9CEEN2nGpFdwD03yEqDtOgCaun7sqSTDH32I1pQA2Pb9sZecAxc5r3IAb21d6878xsAAAAAASUVORK5CYII="),this.isMobileDevice_&&(t.width*=2,t.height*=2),this.leftZoomHandle_=t,this.rightZoomHandle_=t.cloneNode(!1)},t.prototype.initInteraction_=function(){var t,e,a,i,r,n,o,s,l,h,p,g,d,u,c=this,y=document,_=0,v=null,f=!1,x=!1,m=!this.isMobileDevice_&&!this.isUsingExcanvas_,D=new Dygraph.IFrameTarp;t=function(t){var e=c.dygraph_.xAxisExtremes(),a=(e[1]-e[0])/c.canvasRect_.w,i=e[0]+(t.leftHandlePos-c.canvasRect_.x)*a,r=e[0]+(t.rightHandlePos-c.canvasRect_.x)*a;return[i,r]},e=function(t){return Dygraph.cancelEvent(t),f=!0,_=t.clientX,v=t.target?t.target:t.srcElement,("mousedown"===t.type||"dragstart"===t.type)&&(Dygraph.addEvent(y,"mousemove",a),Dygraph.addEvent(y,"mouseup",i)),c.fgcanvas_.style.cursor="col-resize",D.cover(),!0},a=function(t){if(!f)return!1;Dygraph.cancelEvent(t);var e=t.clientX-_;if(Math.abs(e)<4)return!0;_=t.clientX;var a,i=c.getZoomHandleStatus_();v==c.leftZoomHandle_?(a=i.leftHandlePos+e,a=Math.min(a,i.rightHandlePos-v.width-3),a=Math.max(a,c.canvasRect_.x)):(a=i.rightHandlePos+e,a=Math.min(a,c.canvasRect_.x+c.canvasRect_.w),a=Math.max(a,i.leftHandlePos+v.width+3));var n=v.width/2;return v.style.left=a-n+"px",c.drawInteractiveLayer_(),m&&r(),!0},i=function(t){return f?(f=!1,D.uncover(),Dygraph.removeEvent(y,"mousemove",a),Dygraph.removeEvent(y,"mouseup",i),c.fgcanvas_.style.cursor="default",m||r(),!0):!1},r=function(){try{var e=c.getZoomHandleStatus_();if(c.isChangingRange_=!0,e.isZoomed){var a=t(e);c.dygraph_.doZoomXDates_(a[0],a[1])}else c.dygraph_.resetZoom()}finally{c.isChangingRange_=!1}},n=function(t){if(c.isUsingExcanvas_)return t.srcElement==c.iePanOverlay_;var e=c.leftZoomHandle_.getBoundingClientRect(),a=e.left+e.width/2;e=c.rightZoomHandle_.getBoundingClientRect();var i=e.left+e.width/2;return t.clientX>a&&t.clientX<i},o=function(t){return!x&&n(t)&&c.getZoomHandleStatus_().isZoomed?(Dygraph.cancelEvent(t),x=!0,_=t.clientX,"mousedown"===t.type&&(Dygraph.addEvent(y,"mousemove",s),Dygraph.addEvent(y,"mouseup",l)),!0):!1},s=function(t){if(!x)return!1;Dygraph.cancelEvent(t);var e=t.clientX-_;if(Math.abs(e)<4)return!0;_=t.clientX;var a=c.getZoomHandleStatus_(),i=a.leftHandlePos,r=a.rightHandlePos,n=r-i;i+e<=c.canvasRect_.x?(i=c.canvasRect_.x,r=i+n):r+e>=c.canvasRect_.x+c.canvasRect_.w?(r=c.canvasRect_.x+c.canvasRect_.w,i=r-n):(i+=e,r+=e);var o=c.leftZoomHandle_.width/2;return c.leftZoomHandle_.style.left=i-o+"px",c.rightZoomHandle_.style.left=r-o+"px",c.drawInteractiveLayer_(),m&&h(),!0},l=function(t){return x?(x=!1,Dygraph.removeEvent(y,"mousemove",s),Dygraph.removeEvent(y,"mouseup",l),m||h(),!0):!1},h=function(){try{c.isChangingRange_=!0,c.dygraph_.dateWindow_=t(c.getZoomHandleStatus_()),c.dygraph_.drawGraph_(!1)}finally{c.isChangingRange_=!1}},p=function(t){if(!f&&!x){var e=n(t)?"move":"default";e!=c.fgcanvas_.style.cursor&&(c.fgcanvas_.style.cursor=e)}},g=function(t){"touchstart"==t.type&&1==t.targetTouches.length?e(t.targetTouches[0])&&Dygraph.cancelEvent(t):"touchmove"==t.type&&1==t.targetTouches.length?a(t.targetTouches[0])&&Dygraph.cancelEvent(t):i(t)},d=function(t){"touchstart"==t.type&&1==t.targetTouches.length?o(t.targetTouches[0])&&Dygraph.cancelEvent(t):"touchmove"==t.type&&1==t.targetTouches.length?s(t.targetTouches[0])&&Dygraph.cancelEvent(t):l(t)},u=function(t,e){for(var a=["touchstart","touchend","touchmove","touchcancel"],i=0;i<a.length;i++)c.dygraph_.addAndTrackEvent(t,a[i],e)},this.setDefaultOption_("interactionModel",Dygraph.Interaction.dragIsPanInteractionModel),this.setDefaultOption_("panEdgeFraction",1e-4);var w=window.opera?"mousedown":"dragstart";this.dygraph_.addAndTrackEvent(this.leftZoomHandle_,w,e),this.dygraph_.addAndTrackEvent(this.rightZoomHandle_,w,e),this.isUsingExcanvas_?this.dygraph_.addAndTrackEvent(this.iePanOverlay_,"mousedown",o):(this.dygraph_.addAndTrackEvent(this.fgcanvas_,"mousedown",o),this.dygraph_.addAndTrackEvent(this.fgcanvas_,"mousemove",p)),this.hasTouchInterface_&&(u(this.leftZoomHandle_,g),u(this.rightZoomHandle_,g),u(this.fgcanvas_,d))},t.prototype.drawStaticLayer_=function(){var t=this.bgcanvas_ctx_;t.clearRect(0,0,this.canvasRect_.w,this.canvasRect_.h);try{this.drawMiniPlot_()}catch(e){console.warn(e)}var a=.5;this.bgcanvas_ctx_.lineWidth=1,t.strokeStyle="gray",t.beginPath(),t.moveTo(a,a),t.lineTo(a,this.canvasRect_.h-a),t.lineTo(this.canvasRect_.w-a,this.canvasRect_.h-a),t.lineTo(this.canvasRect_.w-a,a),t.stroke()},t.prototype.drawMiniPlot_=function(){var t=this.getOption_("rangeSelectorPlotFillColor"),e=this.getOption_("rangeSelectorPlotStrokeColor");if(t||e){var a=this.getOption_("stepPlot"),i=this.computeCombinedSeriesAndLimits_(),r=i.yMax-i.yMin,n=this.bgcanvas_ctx_,o=.5,s=this.dygraph_.xAxisExtremes(),l=Math.max(s[1]-s[0],1e-30),h=(this.canvasRect_.w-o)/l,p=(this.canvasRect_.h-o)/r,g=this.canvasRect_.w-o,d=this.canvasRect_.h-o,u=null,c=null;n.beginPath(),n.moveTo(o,d);for(var y=0;y<i.data.length;y++){var _=i.data[y],v=null!==_[0]?(_[0]-s[0])*h:0/0,f=null!==_[1]?d-(_[1]-i.yMin)*p:0/0;(a||null===u||Math.round(v)!=Math.round(u))&&(isFinite(v)&&isFinite(f)?(null===u?n.lineTo(v,d):a&&n.lineTo(v,c),n.lineTo(v,f),u=v,c=f):(null!==u&&(a?(n.lineTo(v,c),n.lineTo(v,d)):n.lineTo(u,d)),u=c=null))}if(n.lineTo(g,d),n.closePath(),t){var x=this.bgcanvas_ctx_.createLinearGradient(0,0,0,d);x.addColorStop(0,"white"),x.addColorStop(1,t),this.bgcanvas_ctx_.fillStyle=x,n.fill()}e&&(this.bgcanvas_ctx_.strokeStyle=e,this.bgcanvas_ctx_.lineWidth=1.5,n.stroke())}},t.prototype.computeCombinedSeriesAndLimits_=function(){var t,e=this.dygraph_,a=this.getOption_("logscale"),i=e.numColumns(),r=e.getLabels(),n=new Array(i),o=!1;for(t=1;i>t;t++){var s=this.getOption_("showInRangeSelector",r[t]);n[t]=s,null!==s&&(o=!0)}if(!o)for(t=0;t<n.length;t++)n[t]=!0;var l=[],h=e.dataHandler_,p=e.attributes_;for(t=1;t<e.numColumns();t++)if(n[t]){var g=h.extractSeries(e.rawData_,t,p);e.rollPeriod()>1&&(g=h.rollingAverage(g,e.rollPeriod(),p)),l.push(g)}var d=[];for(t=0;t<l[0].length;t++){for(var u=0,c=0,y=0;y<l.length;y++){var _=l[y][t][1];null===_||isNaN(_)||(c++,u+=_)}d.push([l[0][t][0],u/c])}var v=Number.MAX_VALUE,f=-Number.MAX_VALUE;for(t=0;t<d.length;t++){var x=d[t][1];null!==x&&isFinite(x)&&(!a||x>0)&&(v=Math.min(v,x),f=Math.max(f,x))}var m=.25;if(a)for(f=Dygraph.log10(f),f+=f*m,v=Dygraph.log10(v),t=0;t<d.length;t++)d[t][1]=Dygraph.log10(d[t][1]);else{var D,w=f-v;D=w<=Number.MIN_VALUE?f*m:w*m,f+=D,v-=D}return{data:d,yMin:v,yMax:f}},t.prototype.placeZoomHandles_=function(){var t=this.dygraph_.xAxisExtremes(),e=this.dygraph_.xAxisRange(),a=t[1]-t[0],i=Math.max(0,(e[0]-t[0])/a),r=Math.max(0,(t[1]-e[1])/a),n=this.canvasRect_.x+this.canvasRect_.w*i,o=this.canvasRect_.x+this.canvasRect_.w*(1-r),s=Math.max(this.canvasRect_.y,this.canvasRect_.y+(this.canvasRect_.h-this.leftZoomHandle_.height)/2),l=this.leftZoomHandle_.width/2;this.leftZoomHandle_.style.left=n-l+"px",this.leftZoomHandle_.style.top=s+"px",this.rightZoomHandle_.style.left=o-l+"px",this.rightZoomHandle_.style.top=this.leftZoomHandle_.style.top,this.leftZoomHandle_.style.visibility="visible",this.rightZoomHandle_.style.visibility="visible"},t.prototype.drawInteractiveLayer_=function(){var t=this.fgcanvas_ctx_;t.clearRect(0,0,this.canvasRect_.w,this.canvasRect_.h);var e=1,a=this.canvasRect_.w-e,i=this.canvasRect_.h-e,r=this.getZoomHandleStatus_();if(t.strokeStyle="black",r.isZoomed){var n=Math.max(e,r.leftHandlePos-this.canvasRect_.x),o=Math.min(a,r.rightHandlePos-this.canvasRect_.x);t.fillStyle="rgba(240, 240, 240, 0.6)",t.fillRect(0,0,n,this.canvasRect_.h),t.fillRect(o,0,this.canvasRect_.w-o,this.canvasRect_.h),t.beginPath(),t.moveTo(e,e),t.lineTo(n,e),t.lineTo(n,i),t.lineTo(o,i),t.lineTo(o,e),t.lineTo(a,e),t.stroke(),this.isUsingExcanvas_&&(this.iePanOverlay_.style.width=o-n+"px",this.iePanOverlay_.style.left=n+"px",this.iePanOverlay_.style.height=i+"px",this.iePanOverlay_.style.display="inline")}else t.beginPath(),t.moveTo(e,e),t.lineTo(e,i),t.lineTo(a,i),t.lineTo(a,e),t.stroke(),this.iePanOverlay_&&(this.iePanOverlay_.style.display="none")},t.prototype.getZoomHandleStatus_=function(){var t=this.leftZoomHandle_.width/2,e=parseFloat(this.leftZoomHandle_.style.left)+t,a=parseFloat(this.rightZoomHandle_.style.left)+t;return{leftHandlePos:e,rightHandlePos:a,isZoomed:e-1>this.canvasRect_.x||a+1<this.canvasRect_.x+this.canvasRect_.w}},t}(),Dygraph.PLUGINS.push(Dygraph.Plugins.Legend,Dygraph.Plugins.Axes,Dygraph.Plugins.RangeSelector,Dygraph.Plugins.ChartLabels,Dygraph.Plugins.Annotations,Dygraph.Plugins.Grid),Dygraph.DataHandler=function(){},Dygraph.DataHandlers={},function(){"use strict";var t=Dygraph.DataHandler;t.X=0,t.Y=1,t.EXTRAS=2,t.prototype.extractSeries=function(t,e,a){},t.prototype.seriesToPoints=function(e,a,i){for(var r=[],n=0;n<e.length;++n){var o=e[n],s=o[1],l=null===s?null:t.parseFloat(s),h={x:0/0,y:0/0,xval:t.parseFloat(o[0]),yval:l,name:a,idx:n+i};r.push(h)}return this.onPointsCreated_(e,r),r},t.prototype.onPointsCreated_=function(t,e){},t.prototype.rollingAverage=function(t,e,a){},t.prototype.getExtremeYValues=function(t,e,a){},t.prototype.onLineEvaluated=function(t,e,a){},t.prototype.computeYInterpolation_=function(t,e,a){var i=e[1]-t[1],r=e[0]-t[0],n=i/r,o=(a-t[0])*n;return t[1]+o},t.prototype.getIndexesInWindow_=function(t,e){var a=0,i=t.length-1;if(e){for(var r=0,n=e[0],o=e[1];r<t.length-1&&t[r][0]<n;)a++,r++;for(r=t.length-1;r>0&&t[r][0]>o;)i--,r--}return i>=a?[a,i]:[0,t.length-1]},t.parseFloat=function(t){return null===t?0/0:t}}(),function(){"use strict";Dygraph.DataHandlers.DefaultHandler=function(){};var t=Dygraph.DataHandlers.DefaultHandler;t.prototype=new Dygraph.DataHandler,t.prototype.extractSeries=function(t,e,a){for(var i=[],r=a.get("logscale"),n=0;n<t.length;n++){var o=t[n][0],s=t[n][e];r&&0>=s&&(s=null),i.push([o,s])}return i},t.prototype.rollingAverage=function(t,e,a){e=Math.min(e,t.length);var i,r,n,o,s,l=[];if(1==e)return t;for(i=0;i<t.length;i++){for(o=0,s=0,r=Math.max(0,i-e+1);i+1>r;r++)n=t[r][1],null===n||isNaN(n)||(s++,o+=t[r][1]);s?l[i]=[t[i][0],o/s]:l[i]=[t[i][0],null]}return l},t.prototype.getExtremeYValues=function(t,e,a){for(var i,r=null,n=null,o=0,s=t.length-1,l=o;s>=l;l++)i=t[l][1],null===i||isNaN(i)||((null===n||i>n)&&(n=i),(null===r||r>i)&&(r=i));return[r,n]}}(),function(){"use strict";Dygraph.DataHandlers.DefaultFractionHandler=function(){};var t=Dygraph.DataHandlers.DefaultFractionHandler;t.prototype=new Dygraph.DataHandlers.DefaultHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o,s,l,h=[],p=100,g=a.get("logscale"),d=0;d<t.length;d++)i=t[d][0],n=t[d][e],g&&null!==n&&(n[0]<=0||n[1]<=0)&&(n=null),null!==n?(o=n[0],s=n[1],null===o||isNaN(o)?h.push([i,o,[o,s]]):(l=s?o/s:0,r=p*l,h.push([i,r,[o,s]]))):h.push([i,null,[null,null]]);return h},t.prototype.rollingAverage=function(t,e,a){e=Math.min(e,t.length);var i,r=[],n=0,o=0,s=100;for(i=0;i<t.length;i++){n+=t[i][2][0],o+=t[i][2][1],i-e>=0&&(n-=t[i-e][2][0],o-=t[i-e][2][1]);var l=t[i][0],h=o?n/o:0;r[i]=[l,s*h]}return r}}(),function(){"use strict";Dygraph.DataHandlers.BarsHandler=function(){Dygraph.DataHandler.call(this)},Dygraph.DataHandlers.BarsHandler.prototype=new Dygraph.DataHandler;var t=Dygraph.DataHandlers.BarsHandler;t.prototype.extractSeries=function(t,e,a){},t.prototype.rollingAverage=function(t,e,a){},t.prototype.onPointsCreated_=function(t,e){for(var a=0;a<t.length;++a){var i=t[a],r=e[a];r.y_top=0/0,r.y_bottom=0/0,r.yval_minus=Dygraph.DataHandler.parseFloat(i[2][0]),r.yval_plus=Dygraph.DataHandler.parseFloat(i[2][1])}},t.prototype.getExtremeYValues=function(t,e,a){for(var i,r=null,n=null,o=0,s=t.length-1,l=o;s>=l;l++)if(i=t[l][1],null!==i&&!isNaN(i)){var h=t[l][2][0],p=t[l][2][1];h>i&&(h=i),i>p&&(p=i),(null===n||p>n)&&(n=p),(null===r||r>h)&&(r=h)}return[r,n]},t.prototype.onLineEvaluated=function(t,e,a){for(var i,r=0;r<t.length;r++)i=t[r],i.y_top=DygraphLayout.calcYNormal_(e,i.yval_minus,a),i.y_bottom=DygraphLayout.calcYNormal_(e,i.yval_plus,a)}}(),function(){"use strict";Dygraph.DataHandlers.CustomBarsHandler=function(){};var t=Dygraph.DataHandlers.CustomBarsHandler;t.prototype=new Dygraph.DataHandlers.BarsHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o=[],s=a.get("logscale"),l=0;l<t.length;l++)i=t[l][0],n=t[l][e],s&&null!==n&&(n[0]<=0||n[1]<=0||n[2]<=0)&&(n=null),null!==n?(r=n[1],o.push(null===r||isNaN(r)?[i,r,[r,r]]:[i,r,[n[0],n[2]]])):o.push([i,null,[null,null]]);return o},t.prototype.rollingAverage=function(t,e,a){e=Math.min(e,t.length);var i,r,n,o,s,l,h,p=[];for(r=0,o=0,n=0,s=0,l=0;l<t.length;l++){if(i=t[l][1],h=t[l][2],p[l]=t[l],null===i||isNaN(i)||(r+=h[0],o+=i,n+=h[1],s+=1),l-e>=0){var g=t[l-e];null===g[1]||isNaN(g[1])||(r-=g[2][0],o-=g[1],n-=g[2][1],s-=1)}s?p[l]=[t[l][0],1*o/s,[1*r/s,1*n/s]]:p[l]=[t[l][0],null,[null,null]]}return p}}(),function(){"use strict";Dygraph.DataHandlers.ErrorBarsHandler=function(){};var t=Dygraph.DataHandlers.ErrorBarsHandler;t.prototype=new Dygraph.DataHandlers.BarsHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o,s=[],l=a.get("sigma"),h=a.get("logscale"),p=0;p<t.length;p++)i=t[p][0],o=t[p][e],h&&null!==o&&(o[0]<=0||o[0]-l*o[1]<=0)&&(o=null),null!==o?(r=o[0],null===r||isNaN(r)?s.push([i,r,[r,r,r]]):(n=l*o[1],s.push([i,r,[r-n,r+n,o[1]]]))):s.push([i,null,[null,null,null]]);return s},t.prototype.rollingAverage=function(t,e,a){e=Math.min(e,t.length);var i,r,n,o,s,l,h,p,g,d=[],u=a.get("sigma");for(i=0;i<t.length;i++){for(s=0,p=0,l=0,r=Math.max(0,i-e+1);i+1>r;r++)n=t[r][1],null===n||isNaN(n)||(l++,s+=n,p+=Math.pow(t[r][2][2],2));l?(h=Math.sqrt(p)/l,g=s/l,d[i]=[t[i][0],g,[g-u*h,g+u*h]]):(o=1==e?t[i][1]:null,d[i]=[t[i][0],o,[o,o]])}return d}}(),function(){"use strict";Dygraph.DataHandlers.FractionsBarsHandler=function(){};var t=Dygraph.DataHandlers.FractionsBarsHandler;t.prototype=new Dygraph.DataHandlers.BarsHandler,t.prototype.extractSeries=function(t,e,a){for(var i,r,n,o,s,l,h,p,g=[],d=100,u=a.get("sigma"),c=a.get("logscale"),y=0;y<t.length;y++)i=t[y][0],n=t[y][e],c&&null!==n&&(n[0]<=0||n[1]<=0)&&(n=null),null!==n?(o=n[0],s=n[1],null===o||isNaN(o)?g.push([i,o,[o,o,o,s]]):(l=s?o/s:0,h=s?u*Math.sqrt(l*(1-l)/s):1,p=d*h,r=d*l,g.push([i,r,[r-p,r+p,o,s]]))):g.push([i,null,[null,null,null,null]]);return g},t.prototype.rollingAverage=function(t,e,a){e=Math.min(e,t.length);var i,r,n,o,s=[],l=a.get("sigma"),h=a.get("wilsonInterval"),p=0,g=0,d=100;for(n=0;n<t.length;n++){p+=t[n][2][2],g+=t[n][2][3],n-e>=0&&(p-=t[n-e][2][2],g-=t[n-e][2][3]);var u=t[n][0],c=g?p/g:0;if(h)if(g){var y=0>c?0:c,_=g,v=l*Math.sqrt(y*(1-y)/_+l*l/(4*_*_)),f=1+l*l/g;i=(y+l*l/(2*g)-v)/f,r=(y+l*l/(2*g)+v)/f,s[n]=[u,y*d,[i*d,r*d]]}else s[n]=[u,0,[0,0]];else o=g?l*Math.sqrt(c*(1-c)/g):1,s[n]=[u,d*c,[d*(c-o),d*(c+o)]]}return s}}(); ���������������������cacti-release-1.2.19/include/js/index.php�����������������������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0020170�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/jquery.dropdown.js��������������������������������������������������0000664�0000000�0000000�00000020373�14136337723�0022072�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* +-------------------------------------------------------------------------+ | Copyright (C) 2004-2021 The Cacti Group | | | | 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. | +-------------------------------------------------------------------------+ | Cacti: The Complete RRDtool-based Graphing Solution | +-------------------------------------------------------------------------+ | This code is designed, written, and maintained by the Cacti Group. See | | about.php and/or the AUTHORS file for specific developer information. | +-------------------------------------------------------------------------+ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ (function($){ $.fn.DropDownMenu = function(options) { var defaults = { title: false, subtitle: false, name: 'myName', maxHeight: 300, width: 'auto', timeout: 500, auto_close: 10000, html: '<h6>empty</h6>', offsetX: 0, offsetY: 0, simultaneous: false, textAlign: 'left' }; var timerref = null; var menu = null; var menuHeight = 0; var options = $.extend(defaults, options); var contentHeight = 0; /* do nothing if requested menu is still loaded */ if($('#' + options.name).is(":visible")) { return; } /* remove all open menus from DOM if they should not stay in front at the same time */ var oldMenus = $(".cacti_dd_menu"); if(options.simultaneous == false) { oldMenus.css({'overflow-y':'hidden'}).slideUp('200'); oldMenus.queue(function () { oldMenus.remove(); oldMenus.dequeue(); }); } return this.each(function() { obj = $(this); newMenu = _init_menu(obj); _open_menu(newMenu); }); function _init_menu(initiator){ /* create the main menu structure */ $("<div id='" + options.name + "' style='display: none;' class='cacti_dd_menu ui-widget ui-corner-all'>" + "<div id='" + options.name + "_title' class='title ui-state-default ui-corner-top'><h6>" + options.title + "</h6></div>" + "<div id='" + options.name + "_back' class='back ui-state-active'></div>" + "<div id='" + options.name + "_content' class='content ui-widget-content ui-state-highlight " + ((options.subtitle !== false) ? "" : "ui-corner-bottom" ) + "'></div>" + "<div id='" + options.name + "_subtitle' class='subtitle ui-state-default ui-corner-bottom'><h6>" + options.subtitle + "</h6></div>" + "<div id='" + options.name + "_html' class='html'></div>" + "</div>").appendTo("body"); /* define references to the menu and its different sections */ menu = $('#' + options.name); menu_head = $('#' + options.name + '_title'); menu_content = $('#' + options.name + '_content'); menu_back = $('#' + options.name + '_back'); menu_subhead = $('#' + options.name + '_subtitle'); menu_html = $('#' + options.name + '_html'); /* while div container "myName_html" holds the raw data ... */ menu_html.append(options.html); i=1; menu_html.find("h6:has(div)").each(function() { var subMenu = $(this); var subMenuClass = options.name + '_' + i; var subMenuTitle = subMenu.find('a:first').html(); subMenu.addClass(subMenuClass); $('.'+subMenuClass).die().live("click", function(){ _switch_layer( subMenuClass); } ); subMenu.children("div").hide(); subMenu.find('a:first').html('<span style="float:left; min-width:80%;">' + subMenuTitle + '</span><span class="ui-icon ui-icon-triangle-1-e" style="float:right;"></span>'); i++; }); /* ... "myName_content" will have the visible menu data */ menu_content.append(menu_html.html()); /* if necessary show title, subtitle ... */ if(options.title !== false) { menu_head.show(); } if(options.subtitle !== false) { menu_subhead.show(); } /* make content visible */ menu_content.show(); /* reduce height to a minimum for best fit */ menuHeight = (menu.outerHeight() > options.maxHeight) ? options.maxHeight : menu.outerHeight(); /* set the width to a fixed value */ if(!isNaN(parseInt(options.width))) { menu.css({ 'min-width' : options.width + 'px', 'max-width' : options.width + 'px' }); menu.width(options.width); }else { // use real width plus 15 percent var width = menu.outerWidth(true)*1.15; menu.css({ 'min-width' : width + 'px', 'max-width' : width + 'px' }); menu.width(width); } /* default position of the menu container */ menu.css({ // x-position in relation to the initiator 'left' : initiator.offset().left + options.offsetX + 'px', // y-position in relation to the initiator 'top' : initiator.offset().top + initiator.height() + options.offsetY + 'px' }); /* change the orientation from right to left if width exceeds the windows size */ if((initiator.offset().left + initiator.width() + options.offsetX + menu.outerWidth(true)) > $(window).width()) { menu.css({'left' : (initiator.offset().left + initiator.width() - menu.outerWidth(true)) + 'px'}); } menu.css({'height':0, 'text-align':options.textAlign}); menu.bind('mouseover', _cancel_timer); menu.bind('mouseout', _set_timer); return menu; } function _switch_layer(subMenuClass){ if(subMenuClass == null) { var content = menu_html; menu_back.empty().hide(); menu_content.height(contentHeight); }else { var content = menu_html.find('.' + subMenuClass + ' div:first'); menu_back.show(); } parentClass = menu_html.find('.' + subMenuClass).parents('h6').attr('class'); menu_back.empty().append( menu_html.find('.' + subMenuClass + ' a:first').html() ); menu_back.find('span:last').removeClass('ui-icon-triangle-1-e').addClass('ui-icon-triangle-1-s'); menu_back.unbind('click').click( function() { _switch_layer( parentClass); }); menu_content.empty().append(content.html()); /* re-calculate content height */ if(subMenuClass != null) { menu_head_height = menu_head.is(":visible") ? menu_head.outerHeight() : 0; menu_back_height = menu_back.is(":visible") ? menu_back.outerHeight() : 0; menu_subhead_height = menu_subhead.is(":visible") ? menu_subhead.outerHeight() : 0; menu_content.height(menuHeight - menu_head_height - menu_back_height - menu_subhead_height); } /* return false to suppress unwanted click events*/ return false; } function _set_timer(timer){ timer = ( typeof(timer) != 'number' ) ? options.timeout : timer; timerref = window.setTimeout( _close_menu, timer); } function _cancel_timer() { if(timerref) { window.clearTimeout(timerref); timerref = null; } } function _close_menu(){ menu = $('#' + options.name); menu.slideUp(menuHeight*3); menu.queue(function () { menu.remove(); menu.dequeue(); }); } function _open_menu(obj){ //wait until oldMenu is completey closed before opening a new one var wait = setInterval(function() { if( !oldMenus.is(":animated") ) { clearInterval(wait); obj.show().animate({height: menuHeight}, menuHeight*3); //setup contentHeight; menu_head_height = menu_head.is(":visible") ? menu_head.outerHeight() : 0; menu_back_height = menu_back.is(":visible") ? menu_back.outerHeight() : 0; menu_subhead_height = menu_subhead.is(":visible") ? menu_subhead.outerHeight() : 0; menu_content.height(menuHeight - menu_head_height - menu_back_height - menu_subhead_height); contentHeight = $('#' + options.name + '_content').height(); $('#' + options.name + '_content').css({'overflow-y':'auto'}); obj.find('h6').eq(0).focus(); if(options.auto_close !== false) { _set_timer(options.auto_close); } } }, 200); } }; })(jQuery); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/jquery.multiselect.filter.js����������������������������������������0000664�0000000�0000000�00000024145�14136337723�0024055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ /* * jQuery MultiSelect UI Widget Filtering Plugin 3.0.0 * Copyright (c) 2012 Eric Hynds * * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ * * Depends: * - jQuery UI MultiSelect widget * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ (function($) { var rEscape = /[\-\[\]{}()*+?.,\\\^$|#\s]/g; // "{{term}}" is a placeholder below for where the search term // would be inserted in the resulting regular expression. var filterRules = { contains: '{{term}}', beginsWith: '^{{term}}', endsWith: '{{term}}$', exactMatch: '^{{term}}$', containsNumber: '\d', isNumeric: '^\d+$', isNonNumeric: '^\D+$', }; var headerSelector = '.ui-multiselect-header'; var hasFilterClass = 'ui-multiselect-hasfilter'; var filterClass = 'ui-multiselect-filter'; var optgroupClass = 'ui-multiselect-optgroup'; var groupLabelClass = 'ui-multiselect-grouplabel'; var hiddenClass = 'ui-multiselect-excluded'; /** * This comes courtesy of underscore.js * @param {function} func to debounce * @param {number} wait period * @param {bool} immediate perform once immediately * @return {function} input function with a debounce period */ function debounce(func, wait, immediate) { var timeout; return function() { var context = this; var args = arguments; // eslint-disable-line prefer-rest-params var later = function() { timeout = null; if (!immediate) { func.apply(context, args); } }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) { func.apply(context, args); } }; } $.widget('ech.multiselectfilter', { options: { label: 'Filter:', // (string) The label to show with the input placeholder: 'Enter keywords', // (string) The placeholder text to show in the input filterRule: 'contains', // (string) Either a named filter rule from above or a regular expression containing {{term}} as a placeholder searchGroups: false, // (true | false) If true, search option group labels and show an entire group on a match. autoReset: false, // (true | false) If true, clear the filter each time the widget menu is closed. width: null, // (number) Override default width set in css file (px). null will inherit debounceMS: 250, // (number) Number of milleseconds to wait between running the search handler. }, /** * Performs widget creation * Widget API has already set this.element and this.options for us * - Find the multiselect widget. * - Create the filter input * - Set up event handlers * - Insert in header * - Create text cache * - Override toggleState */ _create: function() { var opts = this.options; var $element = this.element; // get the multiselect instance this.instance = $element.data('ech-multiselect'); // store header; add filter class so the close/check all/uncheck all links can be positioned correctly this.$header = this.instance.$menu.find(headerSelector).addClass(hasFilterClass); // wrapper $element this.$input = $(document.createElement('input')) .attr({ placeholder: opts.placeholder, type: 'search', }) .css({width: (typeof opts.width === 'string') ? this.instance._parse2px(opts.width, this.$header).px + 'px' : (/\d/.test(opts.width) ? opts.width + 'px' : null), }); this._bindInputEvents(); // automatically reset the widget on close? if (this.options.autoReset) { $element.on('multiselectbeforeclose', $.proxy(this._reset, this)); } var $label = $(document.createElement('label')).text(opts.label).append(this.$input).addClass('ui-multiselect-filter-label'); this.$wrapper = $(document.createElement('div')) .addClass(filterClass) .append($label) .prependTo(this.$header); // If menu already opened, have to reset menu height since // addition of the filter input changes the header height calc. if (!!this.instance._isOpen) { this.instance._setMenuHeight(true); } // cache input values for searching this.updateCache(); // Change the normal _toggleChecked fxn behavior so that when checkAll/uncheckAll // is fired, only the currently displayed filtered inputs are checked if filter entered. var instance = this.instance; var filter = this.$input[0]; instance._oldToggleChecked = instance._toggleChecked; instance._toggleChecked = function(flag, group) { instance._oldToggleChecked(flag, group, !!filter.value); }; }, /** * Binds keyboard events to the input * This is where special behavior like ALT-R for reset is bound */ _bindInputEvents: function() { this.$input.on({ keydown: function(e) { // prevent the enter key from submitting the form / closing the widget if (e.which === 13) { e.preventDefault(); } else if (e.which === 27) { $element.multiselect('close'); e.preventDefault(); } else if (e.which === 9 && e.shiftKey) { $element.multiselect('close'); e.preventDefault(); } else if (e.altKey) { switch (e.which) { case 82: e.preventDefault(); $(this).val('').trigger('input', ''); break; case 65: $element.multiselect('checkAll'); break; case 85: $element.multiselect('uncheckAll'); break; case 70: $element.multiselect('flipAll'); break; case 76: $element.multiselect('instance').$labels.first().trigger('mouseenter'); break; } } }, input: $.proxy(debounce(this._handler, this.options.debounceMS), this), search: $.proxy(this._handler, this), }); }, /** * Handles searches as text is entered in the filter box. * Uses a text cache to speed up searching. * Debouncing is done to limit how often this is ran. * Alternate filter rules can be used. * Option group labels may be searched, also. * @param {event} e event object from original event. */ _handler: function(e) { var term = this.$input[0].value.toLowerCase().replace(/^\s+|\s+$/g, ''); var filterRule = this.options.filterRule || 'contains'; var regex = new RegExp( ( filterRules[filterRule] || filterRule ).replace('{{term}}', term.replace(rEscape, '\\$&')), 'i'); var searchGroups = !!this.options.searchGroups; var $checkboxes = this.instance.$checkboxes; var cache = this.cache; // Cached text() object this.$rows.toggleClass(hiddenClass, !!term); var filteredInputs = $checkboxes.children().map(function(x) { var elem = this; var $groupItems = $(elem); var groupShown = false; // Account for optgroups // If we are searching in option group labels and we match an optgroup label, // then show all its children and return all its inputs also. if (elem.classList.contains(optgroupClass)) { var $groupItems = $groupItems.find('li'); if (searchGroups && regex.test( cache[x] ) ) { elem.classList.remove(hiddenClass); $groupItems.removeClass(hiddenClass); return $groupItems.find('input').get(); } } return $groupItems.map(function(y) { if ( regex.test( cache[x + '.' + y] ) ) { // Show the opt group heading if needed if (!groupShown) { elem.classList.remove(hiddenClass); groupShown = true; } this.classList.remove(hiddenClass); return this.getElementsByTagName('input')[0]; } return null; }); }); if (term) { this._trigger('filter', e, filteredInputs); } if (!this.instance.options.listbox && this.instance._isOpen) { this.instance._setMenuHeight(true); this.instance.position(); } return; }, _reset: function() { this.$input.val(''); var event = document.createEvent('Event'); event.initEvent('reset', true, true); this.$input.get(0).dispatchEvent(event); this._handler(event); }, /** * Creates a text cache object from the widget options' text. * @param {Boolean} alsoRefresh causes the displayed search results to refresh. */ updateCache: function(alsoRefresh) { var cache = {}; // keys are like 0, 0.1, 1, 1.0, 1.1 etc. this.instance.$checkboxes.children().each(function(x) { var $element = $(this); // Account for optgroups if (this.classList.contains(optgroupClass)) { // Single number keys are the option labels cache[x] = this.getElementsByClassName(groupLabelClass)[0].textContent; $element = $element.find('li'); } $element.each(function(y) { cache[x + '.' + y] = this.textContent; }); }); this.cache = cache; this.$rows = this.instance.$checkboxes.find('li'); if (!!alsoRefresh) { this._handler(); } }, /** * @return {object} Returns the input wrapper div */ widget: function() { return this.$wrapper; }, /** * Destroys this widget */ destroy: function() { $.Widget.prototype.destroy.call(this); this.$input.val('').trigger('keyup').off('keydown input search'); this.instance.$menu.find(headerSelector).removeClass(hasFilterClass); this.$wrapper.remove(); }, }); })(jQuery); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/jquery.multiselect.js�����������������������������������������������0000664�0000000�0000000�00000215071�14136337723�0022571�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ /* * jQuery UI MultiSelect Widget 3.0.0 * Copyright (c) 2012 Eric Hynds * * Depends: * - jQuery 1.8+ (http://api.jquery.com/) * - jQuery UI 1.11 widget factory (http://api.jqueryui.com/jQuery.widget/) * * Optional: * - jQuery UI effects * - jQuery UI position utility * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ (function($, undefined) { // Counter used to prevent collisions var multiselectID = 0; // The following information can be overridden via the linkInfo option. // An $.extend is used to allow just specifying a partial object in linkInfo. var linkDefaults = { 'open': { 'class': 'ui-multiselect-open', 'icon': '<span class="ui-icon ui-icon-triangle-1-s"></span', 'title': 'Open', }, 'close': { 'class': 'ui-multiselect-close', 'icon': '<span class="ui-icon ui-icon-circle-close"></span>', 'title': 'Close', }, 'checkAll': { 'class': 'ui-multiselect-all', 'icon': '<span class="ui-icon ui-icon-check"></span>', 'text': 'Check all', 'title': 'Check all', }, 'uncheckAll': { 'class': 'ui-multiselect-none', 'icon': '<span class="ui-icon ui-icon-closethick"></span>', 'text': 'Uncheck all', 'title': 'Uncheck all', }, 'flipAll': { 'class': 'ui-multiselect-flip', 'icon': '<span class="ui-icon ui-icon-arrowrefresh-1-w"></span>', 'text': 'Flip all', 'title': 'Flip all', }, 'collapse': { 'icon': '<span class="ui-icon ui-icon-minusthick"></span>', 'title': 'Collapse', }, 'expand': { 'icon': '<span class="ui-icon ui-icon-plusthick"></span>', 'title': 'Expand', }, 'collapseAll': { 'class': 'ui-multiselect-collapseall', 'icon': '<span class="ui-icon ui-icon-minus"></span>', 'text': 'Collapse all', 'title': 'Collapse all', }, 'expandAll': { 'class': 'ui-multiselect-expandall', 'icon': '<span class="ui-icon ui-icon-plus"></span>', 'text': 'Expand all', 'title': 'Expand all', }, }; /** * Checks an option element for data-image-src * and adds that as an image tag within the widget option * * @param {Node} option to pull an image from * @param {Node} span to insert image tag into */ function insertImage(option, span) { var optionImageSrc = option.getAttribute('data-image-src'); if (optionImageSrc) { var img = document.createElement('img'); img.setAttribute('src', optionImageSrc); span.insertBefore(img, span.firstChild); } } /** * Retrieves the font size of the document * Defaults to 16px * @return {string} pixel string for font size */ function determineFontSize() { if (window.getComputedStyle) { return getComputedStyle(document.body).fontSize; } return '16px'; } /** * Creates a jQuery object from the input element * This can be a string selector, Node, or jQuery object * @param {(object|string)} elem * @return {object} jquery object for element */ function getjQueryFromElement(elem) { if (!!elem.jquery) { return elem; } if (!!elem.nodeType) { return $(elem); } return $(elem).eq(0); } /** * Converts dimensions specified in options to pixel values. * Determines if specified value is a minimum, maximum or exact value. * The value can be a number or a string with px, pts, ems, in, cm, mm, or % units. * Number/Numeric string treated as pixel measurements * - 30 * - '30' * - '>30px' * - '1.3em' * - '20 pt' * - '30%' * @param {string} dimText Option text (or number) containing possibly < or >, number, and a unit. * @param {object} $elem jQuery object (or node) to reference for % calculations. * @param {boolean} isHeight T/F to change from using width in % calculations. * @return {object} object containing pixels and -1/1/0 indicating min/max/exact. */ function parse2px(dimText, $elem, isHeight) { if (typeof dimText !== 'string') { return {px: dimText, minimax: 0}; } var parts = dimText.match(/([<>])?=?\s*([.\d]+)\s*([eimnptx%]*)s?/i); var minimax = parts[1]; var value = parseFloat(parts[2]); var unit = parts[3].toLowerCase(); var pixels = -1; switch (unit) { case 'pt': case 'in': case 'cm': case 'mm': pixels = {'pt': 4.0 / 3.0, 'in': 96.0, 'cm': 96.0 / 2.54, 'mm': 96.0 / 25.4}[unit] * value; break; case 'em': pixels = parseFloat(determineFontSize()) * value; break; case '%': if ( !!$elem ) { if (typeof $elem === 'string' || !$elem.jquery) { $elem = $($elem); } pixels = ( !!isHeight ? $elem.parent().height() : $elem.parent().width() ) * (value / 100.0); } // else returns -1 default value from above. break; default: pixels = value; } // minimax: -1 => minimum value, 1 => maximum value, 0 => exact value return {px: pixels, minimax: minimax == '>' ? -1 : ( minimax == '<' ? 1 : 0 )}; } $.widget('ech.multiselect', { // default options options: { buttonWidth: 225, // (integer | string | 'auto' | null) Sets the min/max/exact width of the button. menuWidth: null, // (integer | string | 'auto' | null) If a number is provided, sets the exact menu width. menuHeight: 200, // (integer | string | 'auto' | 'size') Sets the height of the menu or determines it using native select's size setting. resizableMenu: false, // (true | false) Enables the use of jQuery UI resizable if it is loaded. appendTo: null, // (jQuery | DOM element | selector string) If provided, this specifies what element to append the widget to in the DOM. position: {}, // (object) A jQuery UI position object that constrains how the pop-up menu is positioned. zIndex: null, // (integer) Overrides the z-index set for the menu container. classes: '', // (string) Classes that you can provide to be applied to the elements making up the widget. header: ['checkAll', 'uncheckAll'], // (false | string | array) False, custom string or array indicating which links to show in the header & in what order. linkInfo: null, // (object | null) Supply an obect of link information to use alternative icons, icon labels, or icon title text. See linkDefaults above for object structure. noneSelectedText: 'Select options', // (string | null) The text to show in the button where nothing is selected. Set to null to use the native select's placeholder text. selectedText: '# of # selected', // (string) A "template" that indicates how to show the count of selections in the button. The "#'s" are replaced by the selection count & option count. selectedList: 0, // (integer) The actual list selections will be shown in the button when the count of selections is <= than this number. selectedListSeparator: ', ', // (string) This allows customization of the list separator. Use ',<br/>' to make the button grow vertically showing 1 selection per line. maxSelected: null, // (integer | null) If selected count > maxSelected, then message is displayed, and new selection is undone. openEffect: null, // (array) An array containing menu opening effect information. closeEffect: null, // (array) An array containing menu closing effect information. autoOpen: false, // (true | false) If true, then the menu will be opening immediately after initialization. htmlText: [], // (array) List of 'button' &/or 'options' indicating in which parts of the widget to treat text as html. wrapText: ['button', 'header', 'options'], // (array) List of 'button', 'header', &/or 'options' indicating in which parts of the widget to wrap text. listbox: false, // (true | false) Omits the button and instead of a pop-up inserts the open menu directly after the native select as a list box. addInputNames: true, // (true | false) If true, names are created for each option input in the multi-select. disableInputsOnToggle: true, // (true | false) If true, each individual checkbox input is also disabled when the widget is disabled. groupsSelectable: true, // (true | false) Determines if clicking on an option group heading selects all of its options. groupsCollapsable: false, // (true | false) Determines if option groups can be collapsed. groupColumns: false, // (true | false) Displays groups in a horizonal column layout. groupColumnsWidth: false, // (integer) The width of each select item in the groupColumns. }, /** * This method determines which DOM element to append the menu to. Determination process: * 1. Look up the jQuery object, DOM element, or string selector provided in the options. * 2. If nothing provided in options or lookup in #1 failed, then look for .ui-front or dialog. (dialog case) * 3. If still do not have a valid DOM element to append to, then append to the document body. * * NOTE: this.element and this.document are jQuery objects per the jQuery UI widget API. * @return {object} jQuery object for the DOM element to append to. */ _getAppendEl: function() { var elem = this.options.appendTo; // jQuery object or selector, DOM element or null. if (elem) { // NOTE: The find below handles the jQuery selector case elem = getjQueryFromElement(elem); } if (!elem || !elem[0]) { elem = this.element.closest('.ui-front, dialog'); } if (!elem.length) { elem = $(document.body); // Position at end of body. Note that this returns a DOM element. } return elem; }, /** * Constructs the button element for the widget * Stores the result in this.$button * @return{object} jQuery object for button */ _buildButton: function() { var wrapText = this.options.wrapText || []; var $button = (this.$button = $(document.createElement('button'))) .addClass('ui-multiselect ui-widget ui-state-default ui-corner-all' + (wrapText.indexOf('button') > -1 ? '' : ' ui-multiselect-nowrap') + (this.options.classes ? ' ' + this.options.classes : '') ) .attr({ 'type': 'button', 'title': this.element[0].title, 'tabIndex': this.element[0].tabIndex, 'id': this.element[0].id ? this.element[0].id + '_ms' : null, }) .prop('aria-haspopup', true) .html(this._linkHTML('<span class="{{class}}" title="{{title}}">{{icon}}</span>', 'open')); this.$buttonlabel = $(document.createElement('span')) .html(this.options.noneSelectedText || $element[0].placeholder) .appendTo($button); return $button; }, /** * Constructs HTML string for menu header * @return {string} */ _buildHeaderHtml: function() { // Header controls will contain the links & ordering specified by the header option. // Depending on how the options are set, this may be empty or simply plain text if (!this.options.header) { return ''; } if (typeof this.options.header === 'string') { return '<li>' + this.options.header + '</li>'; } var headerLinksHTML = ''; if (this.options.header.constructor == Array) { for (var x = 0; x < this.options.header.length; x++) { var linkInfoKey = this.options.header[x]; if (linkInfoKey && linkInfoKey in this.linkInfo && !(this.options.maxSelected && linkInfoKey === 'checkAll') && ['open', 'close', 'collapse', 'expand'].indexOf(linkInfoKey) === -1) { headerLinksHTML += this._linkHTML('<li><a class="{{class}}" title="{{title}}">{{icon}}<span>{{text}}</span></a></li>', linkInfoKey); } } } return headerLinksHTML; }, /** * Performs initial widget creation * Widget API has already set this.element and this.options for us * All inserts into the DOM are performed at the end to limit performance impact * - Build header links based on options and linkInfo object * - Set UI effect speeds * - Sets the multiselect ID using the global counter * - Creates the button, header, and menu * - Binds events for the widget * - Calls refresh to populate the menu */ _create: function() { var $element = this.element; var options = this.options; // Do an extend here to address link info missing from options.linkInfo--missing info defaults to that in linkDefaults. this.linkInfo = $.extend(true, {}, linkDefaults, options.linkInfo || {}); // grab select width before hiding it this._selectWidth = $element.outerWidth(); $element.hide(); // Convert null/falsely option values to empty arrays for fewer problems options.htmlText = options.htmlText || []; var wrapText = ( options.wrapText = options.wrapText || [] ); // default speed for effects this.speed = $.fx.speeds._default; this._isOpen = false; // Create a unique namespace for events that // the widget factory cannot unbind automatically. this._namespaceID = this.eventNamespace; // bump unique ID after assigning it to the widget instance this.multiselectID = multiselectID++; this.$headerLinkContainer = $( document.createElement('ul') ) .addClass('ui-helper-reset') .html( this._buildHeaderHtml() + ( !options.listbox ? this._linkHTML('<li class="{{class}}"><a class="{{class}}" title="{{title}}">{{icon}}</a></li>', 'close') : '' ) ); // Menu header to hold controls for the menu var $header = ( this.$header = $( document.createElement('div') ) ) .addClass('ui-multiselect-header ui-widget-header ui-corner-all ui-helper-clearfix') .append( this.$headerLinkContainer ); // Holds the actual check boxes for inputs var $checkboxes = ( this.$checkboxes = $( document.createElement('ul') ) ) .addClass('ui-multiselect-checkboxes ui-helper-reset' + (wrapText.indexOf('options') > -1 ? '' : ' ui-multiselect-nowrap')); // This is the menu container that will hold all the options added via refresh(). var $menu = ( this.$menu = $( document.createElement('div') ) ) .addClass('ui-multiselect-menu ui-widget ui-widget-content ui-corner-all' + ($element[0].multiple ? '' : ' ui-multiselect-single') + (!options.listbox ? '' : ' ui-multiselect-listbox') + (this.options.classes ? ' ' + this.options.classes : '')) .append($header, $checkboxes); if (!options.listbox) { var $button = this._buildButton(); $button.insertAfter($element); var $appendEl = this._getAppendEl(); $appendEl.append($menu); // Set z-index of menu appropriately when it is not appended to a dialog and no z-index specified. if ( !options.zIndex && !$appendEl.hasClass('ui-front') ) { var $uiFront = this.element.closest('.ui-front, dialog'); options.zIndex = Math.max( $uiFront && parseInt($uiFront.css('z-index'), 10) + 1 || 0, $appendEl && parseInt($appendEl.css('z-index'), 10) + 1 || 0); } if (options.zIndex) { $menu.css('z-index', options.zIndex); } // Use $.extend below since the "of" position property may not be able to be supplied via the option. options.position = $.extend({'my': 'left top', 'at': 'left bottom', 'of': $button}, options.position || {}); } else { $menu.insertAfter($element); // No button } this._bindEvents(); // build menu this.refresh(true); }, /** * Helper function used in _create() * @param {string} linkTemplate HTML link template string * @param {string} linkID key string to look up in linkInfo object. * @return {object} link HTML */ _linkHTML: function(linkTemplate, linkID) { var self = this; return linkTemplate.replace(/{{(.*?)}}/ig, function(m, p1) { return self.linkInfo[linkID][p1]; } ) .replace('<span></span>', ''); }, /** * https://api.jqueryui.com/jquery.widget/#method-_init * Performed every time the widget is instantiated, or called with only an options object * - Set visibility of header links * - Auto open menu if appropriate * - Set disabled status */ _init: function() { var elSelect = this.element[0]; if (this.options.header !== false) { this.$headerLinkContainer .find('.ui-multiselect-all, .ui-multiselect-none, .ui-multiselect-flip') .toggle( !!elSelect.multiple ); } else { this.$header.hide(); } if (this.options.autoOpen && !this.options.listbox) { this.open(); } if (elSelect.disabled) { this.disable(); } }, /** * Builds an option item for the menu. (Mostly plain JS for speed.) * <li> * <label> * <input /> checkbox or radio depending on single/multiple select * <span /> option text * </label> * </li> * @param {node} option Option from select to be added to menu * @return {object} jQuery object for menu option */ _makeOption: function(option) { var elSelect = this.element.get(0); // Determine unique ID for the label & option tags var id = elSelect.id || this.multiselectID; var inputID = 'ui-multiselect-' + this.multiselectID + '-' + (option.id || id + '-option-' + this.inputIdCounter++); // Pick up the select type from the underlying element var isMultiple = elSelect.multiple; var isDisabled = option.disabled; var isSelected = option.selected; var input = document.createElement('input'); var inputAttribs = { 'type': isMultiple ? 'checkbox' : 'radio', 'id': inputID, 'title': option.title || null, 'value': option.value, 'name': this.options.addInputNames ? 'multiselect_' + id : null, 'checked': isSelected ? 'checked' : null, 'aria-selected': isSelected ? 'true' : null, 'disabled': isDisabled ? 'disabled' : null, 'aria-disabled': isDisabled ? 'true' : null, }; for (var name in inputAttribs) { if (inputAttribs[name] !== null) { input.setAttribute(name, inputAttribs[name]); } } // Clone data attributes var optionAttribs = option.attributes; var len = optionAttribs.length; for (var x = 0; x < len; x++) { var attribute = optionAttribs[x]; if ( /^data\-.+/.test(attribute.name) ) { input.setAttribute(attribute.name, attribute.value); } } // Option text or html var span = document.createElement('span'); if (this.htmlAllowedFor('options')) { span.innerHTML = option.innerHTML; } else { span.textContent = option.textContent; } // Icon images for each item. insertImage(option, span); var label = document.createElement('label'); label.setAttribute('for', inputID); if (option.title) { label.setAttribute('title', option.title); } label.className += (isDisabled ? ' ui-state-disabled' : '') + (isSelected && !isMultiple ? ' ui-state-active' : '') + ' ui-corner-all'; label.appendChild(input); label.appendChild(span); var item = document.createElement('li'); item.className = (isDisabled ? 'ui-multiselect-disabled ' : '') + (this.options.groupColumns ? ' ui-multiselect-columns' : '') + (option.className || ''); if (this.options.groupColumnsWidth) { item.style.width = this.options.groupColumnsWidth+'px'; } item.appendChild(label); return item; }, /** * Processes option and optgroup tags from underlying select to construct the menu's option list * If groupsCollapsable option is set, adds collapse/expand buttons for each option group. * This replaces the current contents of this.$checkboxes * Defers to _makeOption to actually build the options * Resets the input ID counter */ _buildOptionList: function() { var self = this; var list = []; this.inputIdCounter = 0; this.element.children().each( function() { var elem = this; if (elem.tagName.toUpperCase() === 'OPTGROUP') { var options = []; $(elem).children().each( function() { options.push(self._makeOption(this)); }); // Build the list section for this optgroup, complete w/ option inputs... var $collapseButton = !!self.options.groupsCollapsable ? $( document.createElement('button') ) .attr({'title': self.linkInfo.collapse.title}) .addClass('ui-state-default ui-corner-all ui-multiselect-collapser') .html(self.linkInfo.collapse.icon) : null; var $optGroupLabel = $( document.createElement('a') ) .addClass('ui-multiselect-grouplabel' + (self.options.groupsSelectable ? ' ui-multiselect-selectable' : '')) .html( elem.getAttribute('label') ); var $optionGroup = $( document.createElement('ul') ).append(options); var $optGroupItem = $( document.createElement('li') ) .addClass('ui-multiselect-optgroup' + (self.options.groupColumns ? ' ui-multiselect-columns' : '') + (elem.className ? ' ' + elem.className : '')) .append($collapseButton, $optGroupLabel, $optionGroup); if (self.options.groupColumnsWidth) { $optGroupItem.css('width', self.options.groupColumnsWidth+'px'); } list.push($optGroupItem); } else { list.push(self._makeOption(elem)); } }); this.$checkboxes.empty().append(list); }, /** * Refreshes the widget's menu * - Refresh header links if required * - Rebuild option list * - Update the cached values for height, width, and cached elements * - If listbox option is set, shows the menu and sets menu size. * @param {boolean} init If false, broadcasts a refresh event */ refresh: function(init) { var $element = this.element; // update header link container visibility if needed if (this.options.header !== false) { this.$headerLinkContainer .find('.ui-multiselect-all, .ui-multiselect-none, .ui-multiselect-flip') .toggle( !!$element[0].multiple ); } this._buildOptionList(); // Clear and rebuild the menu. this._updateCache(); // cache some more useful elements if (!this.options.listbox) { this._setButtonWidth(); this.update(true); } else { if (!this._isOpen) { this.$menu.show(); this._isOpen = true; } this._setMenuWidth(); this._setMenuHeight(); } // broadcast refresh event; useful for widgets if (!init) { this._trigger('refresh'); } }, /** * Updates cached values used elsewhere in the widget * Causes the filter to also update its cache if the filter is loaded */ _updateCache: function() { // Invalidate cached dimensions to force recalcs. this._savedButtonWidth = 0; this._savedMenuWidth = 0; this._savedMenuHeight = 0; // Recreate important cached jQuery objects this.$header = this.$menu.children('.ui-multiselect-header'); this.$checkboxes = this.$menu.children('.ui-multiselect-checkboxes'); // Update saved labels and inputs this.$labels = this.$menu.find('label:not(.ui-multiselect-filter-label)'); this.$inputs = this.$labels.children('input'); // If the filter widget is in use, then also update its cache. if ( this.element.is(':data("ech-multiselectfilter")') ) { this.element.data('ech-multiselectfilter').updateCache(true); } }, /** * Updates the widget checkboxes' checked states * from the native select options' selected states. * @param {boolean} skipDisabled If true, disabled options in either are skipped. */ resync: function(skipDisabled) { var $inputs = this.$inputs; var $options = this.element.find('option'); if ($inputs.length === $options.length) { var inputValues = {}; $inputs.not(!!skipDisabled ? ':disabled' : '').each( function() { inputValues[this.value] = this; }); $options.not(!!skipDisabled ? ':disabled' : '').each( function() { if (this.value in inputValues) { inputValues[this.value].checked = this.selected; } }); this._trigger('resync'); this.update(); } else { this.refresh(); } }, /** * Updates the button text * If selectedText option is a function, simply call it * The selectedList option determines how many options to display * before switching to # of # selected * This does not apply in listbox mode * @param {boolean} isDefault true if value is default value for the button */ update: function(isDefault) { if (!!this.options.listbox) { return; } var options = this.options; var selectedList = options.selectedList; var selectedText = options.selectedText; var $inputs = this.$inputs; var inputCount = $inputs.length; var $checked = $inputs.filter(':checked'); var numChecked = $checked.length; var value; if (numChecked) { if (typeof selectedText === 'function') { value = selectedText.call(this, numChecked, inputCount, $checked.get()); } else if (/\d/.test(selectedList) && selectedList > 0 && numChecked <= selectedList) { value = $checked.map(function() { return $(this).next().text().replace(/\n$/, ''); }) .get().join(options.selectedListSeparator); } else { value = selectedText.replace('#', numChecked).replace('#', inputCount); } } else { value = options.noneSelectedText; } this._setButtonValue(value, isDefault); if ( options.wrapText.indexOf('button') === -1 ) { this._setButtonWidth(true); } // Check if the menu needs to be repositioned due to button height changing from adding/removing selections. if (this._isOpen && this._savedButtonHeight != this.$button.outerHeight(false)) { this.position(); } }, /** * Sets the button text * @param {string} value content to be assigned to the button * @param {boolean} isDefault true if value is default value for the button */ _setButtonValue: function(value, isDefault) { this.$buttonlabel[this.htmlAllowedFor('button') ? 'html' : 'text'](value); if (!!isDefault) { this.$button[0].defaultValue = value; } }, /** * Sets button events for mouse and keyboard interaction * Called by _bindEvents */ _bindButtonEvents: function() { var self = this; var $button = this.$button; /** * @return {Boolean} always false */ function buttonClickHandler() { self[self._isOpen ? 'close' : 'open'](); return false; } $button .on({ click: buttonClickHandler, keydown: $.proxy(self._handleButtonKeyboardNav, self), mouseenter: function() { if (!this.classList.contains('ui-state-disabled')) { this.classList.add('ui-state-hover'); } }, mouseleave: function() { this.classList.remove('ui-state-hover'); }, focus: function() { if (!this.classList.contains('ui-state-disabled')) { this.classList.add('ui-state-focus'); } }, blur: function() { this.classList.remove('ui-state-focus'); }, }) // webkit doesn't like it when you click on the span :( .find('span') .on('click.multiselect,click', buttonClickHandler); }, // Handle keyboard events for the multiselect button. _handleButtonKeyboardNav: function(e) { // Change selection via up/down on a closed single select. if (!this._isOpen && !this.element[0].multiple && (e.which === 38 || e.which === 40) ) { var $inputs = this.$inputs; var index = $inputs.index( $inputs.filter(':checked') ); if (e.which === 38 && index) { $inputs.eq(index - 1).trigger('click'); } else if (e.which === 40 && index < $inputs.length - 1) { $inputs.eq(index + 1).trigger('click'); } return; } switch (e.which) { case 27: // esc case 37: // left case 38: // up this.close(); break; case 40: // down case 39: // right this.open(); break; } }, /** * Bind events to the checkboxes for options and option groups * Must be bound to the checkboxes container. * This method scopes actions to filtered options * Called by _bindEvents */ _bindCheckboxEvents: function() { var self = this; // optgroup label toggle support self.$checkboxes.on('click.multiselect', '.ui-multiselect-grouplabel', function(e) { e.preventDefault(); if (!self.options.groupsSelectable) { return false; } var $this = $(this); var $inputs = $this.next('ul').children(':not(.ui-multiselect-excluded)').find('input').not(':disabled'); var nodes = $inputs.get(); var label = this.textContent; // trigger before callback and bail if the return is false if (self._trigger('beforeoptgrouptoggle', e, {inputs: nodes, label: label}) === false) { return; } // if maxSelected is in use, cannot exceed it var maxSelected = self.options.maxSelected; if (maxSelected && (self.$inputs.filter(':checked').length + $inputs.length > maxSelected) ) { return; } // toggle inputs self._toggleChecked( $inputs.filter(':checked').length !== $inputs.length, $inputs ); self._trigger('optgrouptoggle', e, { inputs: nodes, label: label, checked: nodes.length ? nodes[0].checked : null, }); }) // collapse button .on('click.multiselect', '.ui-multiselect-collapser', function(e) { var $this = $(this); var $parent = $this.parent(); var optgroupLabel = $parent.find('.ui-multiselect-grouplabel').first().html(); var linkInfo = self.linkInfo; var collapsedClass = 'ui-multiselect-collapsed'; var isCollapsed = $parent.hasClass(collapsedClass); if (self._trigger('beforecollapsetoggle', e, {label: optgroupLabel, collapsed: isCollapsed}) === false) { return; } $parent.toggleClass(collapsedClass); $this.attr('title', isCollapsed ? linkInfo.collapse.title : linkInfo.expand.title) .html(isCollapsed ? linkInfo.collapse.icon : linkInfo.expand.icon ); if (!self.options.listbox) { self._setMenuHeight(true); } self._trigger('collapsetoggle', e, {label: optgroupLabel, collapsed: !isCollapsed}); }) // collapse button .on('mouseenter.multiselect', '.ui-multiselect-collapser', function(e) { this.classList.add('ui-state-hover'); }) // collapse button .on('mouseleave.multiselect', '.ui-multiselect-collapser', function(e) { this.classList.remove('ui-state-hover'); }) // option label .on('mouseenter.multiselect', 'label', function(e, param) { if (!this.classList.contains('ui-state-disabled')) { var checkboxes = self.$checkboxes[0]; var scrollLeft = checkboxes.scrollLeft; var scrollTop = checkboxes.scrollTop; var scrollX = window.pageXOffset; var scrollY = window.pageYOffset; self.$labels.removeClass('ui-state-hover'); $(this).addClass('ui-state-hover').find('input').focus(); // Restore scroll positions if altered by setting input focus if ( !param || !param.allowScroll ) { checkboxes.scrollLeft = scrollLeft; checkboxes.scrollTop = scrollTop; window.scrollTo(scrollX, scrollY); } } }) // Keyboard navigation of the menu .on('keydown.multiselect', 'label', function(e) { // Don't capture function keys or 'r' if (e.which === 82) { return; // r } if (e.which > 111 && e.which < 124) { return; // Function keys. } e.preventDefault(); switch (e.which) { case 9: // tab if (e.shiftKey) { self.$menu.find('.ui-state-hover').removeClass('ui-state-hover'); self.$header.find('li').last().find('a').focus(); } else { self.close(); } break; case 27: // esc self.close(); break; case 38: // up case 40: // down case 37: // left case 39: // right self._traverse(e.which, this); break; case 13: // enter case 32: // space $(this).find('input')[0].click(); break; case 65: // Alt-A if (e.altKey) { self.checkAll(); } break; case 70: // Alt-F if (e.altKey) { self.flipAll(); } break; case 85: // Alt-U if (e.altKey) { self.uncheckAll(); } break; } }) .on('click.multiselect', 'input', function(e) { // Reference to this checkbox / radio input var input = this; var $input = $(input); var val = input.value; var checked = input.checked; // self is cached from outer scope above var $element = self.element; var $tags = $element.find('option'); var isMultiple = $element[0].multiple; var $allInputs = self.$inputs; var numChecked = $allInputs.filter(':checked').length; var options = self.options; var textFxn = self.htmlAllowedFor('options') ? 'html' : 'text'; var optionText = $input.parent().find('span')[textFxn](); var maxSelected = options.maxSelected; // bail if this input is disabled or the event is cancelled if (input.disabled || self._trigger('click', e, {value: val, text: optionText, checked: checked}) === false) { e.preventDefault(); return; } if (maxSelected && checked && numChecked > maxSelected) { if (self._trigger('maxselected', e, {labels: self.$labels, inputs: $allInputs}) !== false) { self.buttonMessage('<center><b>LIMIT OF ' + (numChecked - 1) + ' REACHED!</b></center>'); } input.checked = false; e.preventDefault(); return false; } // make sure the input has focus. otherwise, the esc key // won't close the menu after clicking an item. input.focus(); // toggle aria state $input.prop('aria-selected', checked); // change state on the original option tags $tags.each(function() { this.selected = (this.value === val ? checked : isMultiple && this.selected); }); // some additional single select-specific logic if (!isMultiple) { self.$labels.removeClass('ui-state-active'); $input.closest('label').toggleClass('ui-state-active', checked); // close menu self.close(); } // fire change on the select box $element.trigger('change'); // setTimeout is to fix multiselect issue #14 and #47. caused by jQuery issue #3827 // http://bugs.jquery.com/ticket/3827 setTimeout($.proxy(self.update, self), 10); }); }, /** * Binds keyboard and mouse events to the header * Called by _bindEvents */ _bindHeaderEvents: function() { var self = this; // header links self.$header .on('click.multiselect', 'a', function(e) { var headerLinks = { 'ui-multiselect-close': 'close', 'ui-multiselect-all': 'checkAll', 'ui-multiselect-none': 'uncheckAll', 'ui-multiselect-flip': 'flipAll', 'ui-multiselect-collapseall': 'collapseAll', 'ui-multiselect-expandall': 'expandAll', }; for (hdgClass in headerLinks) { if ( this.classList.contains(hdgClass) ) { // headerLinks[hdgClass] is the click handler name self[headerLinks[hdgClass]](); e.preventDefault(); return false; } } }). on('keydown.multiselect', 'a', function(e) { switch (e.which) { case 27: self.close(); break; case 9: // tab var $target = $(e.target); if ((e.shiftKey && !$target.parent().prev().length && !self.$header.find('.ui-multiselect-filter').length) || (!$target.parent().next().length && !self.$labels.length && !e.shiftKey)) { self.close(); e.preventDefault(); } break; } }); }, /** * Allows the widget to be resized if the option is set and resizable is * included in jQuery UI */ _setResizable: function() { if (!this.options.resizableMenu || !('resizable' in $.ui)) { return; } this.$menu.show(); this.$menu.resizable({ containment: 'parent', handles: 's', helper: 'ui-multiselect-resize', stop: function(e, ui) { // Force consistent width ui.size.width = ui.originalSize.width; $(this).outerWidth(ui.originalSize.width); if (this._trigger('resize', e, ui) !== false) { this.options.menuHeight = ui.size.height; } this._setMenuHeight(true); }, }); this.$menu.hide(); }, /** * Binds all events used in the widget * This calls the menu, button, and header event binding methods */ _bindEvents: function() { if (!this.options.listbox) { this._bindButtonEvents(); } this._bindHeaderEvents(); this._bindCheckboxEvents(); this._setResizable(); // Close each widget when clicking on any other element/anywhere else on the page, // another widget instance, or when scrolling w/ the mouse wheel outside the menu button. this.document.on('mousedown' + this._namespaceID + ' wheel' + this._namespaceID + ' mousewheel' + this._namespaceID, function(event) { var target = event.target; if ( this._isOpen && (!!this.$button ? target !== this.$button[0] && !$.contains(this.$button[0], target) : true) && target !== this.$menu[0] && !$.contains(this.$menu[0], target) ) { this.close(); } }.bind(this)); // deal with form resets. the problem here is that buttons aren't // restored to their defaultValue prop on form reset, and the reset // handler fires before the form is actually reset. delaying it a bit // gives the form inputs time to clear. $(this.element[0].form).on('reset' + this._namespaceID, function() { setTimeout(this.refresh.bind(this), 10); }.bind(this)); }, /** * Sets and caches the width of the button * Can set a minimum value if less than calculated width of native select. * @param {boolean} recalc true if cached width needs to be re-calculated */ _setButtonWidth: function(recalc) { if (this._savedButtonWidth && !recalc) { return; } // this._selectWidth set in _create() for native select element before hiding it. var width = this._selectWidth || this._getBCRWidth( this.element ); var buttonWidth = this.options.buttonWidth || ''; if (/\d/.test(buttonWidth)) { var parsed = parse2px(buttonWidth, this.element); var pixels = parsed.px; var minimax = parsed.minimax; width = minimax < 0 ? Math.max(width, pixels) : ( minimax > 0 ? Math.min(width, pixels) : pixels ); } else { // keywords buttonWidth = buttonWidth.toLowerCase(); } // The button width is set to auto in the CSS, // so we only need to change it for a specific width. if (buttonWidth !== 'auto') { this.$button.outerWidth(width); } this._savedButtonWidth = width; }, /** * Sets and caches the width of the menu * Will use the width in options if provided, otherwise matches the button * @param {boolean} recalc true if cached width needs to be re-calculated */ _setMenuWidth: function(recalc) { if (this._savedMenuWidth && !recalc) { return; } // Note that it is assumed that the button width was set prior. var width = !!this.options.listbox ? this._selectWidth : (this._savedButtonWidth || this._getBCRWidth( this.$button )); var menuWidth = this.options.menuWidth || ''; if ( /\d/.test(menuWidth) ) { var parsed = parse2px(menuWidth, this.element); var pixels = parsed.px; var minimax = parsed.minimax; width = minimax < 0 ? Math.max(width, pixels) : ( minimax > 0 ? Math.min(width, pixels) : pixels ); } else { // keywords menuWidth = menuWidth.toLowerCase(); } // Note that the menu width defaults to the button width if menuWidth option is null or blank. if (menuWidth !== 'auto') { this.$menu.outerWidth(width); this._savedMenuWidth = width; return; } // Auto width determination: get intrinsic / "shrink-wrapped" outer widths w/ margins by applying floats. // cbWidth includes the width of the vertical scrollbar & ui-hover-state width increase per the applied CSS. // Note that a correction is made for jQuery floating point round-off errors below. this.$menu.addClass('ui-multiselect-measure'); var headerWidth = this.$header.outerWidth(true) + this._jqWidthFix(this.$header); var cbWidth = this.$checkboxes.outerWidth(true) + this._jqWidthFix(this.$checkboxes); this.$menu.removeClass('ui-multiselect-measure'); var contentWidth = Math.max(this.options.wrapText.indexOf('header') > -1 ? 0 : headerWidth, cbWidth); // Use $().width() to set menu width not including padding or border. this.$menu.width(contentWidth); // Save width including padding and border (no margins) for consistency w/ normal width setting. this._savedMenuWidth = this.$menu.outerWidth(false); }, /** * Sets and caches the height of the menu * Will use the height provided in the options unless using the select size * option or the option exceeds the available height for the menu * Will set a scrollbar if the options can't all be visible at once * @param {boolean} recalc true if cached value needs to be re-calculated */ _setMenuHeight: function(recalc) { var self = this; if (self._savedMenuHeight && !recalc) { return; } var maxHeight = $(window).height(); var optionHeight = self.options.menuHeight || ''; var useSelectSize = false; var elSelectSize = 4; if ( /\d/.test(optionHeight) ) { // Deduct height of header & border/padding to find height available for checkboxes. var $header = self.$header.filter(':visible'); var headerHeight = $header.outerHeight(true); var menuBorderPaddingHt = this.$menu.outerHeight(false) - this.$menu.height(); var cbBorderPaddingHt = this.$checkboxes.outerHeight(false) - this.$checkboxes.height(); optionHeight = parse2px(optionHeight, self.element, true).px; maxHeight = Math.min(optionHeight, maxHeight) - headerHeight - menuBorderPaddingHt - cbBorderPaddingHt; } else if (optionHeight.toLowerCase() === 'size') { // Overall height based on native select 'size' attribute useSelectSize = true; // Retrieves native select's size attribute or defaults to 4 (like native select). elSelectSize = self.element[0].size || elSelectSize; } var overflowSetting = 'hidden'; var itemCount = 0; var hoverAdjust = 4; // Adjustment for hover height included here. var ulHeight = hoverAdjust; var ulTop = -1; // The following determines the how many items are visible per the menuHeight option. // If the visible height calculation exceeds the calculated maximum height or if the number // of item heights summed equal or exceed the native select size attribute, the loop is aborted. // If the loop is aborted, this means that the menu must be scrolled to see all the items. self.$checkboxes.find('li:not(.ui-multiselect-optgroup),a').filter(':visible').each( function() { if (ulTop < 0) { ulTop = this.offsetTop; } ulHeight = this.offsetTop + this.offsetHeight - ulTop + hoverAdjust; if (useSelectSize && ++itemCount >= elSelectSize || ulHeight > maxHeight) { overflowSetting = 'auto'; if (!useSelectSize) { ulHeight = maxHeight; } return false; } }); // We actually only set the height of the checkboxes as the outer menu container is height:auto. // The _savedMenuHeight value below can be compared to optionHeight as an accuracy check. self.$checkboxes.css('overflow', overflowSetting).height(ulHeight); self._savedMenuHeight = this.$menu.outerHeight(false); }, /** * Calculate accurate outerWidth(false) using getBoundingClientRect() * Note that this presumes that the element is visible in the layout. * @param {node} elem DOM node or jQuery equivalent to get width for. * @return {float} Decimal floating point value for the width. */ _getBCRWidth: function(elem) { if (!elem || !!elem.jquery && !elem[0]) { return null; } var domRect = !!elem.jquery ? elem[0].getBoundingClientRect() : elem.getBoundingClientRect(); return domRect.right - domRect.left; }, /** * Calculate jQuery width correction factor to fix floating point round-off errors. * Note that this presumes that the element is visible in the layout. * @param {node} elem node or jQuery equivalent to get width for. * @return {float} Correction value for the width--typically a decimal < 1.0 */ _jqWidthFix: function(elem) { if (!elem || !!elem.jquery && !elem[0]) { return null; } return !!elem.jquery ? this._getBCRWidth(elem[0]) - elem.outerWidth(false) : this._getBCRWidth(elem) - $(elem).outerWidth(false); }, /** * Moves focus up or down the options list * @param {number} which key that triggered the traversal * @param {node} start element event was triggered from */ _traverse: function(which, start) { var $start = $(start); var moveToLast = which === 38 || which === 37; // select the first li that isn't an optgroup label / disabled var $next = $start.parent()[moveToLast ? 'prevAll' : 'nextAll']('li:not(:disabled, .ui-multiselect-optgroup):visible').first(); // we might have to jump to the next/previous option group if (!$next.length) { $next = $start.parents('.ui-multiselect-optgroup')[moveToLast ? 'prev' : 'next'](); } // if at the first/last element if (!$next.length) { var $container = this.$checkboxes; // move to the first/last $container.find('label').filter(':visible')[moveToLast ? 'last' : 'first']().trigger('mouseover', {allowScroll: true}); // set scroll position $container.scrollTop(moveToLast ? $container.height() : 0); } else { $next.find('label').filter(':visible')[moveToLast ? 'last' : 'first']().trigger('mouseover', {allowScroll: true}); } }, /** * Internal function to toggle checked property and related attributes on a checkbox * The context of this function should be a checkbox; do not proxy it. * @param {string} prop Property being toggled on the checkbox * @param {string} flag Flag to set for the property * @return {function} function for toggling checked state */ _toggleState: function(prop, flag) { return function() { var state = (flag === '!') ? !this[prop] : flag; if ( !this.disabled ) { this[prop] = state; } if (state) { this.setAttribute('aria-' + prop, true); } else { this.removeAttribute('aria-' + prop); } }; }, /** * Toggles the checked state on options within the menu * Potentially scoped down to visible elements from filteredInputs * @param {boolean} flag checked property to set * @param {object} group option group that was clicked, if any * @param {boolean} filteredInputs does not toggle hidden inputs if filtering. */ _toggleChecked: function(flag, group, filteredInputs) { var self = this; var $element = self.element; var $inputs = (group && group.length) ? group : self.$inputs; if (filteredInputs) { $inputs = self._isOpen ? $inputs.closest('li').not('.ui-multiselect-excluded').find('input').not(':disabled') : $inputs.not(':disabled'); } // toggle state on inputs $inputs.each(self._toggleState('checked', flag)); // Give the first input focus $inputs.eq(0).focus(); // update button text self.update(); // Create a plain object of the values that actually changed var inputValues = {}; $inputs.each( function() { inputValues[this.value] = true; }); // toggle state on original option tags $element.find('option') .each( function() { if (!this.disabled && inputValues[this.value]) { self._toggleState('selected', flag).call(this); } }); // trigger the change event on the select if ($inputs.length) { $element.trigger('change'); } }, /** * Toggles disabled state on the widget and underlying select or for just one option group. * Will also disable all individual options if the disableInputsOnToggle option is set * @param {boolean} flag true if disabling widget * @param {number | string} groupID index or label of option group to disable */ _toggleDisabled: function(flag, groupID) { var disabledClass = 'ui-state-disabled'; // used for styling only if (this.$button) { this.$button.prop({'disabled': flag, 'aria-disabled': flag})[flag ? 'addClass' : 'removeClass'](disabledClass); } if (this.options.disableInputsOnToggle) { // Apply the ui-multiselect-disabled class name to identify which // input elements this widget disabled (not pre-disabled) // so that they can be restored if the widget is re-enabled. var $inputs = (typeof groupID === 'undefined') ? this.$inputs : this._multiselectOptgroupFilter(groupID).find('input'); var msDisabledClass = 'ui-multiselect-disabled'; if (flag) { var matchedInputs = $inputs.filter(':enabled').get(); for (var x = 0, len = matchedInputs.length; x < len; x++) { matchedInputs[x].setAttribute('disabled', 'disabled'); matchedInputs[x].setAttribute('aria-disabled', 'disabled'); matchedInputs[x].classList.add(msDisabledClass); matchedInputs[x].parentNode.classList.add(disabledClass); } } else { var matchedInputs = $inputs.filter('.' + msDisabledClass + ':disabled').get(); for (var x = 0, len = matchedInputs.length; x < len; x++) { matchedInputs[x].removeAttribute('disabled'); matchedInputs[x].removeAttribute('aria-disabled'); matchedInputs[x].classList.remove(msDisabledClass); matchedInputs[x].parentNode.classList.remove(disabledClass); } } } var $select = (typeof groupID === 'undefined') ? this.element : this._nativeOptgroupFilter(groupID).find('option'); $select.prop({ 'disabled': flag, 'aria-disabled': flag, }); }, /** * Opens the menu, possibly with effects * Calls methods to set position and resize as well */ open: function() { var $button = this.$button; // bail if the multiselect open event returns false, this widget is disabled, or is already open if (this._trigger('beforeopen') === false || $button.hasClass('ui-state-disabled') || this._isOpen || !!this.options.listbox) { return; } var $menu = this.$menu; var $header = this.$header; var $labels = this.$labels; var $inputs = this.$inputs.filter(':checked:not(.ui-state-disabled)'); var options = this.options; var effect = options.openEffect; var scrollX = window.pageXOffset; var scrollY = window.pageYOffset; // set the scroll of the checkbox container this.$checkboxes.scrollTop(0); // Show the menu, set its dimensions, and position it. $menu.css('display', 'block'); this._setMenuWidth(); this._setMenuHeight(); this.position(); // Do any specified open animation effect after positioning the menu. if (!!effect) { // Menu must be hidden for some effects (e.g. fade) to work. $menu.css('display', 'none'); if (typeof effect == 'string') { $menu.show(effect, this.speed); } else if (typeof effect == 'object' && effect.constructor == Array) { $menu.show(effect[0], effect[1] || this.speed); } else if (typeof effect == 'object' && effect.constructor == Object) { $menu.show(effect); } } // focus the first not disabled option or filter input if available var filter = $header.find('.ui-multiselect-filter'); if (filter.length) { filter.first().find('input').trigger('focus'); } else if ($inputs.length) { $inputs.eq(0).trigger('focus').parent('label').eq(0).trigger('mouseover').trigger('mouseenter'); } else if ($labels.length) { $labels.filter(':not(.ui-state-disabled)').eq(0).trigger('mouseover').trigger('mouseenter').find('input').trigger('focus'); } else { $header.find('a').first().trigger('focus'); } // Restore window scroll position if altered by setting element focus window.scrollTo(scrollX, scrollY); $button.addClass('ui-state-active'); this._isOpen = true; this._trigger('open'); }, // Close the menu close: function() { // bail if the multiselect close event returns false if (this._trigger('beforeclose') === false || !!this.options.listbox) { return; } var $menu = this.$menu; var options = this.options; var effect = options.closeEffect; var $button = this.$button; // hide the menu, maybe with a speed/effect combo if (!!effect) { if (typeof effect == 'string') { $menu.hide(effect, this.speed); } else if (typeof effect == 'object' && effect.constructor == Array) { $menu.hide(effect[0], effect[1] || this.speed); } else if (typeof effect == 'object' && effect.constructor == Object) { $menu.hide(effect); } } else { $menu.css('display', 'none'); } $button.removeClass('ui-state-active').trigger('blur').trigger('mouseleave'); this.element.trigger('blur'); // For jQuery Validate this._isOpen = false; this._trigger('close'); $button.trigger('focus'); }, /** * Positions the menu relative to the button. */ position: function() { var $button = this.$button; // Save the button height so that we can determine when it has changed due to adding/removing selections. this._savedButtonHeight = $button.outerHeight(false); if ($.ui && $.ui.position) { this.$menu.position(this.options.position); } else { var pos = {}; pos.top = $button.offset().top + this._savedButtonHeight; pos.left = $button.offset().left; this.$menu.offset(pos); } }, // Enable widget enable: function(groupID) { this._toggleDisabled(false, groupID); }, // Disable widget disable: function(groupID) { this._toggleDisabled(true, groupID); }, /** * Checks all options or those in an option group * Accounts for maxSelected possibly being set. * @param {(number|string)} groupID index or label of option group to check all for. */ checkAll: function(groupID) { this._trigger('beforeCheckAll'); if (this.options.maxSelected) { return; } if (typeof groupID === 'undefined') { // groupID could be 0 this._toggleChecked(true); } else { this._toggleChecked(true, this._multiselectOptgroupFilter(groupID).find('input')); } this._trigger('checkAll'); }, /** * Unchecks all options or those in an option group * @param {(number|string)} groupID index or label of option group to uncheck all for. */ uncheckAll: function(groupID) { this._trigger('beforeUncheckAll'); if (typeof groupID === 'undefined') { // groupID could be 0 this._toggleChecked(false); } else { this._toggleChecked(false, this._multiselectOptgroupFilter(groupID).find('input')); } if ( !this.element[0].multiple && !this.$inputs.filter(':checked').length) { // Forces the underlying single-select to have no options selected. this.element[0].selectedIndex = -1; } this._trigger('uncheckAll'); }, /** * Flips all options or those in an option group. * Accounts for maxSelected possibly being set. * @param {(number|string)} groupID index or label of option group to flip all for. */ flipAll: function(groupID) { this._trigger('beforeFlipAll'); var gotID = (typeof groupID !== 'undefined'); // groupID could be 0 var maxSelected = this.options.maxSelected; var inputCount = this.$inputs.length; var checkedCount = this.$inputs.filter(':checked').length; var $filteredOptgroupInputs = gotID ? this._multiselectOptgroupFilter(groupID).find('input') : null; var gInputCount = gotID ? $filteredOptgroupInputs.length : 0; var gCheckedCount = gotID ? $filteredOptgroupInputs.filter(':checked').length : 0; if (!maxSelected || maxSelected >= (gotID ? checkedCount - gCheckedCount + gInputCount - gCheckedCount : inputCount - checkedCount ) ) { if (gotID) { this._toggleChecked('!', $filteredOptgroupInputs); } else { this._toggleChecked('!'); } this._trigger('flipAll'); } else { this.buttonMessage('<center><b>Flip All Not Permitted.</b></center>'); } }, /** * Collapses all option groups or just the one specified. * @param {(number|string)} groupID index or label of option group to collapse. */ collapseAll: function(groupID) { this._trigger('beforeCollapseAll'); var $optgroups = (typeof groupID === 'undefined') // groupID could be 0 ? this.$checkboxes.find('.ui-multiselect-optgroup') : this._multiselectOptgroupFilter(groupID); $optgroups.addClass('ui-multiselect-collapsed') .children('.ui-multiselect-collapser').attr('title', this.linkInfo.expand.title ).html( this.linkInfo.expand.icon ); this._trigger('collapseAll'); }, /** * Expands all option groups or just the one specified. * @param {(number|string)} groupID index or label of option group to expand. */ expandAll: function(groupID) { this._trigger('beforeExpandAll'); var $optgroups = (typeof groupID === 'undefined') // groupID could be 0 ? this.$checkboxes.find('.ui-multiselect-optgroup') : this._multiselectOptgroupFilter(groupID); $optgroups.removeClass('ui-multiselect-collapsed') .children('.ui-multiselect-collapser').attr('title', this.linkInfo.collapse.title ).html( this.linkInfo.collapse.icon ); this._trigger('expandAll'); }, /** * Flashes a message in the button caption for 1 second. * Useful for very short warning messages to the user. * @param {string} message HTML to show in the button. */ buttonMessage: function(message) { var self = this; self.$buttonlabel.html(message); setTimeout( function() { self.update(); }, 1000 ); }, /** * Provides a list of all checked options * @return {array} list of inputs */ getChecked: function() { return this.$inputs.filter(':checked'); }, /** * Provides a list of all options that are not checked * @return {array} list of inputs */ getUnchecked: function() { return this.$inputs.filter(':not(:checked)'); }, /** * Destroys the widget instance * @return {object} reference to widget */ destroy: function() { // remove classes + data $.Widget.prototype.destroy.call(this); // unbind events this.document.off(this._namespaceID); $(this.element[0].form).off(this._namespaceID); if (!this.options.listbox) { this.$button.remove(); } this.$menu.remove(); this.element.show(); return this; }, /** * @return {boolean} indicates whether the menu is open */ isOpen: function() { return this._isOpen; }, /** * @return {object} jQuery object for menu */ widget: function() { return this.$menu; }, /** * @return {string} namespaceID for use with external event handlers. */ getNamespaceID: function() { return this._namespaceID; }, /** * @return {object} jQuery object for button */ getButton: function() { return this.$button; }, /** * Essentially an alias for widget * @return {object} jQuery object for menu */ getMenu: function() { return this.$menu; }, /** * @return {array} List of the option labels */ getLabels: function() { return this.$labels; }, /** * @return {array} List of option groups that are collapsed */ getCollapsed: function() { return this.$checkboxes.find('.ui-multiselect-collapsed'); }, /** * Sets the value of the underlying select then resyncs the menu. * @param {(string|array)} newValue value(s) to set the underlying select to. * @return {any} the underlying select when a value is provied, or eles the value of the select */ value: function(newValue) { if (typeof newValue !== 'undefined') { this.element.val(newValue); this.resync(); return this.element; } else { return this.element.val(); } }, /** * Determines if HTML content is allowed for the given element type * @param {string} element to check * @return {boolean} true if html content is allowed */ htmlAllowedFor: function(element) { return this.options.htmlText.indexOf(element) > -1; }, /** * Adds an option to the widget and underlying select * @param {object} attributes hash to be added to the option * @param {string} text label for the option * @param {(number|string)} groupID index or label of option group to add the option to */ addOption: function(attributes, text, groupID) { var self = this; var textFxn = self.htmlAllowedFor('options') ? 'html' : 'text'; var $option = $( document.createElement('option') ).attr(attributes)[textFxn](text); var optionNode = $option.get(0); if (typeof groupID === 'undefined') { // groupID could be 0 self.element.append($option); self.$checkboxes.append(self._makeOption(optionNode)); } else { self._nativeOptgroupFilter(groupID).append($option); self._multiselectOptgroupFilter(groupID).append(self._makeOption(optionNode)); } self._updateCache(); }, /** * Finds an optgroup in the native select by index or label using the tag name * @param {(number|string)} groupID index or label of option group to find * @return {object} matching option groups */ _nativeOptgroupFilter: function(groupID) { return this.element.children('OPTGROUP').filter( function(index) { return (typeof groupID === 'number' ? index === groupID : this.getAttribute('label') === groupID); }); }, /** * Finds an optgroup in the multiselect widget by index or label * @param {(number|string)} groupID index or label of option group to find * @return {object} matching option groups */ _multiselectOptgroupFilter: function(groupID) { return this.$menu.find('.ui-multiselect-optgroup').filter( function(index) { return (typeof groupID === 'number' ? index === groupID : this.getElementsByClassName('ui-multiselect-grouplabel')[0].textContent === groupID); }); }, /** * Removes an option from the widget and underlying select * @param {string} value attribute corresponding to option being removed */ removeOption: function(value) { if (!value) { return; } this.element.find('option[value=' + value + ']').remove(); this.$labels.find('input[value=' + value + ']').parents('li').remove(); this._updateCache(); }, /** * Reacts to options being changed * Delegates to various handlers * @param {string} key into the options hash * @param {any} value to be assigned to that option */ _setOption: function(key, value) { var $header = this.$header; var $menu = this.$menu; switch (key) { case 'header': if (typeof value === 'boolean') { $header.toggle( value ); } else if (typeof value === 'string') { this.$headerLinkContainer.children('li:not(:last-child)').remove(); this.$headerLinkContainer.prepend('<li>' + value + '</li>'); } break; case 'checkAllText': case 'uncheckAllText': case 'flipAllText': case 'collapseAllText': case 'expandAllText': if (key !== 'checkAllText' || !this.options.maxSelected) { // eq(-1) finds the last span $header.find('a.' + this.linkInfo[key.replace('Text', '')]['class'] + ' span').eq(-1).html(value); } break; case 'checkAllIcon': case 'uncheckAllIcon': case 'flipAllIcon': case 'collapseAllIcon': case 'expandAllIcon': if (key !== 'checkAllIcon' || !this.options.maxSelected) { // eq(0) finds the first span $header.find('a.' + this.linkInfo[key.replace('Icon', '')]['class'] + ' span').eq(0).replaceWith(value); } break; case 'openIcon': $menu.find('span.ui-multiselect-open').html(value); break; case 'closeIcon': $menu.find('a.ui-multiselect-close').html(value); break; case 'buttonWidth': case 'menuWidth': this.options[key] = value; this._setButtonWidth(true); // true forces recalc of cached value. this._setMenuWidth(true); // true forces recalc of cached value. break; case 'menuHeight': this.options[key] = value; this._setMenuHeight(true); // true forces recalc of cached value. break; case 'selectedText': case 'selectedList': case 'maxSelected': case 'noneSelectedText': case 'selectedListSeparator': this.options[key] = value; // these all need to update immediately for the update() call this.update(true); break; case 'classes': $menu.add(this.$button).removeClass(this.options.classes).addClass(value); break; case 'multiple': var $element = this.element; if (!!$element[0].multiple !== value) { $menu.toggleClass('ui-multiselect-multiple', value).toggleClass('ui-multiselect-single', !value); $element[0].multiple = value; this.uncheckAll(); this.refresh(); } break; case 'position': if (value !== null && !$.isEmptyObject(value) ) { this.options.position = value; } this.position(); break; case 'zIndex': this.options.zIndex = value; this.$menu.css('z-index', value); break; default: this.options[key] = value; } $.Widget.prototype._setOption.apply(this, arguments); // eslint-disable-line prefer-rest-params }, _parse2px: parse2px, }); // Fix for jQuery UI modal dialogs // https://api.jqueryui.com/dialog/#method-_allowInteraction // https://learn.jquery.com/jquery-ui/widget-factory/extending-widgets/ if ($.ui && 'dialog' in $.ui) { $.widget( 'ui.dialog', $.ui.dialog, { _allowInteraction: function( event ) { if ( this._super( event ) || $( event.target ).closest('.ui-multiselect-menu' ).length ) { return true; } }, }); } })(jQuery); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/jquery.sparkline.js�������������������������������������������������0000664�0000000�0000000�00000361066�14136337723�0022235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * * jquery.sparkline.js * * v2.1.2 * (c) Splunk, Inc * Contact: Gareth Watts (gareth@splunk.com) * http://omnipotent.net/jquery.sparkline/ * * Generates inline sparkline charts from data supplied either to the method * or inline in HTML * * Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag * (Firefox 2.0+, Safari, Opera, etc) * * License: New BSD License * * Copyright (c) 2012, Splunk Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 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. * * Neither the name of Splunk Inc nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * Usage: * $(selector).sparkline(values, options) * * If values is undefined or set to 'html' then the data values are read from the specified tag: * <p>Sparkline: <span class="sparkline">1,4,6,6,8,5,3,5</span></p> * $('.sparkline').sparkline(); * There must be no spaces in the enclosed data set * * Otherwise values must be an array of numbers or null values * <p>Sparkline: <span id="sparkline1">This text replaced if the browser is compatible</span></p> * $('#sparkline1').sparkline([1,4,6,6,8,5,3,5]) * $('#sparkline2').sparkline([1,4,6,null,null,5,3,5]) * * Values can also be specified in an HTML comment, or as a values attribute: * <p>Sparkline: <span class="sparkline"><!--1,4,6,6,8,5,3,5 --></span></p> * <p>Sparkline: <span class="sparkline" values="1,4,6,6,8,5,3,5"></span></p> * $('.sparkline').sparkline(); * * For line charts, x values can also be specified: * <p>Sparkline: <span class="sparkline">1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5</span></p> * $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ]) * * By default, options should be passed in as teh second argument to the sparkline function: * $('.sparkline').sparkline([1,2,3,4], {type: 'bar'}) * * Options can also be set by passing them on the tag itself. This feature is disabled by default though * as there's a slight performance overhead: * $('.sparkline').sparkline([1,2,3,4], {enableTagOptions: true}) * <p>Sparkline: <span class="sparkline" sparkType="bar" sparkBarColor="red">loading</span></p> * Prefix all options supplied as tag attribute with "spark" (configurable by setting tagOptionPrefix) * * Supported options: * lineColor - Color of the line used for the chart * fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart * width - Width of the chart - Defaults to 3 times the number of values in pixels * height - Height of the chart - Defaults to the height of the containing element * chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied * chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied * chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax * chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied * chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied * composite - If true then don't erase any existing chart attached to the tag, but draw * another chart over the top - Note that width and height are ignored if an * existing chart is detected. * tagValuesAttribute - Name of tag attribute to check for data values - Defaults to 'values' * enableTagOptions - Whether to check tags for sparkline options * tagOptionPrefix - Prefix used for options supplied as tag attributes - Defaults to 'spark' * disableHiddenCheck - If set to true, then the plugin will assume that charts will never be drawn into a * hidden dom element, avoding a browser reflow * disableInteraction - If set to true then all mouseover/click interaction behaviour will be disabled, * making the plugin perform much like it did in 1.x * disableTooltips - If set to true then tooltips will be disabled - Defaults to false (tooltips enabled) * disableHighlight - If set to true then highlighting of selected chart elements on mouseover will be disabled * defaults to false (highlights enabled) * highlightLighten - Factor to lighten/darken highlighted chart values by - Defaults to 1.4 for a 40% increase * tooltipContainer - Specify which DOM element the tooltip should be rendered into - defaults to document.body * tooltipClassname - Optional CSS classname to apply to tooltips - If not specified then a default style will be applied * tooltipOffsetX - How many pixels away from the mouse pointer to render the tooltip on the X axis * tooltipOffsetY - How many pixels away from the mouse pointer to render the tooltip on the r axis * tooltipFormatter - Optional callback that allows you to override the HTML displayed in the tooltip * callback is given arguments of (sparkline, options, fields) * tooltipChartTitle - If specified then the tooltip uses the string specified by this setting as a title * tooltipFormat - A format string or SPFormat object (or an array thereof for multiple entries) * to control the format of the tooltip * tooltipPrefix - A string to prepend to each field displayed in a tooltip * tooltipSuffix - A string to append to each field displayed in a tooltip * tooltipSkipNull - If true then null values will not have a tooltip displayed (defaults to true) * tooltipValueLookups - An object or range map to map field values to tooltip strings * (eg. to map -1 to "Lost", 0 to "Draw", and 1 to "Win") * numberFormatter - Optional callback for formatting numbers in tooltips * numberDigitGroupSep - Character to use for group separator in numbers "1,234" - Defaults to "," * numberDecimalMark - Character to use for the decimal point when formatting numbers - Defaults to "." * numberDigitGroupCount - Number of digits between group separator - Defaults to 3 * * There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default), * 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box' * line - Line chart. Options: * spotColor - Set to '' to not end each line in a circular spot * minSpotColor - If set, color of spot at minimum value * maxSpotColor - If set, color of spot at maximum value * spotRadius - Radius in pixels * lineWidth - Width of line in pixels * normalRangeMin * normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal" * or expected range of values * normalRangeColor - Color to use for the above bar * drawNormalOnTop - Draw the normal range above the chart fill color if true * defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart * highlightSpotColor - The color to use for drawing a highlight spot on mouseover - Set to null to disable * highlightLineColor - The color to use for drawing a highlight line on mouseover - Set to null to disable * valueSpots - Specify which points to draw spots on, and in which color. Accepts a range map * * bar - Bar chart. Options: * barColor - Color of bars for postive values * negBarColor - Color of bars for negative values * zeroColor - Color of bars with zero values * nullColor - Color of bars with null values - Defaults to omitting the bar entirely * barWidth - Width of bars in pixels * colorMap - Optional mappnig of values to colors to override the *BarColor values above * can be an Array of values to control the color of individual bars or a range map * to specify colors for individual ranges of values * barSpacing - Gap between bars in pixels * zeroAxis - Centers the y-axis around zero if true * * tristate - Charts values of win (>0), lose (<0) or draw (=0) * posBarColor - Color of win values * negBarColor - Color of lose values * zeroBarColor - Color of draw values * barWidth - Width of bars in pixels * barSpacing - Gap between bars in pixels * colorMap - Optional mappnig of values to colors to override the *BarColor values above * can be an Array of values to control the color of individual bars or a range map * to specify colors for individual ranges of values * * discrete - Options: * lineHeight - Height of each line in pixels - Defaults to 30% of the graph height * thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor * thresholdColor * * bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ... * options: * targetColor - The color of the vertical target marker * targetWidth - The width of the target marker in pixels * performanceColor - The color of the performance measure horizontal bar * rangeColors - Colors to use for each qualitative range background color * * pie - Pie chart. Options: * sliceColors - An array of colors to use for pie slices * offset - Angle in degrees to offset the first slice - Try -90 or +90 * borderWidth - Width of border to draw around the pie chart, in pixels - Defaults to 0 (no border) * borderColor - Color to use for the pie chart border - Defaults to #000 * * box - Box plot. Options: * raw - Set to true to supply pre-computed plot points as values * values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier * When set to false you can supply any number of values and the box plot will * be computed for you. Default is false. * showOutliers - Set to true (default) to display outliers as circles * outlierIQR - Interquartile range used to determine outliers. Default 1.5 * boxLineColor - Outline color of the box * boxFillColor - Fill color for the box * whiskerColor - Line color used for whiskers * outlierLineColor - Outline color of outlier circles * outlierFillColor - Fill color of the outlier circles * spotRadius - Radius of outlier circles * medianColor - Line color of the median line * target - Draw a target cross hair at the supplied value (default undefined) * * * * Examples: * $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false }); * $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 }); * $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }): * $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' }); * $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' }); * $('#pie').sparkline([1,1,2], { type:'pie' }); */ /*jslint regexp: true, browser: true, jquery: true, white: true, nomen: false, plusplus: false, maxerr: 500, indent: 4 */ (function(document, Math, undefined) { // performance/minified-size optimization (function(factory) { if(typeof define === 'function' && define.amd) { define(['jquery'], factory); } else if (jQuery && !jQuery.fn.sparkline) { factory(jQuery); } } (function($) { 'use strict'; var UNSET_OPTION = {}, getDefaults, createClass, SPFormat, clipval, quartile, normalizeValue, normalizeValues, remove, isNumber, all, sum, addCSS, ensureArray, formatNumber, RangeMap, MouseHandler, Tooltip, barHighlightMixin, line, bar, tristate, discrete, bullet, pie, box, defaultStyles, initStyles, VShape, VCanvas_base, VCanvas_canvas, VCanvas_vml, pending, shapeCount = 0; /** * Default configuration settings */ getDefaults = function () { return { // Settings common to most/all chart types common: { type: 'line', lineColor: '#00f', fillColor: '#cdf', defaultPixelsPerValue: 3, width: 'auto', height: 'auto', composite: false, tagValuesAttribute: 'values', tagOptionsPrefix: 'spark', enableTagOptions: false, enableHighlight: true, highlightLighten: 1.4, tooltipSkipNull: true, tooltipPrefix: '', tooltipSuffix: '', disableHiddenCheck: false, numberFormatter: false, numberDigitGroupCount: 3, numberDigitGroupSep: ',', numberDecimalMark: '.', disableTooltips: false, disableInteraction: false }, // Defaults for line charts line: { spotColor: '#f80', highlightSpotColor: '#5f5', highlightLineColor: '#f22', spotRadius: 1.5, minSpotColor: '#f80', maxSpotColor: '#f80', lineWidth: 1, normalRangeMin: undefined, normalRangeMax: undefined, normalRangeColor: '#ccc', drawNormalOnTop: false, chartRangeMin: undefined, chartRangeMax: undefined, chartRangeMinX: undefined, chartRangeMaxX: undefined, tooltipFormat: new SPFormat('<span style="color: {{color}}">●</span> {{prefix}}{{y}}{{suffix}}') }, // Defaults for bar charts bar: { barColor: '#3366cc', negBarColor: '#f44', stackedBarColor: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', '#dd4477', '#0099c6', '#990099'], zeroColor: undefined, nullColor: undefined, zeroAxis: true, barWidth: 4, barSpacing: 1, chartRangeMax: undefined, chartRangeMin: undefined, chartRangeClip: false, colorMap: undefined, tooltipFormat: new SPFormat('<span style="color: {{color}}">●</span> {{prefix}}{{value}}{{suffix}}') }, // Defaults for tristate charts tristate: { barWidth: 4, barSpacing: 1, posBarColor: '#6f6', negBarColor: '#f44', zeroBarColor: '#999', colorMap: {}, tooltipFormat: new SPFormat('<span style="color: {{color}}">●</span> {{value:map}}'), tooltipValueLookups: { map: { '-1': 'Loss', '0': 'Draw', '1': 'Win' } } }, // Defaults for discrete charts discrete: { lineHeight: 'auto', thresholdColor: undefined, thresholdValue: 0, chartRangeMax: undefined, chartRangeMin: undefined, chartRangeClip: false, tooltipFormat: new SPFormat('{{prefix}}{{value}}{{suffix}}') }, // Defaults for bullet charts bullet: { targetColor: '#f33', targetWidth: 3, // width of the target bar in pixels performanceColor: '#33f', rangeColors: ['#d3dafe', '#a8b6ff', '#7f94ff'], base: undefined, // set this to a number to change the base start number tooltipFormat: new SPFormat('{{fieldkey:fields}} - {{value}}'), tooltipValueLookups: { fields: {r: 'Range', p: 'Performance', t: 'Target'} } }, // Defaults for pie charts pie: { offset: 0, sliceColors: ['#3366cc', '#dc3912', '#ff9900', '#109618', '#66aa00', '#dd4477', '#0099c6', '#990099'], borderWidth: 0, borderColor: '#000', tooltipFormat: new SPFormat('<span style="color: {{color}}">●</span> {{value}} ({{percent.1}}%)') }, // Defaults for box plots box: { raw: false, boxLineColor: '#000', boxFillColor: '#cdf', whiskerColor: '#000', outlierLineColor: '#333', outlierFillColor: '#fff', medianColor: '#f00', showOutliers: true, outlierIQR: 1.5, spotRadius: 1.5, target: undefined, targetColor: '#4a2', chartRangeMax: undefined, chartRangeMin: undefined, tooltipFormat: new SPFormat('{{field:fields}}: {{value}}'), tooltipFormatFieldlistKey: 'field', tooltipValueLookups: { fields: { lq: 'Lower Quartile', med: 'Median', uq: 'Upper Quartile', lo: 'Left Outlier', ro: 'Right Outlier', lw: 'Left Whisker', rw: 'Right Whisker'} } } }; }; // You can have tooltips use a css class other than jqstooltip by specifying tooltipClassname defaultStyles = '.jqstooltip { ' + 'position: absolute;' + 'left: 0px;' + 'top: 0px;' + 'visibility: hidden;' + 'background: rgb(0, 0, 0) transparent;' + 'background-color: rgba(0,0,0,0.6);' + 'filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000);' + '-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)";' + 'color: white;' + 'font: 10px arial, san serif;' + 'text-align: left;' + 'white-space: nowrap;' + 'padding: 5px;' + 'border: 1px solid white;' + 'z-index: 10000;' + '}' + '.jqsfield { ' + 'color: white;' + 'font: 10px arial, san serif;' + 'text-align: left;' + '}'; /** * Utilities */ createClass = function (/* [baseclass, [mixin, ...]], definition */) { var Class, args; Class = function () { this.init.apply(this, arguments); }; if (arguments.length > 1) { if (arguments[0]) { Class.prototype = $.extend(new arguments[0](), arguments[arguments.length - 1]); Class._super = arguments[0].prototype; } else { Class.prototype = arguments[arguments.length - 1]; } if (arguments.length > 2) { args = Array.prototype.slice.call(arguments, 1, -1); args.unshift(Class.prototype); $.extend.apply($, args); } } else { Class.prototype = arguments[0]; } Class.prototype.cls = Class; return Class; }; /** * Wraps a format string for tooltips * {{x}} * {{x.2} * {{x:months}} */ $.SPFormatClass = SPFormat = createClass({ fre: /\{\{([\w.]+?)(:(.+?))?\}\}/g, precre: /(\w+)\.(\d+)/, init: function (format, fclass) { this.format = format; this.fclass = fclass; }, render: function (fieldset, lookups, options) { var self = this, fields = fieldset, match, token, lookupkey, fieldvalue, prec; return this.format.replace(this.fre, function () { var lookup; token = arguments[1]; lookupkey = arguments[3]; match = self.precre.exec(token); if (match) { prec = match[2]; token = match[1]; } else { prec = false; } fieldvalue = fields[token]; if (fieldvalue === undefined) { return ''; } if (lookupkey && lookups && lookups[lookupkey]) { lookup = lookups[lookupkey]; if (lookup.get) { // RangeMap return lookups[lookupkey].get(fieldvalue) || fieldvalue; } else { return lookups[lookupkey][fieldvalue] || fieldvalue; } } if (isNumber(fieldvalue)) { if (options.get('numberFormatter')) { fieldvalue = options.get('numberFormatter')(fieldvalue); } else { fieldvalue = formatNumber(fieldvalue, prec, options.get('numberDigitGroupCount'), options.get('numberDigitGroupSep'), options.get('numberDecimalMark')); } } return fieldvalue; }); } }); // convience method to avoid needing the new operator $.spformat = function(format, fclass) { return new SPFormat(format, fclass); }; clipval = function (val, min, max) { if (val < min) { return min; } if (val > max) { return max; } return val; }; quartile = function (values, q) { var vl; if (q === 2) { vl = Math.floor(values.length / 2); return values.length % 2 ? values[vl] : (values[vl-1] + values[vl]) / 2; } else { if (values.length % 2 ) { // odd vl = (values.length * q + q) / 4; return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; } else { //even vl = (values.length * q + 2) / 4; return vl % 1 ? (values[Math.floor(vl)] + values[Math.floor(vl) - 1]) / 2 : values[vl-1]; } } }; normalizeValue = function (val) { var nf; switch (val) { case 'undefined': val = undefined; break; case 'null': val = null; break; case 'true': val = true; break; case 'false': val = false; break; default: nf = parseFloat(val); if (val == nf) { val = nf; } } return val; }; normalizeValues = function (vals) { var i, result = []; for (i = vals.length; i--;) { result[i] = normalizeValue(vals[i]); } return result; }; remove = function (vals, filter) { var i, vl, result = []; for (i = 0, vl = vals.length; i < vl; i++) { if (vals[i] !== filter) { result.push(vals[i]); } } return result; }; isNumber = function (num) { return !isNaN(parseFloat(num)) && isFinite(num); }; formatNumber = function (num, prec, groupsize, groupsep, decsep) { var p, i; num = (prec === false ? parseFloat(num).toString() : num.toFixed(prec)).split(''); p = (p = $.inArray('.', num)) < 0 ? num.length : p; if (p < num.length) { num[p] = decsep; } for (i = p - groupsize; i > 0; i -= groupsize) { num.splice(i, 0, groupsep); } return num.join(''); }; // determine if all values of an array match a value // returns true if the array is empty all = function (val, arr, ignoreNull) { var i; for (i = arr.length; i--; ) { if (ignoreNull && arr[i] === null) continue; if (arr[i] !== val) { return false; } } return true; }; // sums the numeric values in an array, ignoring other values sum = function (vals) { var total = 0, i; for (i = vals.length; i--;) { total += typeof vals[i] === 'number' ? vals[i] : 0; } return total; }; ensureArray = function (val) { return $.isArray(val) ? val : [val]; }; // http://paulirish.com/2008/bookmarklet-inject-new-css-rules/ addCSS = function(css) { var tag; //if ('\v' == 'v') /* ie only */ { if (document.createStyleSheet) { document.createStyleSheet().cssText = css; } else { tag = document.createElement('style'); tag.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(tag); tag[(typeof document.body.style.WebkitAppearance == 'string') /* webkit only */ ? 'innerText' : 'innerHTML'] = css; } }; // Provide a cross-browser interface to a few simple drawing primitives $.fn.simpledraw = function (width, height, useExisting, interact) { var target, mhandler; if (useExisting && (target = this.data('_jqs_vcanvas'))) { return target; } if ($.fn.sparkline.canvas === false) { // We've already determined that neither Canvas nor VML are available return false; } else if ($.fn.sparkline.canvas === undefined) { // No function defined yet -- need to see if we support Canvas or VML var el = document.createElement('canvas'); if (!!(el.getContext && el.getContext('2d'))) { // Canvas is available $.fn.sparkline.canvas = function(width, height, target, interact) { return new VCanvas_canvas(width, height, target, interact); }; } else if (document.namespaces && !document.namespaces.v) { // VML is available document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML'); $.fn.sparkline.canvas = function(width, height, target, interact) { return new VCanvas_vml(width, height, target); }; } else { // Neither Canvas nor VML are available $.fn.sparkline.canvas = false; return false; } } if (width === undefined) { width = $(this).innerWidth(); } if (height === undefined) { height = $(this).innerHeight(); } target = $.fn.sparkline.canvas(width, height, this, interact); mhandler = $(this).data('_jqs_mhandler'); if (mhandler) { mhandler.registerCanvas(target); } return target; }; $.fn.cleardraw = function () { var target = this.data('_jqs_vcanvas'); if (target) { target.reset(); } }; $.RangeMapClass = RangeMap = createClass({ init: function (map) { var key, range, rangelist = []; for (key in map) { if (map.hasOwnProperty(key) && typeof key === 'string' && key.indexOf(':') > -1) { range = key.split(':'); range[0] = range[0].length === 0 ? -Infinity : parseFloat(range[0]); range[1] = range[1].length === 0 ? Infinity : parseFloat(range[1]); range[2] = map[key]; rangelist.push(range); } } this.map = map; this.rangelist = rangelist || false; }, get: function (value) { var rangelist = this.rangelist, i, range, result; if ((result = this.map[value]) !== undefined) { return result; } if (rangelist) { for (i = rangelist.length; i--;) { range = rangelist[i]; if (range[0] <= value && range[1] >= value) { return range[2]; } } } return undefined; } }); // Convenience function $.range_map = function(map) { return new RangeMap(map); }; MouseHandler = createClass({ init: function (el, options) { var $el = $(el); this.$el = $el; this.options = options; this.currentPageX = 0; this.currentPageY = 0; this.el = el; this.splist = []; this.tooltip = null; this.over = false; this.displayTooltips = !options.get('disableTooltips'); this.highlightEnabled = !options.get('disableHighlight'); }, registerSparkline: function (sp) { this.splist.push(sp); if (this.over) { this.updateDisplay(); } }, registerCanvas: function (canvas) { var $canvas = $(canvas.canvas); this.canvas = canvas; this.$canvas = $canvas; $canvas.mouseenter($.proxy(this.mouseenter, this)); $canvas.mouseleave($.proxy(this.mouseleave, this)); $canvas.click($.proxy(this.mouseclick, this)); }, reset: function (removeTooltip) { this.splist = []; if (this.tooltip && removeTooltip) { this.tooltip.remove(); this.tooltip = undefined; } }, mouseclick: function (e) { var clickEvent = $.Event('sparklineClick'); clickEvent.originalEvent = e; clickEvent.sparklines = this.splist; this.$el.trigger(clickEvent); }, mouseenter: function (e) { $(document.body).unbind('mousemove.jqs'); $(document.body).bind('mousemove.jqs', $.proxy(this.mousemove, this)); this.over = true; this.currentPageX = e.pageX; this.currentPageY = e.pageY; this.currentEl = e.target; if (!this.tooltip && this.displayTooltips) { this.tooltip = new Tooltip(this.options); this.tooltip.updatePosition(e.pageX, e.pageY); } this.updateDisplay(); }, mouseleave: function () { $(document.body).unbind('mousemove.jqs'); var splist = this.splist, spcount = splist.length, needsRefresh = false, sp, i; this.over = false; this.currentEl = null; if (this.tooltip) { this.tooltip.remove(); this.tooltip = null; } for (i = 0; i < spcount; i++) { sp = splist[i]; if (sp.clearRegionHighlight()) { needsRefresh = true; } } if (needsRefresh) { this.canvas.render(); } }, mousemove: function (e) { this.currentPageX = e.pageX; this.currentPageY = e.pageY; this.currentEl = e.target; if (this.tooltip) { this.tooltip.updatePosition(e.pageX, e.pageY); } this.updateDisplay(); }, updateDisplay: function () { var splist = this.splist, spcount = splist.length, needsRefresh = false, offset = this.$canvas.offset(), localX = this.currentPageX - offset.left, localY = this.currentPageY - offset.top, tooltiphtml, sp, i, result, changeEvent; if (!this.over) { return; } for (i = 0; i < spcount; i++) { sp = splist[i]; result = sp.setRegionHighlight(this.currentEl, localX, localY); if (result) { needsRefresh = true; } } if (needsRefresh) { changeEvent = $.Event('sparklineRegionChange'); changeEvent.sparklines = this.splist; this.$el.trigger(changeEvent); if (this.tooltip) { tooltiphtml = ''; for (i = 0; i < spcount; i++) { sp = splist[i]; tooltiphtml += sp.getCurrentRegionTooltip(); } this.tooltip.setContent(tooltiphtml); } if (!this.disableHighlight) { this.canvas.render(); } } if (result === null) { this.mouseleave(); } } }); Tooltip = createClass({ sizeStyle: 'position: static !important;' + 'display: block !important;' + 'visibility: hidden !important;' + 'float: left !important;', init: function (options) { var tooltipClassname = options.get('tooltipClassname', 'jqstooltip'), sizetipStyle = this.sizeStyle, offset; this.container = options.get('tooltipContainer') || document.body; this.tooltipOffsetX = options.get('tooltipOffsetX', 10); this.tooltipOffsetY = options.get('tooltipOffsetY', 12); // remove any previous lingering tooltip $('#jqssizetip').remove(); $('#jqstooltip').remove(); this.sizetip = $('<div/>', { id: 'jqssizetip', style: sizetipStyle, 'class': tooltipClassname }); this.tooltip = $('<div/>', { id: 'jqstooltip', 'class': tooltipClassname }).appendTo(this.container); // account for the container's location offset = this.tooltip.offset(); this.offsetLeft = offset.left; this.offsetTop = offset.top; this.hidden = true; $(window).unbind('resize.jqs scroll.jqs'); $(window).bind('resize.jqs scroll.jqs', $.proxy(this.updateWindowDims, this)); this.updateWindowDims(); }, updateWindowDims: function () { this.scrollTop = $(window).scrollTop(); this.scrollLeft = $(window).scrollLeft(); this.scrollRight = this.scrollLeft + $(window).width(); this.updatePosition(); }, getSize: function (content) { this.sizetip.html(content).appendTo(this.container); this.width = this.sizetip.width() + 1; this.height = this.sizetip.height(); this.sizetip.remove(); }, setContent: function (content) { if (!content) { this.tooltip.css('visibility', 'hidden'); this.hidden = true; return; } this.getSize(content); this.tooltip.html(content) .css({ 'width': this.width, 'height': this.height, 'visibility': 'visible' }); if (this.hidden) { this.hidden = false; this.updatePosition(); } }, updatePosition: function (x, y) { if (x === undefined) { if (this.mousex === undefined) { return; } x = this.mousex - this.offsetLeft; y = this.mousey - this.offsetTop; } else { this.mousex = x = x - this.offsetLeft; this.mousey = y = y - this.offsetTop; } if (!this.height || !this.width || this.hidden) { return; } y -= this.height + this.tooltipOffsetY; x += this.tooltipOffsetX; if (y < this.scrollTop) { y = this.scrollTop; } if (x < this.scrollLeft) { x = this.scrollLeft; } else if (x + this.width > this.scrollRight) { x = this.scrollRight - this.width; } this.tooltip.css({ 'left': x, 'top': y }); }, remove: function () { this.tooltip.remove(); this.sizetip.remove(); this.sizetip = this.tooltip = undefined; $(window).unbind('resize.jqs scroll.jqs'); } }); initStyles = function() { addCSS(defaultStyles); }; $(initStyles); pending = []; $.fn.sparkline = function (userValues, userOptions) { return this.each(function () { var options = new $.fn.sparkline.options(this, userOptions), $this = $(this), render, i; render = function () { var values, width, height, tmp, mhandler, sp, vals; if (userValues === 'html' || userValues === undefined) { vals = this.getAttribute(options.get('tagValuesAttribute')); if (vals === undefined || vals === null) { vals = $this.html(); } values = vals.replace(/(^\s*<!--)|(-->\s*$)|\s+/g, '').split(','); } else { values = userValues; } width = options.get('width') === 'auto' ? values.length * options.get('defaultPixelsPerValue') : options.get('width'); if (options.get('height') === 'auto') { if (!options.get('composite') || !$.data(this, '_jqs_vcanvas')) { // must be a better way to get the line height tmp = document.createElement('span'); tmp.innerHTML = 'a'; $this.html(tmp); height = $(tmp).innerHeight() || $(tmp).height(); $(tmp).remove(); tmp = null; } } else { height = options.get('height'); } if (!options.get('disableInteraction')) { mhandler = $.data(this, '_jqs_mhandler'); if (!mhandler) { mhandler = new MouseHandler(this, options); $.data(this, '_jqs_mhandler', mhandler); } else if (!options.get('composite')) { mhandler.reset(); } } else { mhandler = false; } if (options.get('composite') && !$.data(this, '_jqs_vcanvas')) { if (!$.data(this, '_jqs_errnotify')) { alert('Attempted to attach a composite sparkline to an element with no existing sparkline'); $.data(this, '_jqs_errnotify', true); } return; } sp = new $.fn.sparkline[options.get('type')](this, values, options, width, height); sp.render(); if (mhandler) { mhandler.registerSparkline(sp); } }; if (($(this).html() && !options.get('disableHiddenCheck') && $(this).is(':hidden')) || !$(this).parents('body').length) { if (!options.get('composite') && $.data(this, '_jqs_pending')) { // remove any existing references to the element for (i = pending.length; i; i--) { if (pending[i - 1][0] == this) { pending.splice(i - 1, 1); } } } pending.push([this, render]); $.data(this, '_jqs_pending', true); } else { render.call(this); } }); }; $.fn.sparkline.defaults = getDefaults(); $.sparkline_display_visible = function () { var el, i, pl; var done = []; for (i = 0, pl = pending.length; i < pl; i++) { el = pending[i][0]; if ($(el).is(':visible') && !$(el).parents().is(':hidden')) { pending[i][1].call(el); $.data(pending[i][0], '_jqs_pending', false); done.push(i); } else if (!$(el).closest('html').length && !$.data(el, '_jqs_pending')) { // element has been inserted and removed from the DOM // If it was not yet inserted into the dom then the .data request // will return true. // removing from the dom causes the data to be removed. $.data(pending[i][0], '_jqs_pending', false); done.push(i); } } for (i = done.length; i; i--) { pending.splice(done[i - 1], 1); } }; /** * User option handler */ $.fn.sparkline.options = createClass({ init: function (tag, userOptions) { var extendedOptions, defaults, base, tagOptionType; this.userOptions = userOptions = userOptions || {}; this.tag = tag; this.tagValCache = {}; defaults = $.fn.sparkline.defaults; base = defaults.common; this.tagOptionsPrefix = userOptions.enableTagOptions && (userOptions.tagOptionsPrefix || base.tagOptionsPrefix); tagOptionType = this.getTagSetting('type'); if (tagOptionType === UNSET_OPTION) { extendedOptions = defaults[userOptions.type || base.type]; } else { extendedOptions = defaults[tagOptionType]; } this.mergedOptions = $.extend({}, base, extendedOptions, userOptions); }, getTagSetting: function (key) { var prefix = this.tagOptionsPrefix, val, i, pairs, keyval; if (prefix === false || prefix === undefined) { return UNSET_OPTION; } if (this.tagValCache.hasOwnProperty(key)) { val = this.tagValCache.key; } else { val = this.tag.getAttribute(prefix + key); if (val === undefined || val === null) { val = UNSET_OPTION; } else if (val.substr(0, 1) === '[') { val = val.substr(1, val.length - 2).split(','); for (i = val.length; i--;) { val[i] = normalizeValue(val[i].replace(/(^\s*)|(\s*$)/g, '')); } } else if (val.substr(0, 1) === '{') { pairs = val.substr(1, val.length - 2).split(','); val = {}; for (i = pairs.length; i--;) { keyval = pairs[i].split(':', 2); val[keyval[0].replace(/(^\s*)|(\s*$)/g, '')] = normalizeValue(keyval[1].replace(/(^\s*)|(\s*$)/g, '')); } } else { val = normalizeValue(val); } this.tagValCache.key = val; } return val; }, get: function (key, defaultval) { var tagOption = this.getTagSetting(key), result; if (tagOption !== UNSET_OPTION) { return tagOption; } return (result = this.mergedOptions[key]) === undefined ? defaultval : result; } }); $.fn.sparkline._base = createClass({ disabled: false, init: function (el, values, options, width, height) { this.el = el; this.$el = $(el); this.values = values; this.options = options; this.width = width; this.height = height; this.currentRegion = undefined; }, /** * Setup the canvas */ initTarget: function () { var interactive = !this.options.get('disableInteraction'); if (!(this.target = this.$el.simpledraw(this.width, this.height, this.options.get('composite'), interactive))) { this.disabled = true; } else { this.canvasWidth = this.target.pixelWidth; this.canvasHeight = this.target.pixelHeight; } }, /** * Actually render the chart to the canvas */ render: function () { if (this.disabled) { this.el.innerHTML = ''; return false; } return true; }, /** * Return a region id for a given x/y co-ordinate */ getRegion: function (x, y) { }, /** * Highlight an item based on the moused-over x,y co-ordinate */ setRegionHighlight: function (el, x, y) { var currentRegion = this.currentRegion, highlightEnabled = !this.options.get('disableHighlight'), newRegion; if (x > this.canvasWidth || y > this.canvasHeight || x < 0 || y < 0) { return null; } newRegion = this.getRegion(el, x, y); if (currentRegion !== newRegion) { if (currentRegion !== undefined && highlightEnabled) { this.removeHighlight(); } this.currentRegion = newRegion; if (newRegion !== undefined && highlightEnabled) { this.renderHighlight(); } return true; } return false; }, /** * Reset any currently highlighted item */ clearRegionHighlight: function () { if (this.currentRegion !== undefined) { this.removeHighlight(); this.currentRegion = undefined; return true; } return false; }, renderHighlight: function () { this.changeHighlight(true); }, removeHighlight: function () { this.changeHighlight(false); }, changeHighlight: function (highlight) {}, /** * Fetch the HTML to display as a tooltip */ getCurrentRegionTooltip: function () { var options = this.options, header = '', entries = [], fields, formats, formatlen, fclass, text, i, showFields, showFieldsKey, newFields, fv, formatter, format, fieldlen, j; if (this.currentRegion === undefined) { return ''; } fields = this.getCurrentRegionFields(); formatter = options.get('tooltipFormatter'); if (formatter) { return formatter(this, options, fields); } if (options.get('tooltipChartTitle')) { header += '<div class="jqs jqstitle">' + options.get('tooltipChartTitle') + '</div>\n'; } formats = this.options.get('tooltipFormat'); if (!formats) { return ''; } if (!$.isArray(formats)) { formats = [formats]; } if (!$.isArray(fields)) { fields = [fields]; } showFields = this.options.get('tooltipFormatFieldlist'); showFieldsKey = this.options.get('tooltipFormatFieldlistKey'); if (showFields && showFieldsKey) { // user-selected ordering of fields newFields = []; for (i = fields.length; i--;) { fv = fields[i][showFieldsKey]; if ((j = $.inArray(fv, showFields)) != -1) { newFields[j] = fields[i]; } } fields = newFields; } formatlen = formats.length; fieldlen = fields.length; for (i = 0; i < formatlen; i++) { format = formats[i]; if (typeof format === 'string') { format = new SPFormat(format); } fclass = format.fclass || 'jqsfield'; for (j = 0; j < fieldlen; j++) { if (!fields[j].isNull || !options.get('tooltipSkipNull')) { $.extend(fields[j], { prefix: options.get('tooltipPrefix'), suffix: options.get('tooltipSuffix') }); text = format.render(fields[j], options.get('tooltipValueLookups'), options); entries.push('<div class="' + fclass + '">' + text + '</div>'); } } } if (entries.length) { return header + entries.join('\n'); } return ''; }, getCurrentRegionFields: function () {}, calcHighlightColor: function (color, options) { var highlightColor = options.get('highlightColor'), lighten = options.get('highlightLighten'), parse, mult, rgbnew, i; if (highlightColor) { return highlightColor; } if (lighten) { // extract RGB values parse = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(color) || /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(color); if (parse) { rgbnew = []; mult = color.length === 4 ? 16 : 1; for (i = 0; i < 3; i++) { rgbnew[i] = clipval(Math.round(parseInt(parse[i + 1], 16) * mult * lighten), 0, 255); } return 'rgb(' + rgbnew.join(',') + ')'; } } return color; } }); barHighlightMixin = { changeHighlight: function (highlight) { var currentRegion = this.currentRegion, target = this.target, shapeids = this.regionShapes[currentRegion], newShapes; // will be null if the region value was null if (shapeids) { newShapes = this.renderRegion(currentRegion, highlight); if ($.isArray(newShapes) || $.isArray(shapeids)) { target.replaceWithShapes(shapeids, newShapes); this.regionShapes[currentRegion] = $.map(newShapes, function (newShape) { return newShape.id; }); } else { target.replaceWithShape(shapeids, newShapes); this.regionShapes[currentRegion] = newShapes.id; } } }, render: function () { var values = this.values, target = this.target, regionShapes = this.regionShapes, shapes, ids, i, j; if (!this.cls._super.render.call(this)) { return; } for (i = values.length; i--;) { shapes = this.renderRegion(i); if (shapes) { if ($.isArray(shapes)) { ids = []; for (j = shapes.length; j--;) { shapes[j].append(); ids.push(shapes[j].id); } regionShapes[i] = ids; } else { shapes.append(); regionShapes[i] = shapes.id; // store just the shapeid } } else { // null value regionShapes[i] = null; } } target.render(); } }; /** * Line charts */ $.fn.sparkline.line = line = createClass($.fn.sparkline._base, { type: 'line', init: function (el, values, options, width, height) { line._super.init.call(this, el, values, options, width, height); this.vertices = []; this.regionMap = []; this.xvalues = []; this.yvalues = []; this.yminmax = []; this.hightlightSpotId = null; this.lastShapeId = null; this.initTarget(); }, getRegion: function (el, x, y) { var i, regionMap = this.regionMap; // maps regions to value positions for (i = regionMap.length; i--;) { if (regionMap[i] !== null && x >= regionMap[i][0] && x <= regionMap[i][1]) { return regionMap[i][2]; } } return undefined; }, getCurrentRegionFields: function () { var currentRegion = this.currentRegion; return { isNull: this.yvalues[currentRegion] === null, x: this.xvalues[currentRegion], y: this.yvalues[currentRegion], color: this.options.get('lineColor'), fillColor: this.options.get('fillColor'), offset: currentRegion }; }, renderHighlight: function () { var currentRegion = this.currentRegion, target = this.target, vertex = this.vertices[currentRegion], options = this.options, spotRadius = options.get('spotRadius'), highlightSpotColor = options.get('highlightSpotColor'), highlightLineColor = options.get('highlightLineColor'), highlightSpot, highlightLine; if (!vertex) { return; } if (spotRadius && highlightSpotColor) { highlightSpot = target.drawCircle(vertex[0], vertex[1], spotRadius, undefined, highlightSpotColor); this.highlightSpotId = highlightSpot.id; target.insertAfterShape(this.lastShapeId, highlightSpot); } if (highlightLineColor) { highlightLine = target.drawLine(vertex[0], this.canvasTop, vertex[0], this.canvasTop + this.canvasHeight, highlightLineColor); this.highlightLineId = highlightLine.id; target.insertAfterShape(this.lastShapeId, highlightLine); } }, removeHighlight: function () { var target = this.target; if (this.highlightSpotId) { target.removeShapeId(this.highlightSpotId); this.highlightSpotId = null; } if (this.highlightLineId) { target.removeShapeId(this.highlightLineId); this.highlightLineId = null; } }, scanValues: function () { var values = this.values, valcount = values.length, xvalues = this.xvalues, yvalues = this.yvalues, yminmax = this.yminmax, i, val, isStr, isArray, sp; for (i = 0; i < valcount; i++) { val = values[i]; isStr = typeof(values[i]) === 'string'; isArray = typeof(values[i]) === 'object' && values[i] instanceof Array; sp = isStr && values[i].split(':'); if (isStr && sp.length === 2) { // x:y xvalues.push(Number(sp[0])); yvalues.push(Number(sp[1])); yminmax.push(Number(sp[1])); } else if (isArray) { xvalues.push(val[0]); yvalues.push(val[1]); yminmax.push(val[1]); } else { xvalues.push(i); if (values[i] === null || values[i] === 'null') { yvalues.push(null); } else { yvalues.push(Number(val)); yminmax.push(Number(val)); } } } if (this.options.get('xvalues')) { xvalues = this.options.get('xvalues'); } this.maxy = this.maxyorg = Math.max.apply(Math, yminmax); this.miny = this.minyorg = Math.min.apply(Math, yminmax); this.maxx = Math.max.apply(Math, xvalues); this.minx = Math.min.apply(Math, xvalues); this.xvalues = xvalues; this.yvalues = yvalues; this.yminmax = yminmax; }, processRangeOptions: function () { var options = this.options, normalRangeMin = options.get('normalRangeMin'), normalRangeMax = options.get('normalRangeMax'); if (normalRangeMin !== undefined) { if (normalRangeMin < this.miny) { this.miny = normalRangeMin; } if (normalRangeMax > this.maxy) { this.maxy = normalRangeMax; } } if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.miny)) { this.miny = options.get('chartRangeMin'); } if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.maxy)) { this.maxy = options.get('chartRangeMax'); } if (options.get('chartRangeMinX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMinX') < this.minx)) { this.minx = options.get('chartRangeMinX'); } if (options.get('chartRangeMaxX') !== undefined && (options.get('chartRangeClipX') || options.get('chartRangeMaxX') > this.maxx)) { this.maxx = options.get('chartRangeMaxX'); } }, drawNormalRange: function (canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey) { var normalRangeMin = this.options.get('normalRangeMin'), normalRangeMax = this.options.get('normalRangeMax'), ytop = canvasTop + Math.round(canvasHeight - (canvasHeight * ((normalRangeMax - this.miny) / rangey))), height = Math.round((canvasHeight * (normalRangeMax - normalRangeMin)) / rangey); this.target.drawRect(canvasLeft, ytop, canvasWidth, height, undefined, this.options.get('normalRangeColor')).append(); }, render: function () { var options = this.options, target = this.target, canvasWidth = this.canvasWidth, canvasHeight = this.canvasHeight, vertices = this.vertices, spotRadius = options.get('spotRadius'), regionMap = this.regionMap, rangex, rangey, yvallast, canvasTop, canvasLeft, vertex, path, paths, x, y, xnext, xpos, xposnext, last, next, yvalcount, lineShapes, fillShapes, plen, valueSpots, hlSpotsEnabled, color, xvalues, yvalues, i; if (!line._super.render.call(this)) { return; } this.scanValues(); this.processRangeOptions(); xvalues = this.xvalues; yvalues = this.yvalues; if (!this.yminmax.length || this.yvalues.length < 2) { // empty or all null valuess return; } canvasTop = canvasLeft = 0; rangex = this.maxx - this.minx === 0 ? 1 : this.maxx - this.minx; rangey = this.maxy - this.miny === 0 ? 1 : this.maxy - this.miny; yvallast = this.yvalues.length - 1; if (spotRadius && (canvasWidth < (spotRadius * 4) || canvasHeight < (spotRadius * 4))) { spotRadius = 0; } if (spotRadius) { // adjust the canvas size as required so that spots will fit hlSpotsEnabled = options.get('highlightSpotColor') && !options.get('disableInteraction'); if (hlSpotsEnabled || options.get('minSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.miny)) { canvasHeight -= Math.ceil(spotRadius); } if (hlSpotsEnabled || options.get('maxSpotColor') || (options.get('spotColor') && yvalues[yvallast] === this.maxy)) { canvasHeight -= Math.ceil(spotRadius); canvasTop += Math.ceil(spotRadius); } if (hlSpotsEnabled || ((options.get('minSpotColor') || options.get('maxSpotColor')) && (yvalues[0] === this.miny || yvalues[0] === this.maxy))) { canvasLeft += Math.ceil(spotRadius); canvasWidth -= Math.ceil(spotRadius); } if (hlSpotsEnabled || options.get('spotColor') || (options.get('minSpotColor') || options.get('maxSpotColor') && (yvalues[yvallast] === this.miny || yvalues[yvallast] === this.maxy))) { canvasWidth -= Math.ceil(spotRadius); } } canvasHeight--; if (options.get('normalRangeMin') !== undefined && !options.get('drawNormalOnTop')) { this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); } path = []; paths = [path]; last = next = null; yvalcount = yvalues.length; for (i = 0; i < yvalcount; i++) { x = xvalues[i]; xnext = xvalues[i + 1]; y = yvalues[i]; xpos = canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)); xposnext = i < yvalcount - 1 ? canvasLeft + Math.round((xnext - this.minx) * (canvasWidth / rangex)) : canvasWidth; next = xpos + ((xposnext - xpos) / 2); regionMap[i] = [last || 0, next, i]; last = next; if (y === null) { if (i) { if (yvalues[i - 1] !== null) { path = []; paths.push(path); } vertices.push(null); } } else { if (y < this.miny) { y = this.miny; } if (y > this.maxy) { y = this.maxy; } if (!path.length) { // previous value was null path.push([xpos, canvasTop + canvasHeight]); } vertex = [xpos, canvasTop + Math.round(canvasHeight - (canvasHeight * ((y - this.miny) / rangey)))]; path.push(vertex); vertices.push(vertex); } } lineShapes = []; fillShapes = []; plen = paths.length; for (i = 0; i < plen; i++) { path = paths[i]; if (path.length) { if (options.get('fillColor')) { path.push([path[path.length - 1][0], (canvasTop + canvasHeight)]); fillShapes.push(path.slice(0)); path.pop(); } // if there's only a single point in this path, then we want to display it // as a vertical line which means we keep path[0] as is if (path.length > 2) { // else we want the first value path[0] = [path[0][0], path[1][1]]; } lineShapes.push(path); } } // draw the fill first, then optionally the normal range, then the line on top of that plen = fillShapes.length; for (i = 0; i < plen; i++) { target.drawShape(fillShapes[i], options.get('fillColor'), options.get('fillColor')).append(); } if (options.get('normalRangeMin') !== undefined && options.get('drawNormalOnTop')) { this.drawNormalRange(canvasLeft, canvasTop, canvasHeight, canvasWidth, rangey); } plen = lineShapes.length; for (i = 0; i < plen; i++) { target.drawShape(lineShapes[i], options.get('lineColor'), undefined, options.get('lineWidth')).append(); } if (spotRadius && options.get('valueSpots')) { valueSpots = options.get('valueSpots'); if (valueSpots.get === undefined) { valueSpots = new RangeMap(valueSpots); } for (i = 0; i < yvalcount; i++) { color = valueSpots.get(yvalues[i]); if (color) { target.drawCircle(canvasLeft + Math.round((xvalues[i] - this.minx) * (canvasWidth / rangex)), canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[i] - this.miny) / rangey))), spotRadius, undefined, color).append(); } } } if (spotRadius && options.get('spotColor') && yvalues[yvallast] !== null) { target.drawCircle(canvasLeft + Math.round((xvalues[xvalues.length - 1] - this.minx) * (canvasWidth / rangex)), canvasTop + Math.round(canvasHeight - (canvasHeight * ((yvalues[yvallast] - this.miny) / rangey))), spotRadius, undefined, options.get('spotColor')).append(); } if (this.maxy !== this.minyorg) { if (spotRadius && options.get('minSpotColor')) { x = xvalues[$.inArray(this.minyorg, yvalues)]; target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.minyorg - this.miny) / rangey))), spotRadius, undefined, options.get('minSpotColor')).append(); } if (spotRadius && options.get('maxSpotColor')) { x = xvalues[$.inArray(this.maxyorg, yvalues)]; target.drawCircle(canvasLeft + Math.round((x - this.minx) * (canvasWidth / rangex)), canvasTop + Math.round(canvasHeight - (canvasHeight * ((this.maxyorg - this.miny) / rangey))), spotRadius, undefined, options.get('maxSpotColor')).append(); } } this.lastShapeId = target.getLastShapeId(); this.canvasTop = canvasTop; target.render(); } }); /** * Bar charts */ $.fn.sparkline.bar = bar = createClass($.fn.sparkline._base, barHighlightMixin, { type: 'bar', init: function (el, values, options, width, height) { var barWidth = parseInt(options.get('barWidth'), 10), barSpacing = parseInt(options.get('barSpacing'), 10), chartRangeMin = options.get('chartRangeMin'), chartRangeMax = options.get('chartRangeMax'), chartRangeClip = options.get('chartRangeClip'), stackMin = Infinity, stackMax = -Infinity, isStackString, groupMin, groupMax, stackRanges, numValues, i, vlen, range, zeroAxis, xaxisOffset, min, max, clipMin, clipMax, stacked, vlist, j, slen, svals, val, yoffset, yMaxCalc, canvasHeightEf; bar._super.init.call(this, el, values, options, width, height); // scan values to determine whether to stack bars for (i = 0, vlen = values.length; i < vlen; i++) { val = values[i]; isStackString = typeof(val) === 'string' && val.indexOf(':') > -1; if (isStackString || $.isArray(val)) { stacked = true; if (isStackString) { val = values[i] = normalizeValues(val.split(':')); } val = remove(val, null); // min/max will treat null as zero groupMin = Math.min.apply(Math, val); groupMax = Math.max.apply(Math, val); if (groupMin < stackMin) { stackMin = groupMin; } if (groupMax > stackMax) { stackMax = groupMax; } } } this.stacked = stacked; this.regionShapes = {}; this.barWidth = barWidth; this.barSpacing = barSpacing; this.totalBarWidth = barWidth + barSpacing; this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); this.initTarget(); if (chartRangeClip) { clipMin = chartRangeMin === undefined ? -Infinity : chartRangeMin; clipMax = chartRangeMax === undefined ? Infinity : chartRangeMax; } numValues = []; stackRanges = stacked ? [] : numValues; var stackTotals = []; var stackRangesNeg = []; for (i = 0, vlen = values.length; i < vlen; i++) { if (stacked) { vlist = values[i]; values[i] = svals = []; stackTotals[i] = 0; stackRanges[i] = stackRangesNeg[i] = 0; for (j = 0, slen = vlist.length; j < slen; j++) { val = svals[j] = chartRangeClip ? clipval(vlist[j], clipMin, clipMax) : vlist[j]; if (val !== null) { if (val > 0) { stackTotals[i] += val; } if (stackMin < 0 && stackMax > 0) { if (val < 0) { stackRangesNeg[i] += Math.abs(val); } else { stackRanges[i] += val; } } else { stackRanges[i] += Math.abs(val - (val < 0 ? stackMax : stackMin)); } numValues.push(val); } } } else { val = chartRangeClip ? clipval(values[i], clipMin, clipMax) : values[i]; val = values[i] = normalizeValue(val); if (val !== null) { numValues.push(val); } } } this.max = max = Math.max.apply(Math, numValues); this.min = min = Math.min.apply(Math, numValues); this.stackMax = stackMax = stacked ? Math.max.apply(Math, stackTotals) : max; this.stackMin = stackMin = stacked ? Math.min.apply(Math, numValues) : min; if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < min)) { min = options.get('chartRangeMin'); } if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > max)) { max = options.get('chartRangeMax'); } this.zeroAxis = zeroAxis = options.get('zeroAxis', true); if (min <= 0 && max >= 0 && zeroAxis) { xaxisOffset = 0; } else if (zeroAxis == false) { xaxisOffset = min; } else if (min > 0) { xaxisOffset = min; } else { xaxisOffset = max; } this.xaxisOffset = xaxisOffset; range = stacked ? (Math.max.apply(Math, stackRanges) + Math.max.apply(Math, stackRangesNeg)) : max - min; // as we plot zero/min values a single pixel line, we add a pixel to all other // values - Reduce the effective canvas size to suit this.canvasHeightEf = (zeroAxis && min < 0) ? this.canvasHeight - 2 : this.canvasHeight - 1; if (min < xaxisOffset) { yMaxCalc = (stacked && max >= 0) ? stackMax : max; yoffset = (yMaxCalc - xaxisOffset) / range * this.canvasHeight; if (yoffset !== Math.ceil(yoffset)) { this.canvasHeightEf -= 2; yoffset = Math.ceil(yoffset); } } else { yoffset = this.canvasHeight; } this.yoffset = yoffset; if ($.isArray(options.get('colorMap'))) { this.colorMapByIndex = options.get('colorMap'); this.colorMapByValue = null; } else { this.colorMapByIndex = null; this.colorMapByValue = options.get('colorMap'); if (this.colorMapByValue && this.colorMapByValue.get === undefined) { this.colorMapByValue = new RangeMap(this.colorMapByValue); } } this.range = range; }, getRegion: function (el, x, y) { var result = Math.floor(x / this.totalBarWidth); return (result < 0 || result >= this.values.length) ? undefined : result; }, getCurrentRegionFields: function () { var currentRegion = this.currentRegion, values = ensureArray(this.values[currentRegion]), result = [], value, i; for (i = values.length; i--;) { value = values[i]; result.push({ isNull: value === null, value: value, color: this.calcColor(i, value, currentRegion), offset: currentRegion }); } return result; }, calcColor: function (stacknum, value, valuenum) { var colorMapByIndex = this.colorMapByIndex, colorMapByValue = this.colorMapByValue, options = this.options, color, newColor; if (this.stacked) { color = options.get('stackedBarColor'); } else { color = (value < 0) ? options.get('negBarColor') : options.get('barColor'); } if (value === 0 && options.get('zeroColor') !== undefined) { color = options.get('zeroColor'); } if (colorMapByValue && (newColor = colorMapByValue.get(value))) { color = newColor; } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { color = colorMapByIndex[valuenum]; } return $.isArray(color) ? color[stacknum % color.length] : color; }, /** * Render bar(s) for a region */ renderRegion: function (valuenum, highlight) { var vals = this.values[valuenum], options = this.options, xaxisOffset = this.xaxisOffset, result = [], range = this.range, stacked = this.stacked, target = this.target, x = valuenum * this.totalBarWidth, canvasHeightEf = this.canvasHeightEf, yoffset = this.yoffset, y, height, color, isNull, yoffsetNeg, i, valcount, val, minPlotted, allMin; vals = $.isArray(vals) ? vals : [vals]; valcount = vals.length; val = vals[0]; isNull = all(null, vals); allMin = all(xaxisOffset, vals, true); if (isNull) { if (options.get('nullColor')) { color = highlight ? options.get('nullColor') : this.calcHighlightColor(options.get('nullColor'), options); y = (yoffset > 0) ? yoffset - 1 : yoffset; return target.drawRect(x, y, this.barWidth - 1, 0, color, color); } else { return undefined; } } yoffsetNeg = yoffset; for (i = 0; i < valcount; i++) { val = vals[i]; if (stacked && val === xaxisOffset) { if (!allMin || minPlotted) { continue; } minPlotted = true; } if (range > 0) { height = Math.floor(canvasHeightEf * ((Math.abs(val - xaxisOffset) / range))) + 1; } else { height = 1; } if (val < xaxisOffset || (val === xaxisOffset && yoffset === 0)) { y = yoffsetNeg; yoffsetNeg += height; } else { y = yoffset - height; yoffset -= height; } color = this.calcColor(i, val, valuenum); if (highlight) { color = this.calcHighlightColor(color, options); } result.push(target.drawRect(x, y, this.barWidth - 1, height - 1, color, color)); } if (result.length === 1) { return result[0]; } return result; } }); /** * Tristate charts */ $.fn.sparkline.tristate = tristate = createClass($.fn.sparkline._base, barHighlightMixin, { type: 'tristate', init: function (el, values, options, width, height) { var barWidth = parseInt(options.get('barWidth'), 10), barSpacing = parseInt(options.get('barSpacing'), 10); tristate._super.init.call(this, el, values, options, width, height); this.regionShapes = {}; this.barWidth = barWidth; this.barSpacing = barSpacing; this.totalBarWidth = barWidth + barSpacing; this.values = $.map(values, Number); this.width = width = (values.length * barWidth) + ((values.length - 1) * barSpacing); if ($.isArray(options.get('colorMap'))) { this.colorMapByIndex = options.get('colorMap'); this.colorMapByValue = null; } else { this.colorMapByIndex = null; this.colorMapByValue = options.get('colorMap'); if (this.colorMapByValue && this.colorMapByValue.get === undefined) { this.colorMapByValue = new RangeMap(this.colorMapByValue); } } this.initTarget(); }, getRegion: function (el, x, y) { return Math.floor(x / this.totalBarWidth); }, getCurrentRegionFields: function () { var currentRegion = this.currentRegion; return { isNull: this.values[currentRegion] === undefined, value: this.values[currentRegion], color: this.calcColor(this.values[currentRegion], currentRegion), offset: currentRegion }; }, calcColor: function (value, valuenum) { var values = this.values, options = this.options, colorMapByIndex = this.colorMapByIndex, colorMapByValue = this.colorMapByValue, color, newColor; if (colorMapByValue && (newColor = colorMapByValue.get(value))) { color = newColor; } else if (colorMapByIndex && colorMapByIndex.length > valuenum) { color = colorMapByIndex[valuenum]; } else if (values[valuenum] < 0) { color = options.get('negBarColor'); } else if (values[valuenum] > 0) { color = options.get('posBarColor'); } else { color = options.get('zeroBarColor'); } return color; }, renderRegion: function (valuenum, highlight) { var values = this.values, options = this.options, target = this.target, canvasHeight, height, halfHeight, x, y, color; canvasHeight = target.pixelHeight; halfHeight = Math.round(canvasHeight / 2); x = valuenum * this.totalBarWidth; if (values[valuenum] < 0) { y = halfHeight; height = halfHeight - 1; } else if (values[valuenum] > 0) { y = 0; height = halfHeight - 1; } else { y = halfHeight - 1; height = 2; } color = this.calcColor(values[valuenum], valuenum); if (color === null) { return; } if (highlight) { color = this.calcHighlightColor(color, options); } return target.drawRect(x, y, this.barWidth - 1, height - 1, color, color); } }); /** * Discrete charts */ $.fn.sparkline.discrete = discrete = createClass($.fn.sparkline._base, barHighlightMixin, { type: 'discrete', init: function (el, values, options, width, height) { discrete._super.init.call(this, el, values, options, width, height); this.regionShapes = {}; this.values = values = $.map(values, Number); this.min = Math.min.apply(Math, values); this.max = Math.max.apply(Math, values); this.range = this.max - this.min; this.width = width = options.get('width') === 'auto' ? values.length * 2 : this.width; this.interval = Math.floor(width / values.length); this.itemWidth = width / values.length; if (options.get('chartRangeMin') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMin') < this.min)) { this.min = options.get('chartRangeMin'); } if (options.get('chartRangeMax') !== undefined && (options.get('chartRangeClip') || options.get('chartRangeMax') > this.max)) { this.max = options.get('chartRangeMax'); } this.initTarget(); if (this.target) { this.lineHeight = options.get('lineHeight') === 'auto' ? Math.round(this.canvasHeight * 0.3) : options.get('lineHeight'); } }, getRegion: function (el, x, y) { return Math.floor(x / this.itemWidth); }, getCurrentRegionFields: function () { var currentRegion = this.currentRegion; return { isNull: this.values[currentRegion] === undefined, value: this.values[currentRegion], offset: currentRegion }; }, renderRegion: function (valuenum, highlight) { var values = this.values, options = this.options, min = this.min, max = this.max, range = this.range, interval = this.interval, target = this.target, canvasHeight = this.canvasHeight, lineHeight = this.lineHeight, pheight = canvasHeight - lineHeight, ytop, val, color, x; val = clipval(values[valuenum], min, max); x = valuenum * interval; ytop = Math.round(pheight - pheight * ((val - min) / range)); color = (options.get('thresholdColor') && val < options.get('thresholdValue')) ? options.get('thresholdColor') : options.get('lineColor'); if (highlight) { color = this.calcHighlightColor(color, options); } return target.drawLine(x, ytop, x, ytop + lineHeight, color); } }); /** * Bullet charts */ $.fn.sparkline.bullet = bullet = createClass($.fn.sparkline._base, { type: 'bullet', init: function (el, values, options, width, height) { var min, max, vals; bullet._super.init.call(this, el, values, options, width, height); // values: target, performance, range1, range2, range3 this.values = values = normalizeValues(values); // target or performance could be null vals = values.slice(); vals[0] = vals[0] === null ? vals[2] : vals[0]; vals[1] = values[1] === null ? vals[2] : vals[1]; min = Math.min.apply(Math, values); max = Math.max.apply(Math, values); if (options.get('base') === undefined) { min = min < 0 ? min : 0; } else { min = options.get('base'); } this.min = min; this.max = max; this.range = max - min; this.shapes = {}; this.valueShapes = {}; this.regiondata = {}; this.width = width = options.get('width') === 'auto' ? '4.0em' : width; this.target = this.$el.simpledraw(width, height, options.get('composite')); if (!values.length) { this.disabled = true; } this.initTarget(); }, getRegion: function (el, x, y) { var shapeid = this.target.getShapeAt(el, x, y); return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; }, getCurrentRegionFields: function () { var currentRegion = this.currentRegion; return { fieldkey: currentRegion.substr(0, 1), value: this.values[currentRegion.substr(1)], region: currentRegion }; }, changeHighlight: function (highlight) { var currentRegion = this.currentRegion, shapeid = this.valueShapes[currentRegion], shape; delete this.shapes[shapeid]; switch (currentRegion.substr(0, 1)) { case 'r': shape = this.renderRange(currentRegion.substr(1), highlight); break; case 'p': shape = this.renderPerformance(highlight); break; case 't': shape = this.renderTarget(highlight); break; } this.valueShapes[currentRegion] = shape.id; this.shapes[shape.id] = currentRegion; this.target.replaceWithShape(shapeid, shape); }, renderRange: function (rn, highlight) { var rangeval = this.values[rn], rangewidth = Math.round(this.canvasWidth * ((rangeval - this.min) / this.range)), color = this.options.get('rangeColors')[rn - 2]; if (highlight) { color = this.calcHighlightColor(color, this.options); } return this.target.drawRect(0, 0, rangewidth - 1, this.canvasHeight - 1, color, color); }, renderPerformance: function (highlight) { var perfval = this.values[1], perfwidth = Math.round(this.canvasWidth * ((perfval - this.min) / this.range)), color = this.options.get('performanceColor'); if (highlight) { color = this.calcHighlightColor(color, this.options); } return this.target.drawRect(0, Math.round(this.canvasHeight * 0.3), perfwidth - 1, Math.round(this.canvasHeight * 0.4) - 1, color, color); }, renderTarget: function (highlight) { var targetval = this.values[0], x = Math.round(this.canvasWidth * ((targetval - this.min) / this.range) - (this.options.get('targetWidth') / 2)), targettop = Math.round(this.canvasHeight * 0.10), targetheight = this.canvasHeight - (targettop * 2), color = this.options.get('targetColor'); if (highlight) { color = this.calcHighlightColor(color, this.options); } return this.target.drawRect(x, targettop, this.options.get('targetWidth') - 1, targetheight - 1, color, color); }, render: function () { var vlen = this.values.length, target = this.target, i, shape; if (!bullet._super.render.call(this)) { return; } for (i = 2; i < vlen; i++) { shape = this.renderRange(i).append(); this.shapes[shape.id] = 'r' + i; this.valueShapes['r' + i] = shape.id; } if (this.values[1] !== null) { shape = this.renderPerformance().append(); this.shapes[shape.id] = 'p1'; this.valueShapes.p1 = shape.id; } if (this.values[0] !== null) { shape = this.renderTarget().append(); this.shapes[shape.id] = 't0'; this.valueShapes.t0 = shape.id; } target.render(); } }); /** * Pie charts */ $.fn.sparkline.pie = pie = createClass($.fn.sparkline._base, { type: 'pie', init: function (el, values, options, width, height) { var total = 0, i; pie._super.init.call(this, el, values, options, width, height); this.shapes = {}; // map shape ids to value offsets this.valueShapes = {}; // maps value offsets to shape ids this.values = values = $.map(values, Number); if (options.get('width') === 'auto') { this.width = this.height; } if (values.length > 0) { for (i = values.length; i--;) { total += values[i]; } } this.total = total; this.initTarget(); this.radius = Math.floor(Math.min(this.canvasWidth, this.canvasHeight) / 2); }, getRegion: function (el, x, y) { var shapeid = this.target.getShapeAt(el, x, y); return (shapeid !== undefined && this.shapes[shapeid] !== undefined) ? this.shapes[shapeid] : undefined; }, getCurrentRegionFields: function () { var currentRegion = this.currentRegion; return { isNull: this.values[currentRegion] === undefined, value: this.values[currentRegion], percent: this.values[currentRegion] / this.total * 100, color: this.options.get('sliceColors')[currentRegion % this.options.get('sliceColors').length], offset: currentRegion }; }, changeHighlight: function (highlight) { var currentRegion = this.currentRegion, newslice = this.renderSlice(currentRegion, highlight), shapeid = this.valueShapes[currentRegion]; delete this.shapes[shapeid]; this.target.replaceWithShape(shapeid, newslice); this.valueShapes[currentRegion] = newslice.id; this.shapes[newslice.id] = currentRegion; }, renderSlice: function (valuenum, highlight) { var target = this.target, options = this.options, radius = this.radius, borderWidth = options.get('borderWidth'), offset = options.get('offset'), circle = 2 * Math.PI, values = this.values, total = this.total, next = offset ? (2*Math.PI)*(offset/360) : 0, start, end, i, vlen, color; vlen = values.length; for (i = 0; i < vlen; i++) { start = next; end = next; if (total > 0) { // avoid divide by zero end = next + (circle * (values[i] / total)); } if (valuenum === i) { color = options.get('sliceColors')[i % options.get('sliceColors').length]; if (highlight) { color = this.calcHighlightColor(color, options); } return target.drawPieSlice(radius, radius, radius - borderWidth, start, end, undefined, color); } next = end; } }, render: function () { var target = this.target, values = this.values, options = this.options, radius = this.radius, borderWidth = options.get('borderWidth'), shape, i; if (!pie._super.render.call(this)) { return; } if (borderWidth) { target.drawCircle(radius, radius, Math.floor(radius - (borderWidth / 2)), options.get('borderColor'), undefined, borderWidth).append(); } for (i = values.length; i--;) { if (values[i]) { // don't render zero values shape = this.renderSlice(i).append(); this.valueShapes[i] = shape.id; // store just the shapeid this.shapes[shape.id] = i; } } target.render(); } }); /** * Box plots */ $.fn.sparkline.box = box = createClass($.fn.sparkline._base, { type: 'box', init: function (el, values, options, width, height) { box._super.init.call(this, el, values, options, width, height); this.values = $.map(values, Number); this.width = options.get('width') === 'auto' ? '4.0em' : width; this.initTarget(); if (!this.values.length) { this.disabled = 1; } }, /** * Simulate a single region */ getRegion: function () { return 1; }, getCurrentRegionFields: function () { var result = [ { field: 'lq', value: this.quartiles[0] }, { field: 'med', value: this.quartiles[1] }, { field: 'uq', value: this.quartiles[2] } ]; if (this.loutlier !== undefined) { result.push({ field: 'lo', value: this.loutlier}); } if (this.routlier !== undefined) { result.push({ field: 'ro', value: this.routlier}); } if (this.lwhisker !== undefined) { result.push({ field: 'lw', value: this.lwhisker}); } if (this.rwhisker !== undefined) { result.push({ field: 'rw', value: this.rwhisker}); } return result; }, render: function () { var target = this.target, values = this.values, vlen = values.length, options = this.options, canvasWidth = this.canvasWidth, canvasHeight = this.canvasHeight, minValue = options.get('chartRangeMin') === undefined ? Math.min.apply(Math, values) : options.get('chartRangeMin'), maxValue = options.get('chartRangeMax') === undefined ? Math.max.apply(Math, values) : options.get('chartRangeMax'), canvasLeft = 0, lwhisker, loutlier, iqr, q1, q2, q3, rwhisker, routlier, i, size, unitSize; if (!box._super.render.call(this)) { return; } if (options.get('raw')) { if (options.get('showOutliers') && values.length > 5) { loutlier = values[0]; lwhisker = values[1]; q1 = values[2]; q2 = values[3]; q3 = values[4]; rwhisker = values[5]; routlier = values[6]; } else { lwhisker = values[0]; q1 = values[1]; q2 = values[2]; q3 = values[3]; rwhisker = values[4]; } } else { values.sort(function (a, b) { return a - b; }); q1 = quartile(values, 1); q2 = quartile(values, 2); q3 = quartile(values, 3); iqr = q3 - q1; if (options.get('showOutliers')) { lwhisker = rwhisker = undefined; for (i = 0; i < vlen; i++) { if (lwhisker === undefined && values[i] > q1 - (iqr * options.get('outlierIQR'))) { lwhisker = values[i]; } if (values[i] < q3 + (iqr * options.get('outlierIQR'))) { rwhisker = values[i]; } } loutlier = values[0]; routlier = values[vlen - 1]; } else { lwhisker = values[0]; rwhisker = values[vlen - 1]; } } this.quartiles = [q1, q2, q3]; this.lwhisker = lwhisker; this.rwhisker = rwhisker; this.loutlier = loutlier; this.routlier = routlier; unitSize = canvasWidth / (maxValue - minValue + 1); if (options.get('showOutliers')) { canvasLeft = Math.ceil(options.get('spotRadius')); canvasWidth -= 2 * Math.ceil(options.get('spotRadius')); unitSize = canvasWidth / (maxValue - minValue + 1); if (loutlier < lwhisker) { target.drawCircle((loutlier - minValue) * unitSize + canvasLeft, canvasHeight / 2, options.get('spotRadius'), options.get('outlierLineColor'), options.get('outlierFillColor')).append(); } if (routlier > rwhisker) { target.drawCircle((routlier - minValue) * unitSize + canvasLeft, canvasHeight / 2, options.get('spotRadius'), options.get('outlierLineColor'), options.get('outlierFillColor')).append(); } } // box target.drawRect( Math.round((q1 - minValue) * unitSize + canvasLeft), Math.round(canvasHeight * 0.1), Math.round((q3 - q1) * unitSize), Math.round(canvasHeight * 0.8), options.get('boxLineColor'), options.get('boxFillColor')).append(); // left whisker target.drawLine( Math.round((lwhisker - minValue) * unitSize + canvasLeft), Math.round(canvasHeight / 2), Math.round((q1 - minValue) * unitSize + canvasLeft), Math.round(canvasHeight / 2), options.get('lineColor')).append(); target.drawLine( Math.round((lwhisker - minValue) * unitSize + canvasLeft), Math.round(canvasHeight / 4), Math.round((lwhisker - minValue) * unitSize + canvasLeft), Math.round(canvasHeight - canvasHeight / 4), options.get('whiskerColor')).append(); // right whisker target.drawLine(Math.round((rwhisker - minValue) * unitSize + canvasLeft), Math.round(canvasHeight / 2), Math.round((q3 - minValue) * unitSize + canvasLeft), Math.round(canvasHeight / 2), options.get('lineColor')).append(); target.drawLine( Math.round((rwhisker - minValue) * unitSize + canvasLeft), Math.round(canvasHeight / 4), Math.round((rwhisker - minValue) * unitSize + canvasLeft), Math.round(canvasHeight - canvasHeight / 4), options.get('whiskerColor')).append(); // median line target.drawLine( Math.round((q2 - minValue) * unitSize + canvasLeft), Math.round(canvasHeight * 0.1), Math.round((q2 - minValue) * unitSize + canvasLeft), Math.round(canvasHeight * 0.9), options.get('medianColor')).append(); if (options.get('target')) { size = Math.ceil(options.get('spotRadius')); target.drawLine( Math.round((options.get('target') - minValue) * unitSize + canvasLeft), Math.round((canvasHeight / 2) - size), Math.round((options.get('target') - minValue) * unitSize + canvasLeft), Math.round((canvasHeight / 2) + size), options.get('targetColor')).append(); target.drawLine( Math.round((options.get('target') - minValue) * unitSize + canvasLeft - size), Math.round(canvasHeight / 2), Math.round((options.get('target') - minValue) * unitSize + canvasLeft + size), Math.round(canvasHeight / 2), options.get('targetColor')).append(); } target.render(); } }); // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier // This is accessible as $(foo).simpledraw() VShape = createClass({ init: function (target, id, type, args) { this.target = target; this.id = id; this.type = type; this.args = args; }, append: function () { this.target.appendShape(this); return this; } }); VCanvas_base = createClass({ _pxregex: /(\d+)(px)?\s*$/i, init: function (width, height, target) { if (!width) { return; } this.width = width; this.height = height; this.target = target; this.lastShapeId = null; if (target[0]) { target = target[0]; } $.data(target, '_jqs_vcanvas', this); }, drawLine: function (x1, y1, x2, y2, lineColor, lineWidth) { return this.drawShape([[x1, y1], [x2, y2]], lineColor, lineWidth); }, drawShape: function (path, lineColor, fillColor, lineWidth) { return this._genShape('Shape', [path, lineColor, fillColor, lineWidth]); }, drawCircle: function (x, y, radius, lineColor, fillColor, lineWidth) { return this._genShape('Circle', [x, y, radius, lineColor, fillColor, lineWidth]); }, drawPieSlice: function (x, y, radius, startAngle, endAngle, lineColor, fillColor) { return this._genShape('PieSlice', [x, y, radius, startAngle, endAngle, lineColor, fillColor]); }, drawRect: function (x, y, width, height, lineColor, fillColor) { return this._genShape('Rect', [x, y, width, height, lineColor, fillColor]); }, getElement: function () { return this.canvas; }, /** * Return the most recently inserted shape id */ getLastShapeId: function () { return this.lastShapeId; }, /** * Clear and reset the canvas */ reset: function () { alert('reset not implemented'); }, _insert: function (el, target) { $(target).html(el); }, /** * Calculate the pixel dimensions of the canvas */ _calculatePixelDims: function (width, height, canvas) { // XXX This should probably be a configurable option var match; match = this._pxregex.exec(height); if (match) { this.pixelHeight = match[1]; } else { this.pixelHeight = $(canvas).height(); } match = this._pxregex.exec(width); if (match) { this.pixelWidth = match[1]; } else { this.pixelWidth = $(canvas).width(); } }, /** * Generate a shape object and id for later rendering */ _genShape: function (shapetype, shapeargs) { var id = shapeCount++; shapeargs.unshift(id); return new VShape(this, id, shapetype, shapeargs); }, /** * Add a shape to the end of the render queue */ appendShape: function (shape) { alert('appendShape not implemented'); }, /** * Replace one shape with another */ replaceWithShape: function (shapeid, shape) { alert('replaceWithShape not implemented'); }, /** * Insert one shape after another in the render queue */ insertAfterShape: function (shapeid, shape) { alert('insertAfterShape not implemented'); }, /** * Remove a shape from the queue */ removeShapeId: function (shapeid) { alert('removeShapeId not implemented'); }, /** * Find a shape at the specified x/y co-ordinates */ getShapeAt: function (el, x, y) { alert('getShapeAt not implemented'); }, /** * Render all queued shapes onto the canvas */ render: function () { alert('render not implemented'); } }); VCanvas_canvas = createClass(VCanvas_base, { init: function (width, height, target, interact) { VCanvas_canvas._super.init.call(this, width, height, target); this.canvas = document.createElement('canvas'); if (target[0]) { target = target[0]; } $.data(target, '_jqs_vcanvas', this); $(this.canvas).css({ display: 'inline-block', width: width, height: height, verticalAlign: 'top' }); this._insert(this.canvas, target); this._calculatePixelDims(width, height, this.canvas); this.canvas.width = this.pixelWidth; this.canvas.height = this.pixelHeight; this.interact = interact; this.shapes = {}; this.shapeseq = []; this.currentTargetShapeId = undefined; $(this.canvas).css({width: this.pixelWidth, height: this.pixelHeight}); }, _getContext: function (lineColor, fillColor, lineWidth) { var context = this.canvas.getContext('2d'); if (lineColor !== undefined) { context.strokeStyle = lineColor; } context.lineWidth = lineWidth === undefined ? 1 : lineWidth; if (fillColor !== undefined) { context.fillStyle = fillColor; } return context; }, reset: function () { var context = this._getContext(); context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); this.shapes = {}; this.shapeseq = []; this.currentTargetShapeId = undefined; }, _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { var context = this._getContext(lineColor, fillColor, lineWidth), i, plen; context.beginPath(); context.moveTo(path[0][0] + 0.5, path[0][1] + 0.5); for (i = 1, plen = path.length; i < plen; i++) { context.lineTo(path[i][0] + 0.5, path[i][1] + 0.5); // the 0.5 offset gives us crisp pixel-width lines } if (lineColor !== undefined) { context.stroke(); } if (fillColor !== undefined) { context.fill(); } if (this.targetX !== undefined && this.targetY !== undefined && context.isPointInPath(this.targetX, this.targetY)) { this.currentTargetShapeId = shapeid; } }, _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { var context = this._getContext(lineColor, fillColor, lineWidth); context.beginPath(); context.arc(x, y, radius, 0, 2 * Math.PI, false); if (this.targetX !== undefined && this.targetY !== undefined && context.isPointInPath(this.targetX, this.targetY)) { this.currentTargetShapeId = shapeid; } if (lineColor !== undefined) { context.stroke(); } if (fillColor !== undefined) { context.fill(); } }, _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { var context = this._getContext(lineColor, fillColor); context.beginPath(); context.moveTo(x, y); context.arc(x, y, radius, startAngle, endAngle, false); context.lineTo(x, y); context.closePath(); if (lineColor !== undefined) { context.stroke(); } if (fillColor) { context.fill(); } if (this.targetX !== undefined && this.targetY !== undefined && context.isPointInPath(this.targetX, this.targetY)) { this.currentTargetShapeId = shapeid; } }, _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { return this._drawShape(shapeid, [[x, y], [x + width, y], [x + width, y + height], [x, y + height], [x, y]], lineColor, fillColor); }, appendShape: function (shape) { this.shapes[shape.id] = shape; this.shapeseq.push(shape.id); this.lastShapeId = shape.id; return shape.id; }, replaceWithShape: function (shapeid, shape) { var shapeseq = this.shapeseq, i; this.shapes[shape.id] = shape; for (i = shapeseq.length; i--;) { if (shapeseq[i] == shapeid) { shapeseq[i] = shape.id; } } delete this.shapes[shapeid]; }, replaceWithShapes: function (shapeids, shapes) { var shapeseq = this.shapeseq, shapemap = {}, sid, i, first; for (i = shapeids.length; i--;) { shapemap[shapeids[i]] = true; } for (i = shapeseq.length; i--;) { sid = shapeseq[i]; if (shapemap[sid]) { shapeseq.splice(i, 1); delete this.shapes[sid]; first = i; } } for (i = shapes.length; i--;) { shapeseq.splice(first, 0, shapes[i].id); this.shapes[shapes[i].id] = shapes[i]; } }, insertAfterShape: function (shapeid, shape) { var shapeseq = this.shapeseq, i; for (i = shapeseq.length; i--;) { if (shapeseq[i] === shapeid) { shapeseq.splice(i + 1, 0, shape.id); this.shapes[shape.id] = shape; return; } } }, removeShapeId: function (shapeid) { var shapeseq = this.shapeseq, i; for (i = shapeseq.length; i--;) { if (shapeseq[i] === shapeid) { shapeseq.splice(i, 1); break; } } delete this.shapes[shapeid]; }, getShapeAt: function (el, x, y) { this.targetX = x; this.targetY = y; this.render(); return this.currentTargetShapeId; }, render: function () { var shapeseq = this.shapeseq, shapes = this.shapes, shapeCount = shapeseq.length, context = this._getContext(), shapeid, shape, i; context.clearRect(0, 0, this.pixelWidth, this.pixelHeight); for (i = 0; i < shapeCount; i++) { shapeid = shapeseq[i]; shape = shapes[shapeid]; this['_draw' + shape.type].apply(this, shape.args); } if (!this.interact) { // not interactive so no need to keep the shapes array this.shapes = {}; this.shapeseq = []; } } }); VCanvas_vml = createClass(VCanvas_base, { init: function (width, height, target) { var groupel; VCanvas_vml._super.init.call(this, width, height, target); if (target[0]) { target = target[0]; } $.data(target, '_jqs_vcanvas', this); this.canvas = document.createElement('span'); $(this.canvas).css({ display: 'inline-block', position: 'relative', overflow: 'hidden', width: width, height: height, margin: '0px', padding: '0px', verticalAlign: 'top'}); this._insert(this.canvas, target); this._calculatePixelDims(width, height, this.canvas); this.canvas.width = this.pixelWidth; this.canvas.height = this.pixelHeight; groupel = '<v:group coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '"' + ' style="position:absolute;top:0;left:0;width:' + this.pixelWidth + 'px;height=' + this.pixelHeight + 'px;"></v:group>'; this.canvas.insertAdjacentHTML('beforeEnd', groupel); this.group = $(this.canvas).children()[0]; this.rendered = false; this.prerender = ''; }, _drawShape: function (shapeid, path, lineColor, fillColor, lineWidth) { var vpath = [], initial, stroke, fill, closed, vel, plen, i; for (i = 0, plen = path.length; i < plen; i++) { vpath[i] = '' + (path[i][0]) + ',' + (path[i][1]); } initial = vpath.splice(0, 1); lineWidth = lineWidth === undefined ? 1 : lineWidth; stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; closed = vpath[0] === vpath[vpath.length - 1] ? 'x ' : ''; vel = '<v:shape coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '" ' + ' id="jqsshape' + shapeid + '" ' + stroke + fill + ' style="position:absolute;left:0px;top:0px;height:' + this.pixelHeight + 'px;width:' + this.pixelWidth + 'px;padding:0px;margin:0px;" ' + ' path="m ' + initial + ' l ' + vpath.join(', ') + ' ' + closed + 'e">' + ' </v:shape>'; return vel; }, _drawCircle: function (shapeid, x, y, radius, lineColor, fillColor, lineWidth) { var stroke, fill, vel; x -= radius; y -= radius; stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="' + lineWidth + 'px" strokeColor="' + lineColor + '" '; fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; vel = '<v:oval ' + ' id="jqsshape' + shapeid + '" ' + stroke + fill + ' style="position:absolute;top:' + y + 'px; left:' + x + 'px; width:' + (radius * 2) + 'px; height:' + (radius * 2) + 'px"></v:oval>'; return vel; }, _drawPieSlice: function (shapeid, x, y, radius, startAngle, endAngle, lineColor, fillColor) { var vpath, startx, starty, endx, endy, stroke, fill, vel; if (startAngle === endAngle) { return ''; // VML seems to have problem when start angle equals end angle. } if ((endAngle - startAngle) === (2 * Math.PI)) { startAngle = 0.0; // VML seems to have a problem when drawing a full circle that doesn't start 0 endAngle = (2 * Math.PI); } startx = x + Math.round(Math.cos(startAngle) * radius); starty = y + Math.round(Math.sin(startAngle) * radius); endx = x + Math.round(Math.cos(endAngle) * radius); endy = y + Math.round(Math.sin(endAngle) * radius); if (startx === endx && starty === endy) { if ((endAngle - startAngle) < Math.PI) { // Prevent very small slices from being mistaken as a whole pie return ''; } // essentially going to be the entire circle, so ignore startAngle startx = endx = x + radius; starty = endy = y; } if (startx === endx && starty === endy && (endAngle - startAngle) < Math.PI) { return ''; } vpath = [x - radius, y - radius, x + radius, y + radius, startx, starty, endx, endy]; stroke = lineColor === undefined ? ' stroked="false" ' : ' strokeWeight="1px" strokeColor="' + lineColor + '" '; fill = fillColor === undefined ? ' filled="false"' : ' fillColor="' + fillColor + '" filled="true" '; vel = '<v:shape coordorigin="0 0" coordsize="' + this.pixelWidth + ' ' + this.pixelHeight + '" ' + ' id="jqsshape' + shapeid + '" ' + stroke + fill + ' style="position:absolute;left:0px;top:0px;height:' + this.pixelHeight + 'px;width:' + this.pixelWidth + 'px;padding:0px;margin:0px;" ' + ' path="m ' + x + ',' + y + ' wa ' + vpath.join(', ') + ' x e">' + ' </v:shape>'; return vel; }, _drawRect: function (shapeid, x, y, width, height, lineColor, fillColor) { return this._drawShape(shapeid, [[x, y], [x, y + height], [x + width, y + height], [x + width, y], [x, y]], lineColor, fillColor); }, reset: function () { this.group.innerHTML = ''; }, appendShape: function (shape) { var vel = this['_draw' + shape.type].apply(this, shape.args); if (this.rendered) { this.group.insertAdjacentHTML('beforeEnd', vel); } else { this.prerender += vel; } this.lastShapeId = shape.id; return shape.id; }, replaceWithShape: function (shapeid, shape) { var existing = $('#jqsshape' + shapeid), vel = this['_draw' + shape.type].apply(this, shape.args); existing[0].outerHTML = vel; }, replaceWithShapes: function (shapeids, shapes) { // replace the first shapeid with all the new shapes then toast the remaining old shapes var existing = $('#jqsshape' + shapeids[0]), replace = '', slen = shapes.length, i; for (i = 0; i < slen; i++) { replace += this['_draw' + shapes[i].type].apply(this, shapes[i].args); } existing[0].outerHTML = replace; for (i = 1; i < shapeids.length; i++) { $('#jqsshape' + shapeids[i]).remove(); } }, insertAfterShape: function (shapeid, shape) { var existing = $('#jqsshape' + shapeid), vel = this['_draw' + shape.type].apply(this, shape.args); existing[0].insertAdjacentHTML('afterEnd', vel); }, removeShapeId: function (shapeid) { var existing = $('#jqsshape' + shapeid); this.group.removeChild(existing[0]); }, getShapeAt: function (el, x, y) { var shapeid = el.id.substr(8); return shapeid; }, render: function () { if (!this.rendered) { // batch the intial render into a single repaint this.group.innerHTML = this.prerender; this.rendered = true; } } }); }))}(document, Math)); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/jquery.tablednd.js��������������������������������������������������0000664�0000000�0000000�00000067676�14136337723�0022034�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * TableDnD plug-in for JQuery, allows you to drag and drop table rows * You can set up various options to control how the system will work * Copyright (c) Denis Howlett <denish@isocra.com> * Licensed like jQuery, see http://docs.jquery.com/License. * * Configuration options: * * onDragStyle * This is the style that is assigned to the row during drag. There are limitations to the styles that can be * associated with a row (such as you can't assign a border--well you can, but it won't be * displayed). (So instead consider using onDragClass.) The CSS style to apply is specified as * a map (as used in the jQuery css(...) function). * onDropStyle * This is the style that is assigned to the row when it is dropped. As for onDragStyle, there are limitations * to what you can do. Also this replaces the original style, so again consider using onDragClass which * is simply added and then removed on drop. * onDragClass * This class is added for the duration of the drag and then removed when the row is dropped. It is more * flexible than using onDragStyle since it can be inherited by the row cells and other content. The default * is class is tDnD_whileDrag. So to use the default, simply customise this CSS class in your * stylesheet. * onDrop * Pass a function that will be called when the row is dropped. The function takes 2 parameters: the table * and the row that was dropped. You can work out the new order of the rows by using * table.rows. * onDragStart * Pass a function that will be called when the user starts dragging. The function takes 2 parameters: the * table and the row which the user has started to drag. * onDragStop * Pass a function that will be called when the user stops dragging regardless of if the rows have been * rearranged. The function takes 2 parameters: the table and the row which the user was dragging. * onAllowDrop * Pass a function that will be called as a row is over another row. If the function returns true, allow * dropping on that row, otherwise not. The function takes 2 parameters: the dragged row and the row under * the cursor. It returns a boolean: true allows the drop, false doesn't allow it. * scrollAmount * This is the number of pixels to scroll if the user moves the mouse cursor to the top or bottom of the * window. The page should automatically scroll up or down as appropriate (tested in IE6, IE7, Safari, FF2, * FF3 beta * dragHandle * This is a jQuery mach string for one or more cells in each row that is draggable. If you * specify this, then you are responsible for setting cursor: move in the CSS and only these cells * will have the drag behaviour. If you do not specify a dragHandle, then you get the old behaviour where * the whole row is draggable. * * Other ways to control behaviour: * * Add class="nodrop" to any rows for which you don't want to allow dropping, and class="nodrag" to any rows * that you don't want to be draggable. * * Inside the onDrop method you can also call $.tableDnD.serialize() this returns a string of the form * <tableID>[]=<rowID1>&<tableID>[]=<rowID2> so that you can send this back to the server. The table must have * an ID as must all the rows. * * Other methods: * * $("...").tableDnDUpdate() * Will update all the matching tables, that is it will reapply the mousedown method to the rows (or handle cells). * This is useful if you have updated the table rows using Ajax and you want to make the table draggable again. * The table maintains the original configuration (so you don't have to specify it again). * * $("...").tableDnDSerialize() * Will serialize and return the serialized string as above, but for each of the matching tables--so it can be * called from anywhere and isn't dependent on the currentTable being set up correctly before calling * * Known problems: * - Auto-scoll has some problems with IE7 (it scrolls even when it shouldn't), work-around: set scrollAmount to 0 * * Version 0.2: 2008-02-20 First public version * Version 0.3: 2008-02-07 Added onDragStart option * Made the scroll amount configurable (default is 5 as before) * Version 0.4: 2008-03-15 Changed the noDrag/noDrop attributes to nodrag/nodrop classes * Added onAllowDrop to control dropping * Fixed a bug which meant that you couldn't set the scroll amount in both directions * Added serialize method * Version 0.5: 2008-05-16 Changed so that if you specify a dragHandle class it doesn't make the whole row * draggable * Improved the serialize method to use a default (and settable) regular expression. * Added tableDnDupate() and tableDnDSerialize() to be called when you are outside the table * Version 0.6: 2011-12-02 Added support for touch devices * Version 0.7 2012-04-09 Now works with jQuery 1.7 and supports touch, tidied up tabs and spaces */ !function ($, window, document, undefined) { // Determine if this is a touch device var hasTouch = 'ontouchstart' in document.documentElement, startEvent = 'touchstart mousedown', moveEvent = 'touchmove mousemove', endEvent = 'touchend mouseup'; $(document).ready(function () { function parseStyle(css) { var objMap = {}, parts = css.match(/([^;:]+)/g) || []; while (parts.length) objMap[parts.shift()] = parts.shift().trim(); return objMap; } $('table').each(function () { if ($(this).data('table') == 'dnd') { $(this).tableDnD({ onDragStyle: $(this).data('ondragstyle') && parseStyle($(this).data('ondragstyle')) || null, onDropStyle: $(this).data('ondropstyle') && parseStyle($(this).data('ondropstyle')) || null, onDragClass: $(this).data('ondragclass') == undefined && "tDnD_whileDrag" || $(this).data('ondragclass'), onDrop: $(this).data('ondrop') && new Function('table', 'row', $(this).data('ondrop')), // 'return eval("'+$(this).data('ondrop')+'");') || null, onDragStart: $(this).data('ondragstart') && new Function('table', 'row' ,$(this).data('ondragstart')), // 'return eval("'+$(this).data('ondragstart')+'");') || null, onDragStop: $(this).data('ondragstop') && new Function('table', 'row' ,$(this).data('ondragstop')), scrollAmount: $(this).data('scrollamount') || 5, sensitivity: $(this).data('sensitivity') || 10, hierarchyLevel: $(this).data('hierarchylevel') || 0, indentArtifact: $(this).data('indentartifact') || '<div class="indent"> </div>', autoWidthAdjust: $(this).data('autowidthadjust') || true, autoCleanRelations: $(this).data('autocleanrelations') || true, jsonPretifySeparator: $(this).data('jsonpretifyseparator') || '\t', serializeRegexp: $(this).data('serializeregexp') && new RegExp($(this).data('serializeregexp')) || /[^\-]*$/, serializeParamName: $(this).data('serializeparamname') || false, dragHandle: $(this).data('draghandle') || null }); } }); }); jQuery.tableDnD = { /** Keep hold of the current table being dragged */ currentTable: null, /** Keep hold of the current drag object if any */ dragObject: null, /** The current mouse offset */ mouseOffset: null, /** Remember the old value of X and Y so that we don't do too much processing */ oldX: 0, oldY: 0, /** Actually build the structure */ build: function(options) { // Set up the defaults if any this.each(function() { // This is bound to each matching table, set up the defaults and override with user options this.tableDnDConfig = $.extend({ onDragStyle: null, onDropStyle: null, // Add in the default class for whileDragging onDragClass: "tDnD_whileDrag", onDrop: null, onDragStart: null, onDragStop: null, scrollAmount: 5, /** Sensitivity setting will throttle the trigger rate for movement detection */ sensitivity: 10, /** Hierarchy level to support parent child. 0 switches this functionality off */ hierarchyLevel: 0, /** The html artifact to prepend the first cell with as indentation */ indentArtifact: '<div class="indent"> </div>', /** Automatically adjust width of first cell */ autoWidthAdjust: true, /** Automatic clean-up to ensure relationship integrity */ autoCleanRelations: true, /** Specify a number (4) as number of spaces or any indent string for JSON.stringify */ jsonPretifySeparator: '\t', /** The regular expression to use to trim row IDs */ serializeRegexp: /[^\-]*$/, /** If you want to specify another parameter name instead of the table ID */ serializeParamName: false, /** If you give the name of a class here, then only Cells with this class will be draggable */ dragHandle: null }, options || {}); // Now make the rows draggable $.tableDnD.makeDraggable(this); // Prepare hierarchy support this.tableDnDConfig.hierarchyLevel && $.tableDnD.makeIndented(this); }); // Don't break the chain return this; }, makeIndented: function (table) { var config = table.tableDnDConfig, rows = table.rows, firstCell = $(rows).first().find('td:first')[0], indentLevel = 0, cellWidth = 0, longestCell, tableStyle; if ($(table).hasClass('indtd')) return null; tableStyle = $(table).addClass('indtd').attr('style'); $(table).css({whiteSpace: "nowrap"}); for (var w = 0; w < rows.length; w++) { if (cellWidth < $(rows[w]).find('td:first').text().length) { cellWidth = $(rows[w]).find('td:first').text().length; longestCell = w; } } $(firstCell).css({width: 'auto'}); for (w = 0; w < config.hierarchyLevel; w++) $(rows[longestCell]).find('td:first').prepend(config.indentArtifact); firstCell && $(firstCell).css({width: firstCell.offsetWidth}); tableStyle && $(table).css(tableStyle); for (w = 0; w < config.hierarchyLevel; w++) $(rows[longestCell]).find('td:first').children(':first').remove(); config.hierarchyLevel && $(rows).each(function () { indentLevel = $(this).data('level') || 0; indentLevel <= config.hierarchyLevel && $(this).data('level', indentLevel) || $(this).data('level', 0); for (var i = 0; i < $(this).data('level'); i++) $(this).find('td:first').prepend(config.indentArtifact); }); return this; }, /** This function makes all the rows on the table draggable apart from those marked as "NoDrag" */ makeDraggable: function(table) { var config = table.tableDnDConfig; config.dragHandle // We only need to add the event to the specified cells && $(config.dragHandle, table).each(function() { // The cell is bound to "this" $(this).bind(startEvent, function(e) { $.tableDnD.initialiseDrag($(this).parents('tr')[0], table, this, e, config); return false; }); }) // For backwards compatibility, we add the event to the whole row // get all the rows as a wrapped set || $(table.rows).each(function() { // Iterate through each row, the row is bound to "this" if (! $(this).hasClass("nodrag")) { $(this).bind(startEvent, function(e) { if (e.target.tagName == "TD") { $.tableDnD.initialiseDrag(this, table, this, e, config); return false; } }).css("cursor", "move"); // Store the tableDnD object } else { $(this).css("cursor", ""); // Remove the cursor if we don't have the nodrag class } }); }, currentOrder: function() { var rows = this.currentTable.rows; return $.map(rows, function (val) { return ($(val).data('level') + val.id).replace(/\s/g, ''); }).join(''); }, initialiseDrag: function(dragObject, table, target, e, config) { this.dragObject = dragObject; this.currentTable = table; this.mouseOffset = this.getMouseOffset(target, e); this.originalOrder = this.currentOrder(); // Now we need to capture the mouse up and mouse move event // We can use bind so that we don't interfere with other event handlers $(document) .bind(moveEvent, this.mousemove) .bind(endEvent, this.mouseup); // Call the onDragStart method if there is one config.onDragStart && config.onDragStart(table, target); }, updateTables: function() { this.each(function() { // this is now bound to each matching table if (this.tableDnDConfig) $.tableDnD.makeDraggable(this); }); }, /** Get the mouse coordinates from the event (allowing for browser differences) */ mouseCoords: function(e) { if (e.originalEvent.changedTouches) return { x: e.originalEvent.changedTouches[0].clientX, y: e.originalEvent.changedTouches[0].clientY }; if(e.pageX || e.pageY) return { x: e.pageX, y: e.pageY }; return { x: e.clientX + document.body.scrollLeft - document.body.clientLeft, y: e.clientY + document.body.scrollTop - document.body.clientTop }; }, /** Given a target element and a mouse eent, get the mouse offset from that element. To do this we need the element's position and the mouse position */ getMouseOffset: function(target, e) { var mousePos, docPos; e = e || window.event; docPos = this.getPosition(target); mousePos = this.mouseCoords(e); return { x: mousePos.x - docPos.x, y: mousePos.y - docPos.y }; }, /** Get the position of an element by going up the DOM tree and adding up all the offsets */ getPosition: function(element) { var left = 0, top = 0; // Safari fix -- thanks to Luis Chato for this! // Safari 2 doesn't correctly grab the offsetTop of a table row // this is detailed here: // http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/ // the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild. // note that firefox will return a text node as a first child, so designing a more thorough // solution may need to take that into account, for now this seems to work in firefox, safari, ie if (element.offsetHeight == 0) element = element.firstChild; // a table cell while (element.offsetParent) { left += element.offsetLeft; top += element.offsetTop; element = element.offsetParent; } left += element.offsetLeft; top += element.offsetTop; return { x: left, y: top }; }, autoScroll: function (mousePos) { var config = this.currentTable.tableDnDConfig, yOffset = window.pageYOffset, windowHeight = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight; // Windows version // yOffset=document.body.scrollTop; if (document.all) if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') yOffset = document.documentElement.scrollTop; else if (typeof document.body != 'undefined') yOffset = document.body.scrollTop; mousePos.y - yOffset < config.scrollAmount && window.scrollBy(0, - config.scrollAmount) || windowHeight - (mousePos.y - yOffset) < config.scrollAmount && window.scrollBy(0, config.scrollAmount); }, moveVerticle: function (moving, currentRow) { if (0 != moving.vertical // If we're over a row then move the dragged row to there so that the user sees the // effect dynamically && currentRow && this.dragObject != currentRow && this.dragObject.parentNode == currentRow.parentNode) 0 > moving.vertical && this.dragObject.parentNode.insertBefore(this.dragObject, currentRow.nextSibling) || 0 < moving.vertical && this.dragObject.parentNode.insertBefore(this.dragObject, currentRow); }, moveHorizontal: function (moving, currentRow) { var config = this.currentTable.tableDnDConfig, currentLevel; if (!config.hierarchyLevel || 0 == moving.horizontal // We only care if moving left or right on the current row || !currentRow || this.dragObject != currentRow) return null; currentLevel = $(currentRow).data('level'); 0 < moving.horizontal && currentLevel > 0 && $(currentRow).find('td:first').children(':first').remove() && $(currentRow).data('level', --currentLevel); 0 > moving.horizontal && currentLevel < config.hierarchyLevel && $(currentRow).prev().data('level') >= currentLevel && $(currentRow).children(':first').prepend(config.indentArtifact) && $(currentRow).data('level', ++currentLevel); }, mousemove: function(e) { var dragObj = $($.tableDnD.dragObject), config = $.tableDnD.currentTable.tableDnDConfig, currentRow, mousePos, moving, x, y; e && e.preventDefault(); if (!$.tableDnD.dragObject) return false; // prevent touch device screen scrolling e.type == 'touchmove' && event.preventDefault(); // TODO verify this is event and not really e // update the style to show we're dragging config.onDragClass && dragObj.addClass(config.onDragClass) || dragObj.css(config.onDragStyle); mousePos = $.tableDnD.mouseCoords(e); x = mousePos.x - $.tableDnD.mouseOffset.x; y = mousePos.y - $.tableDnD.mouseOffset.y; // auto scroll the window $.tableDnD.autoScroll(mousePos); currentRow = $.tableDnD.findDropTargetRow(dragObj, y); moving = $.tableDnD.findDragDirection(x, y); $.tableDnD.moveVerticle(moving, currentRow); $.tableDnD.moveHorizontal(moving, currentRow); return false; }, findDragDirection: function (x,y) { var sensitivity = this.currentTable.tableDnDConfig.sensitivity, oldX = this.oldX, oldY = this.oldY, xMin = oldX - sensitivity, xMax = oldX + sensitivity, yMin = oldY - sensitivity, yMax = oldY + sensitivity, moving = { horizontal: x >= xMin && x <= xMax ? 0 : x > oldX ? -1 : 1, vertical : y >= yMin && y <= yMax ? 0 : y > oldY ? -1 : 1 }; // update the old value if (moving.horizontal != 0) this.oldX = x; if (moving.vertical != 0) this.oldY = y; return moving; }, /** We're only worried about the y position really, because we can only move rows up and down */ findDropTargetRow: function(draggedRow, y) { var rowHeight = 0, rows = this.currentTable.rows, config = this.currentTable.tableDnDConfig, rowY = 0, row = null; for (var i = 0; i < rows.length; i++) { row = rows[i]; rowY = this.getPosition(row).y; rowHeight = parseInt(row.offsetHeight) / 2; if (row.offsetHeight == 0) { rowY = this.getPosition(row.firstChild).y; rowHeight = parseInt(row.firstChild.offsetHeight) / 2; } // Because we always have to insert before, we need to offset the height a bit if (y > (rowY - rowHeight) && y < (rowY + rowHeight)) // that's the row we're over // If it's the same as the current row, ignore it if (draggedRow.is(row) || (config.onAllowDrop && !config.onAllowDrop(draggedRow, row)) // If a row has nodrop class, then don't allow dropping (inspired by John Tarr and Famic) || $(row).hasClass("nodrop")) return null; else return row; } return null; }, processMouseup: function() { if (!this.currentTable || !this.dragObject) return null; var config = this.currentTable.tableDnDConfig, droppedRow = this.dragObject, parentLevel = 0, myLevel = 0; // Unbind the event handlers $(document) .unbind(moveEvent, this.mousemove) .unbind(endEvent, this.mouseup); config.hierarchyLevel && config.autoCleanRelations && $(this.currentTable.rows).first().find('td:first').children().each(function () { myLevel = $(this).parents('tr:first').data('level'); myLevel && $(this).parents('tr:first').data('level', --myLevel) && $(this).remove(); }) && config.hierarchyLevel > 1 && $(this.currentTable.rows).each(function () { myLevel = $(this).data('level'); if (myLevel > 1) { parentLevel = $(this).prev().data('level'); while (myLevel > parentLevel + 1) { $(this).find('td:first').children(':first').remove(); $(this).data('level', --myLevel); } } }); // If we have a dragObject, then we need to release it, // The row will already have been moved to the right place so we just reset stuff config.onDragClass && $(droppedRow).removeClass(config.onDragClass) || $(droppedRow).css(config.onDropStyle); this.dragObject = null; // Call the onDrop method if there is one config.onDrop && this.originalOrder != this.currentOrder() && $(droppedRow).hide().fadeIn('fast') && config.onDrop(this.currentTable, droppedRow); // Call the onDragStop method if there is one config.onDragStop && config.onDragStop(this.currentTable, droppedRow); this.currentTable = null; // let go of the table too }, mouseup: function(e) { e && e.preventDefault(); $.tableDnD.processMouseup(); return false; }, jsonize: function(pretify) { var table = this.currentTable; if (pretify) return JSON.stringify( this.tableData(table), null, table.tableDnDConfig.jsonPretifySeparator ); return JSON.stringify(this.tableData(table)); }, serialize: function() { return $.param(this.tableData(this.currentTable)); }, serializeTable: function(table) { var result = ""; var paramName = table.tableDnDConfig.serializeParamName || table.id; var rows = table.rows; for (var i=0; i<rows.length; i++) { if (result.length > 0) result += "&"; var rowId = rows[i].id; if (rowId && table.tableDnDConfig && table.tableDnDConfig.serializeRegexp) { rowId = rowId.match(table.tableDnDConfig.serializeRegexp)[0]; result += paramName + '[]=' + rowId; } } return result; }, serializeTables: function() { var result = []; $('table').each(function() { this.id && result.push($.param($.tableDnD.tableData(this))); }); return result.join('&'); }, tableData: function (table) { var config = table.tableDnDConfig, previousIDs = [], currentLevel = 0, indentLevel = 0, rowID = null, data = {}, getSerializeRegexp, paramName, currentID, rows; if (!table) table = this.currentTable; if (!table || !table.rows || !table.rows.length) return {error: { code: 500, message: "Not a valid table."}}; if (!table.id && !config.serializeParamName) return {error: { code: 500, message: "No serializable unique id provided."}}; rows = config.autoCleanRelations && table.rows || $.makeArray(table.rows); paramName = config.serializeParamName || table.id; currentID = paramName; getSerializeRegexp = function (rowId) { if (rowId && config && config.serializeRegexp) return rowId.match(config.serializeRegexp)[0]; return rowId; }; data[currentID] = []; !config.autoCleanRelations && $(rows[0]).data('level') && rows.unshift({id: 'undefined'}); for (var i=0; i < rows.length; i++) { if (config.hierarchyLevel) { indentLevel = $(rows[i]).data('level') || 0; if (indentLevel == 0) { currentID = paramName; previousIDs = []; } else if (indentLevel > currentLevel) { previousIDs.push([currentID, currentLevel]); currentID = getSerializeRegexp(rows[i-1].id); } else if (indentLevel < currentLevel) { for (var h = 0; h < previousIDs.length; h++) { if (previousIDs[h][1] == indentLevel) currentID = previousIDs[h][0]; if (previousIDs[h][1] >= currentLevel) previousIDs[h][1] = 0; } } currentLevel = indentLevel; if (!$.isArray(data[currentID])) data[currentID] = []; rowID = getSerializeRegexp(rows[i].id); rowID && data[currentID].push(rowID); } else { rowID = getSerializeRegexp(rows[i].id); rowID && data[currentID].push(rowID); } } return data; } }; jQuery.fn.extend( { tableDnD : $.tableDnD.build, tableDnDUpdate : $.tableDnD.updateTables, tableDnDSerialize : $.proxy($.tableDnD.serialize, $.tableDnD), tableDnDSerializeAll : $.tableDnD.serializeTables, tableDnDData : $.proxy($.tableDnD.tableData, $.tableDnD) } ); }(jQuery, window, window.document); ������������������������������������������������������������������cacti-release-1.2.19/include/js/jquery.zoom.js������������������������������������������������������0000664�0000000�0000000�00000145431�14136337723�0021225�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* +-------------------------------------------------------------------------+ | Copyright (C) 2004-2021 The Cacti Group | | | | 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. | +-------------------------------------------------------------------------+ | Cacti: The Complete RRDtool-based Graphing Solution | +-------------------------------------------------------------------------+ | This code is designed, written, and maintained by the Cacti Group. See | | about.php and/or the AUTHORS file for specific developer information. | +-------------------------------------------------------------------------+ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ /* requirements: jQuery 1.7.x or above jQuery UI 1.8.x or above jQuery cookie plugin */ (function($){ $.fn.zoom = function(options) { storage=Storages.localStorage; /* +++++++++++++++++++++++ Global Variables +++++++++++++++++++++++++ */ // JS calculates in relation to the localization of the client - we have to take care of that, but only for 0.8.8 var clientTime = new Date(); var clientTimeOffset = clientTime.getTimezoneOffset()*60*(-1); //requires -1, because PHP return the opposite var timeOffset = 0; var mouseDown = false; // default values of the different options being offered var defaults = { inputfieldStartTime : '', // ID of the input field that contains the start date inputfieldEndTime : '', // ID of the input field that contains the end date submitButton : 'button_refresh_x', // ID of the submit button cookieName : 'cacti_zoom', // default name required for session cookie serverTimeOffset : 0 // JS calculates in relation to the localization of the browser :/ - only required for 0.8.8 }; // define global variables / objects here var zoom = { // 'initiator' is the element that initiates Zoom initiator: $(this), // 'image' means the image tag and its properties image: { top:0, left:0, width:0, height:0 }, // 'graph' stands for the rrdgraph itself excluding legend, graph title etc. graph: { timespan:0, secondsPerPixel:0 }, // 'box' describes the area in front of the graph within jQueryZoom will allow interaction box: { top:0, left:0, right:0, width:0, height:0 }, // 'markers' are selectors useable within the advanced mode marker: { 1 : { placed:false }, 2 : { placed:false} }, // 'custom' holds the local configuration done by the user custom: {}, // 'options' contains the start input parameters options: $.extend(defaults, options), // 'attributes' holds all values that will describe the selected area attr: { start:'none', end:'none', action:'left2right', location: window.location.href.split('?'), urlPath: ((typeof urlPath == 'undefined') ? '' : urlPath), origin: ((typeof location.origin == 'undefined') ? location.protocol + '//' + location.host : location.origin)} }; // support jQuery's concatenation return this.each(function() { zoom_init( $(this) ); }); /* ++++++++++++++++++++ Universal Functions +++++++++++++++++++++++++ */ /** * splits off the parameters of a given URL **/ function getUrlVars(url) { var parameters = [], name, value; urlBaseAndParameters = url.split('?'); urlBase = urlBaseAndParameters[0]; urlParameters = urlBaseAndParameters[1].split('&'); parameters['urlBase'] = urlBase; for (var i=0; i<urlParameters.length; i++) { parameter = urlParameters[i].split('='); parameters[parameter[0].replace(/^graph_/, '')] = $.isNumeric(parameter[1]) ? +parameter[1] : parameter[1]; } return parameters; } /** * transforms an object into a comma separated string of key-value pairs **/ function serialize(object){ var str = ''; for (var key in object) { str += (key + '=' + object[key] + ','); } return str.slice(0, -1); } /** * transforms a comma separated string of key-values pairs into an object * including a change of the value type from string to boolean or numeric if reasonable. **/ function unserialize(string){ var obj = new Array(); if (string != null) { pairs = string.split(','); for (var i=0; i<pairs.length; i++) { pair = pairs[i].split('='); if (pair[1] == 'true') { pair[1] = true; } else if (pair[1] == 'false') { pair[1] = false; } else if ($.isNumeric(pair[1])) { pair[1] = +pair[1]; } obj[pair[0]] = pair[1]; } } return obj; } /** * converts a Unix time stamp to a formatted date string **/ function unixTime2Date(unixTime){ var date = new Date(unixTime*1000+timeOffset); var year = date.getFullYear(); var month = ((date.getMonth()+1) < 9 ) ? '0' + (date.getMonth()+1) : date.getMonth()+1; var day = (date.getDate() > 9) ? date.getDate() : '0' + date.getDate(); var hours = (date.getHours() > 9) ? date.getHours() : '0' + date.getHours(); var minutes = (date.getMinutes() > 9) ? date.getMinutes() : '0' + date.getMinutes(); var seconds = (date.getSeconds() > 9) ? date.getSeconds() : '0' + date.getSeconds(); var formattedTime = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds; return formattedTime; } /* +++++++++++++++++++++++ Core Functions +++++++++++++++++++++++++++ */ /* init zoom */ function zoom_init(image) { var $this = image; var activeElement = ''; $this.parent().disableSelection(); $this.off().mouseover( function(){ if($('#zoom-container').length != 0) { activeElement = $('#zoom-container').attr('data-active-element'); } if (!activeElement || activeElement !== zoomGetImageId($this)){ zoomElements_remove(); zoomFunction_init($this); } } ); } function zoomGetElement(zoom) { var id = '#' + zoom.image.reference; if (zoom.image.rra_id > 0) { id += '[rra_id=\'' + zoom.image.rra_id + '\']'; } return id; } function zoomGetImageId(image) { var id = image.attr('id'); if (image.attr('rra_id') > 0) { id += '_rra' + image.attr('rra_id'); } return id; } function zoomGetId(zoom) { var id = zoom.image.reference; if (zoom.image.rra_id > 0) { id += '_rra' + zoom.image.rra_id; } return id; } function zoomFunction_init(image) { var $this = image; /* load global settings cached in a cookie if available */ if (storage.isSet(zoom.options.cookieName)) { zoom.custom = unserialize(storage.get(zoom.options.cookieName)); } if (zoom.custom.zoomMode == undefined) zoom.custom.zoomMode = 'quick'; if (zoom.custom.zoomOutPositioning == undefined) zoom.custom.zoomOutPositioning = 'center'; if (zoom.custom.zoomOutFactor == undefined) zoom.custom.zoomOutFactor = '2'; if (zoom.custom.zoomTimestamps == undefined) zoom.custom.zoomTimestamps = 'auto'; if (zoom.custom.zoom3rdMouseButton == undefined) zoom.custom.zoom3rdMouseButton = 'zoom_out'; storage.set(zoom.options.cookieName, serialize(zoom.custom)); /* take care of different time zones server and client can make use of */ if (zoom.options.serverTimeOffset > clientTimeOffset ) { timeOffset = (zoom.options.serverTimeOffset - clientTimeOffset)*1000; } else { timeOffset = (clientTimeOffset - zoom.options.serverTimeOffset)*1000*(-1); } /* fetch all attributes that rrdgraph provides */ zoom.image.data = atob( zoom.initiator.attr('src').split(',')[1] ); zoom.image.type = (zoom.initiator.attr('src').split(';')[0] == 'data:image/svg+xml' )? 'svg' : 'png'; zoom.image.reference = zoom.initiator.attr('id'); zoom.image.id = zoom.image.reference.replace('graph_', ''); zoom.image.rra_id = zoom.initiator.attr('rra_id'); zoom.image.name = 'cacti_' + zoomGetImageId(zoom.initiator)+ '.' + zoom.image.type; zoom.image.legend = ($('#thumbnails').length != 0 && $('#thumbnails').is(':checked')) ? false : true; zoom.image.top = parseInt(zoom.initiator.offset().top); zoom.image.left = parseInt(zoom.initiator.offset().left); zoom.image.width = parseInt(zoom.initiator.attr('image_width')); zoom.image.height = parseInt(zoom.initiator.attr('image_height')); zoom.graph.top = parseInt(zoom.initiator.attr('graph_top')); zoom.graph.left = parseInt(zoom.initiator.attr('graph_left')); zoom.graph.width = parseInt(zoom.initiator.attr('graph_width')); zoom.graph.height = parseInt(zoom.initiator.attr('graph_height')); zoom.graph.start = parseInt(zoom.initiator.attr('graph_start')); zoom.graph.end = parseInt(zoom.initiator.attr('graph_end')); zoom.graph.timespan = zoom.graph.end - zoom.graph.start; zoom.graph.secondsPerPixel = zoom.graph.timespan/zoom.graph.width; zoom.box.width = zoom.graph.width + ((zoom.custom.zoomMode === 'quick') ? 0 : 1); zoom.box.height = zoom.graph.height; zoom.box.top = zoom.graph.top-1; zoom.box.bottom = zoom.graph.top + zoom.box.height; zoom.box.left = zoom.graph.left; zoom.box.right = zoom.box.left + zoom.box.width; //console.log('BoxTop: ' + zoom.box.top); //console.log('BoxBottom: ' + zoom.box.bottom); //console.log('BoxLeft: ' + zoom.box.left); //console.log('BoxRight: ' + zoom.box.right); //console.log('ImageTop: ' + zoom.initiator.offset().top); //console.log('ImageLeft: ' + zoom.initiator.offset().left); //console.log('GraphTop: ' + zoom.initiator.attr('graph_top')); //console.log('GraphLeft: ' + zoom.initiator.attr('graph_left')); // get all graph parameters and merge results with zoom.graph object // $.extend(zoom.graph, getUrlVars( $this.attr("src") )); // add all additional HTML elements to the DOM if necessary and register // the individual events needed. Once added we will only reset // and reposition these elements. // add the container for all elements Zoom requires if ($('#zoom-container').length === 0) { // Please note: IE does not fire hover or click behaviors on completely transparent elements. // Use a background color and set opacity to 1% as a workaround.(see CSS file) $('<div id="zoom-container" data-active-element=""></div>').appendTo('body').delay(1000); $('#zoom-container').css({ position: 'absolute', 'pointer-events': 'none' }); }else { $('#zoom-container').attr('data-active-element', ''); } // add a hidden anchor to use for downloads if ($('#zoom-image').length == 0) { $('<a class="zoom-hidden" id="zoom-image"></a>').appendTo('body'); } // add a hidden textareas used to copy images / links if ($('#zoom-textarea').length == 0) { $('<textarea id="zoom-textarea" class="zoom-hidden"></textarea>').appendTo('body'); } // add the 'zoomBox' if ($('#zoom-box').length == 0) { // Please note: IE does not fire hover or click behaviors on completely transparent elements. // Use a background color and set opacity to 1% as a workaround.(see CSS file) $('<div id="zoom-box"></div>').appendTo('#zoom-container'); } // add the 'zoomSelectedArea' if ($('#zoom-area').length == 0) { $('<div id="zoom-area"></div>').appendTo('#zoom-container'); } // add two markers for the advanced mode if ($('#zoom-marker-1').length == 0) { $('<div id="zoom-excluded-area-1" class="zoom-area-excluded"></div>').appendTo('#zoom-container'); $('<div class="zoom-marker" id="zoom-marker-1"><div class="zoom-marker-arrow-down"></div><div class="zoom-marker-arrow-up"></div></div>').appendTo('#zoom-container'); $('<div id="zoom-marker-tooltip-1" class="zoom-marker-tooltip"><div id="zoom-marker-tooltip-1-arrow-left" class="zoom-marker-tooltip-arrow-left"><div id="zoom-marker-tooltip-1-arrow-left-inner" class="zoom-marker-tooltip-arrow-left-inner"></div></div><span id="zoom-marker-tooltip-value-1" class="zoom-marker-tooltip-value">-</span><div id="zoom-marker-tooltip-1-arrow-right" class="zoom-marker-tooltip-arrow-right"><div id="zoom-marker-tooltip-1-arrow-right-inner" class="zoom-marker-tooltip-arrow-right-inner"></div></div></div>').appendTo('#zoom-container'); } if ($('#zoom-marker-2').length == 0) { $('<div id="zoom-excluded-area-2" class="zoom-area-excluded"></div>').appendTo('#zoom-container'); $('<div class="zoom-marker" id="zoom-marker-2"><div class="zoom-marker-arrow-down"></div><div class="zoom-marker-arrow-up"></div></div>').appendTo('#zoom-container'); $('<div id="zoom-marker-tooltip-2" class="zoom-marker-tooltip"><div id="zoom-marker-tooltip-2-arrow-left" class="zoom-marker-tooltip-arrow-left"><div id="zoom-marker-tooltip-1-arrow-left-inner" class="zoom-marker-tooltip-arrow-left-inner"></div></div><span id="zoom-marker-tooltip-value-2" class="zoom-marker-tooltip-value">-</span><div id="zoom-marker-tooltip-2-arrow-right" class="zoom-marker-tooltip-arrow-right"><div id="zoom-marker-tooltip-2-arrow-right-inner" class="zoom-marker-tooltip-arrow-right-inner"></div></div></div>').appendTo('#zoom-container'); } zoom.marker[1].placed = false; zoom.marker[2].placed = false; // add the context (right click) menu if ($('#zoom-menu').length == 0) { $('<div id="zoom-menu" class="zoom-menu">' + '<div class="first_li">' + '<div class="ui-icon ui-icon-zoomin zoomContextMenuAction__zoom_in"></div>' + '<span class="zoomContextMenuAction__zoom_in">' + zoom_i18n_zoom_in + '</span>' + '</div>' + '<div class="first_li">' + '<div class="ui-icon ui-icon-zoomout zoomContextMenuAction__zoom_out"></div>' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span class="zoomContextMenuAction__zoom_out">' + zoom_i18n_zoom_out + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__zoom_out__2">' + zoom_i18n_zoom_2 + '</span>' + '<span class="zoomContextMenuAction__zoom_out__4">' + zoom_i18n_zoom_4 + '</span>' + '<span class="zoomContextMenuAction__zoom_out__8">' + zoom_i18n_zoom_8 + '</span>' + '<span class="zoomContextMenuAction__zoom_out__16">' + zoom_i18n_zoom_16 + '</span>' + '<span class="zoomContextMenuAction__zoom_out__32">' + zoom_i18n_zoom_32 + '</span>' + '</div>' + '</div>' + '<div class="sep_li"></div>' + '<div class="first_li">' + '<div class="ui-icon ui-icon-empty"></div>' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_mode + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__set_zoomMode__quick">' + zoom_i18n_quick + '</span>' + '<span class="zoomContextMenuAction__set_zoomMode__advanced">' + zoom_i18n_advanced + '</span>' + '</div>' + '</div>' + '<div class="sep_li"></div>' + '<div class="first_li">' + '<div class="ui-icon ui-icon-empty"></div>' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_graph + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__newTab">' + zoom_i18n_newTab + '</span>' + '<span class="zoomContextMenuAction__save">' + zoom_i18n_save_graph + '</span>' + '<span class="zoomContextMenuAction__copy">' + zoom_i18n_copy_graph + '</span>' + '<span class="zoomContextMenuAction__link">' + zoom_i18n_copy_graph_link + '</span>' + '</div>' + '</div>' + '<div class="first_li">' + '<div class="ui-icon ui-icon-wrench"></div>' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_settings + '</span>' + '<div class="inner_li">' + '<div class="sec_li">' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_timestamps + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__set_zoomTimestamps__on">' + zoom_i18n_on + '</span>' + '<span class="zoomContextMenuAction__set_zoomTimestamps__auto">' + zoom_i18n_auto + '</span>' + '<span class="zoomContextMenuAction__set_zoomTimestamps__off">' + zoom_i18n_off + '</span>' + '</div>' + '</div>' + '<div class="sep_li"></div>' + '<div class="sec_li">' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_zoom_out_factor + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__set_zoomOutFactor__2">' + zoom_i18n_zoom_2 + '</span>' + '<span class="zoomContextMenuAction__set_zoomOutFactor__4">' + zoom_i18n_zoom_4 + '</span>' + '<span class="zoomContextMenuAction__set_zoomOutFactor__8">' + zoom_i18n_zoom_8 + '</span>' + '<span class="zoomContextMenuAction__set_zoomOutFactor__16">' + zoom_i18n_zoom_16 + '</span>' + '<span class="zoomContextMenuAction__set_zoomOutFactor__32">' + zoom_i18n_zoom_32 + '</span>' + '</div>' + '</div>' + '<div class="sec_li">' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_zoom_out_positioning + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__set_zoomOutPositioning__begin">' + zoom_i18n_begin + '</span>' + '<span class="zoomContextMenuAction__set_zoomOutPositioning__center">' + zoom_i18n_center + '</span>' + '<span class="zoomContextMenuAction__set_zoomOutPositioning__end">' + zoom_i18n_end + '</span>' + '</div>' + '</div>' + '<div class="sec_li">' + '<div class="ui-icon ui-icon-play ui-icon-right"></div>' + '<span>' + zoom_i18n_3rd_button + '</span>' + '<div class="inner_li">' + '<span class="zoomContextMenuAction__set_zoom3rdMouseButton__zoom_in">' + zoom_i18n_zoom_in + '</span>' + '<span class="zoomContextMenuAction__set_zoom3rdMouseButton__zoom_out">' + zoom_i18n_zoom_out + '</span>' + '<span class="zoomContextMenuAction__set_zoom3rdMouseButton__off">' + zoom_i18n_disabled + '</span>' + '</div>' + '</div>' + '</div>' + '</div>' + '<div class="sep_li"></div>' + '<div class="first_li">' + '<div class="ui-icon ui-icon-close zoomContextMenuAction__close"></div>' + '<span class="zoomContextMenuAction__close">' + zoom_i18n_close + '</span>' + '</div>').appendTo('body'); } zoomElements_reposition(); zoomElements_reset(); zoomContextMenu_init(); zoomAction_init(image); } /** * reposition all elements of Zoom **/ function zoomElements_reposition() { $('#zoom-container').insertBefore(zoomGetElement(zoom)); } /** * resets and destroys all elements of Zoom **/ function zoomElements_remove() { zoomElements_reset(); $('#zoom-container').find('*').off().remove(); $('#zoom-menu').remove(); } /** * resets all elements of Zoom **/ function zoomElements_reset() { zoom.attr.start = 'none'; zoom.marker = { 1 : { placed:false }, 2 : { placed:false} }; $('#zoom-container > div[id^="zoom-"]').not('#zoom-menu').each( function () { $(this).removeAttr('style'); }); $('#zoom-container').off(); $('#zoom-container').bind('contextmenu', function(e) { zoomContextMenu_toggle(e); return false;} ); $('#zoom-box').off(); $('#zoom-box').css({ cursor:'crosshair', width:zoom.box.width + 'px', height:zoom.box.height + 'px', top:zoom.box.top+'px', left:zoom.box.left+'px' }); $('#zoom-box').bind('contextmenu', function(e) { zoomContextMenu_toggle(e); return false;} ); $('#zoom-area').off().css({ top:zoom.graph.top+'px', height:zoom.graph.height+'px' }); $('.zoom-area-excluded').off(); $('.zoom-area-excluded').bind('contextmenu', function(e) { zoomContextMenu_toggle(e); return false;} ); $('.zoom-area-excluded').bind('click', function(e) { zoomContextMenu_hide(); return false;} ); $('.zoom-marker-arrow-up').css({ top:(zoom.box.height-6) + 'px' }); $('.zoom-marker-tooltip-value').disableSelection(); $('#zoom-container > div[id^="zoom-"]').css({ 'pointer-events': 'all' }); } /* * registers all the different mouse click event handler */ function zoomAction_init(image) { if (zoom.custom.zoomMode === 'quick') { zoom.box.width = zoom.graph.width; $('#zoom-box').css({ width:zoom.box.width + 'px' }); $('#zoom-area').resizable({ containment: '#zoom-box', handles: 'e, w' }); $('#zoom-box').off('mousedown').on('mousedown', function(e) { switch(e.which) { /* clicking the left mouse button will initiates a zoom-in */ case 1: // remember active element $('#zoom-container').attr('data-active-element', zoomGetImageId(image)); // ensure menu is closed zoomContextMenu_hide(); // reset the zoom area zoom.attr.start = e.pageX; $('#zoom-box').css({ cursor:'e-resize' }); $('#zoom-area').css({ width:'0px', left: zoom.attr.start-zoom.image.left+'px', display:'block' }); break; } }); /* register the mouse up event */ $('#zoom-box, #zoom-area').off('mouseup').on('mouseup', function(e) { switch(e.which) { /* leaving the left mouse button will execute a zoom in */ case 1: if (zoom.attr.start != 'none') { zoomAction_zoom_in(); } break; case 2: /* hide context menu if open */ zoomContextMenu_hide(); if (zoom.custom.zoom3rdMouseButton == 'zoom_in') { zoomAction_zoom_in(); } else { zoomAction_zoom_out( zoom.custom.zoomOutFactor ); } break; } }); /* stretch the zoom area in that direction the user moved the mouse pointer. That is required to get it working faultlessly with Opera, IE and Chrome */ $('#zoom-box, #zoom-area').mousemove( function(e) { zoomAction_draw(e); } ); /* capture mouse up/down events for zoom */ $(document).off('mousedown').on('mousedown', function() { mouseDown = true; clearTimeout(myRefresh); }).off('mouseup').on('mouseup', function() { if (mouseDown) { if (zoom.attr.start != 'none') { zoomAction_zoom_in(); } } mouseDown = false; }); /* moving the mouse pointer quickly will avoid that the mousemove event has enough time to actualize the zoom area */ $('#zoom-container').mouseout( function(e) { zoomAction_draw(e); } ); } else{ /* welcome to the advanced mode ;) */ zoom.box.width = zoom.graph.width+1; $('#zoom-box').css({ width:zoom.box.width + 'px' }); $('#zoom-box').off('mousedown').on('mousedown', function(e) { switch(e.which) { case 1: // remember active element $('#zoom-container').attr('data-active-element', zoomGetImageId(image)); // ensure menu is closed zoomContextMenu_hide(); /* find out which marker has to be added */ if (zoom.marker[1].placed && zoom.marker[2].placed) { zoomAction_zoom_in(); return; } else { var marker = zoom.marker[1].placed ? 2 : 1; var secondmarker = (marker == 1) ? 2 : 1; } /* select marker */ var $this = $('#zoom-marker-' + marker); /* place the marker and make it visible */ var pos_relative_left = e.pageX-zoom.image.left; var pos_relative_top = e.pageY-zoom.image.top; $this.css({ height:zoom.box.height+'px', top:zoom.box.top+'px', left:pos_relative_left+'px', display:'block' }); zoom.marker[marker].placed = true; zoom.marker[marker].left = pos_relative_left; /* place the marker's tooltip, update its value and make it visible if necessary (Setting: 'Always On') */ zoom.marker[marker].unixtime = parseInt(parseInt(zoom.graph.start) + (pos_relative_left - zoom.box.left)*zoom.graph.secondsPerPixel); $('#zoom-marker-tooltip-value-' + marker).html( unixTime2Date(zoom.marker[marker].unixtime).replace(' ', '<br>') ); zoom.marker[marker].width = $('#zoom-marker-tooltip-' + marker).width(); zoom.marker[marker].height = $('#zoom-marker-tooltip-' + marker).height(); $('#zoom-marker-tooltip-' + marker).css({ width: zoom.marker[marker].width +'px', top: ( (marker == 1) ? zoom.box.top+3 : zoom.box.bottom-zoom.marker[marker].height-3 )+'px', left:( (marker == 1) ? pos_relative_left - zoom.marker[marker].width : pos_relative_left )+'px'} ); if (zoom.custom.zoomTimestamps === true) { $('#zoom-marker-tooltip-' + marker).fadeIn(500); } if (e.pageX == $('#zoom-marker-tooltip-' + marker).position().left) { $('#zoom-marker-tooltip-' + marker + '-arrow-right').css({ visibility:'hidden'}); } else { $('#zoom-marker-tooltip-' + marker + '-arrow-left').css({ visibility:'hidden'}); } /* make the excluded areas visible directly in that moment both markers are set */ if (zoom.marker[1].placed && zoom.marker[2].placed) { zoom.marker.distance = zoom.marker[1].left - zoom.marker[2].left; $('#zoom-excluded-area-1').css({ position:'absolute', height:zoom.box.height+'px', top:zoom.box.top+'px', left: (zoom.marker.distance > 0) ? zoom.marker[1].left : zoom.box.left, width: (zoom.marker.distance > 0) ? zoom.box.right - zoom.marker[1].left : zoom.marker[1].left - zoom.box.left, display:'block' }); $('#zoom-excluded-area-2').css({ position:'absolute', height:zoom.box.height+'px', top:zoom.box.top+'px', left: (zoom.marker.distance < 0) ? zoom.marker[2].left : zoom.box.left, width: (zoom.marker.distance < 0) ? zoom.box.right - zoom.marker[2].left : zoom.marker[2].left - zoom.box.left, display:'block' }); /* reposition both tooltips */ $('#zoom-marker-tooltip-1').css({ left: $('#zoom-marker-1').position().left - ( (zoom.marker.distance > 0) ? 0 : $('#zoom-marker-tooltip-1').width() ) + 'px' }); $('#zoom-marker-tooltip-1-arrow-left').css({ visibility: (($('#zoom-marker-tooltip-1').position().left < $('#zoom-marker-1').position().left ) ? 'hidden' : 'visible') }); $('#zoom-marker-tooltip-1-arrow-right').css({ visibility: (($('#zoom-marker-tooltip-1').position().left < $('#zoom-marker-1').position().left ) ? 'visible' : 'hidden') }); $('#zoom-marker-tooltip-2').css({ left: $('#zoom-marker-2').position().left - ( (zoom.marker.distance < 0) ? 0 : $('#zoom-marker-tooltip-2').width() ) + 'px' }); $('#zoom-marker-tooltip-2-arrow-left').css({ visibility: (($('#zoom-marker-tooltip-2').position().left < $('#zoom-marker-2').position().left ) ? 'hidden' : 'visible') }); $('#zoom-marker-tooltip-2-arrow-right').css({ visibility: (($('#zoom-marker-tooltip-2').position().left < $('#zoom-marker-2').position().left ) ? 'visible' : 'hidden') }); /* change cursor */ $('#zoom-box').css({cursor: 'pointer'}); } /* make the marker draggable */ $this.draggable({ containment: '#zoom-box', axis: 'x', scroll: false, start: function(event, ui) { if (zoom.custom.zoomTimestamps == 'auto') { $('.zoom-marker-tooltip').fadeIn(500); } }, drag: function(event, ui) { if (ui.position['left'] <= zoom.box.left) { zoom.marker[marker].left = zoom.box.left; } else if (ui.position['left'] >= zoom.box.right) { zoom.marker[marker].left = zoom.box.right; } else { zoom.marker[marker].left = Math.ceil(parseFloat(ui.position['left'])); } /* update the timestamp shown in tooltip */ zoom.marker[marker].unixtime = Math.ceil( parseFloat(parseInt(zoom.graph.start) + (zoom.marker[marker].left - zoom.graph.left)*zoom.graph.secondsPerPixel)); $('#zoom-marker-tooltip-value-' + marker).html( unixTime2Date(zoom.marker[marker].unixtime).replace(' ', '<br>') ); zoom.marker[marker].width = $('#zoom-marker-tooltip-' + marker).width(); /* update the execludedArea if both markers have been placed */ if (zoom.marker[1].placed && zoom.marker[2].placed) { zoom.marker.distance = zoom.marker[marker].left - zoom.marker[secondmarker].left; if ( zoom.marker.distance > 0 ) { zoom.marker[marker].excludeArea = 'right'; zoom.marker[secondmarker].excludeArea = 'left'; } else { zoom.marker[marker].excludeArea = 'left'; zoom.marker[secondmarker].excludeArea = 'right'; } /* in that case we have to update the tooltip of both marker */ $('#zoom-excluded-area-' + marker).css({ left: (zoom.marker.distance > 0) ? zoom.marker[marker].left : zoom.box.left, width: (zoom.marker.distance > 0) ? zoom.box.right - zoom.marker[marker].left : zoom.marker[marker].left - zoom.box.left}); $('#zoom-marker-tooltip-' + marker).css({ left: zoom.marker[marker].left + ( (zoom.marker[marker].excludeArea == 'right') ? (0) : (-zoom.marker[marker].width) ) }); $('#zoom-marker-tooltip-' + marker + '-arrow-left').css({ visibility: ( zoom.marker[marker].excludeArea == 'left' ? 'hidden' : 'visible') }); $('#zoom-marker-tooltip-' + marker + '-arrow-right').css({ visibility: ( zoom.marker[marker].excludeArea == 'left' ? 'visible' : 'hidden') }); $('#zoom-excluded-area-' + secondmarker).css({ left: (zoom.marker.distance > 0) ? zoom.box.left : zoom.marker[secondmarker].left, width: (zoom.marker.distance > 0) ? zoom.marker[secondmarker].left - zoom.box.left : zoom.box.right - zoom.marker[secondmarker].left}); $('#zoom-marker-tooltip-' + secondmarker ).css({ left: zoom.marker[secondmarker].left + ( (zoom.marker[secondmarker].excludeArea == 'right') ? (0) : (-zoom.marker[secondmarker].width) ) }); $('#zoom-marker-tooltip-' + secondmarker + '-arrow-left').css({ visibility: ( zoom.marker[secondmarker].excludeArea == 'left' ? 'hidden' : 'visible') }); $('#zoom-marker-tooltip-' + secondmarker + '-arrow-right').css({ visibility: ( zoom.marker[secondmarker].excludeArea == 'left' ? 'visible' : 'hidden') }); } else { /* let the tooltip follow its marker */ $('#zoom-marker-tooltip-' + marker).css({ left: zoom.marker[marker].left -zoom.marker[marker].width }); } }, stop: function(event,ui) { /* hide all tooltip if we are in auto mode */ if (zoom.custom.zoomTimestamps == 'auto') { $('.zoom-marker-tooltip').fadeOut(1000); } } }); break; case 2: if (zoom.custom.zoom3rdMouseButton != false) { /* hide context menu if open */ zoomContextMenu_hide(); if (zoom.custom.zoom3rdMouseButton == 'zoom_in') { zoomAction_zoom_in(); } else { zoomAction_zoom_out( zoom.custom.zoomOutFactor ); } } break; } return false; }); } } /* * executes a dynamic zoom in */ function zoomAction_zoom_in(){ setCustomFilterActionActionAndDate(); /* hide context menu if open */ zoomContextMenu_hide(); if (zoom.custom.zoomMode == 'quick') { var newGraphStartTime = (zoom.attr.action == 'left2right') ? parseInt(parseInt(zoom.graph.start) + (zoom.attr.start -zoom.image.left -zoom.box.left)*zoom.graph.secondsPerPixel) : parseInt(parseInt(zoom.graph.start) + (zoom.attr.end -zoom.image.left -zoom.box.left)*zoom.graph.secondsPerPixel); var newGraphEndTime = (zoom.attr.action == 'left2right') ? Math.ceil( parseFloat(newGraphStartTime + (zoom.attr.end-zoom.attr.start)*zoom.graph.secondsPerPixel)) : parseInt(newGraphStartTime + (zoom.attr.start-zoom.attr.end)*zoom.graph.secondsPerPixel); /* If the user only clicked on a graph then equal end and start date to ensure that we do not propergate NaNs */ if (isNaN(newGraphStartTime) & isNaN(newGraphEndTime)) { return; } else if (isNaN(newGraphStartTime) & !isNaN(newGraphEndTime)) { newGraphStartTime = newGraphEndTime; } else if (!isNaN(newGraphStartTime) & isNaN(newGraphEndTime)){ newGraphEndTime = newGraphStartTime; } } else { /* advanced mode has other requirements */ /* first of, do nothing if not both marker have been positioned */ if (!zoom.marker[1].placed | !zoom.marker[2].placed) { alert('NOTE: In advanced mode both markers have to be positioned first to define the period of time you want to zoom in.'); return; } else { var newGraphStartTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 2 : 1 )].unixtime; var newGraphEndTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 1 : 2 )].unixtime; } } /* hide Zoom without destroying its container */ $('#zoom-container').html(''); if (zoom.options.inputfieldStartTime != '' & zoom.options.inputfieldEndTime != ''){ zoom.initiator.attr('graph_start', newGraphStartTime); zoom.initiator.attr('graph_end', newGraphEndTime); /* execute zoom within 'tree view' or the 'preview view' */ $('#' + zoom.options.inputfieldStartTime).val(unixTime2Date(newGraphStartTime)); $('#' + zoom.options.inputfieldEndTime).val(unixTime2Date(newGraphEndTime)); if (graph_start !== null && graph_end !== null) { zoom.attr.start = 'none'; if (pageAction != 'graph') { graph_start = newGraphStartTime; graph_end = newGraphEndTime; initializeGraphs(true); }else{ $('#graph_start').val(newGraphStartTime); $('#graph_end').val(newGraphEndTime); initializeGraph(); } } else { $("input[name='" + zoom.options.submitButton + "']").trigger('click'); } zoomAction_update_session(newGraphStartTime, newGraphEndTime); return false; } else { /* graph view is already in zoom status */ open(zoom.attr.location[0] + '?action=' + zoom.graph.action + '&local_graph_id=' + zoom.graph.local_graph_id + '&rra_id=' + zoom.graph.rra_id + '&view_type=' + zoom.graph.view_type + '&graph_start=' + newGraphStartTime + '&graph_end=' + newGraphEndTime + '&graph_height=' + zoom.graph.height + '&graph_width=' + zoom.graph.width + '&title_font_size=' + zoom.graph.title_font_size + '&disable_cache=true', '_self'); } zoom.attr.start = 'none'; } /* * sets the predefined timespan to 'Custom' */ function setCustomFilterActionActionAndDate() { onChange = $('#predefined_timespan').attr('onchange'); if (typeof $('#predefined_timespan').selectmenu() == 'function') { $('#predefined_timespan').val('0').selectmenu('refresh'); } else{ $('#predefined_timespan').val('0'); } } function getZoomOutFactorText(zoomOutFactor) { switch(zoomOutFactor) { case 2: return zoom_i18n_zoom_out + ' (' + zoom_i18n_zoom_2 + ')'; break; case 4: return zoom_i18n_zoom_out + ' (' + zoom_i18n_zoom_4 + ')'; break; case 8: return zoom_i18n_zoom_out + ' (' + zoom_i18n_zoom_8 + ')'; break; case 16: return zoom_i18n_zoom_out + ' (' + zoom_i18n_zoom_16 + ')'; break; case 32: return zoom_i18n_zoom_out + ' (' + zoom_i18n_zoom_32 + ')'; break; } } /* * executes a static zoom out (as right click event) */ function zoomAction_zoom_out(multiplier){ setCustomFilterActionActionAndDate(); /* hide context menu if open */ zoomContextMenu_hide(); multiplier--; /* avoid that we can not zoom out anymore if start and end date will be equal */ if (zoom.graph.timespan == 0) { zoom.graph.timespan = 1; } if (zoom.custom.zoomMode == 'quick' || !zoom.marker[1].placed || !zoom.marker[2].placed ) { if (zoom.custom.zoomOutPositioning == 'begin') { var newGraphStartTime = parseInt(zoom.graph.start); var newGraphEndTime = parseInt(parseInt(zoom.graph.end) + (multiplier * zoom.graph.timespan)); } else if (zoom.custom.zoomOutPositioning == 'end') { var newGraphStartTime = parseInt(parseInt(zoom.graph.start) - (multiplier * zoom.graph.timespan)); var newGraphEndTime = parseInt(zoom.graph.end); } else { if ($('#future').val() == 'on') { // define the new start and end time, so that the selected area will be centered per default var newGraphStartTime = parseInt(parseInt(zoom.graph.start) - (0.5 * multiplier * zoom.graph.timespan)); var newGraphEndTime = parseInt(parseInt(zoom.graph.end) + (0.5 * multiplier * zoom.graph.timespan)); } else{ var now = parseInt($.now() / 1000); var newGraphEndTime = parseInt(parseInt(zoom.graph.end) + (0.5 * multiplier * zoom.graph.timespan)); var newGraphStartTime = parseInt(parseInt(zoom.graph.start) - (0.5 * multiplier * zoom.graph.timespan)); if (newGraphEndTime > now) { offset = newGraphEndTime - now; newGraphEndTime = now; newGraphStartTime -= offset; } } } } else { var newGraphStartTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 2 : 1 )].unixtime; var newGraphEndTime = zoom.marker[((zoom.marker[1].unixtime > zoom.marker[2].unixtime)? 1 : 2 )].unixtime; var selectedTimeSpan = newGraphEndTime - newGraphStartTime; if (zoom.custom.zoomOutPositioning == 'begin') { newGraphEndTime = newGraphEndTime + multiplier * selectedTimeSpan; } else if (zoom.custom.zoomOutPositioning == 'end') { newGraphStartTime = newGraphStartTime - multiplier * selectedTimeSpan; } else { newGraphStartTime = parseInt(newGraphStartTime - 0.5 * multiplier * selectedTimeSpan); newGraphEndTime = parseInt(newGraphEndTime + 0.5 * multiplier * selectedTimeSpan); } } /* hide Zoom without destroying its container */ $('#zoom-container').html(''); if (zoom.options.inputfieldStartTime != '' & zoom.options.inputfieldEndTime != ''){ zoom.initiator.attr('graph_start', newGraphStartTime); zoom.initiator.attr('graph_end', newGraphEndTime); /* execute zoom within 'tree view' or the 'preview view' */ $('#' + zoom.options.inputfieldStartTime).val(unixTime2Date(newGraphStartTime)); $('#' + zoom.options.inputfieldEndTime).val(unixTime2Date(newGraphEndTime)); if (graph_start !== null && graph_end !== null) { zoom.attr.start = 'none'; if (pageAction != 'graph') { graph_start = newGraphStartTime; graph_end = newGraphEndTime; initializeGraphs(true); }else{ $('#graph_start').val(newGraphStartTime); $('#graph_end').val(newGraphEndTime); initializeGraph(); } } else { $("input[name='" + zoom.options.submitButton + "']").trigger('click'); } zoomAction_update_session(newGraphStartTime, newGraphEndTime); } else { open(zoom.attr.location[0] + '?action=' + zoom.graph.action + '&local_graph_id=' + zoom.graph.local_graph_id + '&rra_id=' + zoom.graph.rra_id + '&view_type=' + zoom.graph.view_type + '&graph_start=' + newGraphStartTime + '&graph_end=' + newGraphEndTime + '&graph_height=' + zoom.graph.height + '&graph_width=' + zoom.graph.width + '&title_font_size=' + zoom.graph.title_font_size + '&disable_cache=true', '_self'); } } /* * when updating the zoom window, we have to update cacti's zoom session variables */ function zoomAction_update_session(newGraphStartTime, newGraphEndTime) { $.get(document.location.pathname + '?action=update_timespan' + '&date1=' + unixTime2Date(newGraphStartTime) + '&date2=' + unixTime2Date(newGraphEndTime), function() { $('#predefined_timespan').val('0'); if (typeof $('#predefined_timespan').selectmenu() === 'object') { $('#predefined_timespan').selectmenu('refresh'); } }); } /* * updates the css parameters of the zoom area to reflect user's interaction */ function zoomAction_draw(event) { if (zoom.attr.start == 'none') { return; } /* mouse has been moved from right to left */ if ((event.pageX-zoom.attr.start)<0) { zoom.attr.action = 'right2left'; zoom.attr.end = (event.pageX < zoom.image.left+zoom.box.left) ? zoom.image.left+zoom.box.left : event.pageX; $('#zoom-area').css({ left:zoom.attr.end-zoom.image.left+'px', width:Math.abs(zoom.attr.start-zoom.attr.end-1)+'px' }); /* mouse has been moved from left to right*/ } else { zoom.attr.action = 'left2right'; zoom.attr.end = (event.pageX > zoom.image.left+zoom.box.right) ? zoom.image.left+zoom.box.right : event.pageX; $('#zoom-area').css({ left:zoom.attr.start-zoom.image.left+'px', width:Math.abs(zoom.attr.end-zoom.attr.start)+'px' }); } } /** * * @access public * @return void **/ function zoomContextMenu_init(){ /* sync menu with cookie parameters */ $('.zoomContextMenuAction__set_zoomMode__' + zoom.custom.zoomMode).addClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoomTimestamps__' + ((zoom.custom.zoomTimestamps == 'auto') ? 'auto' : ((zoom.custom.zoomTimestamps) ? 'on' : 'off' ))).addClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoomOutFactor__' + zoom.custom.zoomOutFactor).addClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoomOutPositioning__' + zoom.custom.zoomOutPositioning).addClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoom3rdMouseButton__' + ((zoom.custom.zoom3rdMouseButton === false) ? 'off' : zoom.custom.zoom3rdMouseButton) ).addClass('zoom-menu-highlight'); $('.zoomContextMenuAction__zoom_out').text(getZoomOutFactorText(zoom.custom.zoomOutFactor)); if (zoom.custom.zoomMode == 'quick') { $('.advanced_mode').hide(); } /* init click on events */ $('[class*=zoomContextMenuAction__]').off().on('click', function() { var zoomContextMenuAction = false; var zoomContextMenuActionValue = false; var classList = $.trim($(this).attr('class')).split(/\s+/); $.each( classList, function(index, item){ if ( item.search('zoomContextMenuAction__') != -1) { zoomContextMenuActionList = item.replace('zoomContextMenuAction__', '').split('__'); zoomContextMenuAction = zoomContextMenuActionList[0]; if (zoomContextMenuActionList[1] == 'undefined' || zoomContextMenuActionList[1] == 'off') { zoomContextMenuActionValue = false; } else if (zoomContextMenuActionList[1] == 'on') { zoomContextMenuActionValue = true; } else { zoomContextMenuActionValue = zoomContextMenuActionList[1]; } return( false ); } }); if ( zoomContextMenuAction ) { if ( zoomContextMenuAction.substring(0,8) == 'set_zoom') { zoomContextMenuAction_set( zoomContextMenuAction.replace('set_zoom', '').toLowerCase(), zoomContextMenuActionValue); } else { zoomContextMenuAction_do( zoomContextMenuAction, zoomContextMenuActionValue); } } }); /* init hover events */ $('.first_li , .sec_li, .inner_li span').hover( function () { $(this).addClass('zoom-menu-hover'); if ( $(this).children().length >0 ) if (zoom.custom.zoomMode == 'quick') { $(this).children('.inner_li:not(.advanced_mode)').show(); } else { $(this).children('.inner_li').show(); } }, function () { $(this).removeClass('zoom-menu-hover'); $(this).children('.inner_li').hide(); } ); }; /** * * @access public * @return void **/ function zoomContextMenuAction_set(object, value){ switch(object) { case 'mode': if ( zoom.custom.zoomMode != value) { zoom.custom.zoomMode = value; $('[class*=zoomContextMenuAction__set_zoomMode__]').toggleClass('zoom-menu-highlight'); if (value == 'quick') { // reset menu $('.advanced_mode').hide(); zoom.custom.zoomMode = 'quick'; storage.set(zoom.options.cookieName, serialize(zoom.custom)); } else { // switch to advanced mode $('.sec_li.advanced_mode').show(); zoom.custom.zoomMode = 'advanced'; storage.set(zoom.options.cookieName, serialize(zoom.custom)); } zoomContextMenu_hide(); zoomElements_reset(); zoomAction_init(zoom.initiator); } break; case 'timestamps': if ( zoom.custom.zoomTimestamps != value) { zoom.custom.zoomTimestamps = value; storage.set(zoom.options.cookieName, serialize(zoom.custom)); $('[class*=zoomContextMenuAction__set_zoomTimestamps__]').removeClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoomTimestamps__' + ((zoom.custom.zoomTimestamps == 'auto') ? 'auto' : ((zoom.custom.zoomTimestamps) ? 'on' : 'off' ))).addClass('zoom-menu-highlight'); /* make them visible only for mode 'Always On' */ if (zoom.custom.zoomTimestamps === true) { $('.zoom-marker-tooltip').fadeIn(500); } else { $('.zoom-marker-tooltip').fadeOut(500); } } break; case 'outfactor': if ( zoom.custom.zoomOutFactor != value) { zoom.custom.zoomOutFactor = value; storage.set(zoom.options.cookieName, serialize(zoom.custom)); $('[class*=zoomContextMenuAction__set_zoomOutFactor__]').removeClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoomOutFactor__' + value).addClass('zoom-menu-highlight'); $('.zoomContextMenuAction__zoom_out').text(getZoomOutFactorText(value)); } break; case 'outpositioning': if ( zoom.custom.zoomOutPositioning != value) { zoom.custom.zoomOutPositioning = value; storage.set(zoom.options.cookieName, serialize(zoom.custom)); $('[class*=zoomContextMenuAction__set_zoomOutPositioning__]').removeClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoomOutPositioning__' + value).addClass('zoom-menu-highlight'); } break; case '3rdmousebutton': if ( zoom.custom.zoom3rdMouseButton != value) { zoom.custom.zoom3rdMouseButton = value; storage.set(zoom.options.cookieName, serialize(zoom.custom)); $('[class*=zoomContextMenuAction__set_zoom3rdMouseButton__]').removeClass('zoom-menu-highlight'); $('.zoomContextMenuAction__set_zoom3rdMouseButton__' + ((value === false) ? 'off' : value)).addClass('zoom-menu-highlight'); } break; } } function zoomContextMenuAction_do(action, value){ switch(action) { case 'close': zoomContextMenu_hide(); break; case 'zoom_out': if (value == undefined) { value = zoom.custom.zoomOutFactor; } zoomAction_zoom_out(value); break; case 'zoom_in': zoomAction_zoom_in(); break; case 'copy': $('#zoom-textarea').html('<img src="data:image/png;base64,'+btoa(unescape(encodeURIComponent(zoom.image.data)))+'" width="'+zoom.image.width+'" height="'+zoom.image.height+'">').select(); try { var successful = document.execCommand('copy'); } catch (err) { alert('Unsupported Browser'); } return false; break; case 'save': var arraybuffer = new ArrayBuffer(zoom.image.data.length); var view = new Uint8Array(arraybuffer); for (var i = 0; i < zoom.image.data.length; i++) { view[i] = zoom.image.data.charCodeAt(i) & 0xff; } try { var blob = new Blob([arraybuffer], {type: 'application/octet-stream'}); } catch (e) { var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder); bb.append(arraybuffer); var blob = bb.getBlob('application/octet-stream'); } if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, zoom.image.name); } else { var objectUrl = URL.createObjectURL(blob); $('#zoom-image').removeAttr('target').attr({'download':zoom.image.name, 'href':objectUrl }).get(0).click(); } break; case 'newTab': var url = zoom.attr.urlPath + 'graph_image.php?local_graph_id=' + zoom.image.id; if (zoom.image.rra_id > 0) { url += '&rra_id='+zoom.image.rra_id; } url += '&graph_start=' + zoom.graph.start + '&graph_end=' + zoom.graph.end + '&graph_width=' + zoom.graph.width + '&graph_height=' + zoom.graph.height + ( (zoom.image.legend === true) ? '' : '&graph_nolegend=true' ) + '&disable_cache=true'; $('#zoom-image').removeAttr('download').attr({ 'href':url, 'target': '_bank' }).get(0).click(); break; case 'link': var url = zoom.attr.origin + ((zoom.attr.urlPath == '') ? '/' : zoom.attr.urlPath) + 'graph_image.php?local_graph_id=' + zoom.image.id + '&graph_start=' + zoom.graph.start + '&graph_end=' + zoom.graph.end + '&graph_width=' + zoom.graph.width + '&graph_height=' + zoom.graph.height + ( (zoom.image.legend === true) ? '' : '&graph_nolegend=true' ) + '&disable_cache=true'; $('#zoom-textarea').html(url).select(); try { var successful = document.execCommand('copy'); } catch (err) { alert('Unsupported Browser'); } return false; break; } } function zoomContextMenu_show(e){ var menu_y_pos = e.pageY; var menu_y_offset = 5; var menu_x_pos = e.pageX; var menu_x_offset = 5; var window_size_x_1 = $(document).scrollLeft(); var window_size_x_2 = $(window).width() + $(document).scrollLeft(); var window_size_y_1 = $(document).scrollTop(); var window_size_y_2 = $(window).height() + $(document).scrollTop(); var menu_height = $('.zoom-menu').outerHeight(); var menu_width = $('.zoom-menu').outerWidth(); var menu_width_level_1 = Math.abs($('.zoom-menu .first_li span').outerWidth()); var menu_width_level_2 = Math.abs($('.zoom-menu .sec_li span').outerWidth()); var menu_height_level_1 = Math.abs($('.zoom-menu .first_li span').outerHeight()); var menu_height_level_2 = Math.abs($('.zoom-menu .sec_li span').outerHeight()); /* let the menu occur on the right per default if possible, otherwise move it to the left: */ if (( menu_x_pos + menu_x_offset + menu_width) > window_size_x_2 ) { menu_x_offset += (-1*menu_width); $('.zoom-menu .inner_li').css({ 'margin-left': -menu_width_level_1 }); } else { if (( menu_x_pos + menu_x_offset + menu_width + menu_width_level_1 + menu_width_level_2 ) > window_size_x_2) { $('.zoom-menu .inner_li').css({ 'margin-left': -menu_width_level_1 }); } else { $('.zoom-menu .inner_li').css({ 'margin-left': menu_width_level_1 }); } } if (( menu_y_pos + menu_y_offset + menu_height ) > window_size_y_2 ) { menu_y_offset += (-1*menu_height); } $('#zoom-menu').css({ left: menu_x_pos+menu_x_offset, top: menu_y_pos+menu_y_offset, zIndex: '101' }).show(); }; function zoomContextMenu_hide(){ $('#zoom-menu').hide(); } function zoomContextMenu_toggle(e){ ($('#zoom-menu').css('display') == 'none') ? zoomContextMenu_show(e) : zoomContextMenu_hide(); } }; })(jQuery); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/js.storage.js�������������������������������������������������������0000664�0000000�0000000�00000057477�14136337723�0021016�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * JS Storage Plugin * * Copyright (c) 2019 Julien Maurel * * Licensed under the MIT license: * http://www.opensource.org/licenses/mit-license.php * * Project home: * https://github.com/julien-maurel/js-storage * * Version: 1.1.0 */ (function (factory) { var registeredInModuleLoader = false; if (typeof define === 'function' && define.amd) { define(factory); registeredInModuleLoader = true; } if (typeof exports === 'object') { module.exports = factory(); registeredInModuleLoader = true; } if (!registeredInModuleLoader) { var OldStorages = window.Storages; var api = window.Storages = factory(); api.noConflict = function () { window.Storages = OldStorages; return api; }; } }(function () { // Variables used by utilities functions (like isPlainObject...) var class2type = {}; var toString = class2type.toString; var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; var ObjectFunctionString = fnToString.call(Object); var getProto = Object.getPrototypeOf; var apis = {}; // Prefix to use with cookie fallback var cookie_local_prefix = "ls_"; var cookie_session_prefix = "ss_"; // Get items from a storage function _get() { var storage = this._type, l = arguments.length, s = window[storage], a = arguments, a0 = a[0], vi, ret, tmp, i, j; if (l < 1) { throw new Error('Minimum 1 argument must be given'); } else if (Array.isArray(a0)) { // If second argument is an array, return an object with value of storage for each item in this array ret = {}; for (i in a0) { if (a0.hasOwnProperty(i)) { vi = a0[i]; try { ret[vi] = JSON.parse(s.getItem(vi)); } catch (e) { ret[vi] = s.getItem(vi); } } } return ret; } else if (l == 1) { // If only 1 argument, return value directly try { return JSON.parse(s.getItem(a0)); } catch (e) { return s.getItem(a0); } } else { // If more than 1 argument, parse storage to retrieve final value to return it // Get first level try { ret = JSON.parse(s.getItem(a0)); if (!ret) { throw new ReferenceError(a0 + ' is not defined in this storage'); } } catch (e) { throw new ReferenceError(a0 + ' is not defined in this storage'); } // Parse next levels for (i = 1; i < l - 1; i++) { ret = ret[a[i]]; if (ret === undefined) { throw new ReferenceError([].slice.call(a, 0, i + 1).join('.') + ' is not defined in this storage'); } } // If last argument is an array, return an object with value for each item in this array // Else return value normally if (Array.isArray(a[i])) { tmp = ret; ret = {}; for (j in a[i]) { if (a[i].hasOwnProperty(j)) { ret[a[i][j]] = tmp[a[i][j]]; } } return ret; } else { return ret[a[i]]; } } } // Set items of a storage function _set() { var storage = this._type, l = arguments.length, s = window[storage], a = arguments, a0 = a[0], a1 = a[1], vi, to_store = isNaN(a1) ? {} : [], type, tmp, i; if (l < 1 || !_isPlainObject(a0) && l < 2) { throw new Error('Minimum 2 arguments must be given or first parameter must be an object'); } else if (_isPlainObject(a0)) { // If first argument is an object, set values of storage for each property of this object for (i in a0) { if (a0.hasOwnProperty(i)) { vi = a0[i]; if (!_isPlainObject(vi) && !this.alwaysUseJson) { s.setItem(i, vi); } else { s.setItem(i, JSON.stringify(vi)); } } } return a0; } else if (l == 2) { // If only 2 arguments, set value of storage directly if (typeof a1 === 'object' || this.alwaysUseJson) { s.setItem(a0, JSON.stringify(a1)); } else { s.setItem(a0, a1); } return a1; } else { // If more than 3 arguments, parse storage to retrieve final node and set value // Get first level try { tmp = s.getItem(a0); if (tmp != null) { to_store = JSON.parse(tmp); } } catch (e) { } tmp = to_store; // Parse next levels and set value for (i = 1; i < l - 2; i++) { vi = a[i]; type = isNaN(a[i + 1]) ? "object" : "array"; if (!tmp[vi] || type == "object" && !_isPlainObject(tmp[vi]) || type == "array" && !Array.isArray(tmp[vi])) { if (type == "array") tmp[vi] = []; else tmp[vi] = {}; } tmp = tmp[vi]; } tmp[a[i]] = a[i + 1]; s.setItem(a0, JSON.stringify(to_store)); return to_store; } } // Remove items from a storage function _remove() { var storage = this._type, l = arguments.length, s = window[storage], a = arguments, a0 = a[0], to_store, tmp, i, j; if (l < 1) { throw new Error('Minimum 1 argument must be given'); } else if (Array.isArray(a0)) { // If first argument is an array, remove values from storage for each item of this array for (i in a0) { if (a0.hasOwnProperty(i)) { s.removeItem(a0[i]); } } return true; } else if (l == 1) { // If only 2 arguments, remove value from storage directly s.removeItem(a0); return true; } else { // If more than 2 arguments, parse storage to retrieve final node and remove value // Get first level try { to_store = tmp = JSON.parse(s.getItem(a0)); } catch (e) { throw new ReferenceError(a0 + ' is not defined in this storage'); } // Parse next levels and remove value for (i = 1; i < l - 1; i++) { tmp = tmp[a[i]]; if (tmp === undefined) { throw new ReferenceError([].slice.call(a, 1, i).join('.') + ' is not defined in this storage'); } } // If last argument is an array,remove value for each item in this array // Else remove value normally if (Array.isArray(a[i])) { for (j in a[i]) { if (a[i].hasOwnProperty(j)) { delete tmp[a[i][j]]; } } } else { delete tmp[a[i]]; } s.setItem(a0, JSON.stringify(to_store)); return true; } } // Remove all items from a storage function _removeAll(reinit_ns) { var keys = _keys.call(this), i; for (i in keys) { if (keys.hasOwnProperty(i)) { _remove.call(this, keys[i]); } } // Reinitialize all namespace storages if (reinit_ns) { for (i in apis.namespaceStorages) { if (apis.namespaceStorages.hasOwnProperty(i)) { _createNamespace(i); } } } } // Check if items of a storage are empty function _isEmpty() { var l = arguments.length, a = arguments, a0 = a[0], i; if (l == 0) { // If no argument, test if storage is empty return (_keys.call(this).length == 0); } else if (Array.isArray(a0)) { // If first argument is an array, test each item of this array and return true only if all items are empty for (i = 0; i < a0.length; i++) { if (!_isEmpty.call(this, a0[i])) { return false; } } return true; } else { // If at least 1 argument, try to get value and test it try { var v = _get.apply(this, arguments); // Convert result to an object (if last argument is an array, _get return already an object) and test each item if (!Array.isArray(a[l - 1])) { v = {'totest': v}; } for (i in v) { if (v.hasOwnProperty(i) && !( (_isPlainObject(v[i]) && _isEmptyObject(v[i])) || (Array.isArray(v[i]) && !v[i].length) || (typeof v[i] !== 'boolean' && !v[i]) )) { return false; } } return true; } catch (e) { return true; } } } // Check if items of a storage exist function _isSet() { var l = arguments.length, a = arguments, a0 = a[0], i; if (l < 1) { throw new Error('Minimum 1 argument must be given'); } if (Array.isArray(a0)) { // If first argument is an array, test each item of this array and return true only if all items exist for (i = 0; i < a0.length; i++) { if (!_isSet.call(this, a0[i])) { return false; } } return true; } else { // For other case, try to get value and test it try { var v = _get.apply(this, arguments); // Convert result to an object (if last argument is an array, _get return already an object) and test each item if (!Array.isArray(a[l - 1])) { v = {'totest': v}; } for (i in v) { if (v.hasOwnProperty(i) && !(v[i] !== undefined && v[i] !== null)) { return false; } } return true; } catch (e) { return false; } } } // Get keys of a storage or of an item of the storage function _keys() { var storage = this._type, l = arguments.length, s = window[storage], keys = [], o = {}; // If at least 1 argument, get value from storage to retrieve keys // Else, use storage to retrieve keys if (l > 0) { o = _get.apply(this, arguments); } else { o = s; } if (o && o._cookie) { // If storage is a cookie, use js-cookie to retrieve keys var cookies = Cookies.get(); for (var key in cookies) { if (cookies.hasOwnProperty(key) && key != '') { keys.push(key.replace(o._prefix, '')); } } } else { for (var i in o) { if (o.hasOwnProperty(i)) { keys.push(i); } } } return keys; } // Create new namespace storage function _createNamespace(name) { if (!name || typeof name != "string") { throw new Error('First parameter must be a string'); } if (storage_available) { if (!window.localStorage.getItem(name)) { window.localStorage.setItem(name, '{}'); } if (!window.sessionStorage.getItem(name)) { window.sessionStorage.setItem(name, '{}'); } } else { if (!window.localCookieStorage.getItem(name)) { window.localCookieStorage.setItem(name, '{}'); } if (!window.sessionCookieStorage.getItem(name)) { window.sessionCookieStorage.setItem(name, '{}'); } } var ns = { localStorage: _extend({}, apis.localStorage, {_ns: name}), sessionStorage: _extend({}, apis.sessionStorage, {_ns: name}) }; if (cookies_available) { if (!window.cookieStorage.getItem(name)) { window.cookieStorage.setItem(name, '{}'); } ns.cookieStorage = _extend({}, apis.cookieStorage, {_ns: name}); } apis.namespaceStorages[name] = ns; return ns; } // Test if storage is natively available on browser function _testStorage(name) { var foo = 'jsapi'; try { if (!window[name]) { return false; } window[name].setItem(foo, foo); window[name].removeItem(foo); return true; } catch (e) { return false; } } // Test if a variable is a plain object (from jQuery) function _isPlainObject(obj) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects if (!obj || toString.call(obj) !== "[object Object]") { return false; } proto = getProto(obj); // Objects with no prototype (e.g., `Object.create( null )`) are plain if (!proto) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function Ctor = hasOwn.call(proto, "constructor") && proto.constructor; return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString; } // Test if a variable is an empty object (from jQuery) function _isEmptyObject(obj) { var name; for (name in obj) { return false; } return true; } // Merge objects function _extend() { var i = 1; var result = arguments[0]; for (; i < arguments.length; i++) { var attributes = arguments[i]; for (var key in attributes) { if (attributes.hasOwnProperty(key)) { result[key] = attributes[key]; } } } return result; } // Check if storages are natively available on browser and check is js-cookie is present var storage_available = _testStorage('localStorage'); var cookies_available = typeof Cookies !== 'undefined'; // Namespace object var storage = { _type: '', _ns: '', _callMethod: function (f, a) { a = Array.prototype.slice.call(a); var p = [], a0 = a[0]; if (this._ns) { p.push(this._ns); } if (typeof a0 === 'string' && a0.indexOf('.') !== -1) { a.shift(); [].unshift.apply(a, a0.split('.')); } [].push.apply(p, a); return f.apply(this, p); }, // Define if plugin always use JSON to store values (even to store simple values like string, int...) or not alwaysUseJson: false, // Get items. If no parameters and storage have a namespace, return all namespace get: function () { if (!storage_available && !cookies_available){ return null; } return this._callMethod(_get, arguments); }, // Set items set: function () { var l = arguments.length, a = arguments, a0 = a[0]; if (l < 1 || !_isPlainObject(a0) && l < 2) { throw new Error('Minimum 2 arguments must be given or first parameter must be an object'); } if (!storage_available && !cookies_available){ return null; } // If first argument is an object and storage is a namespace storage, set values individually if (_isPlainObject(a0) && this._ns) { for (var i in a0) { if (a0.hasOwnProperty(i)) { this._callMethod(_set, [i, a0[i]]); } } return a0; } else { var r = this._callMethod(_set, a); if (this._ns) { return r[a0.split('.')[0]]; } else { return r; } } }, // Delete items remove: function () { if (arguments.length < 1) { throw new Error('Minimum 1 argument must be given'); } if (!storage_available && !cookies_available){ return null; } return this._callMethod(_remove, arguments); }, // Delete all items removeAll: function (reinit_ns) { if (!storage_available && !cookies_available){ return null; } if (this._ns) { this._callMethod(_set, [{}]); return true; } else { return this._callMethod(_removeAll, [reinit_ns]); } }, // Items empty isEmpty: function () { if (!storage_available && !cookies_available){ return null; } return this._callMethod(_isEmpty, arguments); }, // Items exists isSet: function () { if (arguments.length < 1) { throw new Error('Minimum 1 argument must be given'); } if (!storage_available && !cookies_available){ return null; } return this._callMethod(_isSet, arguments); }, // Get keys of items keys: function () { if (!storage_available && !cookies_available){ return null; } return this._callMethod(_keys, arguments); } }; // Use js-cookie for compatibility with old browsers and give access to cookieStorage if (cookies_available) { // sessionStorage is valid for one window/tab. To simulate that with cookie, we set a name for the window and use it for the name of the cookie if (!window.name) { window.name = Math.floor(Math.random() * 100000000); } var cookie_storage = { _cookie: true, _prefix: '', _expires: null, _path: null, _domain: null, _secure: false, setItem: function (n, v) { Cookies.set(this._prefix + n, v, {expires: this._expires, path: this._path, domain: this._domain, secure: this._secure}); }, getItem: function (n) { return Cookies.get(this._prefix + n); }, removeItem: function (n) { return Cookies.remove(this._prefix + n, {path: this._path}); }, clear: function () { var cookies = Cookies.get(); for (var key in cookies) { if (cookies.hasOwnProperty(key) && key != '') { if (!this._prefix && key.indexOf(cookie_local_prefix) === -1 && key.indexOf(cookie_session_prefix) === -1 || this._prefix && key.indexOf(this._prefix) === 0) { Cookies.remove(key); } } } }, setExpires: function (e) { this._expires = e; return this; }, setPath: function (p) { this._path = p; return this; }, setDomain: function (d) { this._domain = d; return this; }, setSecure: function (s) { this._secure = s; return this; }, setConf: function (c) { if (c.path) { this._path = c.path; } if (c.domain) { this._domain = c.domain; } if (c.secure) { this._secure = c.secure; } if (c.expires) { this._expires = c.expires; } return this; }, setDefaultConf: function () { this._path = this._domain = this._expires = null; this._secure = false; } }; if (!storage_available) { window.localCookieStorage = _extend({}, cookie_storage, { _prefix: cookie_local_prefix, _expires: 365 * 10, _secure: true }); window.sessionCookieStorage = _extend({}, cookie_storage, { _prefix: cookie_session_prefix + window.name + '_', _secure: true }); } window.cookieStorage = _extend({}, cookie_storage); // cookieStorage API apis.cookieStorage = _extend({}, storage, { _type: 'cookieStorage', setExpires: function (e) { window.cookieStorage.setExpires(e); return this; }, setPath: function (p) { window.cookieStorage.setPath(p); return this; }, setDomain: function (d) { window.cookieStorage.setDomain(d); return this; }, setSecure: function (s) { window.cookieStorage.setSecure(s); return this; }, setConf: function (c) { window.cookieStorage.setConf(c); return this; }, setDefaultConf: function () { window.cookieStorage.setDefaultConf(); return this; } }); } // Get a new API on a namespace apis.initNamespaceStorage = function (ns) { return _createNamespace(ns); }; if (storage_available) { // localStorage API apis.localStorage = _extend({}, storage, {_type: 'localStorage'}); // sessionStorage API apis.sessionStorage = _extend({}, storage, {_type: 'sessionStorage'}); } else { // localStorage API apis.localStorage = _extend({}, storage, {_type: 'localCookieStorage'}); // sessionStorage API apis.sessionStorage = _extend({}, storage, {_type: 'sessionCookieStorage'}); } // List of all namespace storage apis.namespaceStorages = {}; // Remove all items in all storages apis.removeAllStorages = function (reinit_ns) { apis.localStorage.removeAll(reinit_ns); apis.sessionStorage.removeAll(reinit_ns); if (apis.cookieStorage) { apis.cookieStorage.removeAll(reinit_ns); } if (!reinit_ns) { apis.namespaceStorages = {}; } }; // About alwaysUseJson // By default, all values are string on html storages and the plugin don't use json to store simple values (strings, int, float...) // So by default, if you do storage.setItem('test',2), value in storage will be "2", not 2 // If you set this property to true, all values set with the plugin will be stored as json to have typed values in any cases apis.alwaysUseJsonInStorage = function (value) { storage.alwaysUseJson = value; apis.localStorage.alwaysUseJson = value; apis.sessionStorage.alwaysUseJson = value; if (apis.cookieStorage) { apis.cookieStorage.alwaysUseJson = value; } }; return apis; })); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/pace.js�������������������������������������������������������������0000664�0000000�0000000�00000062414�14136337723�0017632�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * pace.js v1.2.4 * https://github.com/CodeByZach/pace/ * Licensed MIT © HubSpot, Inc. */ (function() { var AjaxMonitor, Bar, DocumentMonitor, ElementMonitor, ElementTracker, EventLagMonitor, Evented, Events, NoTargetError, Pace, RequestIntercept, SOURCE_KEYS, Scaler, SocketRequestTracker, XHRRequestTracker, addEventListener, animation, avgAmplitude, bar, cancelAnimation, cancelAnimationFrame, defaultOptions, extend, extendNative, getFromDOM, getIntercept, handlePushState, ignoreStack, init, now, options, requestAnimationFrame, result, runAnimation, scalers, shouldIgnoreURL, shouldTrack, source, sources, uniScaler, _WebSocket, _XDomainRequest, _XMLHttpRequest, _i, _intercept, _len, _pushState, _ref, _ref1, _replaceState, __slice = [].slice, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; defaultOptions = { className: '', catchupTime: 100, initialRate: .03, minTime: 250, ghostTime: 100, maxProgressPerFrame: 20, easeFactor: 1.25, startOnPageLoad: true, restartOnPushState: true, restartOnRequestAfter: 500, target: 'body', elements: { checkInterval: 100, selectors: ['body'] }, eventLag: { minSamples: 10, sampleCount: 3, lagThreshold: 3 }, ajax: { trackMethods: ['GET'], trackWebSockets: true, ignoreURLs: [] } }; now = function() { var _ref; return (_ref = typeof performance !== "undefined" && performance !== null ? typeof performance.now === "function" ? performance.now() : void 0 : void 0) != null ? _ref : +(new Date); }; requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame; addEventListener = function(obj, event, callback) { if (typeof obj.addEventListener === "function") { return obj.addEventListener(event, callback, false); } else { return function() { if (typeof obj["on" + event] !== "function" || typeof obj["on" + event].eventListeners !== "object") { var eventListeners = new Events(); if (typeof obj["on" + event] === "function") { eventListeners.on(event, obj["on" + event]); } obj["on" + event] = function(evt) { return eventListeners.trigger(event, evt); }; obj["on" + event].eventListeners = eventListeners; } else { var eventListeners = obj["on" + event].eventListeners; } eventListeners.on(event, callback); }(); } }; if (requestAnimationFrame == null) { requestAnimationFrame = function(fn) { return setTimeout(fn, 50); }; cancelAnimationFrame = function(id) { return clearTimeout(id); }; } runAnimation = function(fn) { var last, tick; last = now(); tick = function() { var diff; diff = now() - last; if (diff >= 33) { last = now(); return fn(diff, function() { return requestAnimationFrame(tick); }); } else { return setTimeout(tick, 33 - diff); } }; return tick(); }; result = function() { var args, key, obj; obj = arguments[0], key = arguments[1], args = 3 <= arguments.length ? __slice.call(arguments, 2) : []; if (typeof obj[key] === 'function') { return obj[key].apply(obj, args); } else { return obj[key]; } }; extend = function() { var key, out, source, sources, val, _i, _len; out = arguments[0], sources = 2 <= arguments.length ? __slice.call(arguments, 1) : []; for (_i = 0, _len = sources.length; _i < _len; _i++) { source = sources[_i]; if (source) { for (key in source) { if (!__hasProp.call(source, key)) continue; val = source[key]; if ((out[key] != null) && typeof out[key] === 'object' && (val != null) && typeof val === 'object') { extend(out[key], val); } else { out[key] = val; } } } } return out; }; avgAmplitude = function(arr) { var count, sum, v, _i, _len; sum = count = 0; for (_i = 0, _len = arr.length; _i < _len; _i++) { v = arr[_i]; sum += Math.abs(v); count++; } return sum / count; }; getFromDOM = function(key, json) { var data, e, el; if (key == null) { key = 'options'; } if (json == null) { json = true; } el = document.querySelector("[data-pace-" + key + "]"); if (!el) { return; } data = el.getAttribute("data-pace-" + key); if (!json) { return data; } try { return JSON.parse(data); } catch (_error) { e = _error; return typeof console !== "undefined" && console !== null ? console.error("Error parsing inline pace options", e) : void 0; } }; Evented = (function() { function Evented() {} Evented.prototype.on = function(event, handler, ctx, once) { var _base; if (once == null) { once = false; } if (this.bindings == null) { this.bindings = {}; } if ((_base = this.bindings)[event] == null) { _base[event] = []; } return this.bindings[event].push({ handler: handler, ctx: ctx, once: once }); }; Evented.prototype.once = function(event, handler, ctx) { return this.on(event, handler, ctx, true); }; Evented.prototype.off = function(event, handler) { var i, _ref, _results; if (((_ref = this.bindings) != null ? _ref[event] : void 0) == null) { return; } if (handler == null) { return delete this.bindings[event]; } else { i = 0; _results = []; while (i < this.bindings[event].length) { if (this.bindings[event][i].handler === handler) { _results.push(this.bindings[event].splice(i, 1)); } else { _results.push(i++); } } return _results; } }; Evented.prototype.trigger = function() { var args, ctx, event, handler, i, once, _ref, _ref1, _results; event = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; if ((_ref = this.bindings) != null ? _ref[event] : void 0) { i = 0; _results = []; while (i < this.bindings[event].length) { _ref1 = this.bindings[event][i], handler = _ref1.handler, ctx = _ref1.ctx, once = _ref1.once; handler.apply(ctx != null ? ctx : this, args); if (once) { _results.push(this.bindings[event].splice(i, 1)); } else { _results.push(i++); } } return _results; } }; return Evented; })(); Pace = window.Pace || {}; window.Pace = Pace; extend(Pace, Evented.prototype); options = Pace.options = extend({}, defaultOptions, window.paceOptions, getFromDOM()); _ref = ['ajax', 'document', 'eventLag', 'elements']; for (_i = 0, _len = _ref.length; _i < _len; _i++) { source = _ref[_i]; if (options[source] === true) { options[source] = defaultOptions[source]; } } NoTargetError = (function(_super) { __extends(NoTargetError, _super); function NoTargetError() { _ref1 = NoTargetError.__super__.constructor.apply(this, arguments); return _ref1; } return NoTargetError; })(Error); Bar = (function() { function Bar() { this.progress = 0; } Bar.prototype.getElement = function() { var targetElement; if (this.el == null) { targetElement = document.querySelector(options.target); if (!targetElement) { throw new NoTargetError; } this.el = document.createElement('div'); this.el.className = "pace pace-active"; document.body.className = document.body.className.replace(/(pace-done )|/, 'pace-running '); var _custom_class_name = (options.className !== '') ? ' '+options.className : ''; this.el.innerHTML = '<div class="pace-progress'+_custom_class_name+'">\n <div class="pace-progress-inner"></div>\n</div>\n<div class="pace-activity"></div>'; if (targetElement.firstChild != null) { targetElement.insertBefore(this.el, targetElement.firstChild); } else { targetElement.appendChild(this.el); } } return this.el; }; Bar.prototype.finish = function() { var el; el = this.getElement(); el.className = el.className.replace('pace-active', 'pace-inactive'); return document.body.className = document.body.className.replace('pace-running ', 'pace-done '); }; Bar.prototype.update = function(prog) { this.progress = prog; Pace.trigger('progress', prog); return this.render(); }; Bar.prototype.destroy = function() { try { this.getElement().parentNode.removeChild(this.getElement()); } catch (_error) { NoTargetError = _error; } return this.el = void 0; }; Bar.prototype.render = function() { var el, key, progressStr, transform, _j, _len1, _ref2; if (document.querySelector(options.target) == null) { return false; } el = this.getElement(); transform = "translate3d(" + this.progress + "%, 0, 0)"; _ref2 = ['webkitTransform', 'msTransform', 'transform']; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { key = _ref2[_j]; el.children[0].style[key] = transform; } if (!this.lastRenderedProgress || this.lastRenderedProgress | 0 !== this.progress | 0) { el.children[0].setAttribute('data-progress-text', "" + (this.progress | 0) + "%"); if (this.progress >= 100) { progressStr = '99'; } else { progressStr = this.progress < 10 ? "0" : ""; progressStr += this.progress | 0; } el.children[0].setAttribute('data-progress', "" + progressStr); } Pace.trigger('change', this.progress); return this.lastRenderedProgress = this.progress; }; Bar.prototype.done = function() { return this.progress >= 100; }; return Bar; })(); Events = (function() { function Events() { this.bindings = {}; } Events.prototype.trigger = function(name, val) { var binding, _j, _len1, _ref2, _results; if (this.bindings[name] != null) { _ref2 = this.bindings[name]; _results = []; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { binding = _ref2[_j]; _results.push(binding.call(this, val)); } return _results; } }; Events.prototype.on = function(name, fn) { var _base; if ((_base = this.bindings)[name] == null) { _base[name] = []; } return this.bindings[name].push(fn); }; return Events; })(); _XMLHttpRequest = window.XMLHttpRequest; _XDomainRequest = window.XDomainRequest; _WebSocket = window.WebSocket; extendNative = function(to, from) { var e, key, _results; _results = []; for (key in from.prototype) { try { if ((to[key] == null) && typeof from[key] !== 'function') { if (typeof Object.defineProperty === 'function') { _results.push(Object.defineProperty(to, key, { get: (function(key) { return function() { return from.prototype[key]; }; })(key), configurable: true, enumerable: true })); } else { _results.push(to[key] = from.prototype[key]); } } else { _results.push(void 0); } } catch (_error) { e = _error; } } return _results; }; ignoreStack = []; Pace.ignore = function() { var args, fn, ret; fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; ignoreStack.unshift('ignore'); ret = fn.apply(null, args); ignoreStack.shift(); return ret; }; Pace.track = function() { var args, fn, ret; fn = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; ignoreStack.unshift('track'); ret = fn.apply(null, args); ignoreStack.shift(); return ret; }; shouldTrack = function(method) { var _ref2; if (method == null) { method = 'GET'; } if (ignoreStack[0] === 'track') { return 'force'; } if (!ignoreStack.length && options.ajax) { if (method === 'socket' && options.ajax.trackWebSockets) { return true; } else if (_ref2 = method.toUpperCase(), __indexOf.call(options.ajax.trackMethods, _ref2) >= 0) { return true; } } return false; }; RequestIntercept = (function(_super) { __extends(RequestIntercept, _super); function RequestIntercept() { var monitorXHR, _this = this; RequestIntercept.__super__.constructor.apply(this, arguments); monitorXHR = function(req) { var _open; _open = req.open; return req.open = function(type, url, async) { if (shouldTrack(type)) { _this.trigger('request', { type: type, url: url, request: req }); } return _open.apply(req, arguments); }; }; window.XMLHttpRequest = function(flags) { var req; req = new _XMLHttpRequest(flags); monitorXHR(req); return req; }; try { extendNative(window.XMLHttpRequest, _XMLHttpRequest); } catch (_error) {} if (_XDomainRequest != null) { window.XDomainRequest = function() { var req; req = new _XDomainRequest; monitorXHR(req); return req; }; try { extendNative(window.XDomainRequest, _XDomainRequest); } catch (_error) {} } if ((_WebSocket != null) && options.ajax.trackWebSockets) { window.WebSocket = function(url, protocols) { var req; if (protocols != null) { req = new _WebSocket(url, protocols); } else { req = new _WebSocket(url); } if (shouldTrack('socket')) { _this.trigger('request', { type: 'socket', url: url, protocols: protocols, request: req }); } return req; }; try { extendNative(window.WebSocket, _WebSocket); } catch (_error) {} } } return RequestIntercept; })(Events); _intercept = null; getIntercept = function() { if (_intercept == null) { _intercept = new RequestIntercept; } return _intercept; }; shouldIgnoreURL = function(url) { var pattern, _j, _len1, _ref2; _ref2 = options.ajax.ignoreURLs; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { pattern = _ref2[_j]; if (typeof pattern === 'string') { if (url.indexOf(pattern) !== -1) { return true; } } else { if (pattern.test(url)) { return true; } } } return false; }; getIntercept().on('request', function(_arg) { var after, args, request, type, url; type = _arg.type, request = _arg.request, url = _arg.url; if (shouldIgnoreURL(url)) { return; } if (!Pace.running && (options.restartOnRequestAfter !== false || shouldTrack(type) === 'force')) { args = arguments; after = options.restartOnRequestAfter || 0; if (typeof after === 'boolean') { after = 0; } return setTimeout(function() { var stillActive, _j, _len1, _ref2, _ref3, _results; if (type === 'socket') { stillActive = request.readyState < 1; } else { stillActive = (0 < (_ref2 = request.readyState) && _ref2 < 4); } if (stillActive) { Pace.restart(); _ref3 = Pace.sources; _results = []; for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { source = _ref3[_j]; if (source instanceof AjaxMonitor) { source.watch.apply(source, args); break; } else { _results.push(void 0); } } return _results; } }, after); } }); AjaxMonitor = (function() { function AjaxMonitor() { this.complete = __bind(this.complete, this); var _this = this; this.elements = []; getIntercept().on('request', function() { return _this.watch.apply(_this, arguments); }); } AjaxMonitor.prototype.watch = function(_arg) { var request, tracker, type, url; type = _arg.type, request = _arg.request, url = _arg.url; if (shouldIgnoreURL(url)) { return; } if (type === 'socket') { tracker = new SocketRequestTracker(request, this.complete); } else { tracker = new XHRRequestTracker(request, this.complete); } return this.elements.push(tracker); }; AjaxMonitor.prototype.complete = function(tracker) { return this.elements = this.elements.filter(function(e) { return e !== tracker; }); }; return AjaxMonitor; })(); XHRRequestTracker = (function() { function XHRRequestTracker(request, completeCallback) { var event, size, _j, _len1, _onreadystatechange, _ref2, _this = this; this.progress = 0; if (window.ProgressEvent != null) { size = null; addEventListener(request, 'progress', function(evt) { if (evt.lengthComputable) { return _this.progress = 100 * evt.loaded / evt.total; } else { return _this.progress = _this.progress + (100 - _this.progress) / 2; } }, false); _ref2 = ['load', 'abort', 'timeout', 'error']; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { event = _ref2[_j]; addEventListener(request, event, function() { completeCallback(_this); return _this.progress = 100; }, false); } } else { _onreadystatechange = request.onreadystatechange; request.onreadystatechange = function() { var _ref3; if ((_ref3 = request.readyState) === 0 || _ref3 === 4) { completeCallback(_this); _this.progress = 100; } else if (request.readyState === 3) { _this.progress = 50; } return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; }; } } return XHRRequestTracker; })(); SocketRequestTracker = (function() { function SocketRequestTracker(request, completeCallback) { var event, _j, _len1, _ref2, _this = this; this.progress = 0; _ref2 = ['error', 'open']; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { event = _ref2[_j]; addEventListener(request, event, function() { completeCallback(_this); return _this.progress = 100; }, false); } } return SocketRequestTracker; })(); ElementMonitor = (function() { function ElementMonitor(options) { var selector, _j, _len1, _ref2; if (options == null) { options = {}; } this.complete = __bind(this.complete, this); this.elements = []; if (options.selectors == null) { options.selectors = []; } _ref2 = options.selectors; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { selector = _ref2[_j]; this.elements.push(new ElementTracker(selector, this.complete)); } } ElementMonitor.prototype.complete = function(tracker) { return this.elements = this.elements.filter(function(e) { return e !== tracker; }); }; return ElementMonitor; })(); ElementTracker = (function() { function ElementTracker(selector, completeCallback) { this.selector = selector; this.completeCallback = completeCallback; this.progress = 0; this.check(); } ElementTracker.prototype.check = function() { var _this = this; if (document.querySelector(this.selector)) { return this.done(); } else { return setTimeout((function() { return _this.check(); }), options.elements.checkInterval); } }; ElementTracker.prototype.done = function() { this.completeCallback(this); this.completeCallback = null; return this.progress = 100; }; return ElementTracker; })(); DocumentMonitor = (function() { DocumentMonitor.prototype.states = { loading: 0, interactive: 50, complete: 100 }; function DocumentMonitor() { var _onreadystatechange, _ref2, _this = this; this.progress = (_ref2 = this.states[document.readyState]) != null ? _ref2 : 100; _onreadystatechange = document.onreadystatechange; document.onreadystatechange = function() { if (_this.states[document.readyState] != null) { _this.progress = _this.states[document.readyState]; } return typeof _onreadystatechange === "function" ? _onreadystatechange.apply(null, arguments) : void 0; }; } return DocumentMonitor; })(); EventLagMonitor = (function() { function EventLagMonitor() { var avg, interval, last, points, samples, _this = this; this.progress = 0; avg = 0; samples = []; points = 0; last = now(); interval = setInterval(function() { var diff; diff = now() - last - 50; last = now(); samples.push(diff); if (samples.length > options.eventLag.sampleCount) { samples.shift(); } avg = avgAmplitude(samples); if (++points >= options.eventLag.minSamples && avg < options.eventLag.lagThreshold) { _this.progress = 100; return clearInterval(interval); } else { return _this.progress = 100 * (3 / (avg + 3)); } }, 50); } return EventLagMonitor; })(); Scaler = (function() { function Scaler(source) { this.source = source; this.last = this.sinceLastUpdate = 0; this.rate = options.initialRate; this.catchup = 0; this.progress = this.lastProgress = 0; if (this.source != null) { this.progress = result(this.source, 'progress'); } } Scaler.prototype.tick = function(frameTime, val) { var scaling; if (val == null) { val = result(this.source, 'progress'); } if (val >= 100) { this.done = true; } if (val === this.last) { this.sinceLastUpdate += frameTime; } else { if (this.sinceLastUpdate) { this.rate = (val - this.last) / this.sinceLastUpdate; } this.catchup = (val - this.progress) / options.catchupTime; this.sinceLastUpdate = 0; this.last = val; } if (val > this.progress) { this.progress += this.catchup * frameTime; } scaling = 1 - Math.pow(this.progress / 100, options.easeFactor); this.progress += scaling * this.rate * frameTime; this.progress = Math.min(this.lastProgress + options.maxProgressPerFrame, this.progress); this.progress = Math.max(0, this.progress); this.progress = Math.min(100, this.progress); this.lastProgress = this.progress; return this.progress; }; return Scaler; })(); sources = null; scalers = null; bar = null; uniScaler = null; animation = null; cancelAnimation = null; Pace.running = false; handlePushState = function() { if (options.restartOnPushState) { return Pace.restart(); } }; if (window.history.pushState != null) { _pushState = window.history.pushState; window.history.pushState = function() { handlePushState(); return _pushState.apply(window.history, arguments); }; } if (window.history.replaceState != null) { _replaceState = window.history.replaceState; window.history.replaceState = function() { handlePushState(); return _replaceState.apply(window.history, arguments); }; } SOURCE_KEYS = { ajax: AjaxMonitor, elements: ElementMonitor, document: DocumentMonitor, eventLag: EventLagMonitor }; (init = function() { var type, _j, _k, _len1, _len2, _ref2, _ref3, _ref4; Pace.sources = sources = []; _ref2 = ['ajax', 'elements', 'document', 'eventLag']; for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { type = _ref2[_j]; if (options[type] !== false) { sources.push(new SOURCE_KEYS[type](options[type])); } } _ref4 = (_ref3 = options.extraSources) != null ? _ref3 : []; for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { source = _ref4[_k]; sources.push(new source(options)); } Pace.bar = bar = new Bar; scalers = []; return uniScaler = new Scaler; })(); Pace.stop = function() { Pace.trigger('stop'); Pace.running = false; bar.destroy(); cancelAnimation = true; if (animation != null) { if (typeof cancelAnimationFrame === "function") { cancelAnimationFrame(animation); } animation = null; } return init(); }; Pace.restart = function() { Pace.trigger('restart'); Pace.stop(); return Pace.start(); }; Pace.go = function() { var start; Pace.running = true; bar.render(); start = now(); cancelAnimation = false; return animation = runAnimation(function(frameTime, enqueueNextFrame) { var avg, count, done, element, elements, i, j, remaining, scaler, scalerList, sum, _j, _k, _len1, _len2, _ref2; remaining = 100 - bar.progress; count = sum = 0; done = true; for (i = _j = 0, _len1 = sources.length; _j < _len1; i = ++_j) { source = sources[i]; scalerList = scalers[i] != null ? scalers[i] : scalers[i] = []; elements = (_ref2 = source.elements) != null ? _ref2 : [source]; for (j = _k = 0, _len2 = elements.length; _k < _len2; j = ++_k) { element = elements[j]; scaler = scalerList[j] != null ? scalerList[j] : scalerList[j] = new Scaler(element); done &= scaler.done; if (scaler.done) { continue; } count++; sum += scaler.tick(frameTime); } } avg = sum / count; bar.update(uniScaler.tick(frameTime, avg)); if (bar.done() || done || cancelAnimation) { bar.update(100); Pace.trigger('done'); return setTimeout(function() { bar.finish(); Pace.running = false; return Pace.trigger('hide'); }, Math.max(options.ghostTime, Math.max(options.minTime - (now() - start), 0))); } else { return enqueueNextFrame(); } }); }; Pace.start = function(_options) { extend(options, _options); Pace.running = true; try { bar.render(); } catch (_error) { NoTargetError = _error; } if (!document.querySelector('.pace')) { return setTimeout(Pace.start, 50); } else { Pace.trigger('start'); return Pace.go(); } }; if (typeof define === 'function' && define.amd) { define(function() { return Pace; }); } else if (typeof exports === 'object') { module.exports = Pace; } else { if (options.startOnPageLoad) { Pace.start(); } } }).call(this);����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/js/screenfull.js�������������������������������������������������������0000664�0000000�0000000�00000006714�14136337723�0021065�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * screenfull * v3.3.3 - 2018-09-04 * (c) Sindre Sorhus; MIT License */ (function () { 'use strict'; var document = typeof window !== 'undefined' && typeof window.document !== 'undefined' ? window.document : {}; var isCommonjs = typeof module !== 'undefined' && module.exports; var keyboardAllowed = typeof Element !== 'undefined' && 'ALLOW_KEYBOARD_INPUT' in Element; var fn = (function () { var val; var fnMap = [ [ 'requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror' ], // New WebKit [ 'webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror' ], // Old WebKit (Safari 5.1) [ 'webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror' ], [ 'mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror' ], [ 'msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError' ] ]; var i = 0; var l = fnMap.length; var ret = {}; for (; i < l; i++) { val = fnMap[i]; if (val && val[1] in document) { for (i = 0; i < val.length; i++) { ret[fnMap[0][i]] = val[i]; } return ret; } } return false; })(); var eventNameMap = { change: fn.fullscreenchange, error: fn.fullscreenerror }; var screenfull = { request: function (elem) { var request = fn.requestFullscreen; elem = elem || document.documentElement; // Work around Safari 5.1 bug: reports support for // keyboard in fullscreen even though it doesn't. // Browser sniffing, since the alternative with // setTimeout is even worse. if (/ Version\/5\.1(?:\.\d+)? Safari\//.test(navigator.userAgent)) { elem[request](); } else { elem[request](keyboardAllowed ? Element.ALLOW_KEYBOARD_INPUT : {}); } }, exit: function () { document[fn.exitFullscreen](); }, toggle: function (elem) { if (this.isFullscreen) { this.exit(); } else { this.request(elem); } }, onchange: function (callback) { this.on('change', callback); }, onerror: function (callback) { this.on('error', callback); }, on: function (event, callback) { var eventName = eventNameMap[event]; if (eventName) { document.addEventListener(eventName, callback, false); } }, off: function (event, callback) { var eventName = eventNameMap[event]; if (eventName) { document.removeEventListener(eventName, callback, false); } }, raw: fn }; if (!fn) { if (isCommonjs) { module.exports = false; } else { window.screenfull = false; } return; } Object.defineProperties(screenfull, { isFullscreen: { get: function () { return Boolean(document[fn.fullscreenElement]); } }, element: { enumerable: true, get: function () { return document[fn.fullscreenElement]; } }, enabled: { enumerable: true, get: function () { // Coerce to boolean in case of old WebKit return Boolean(document[fn.fullscreenEnabled]); } } }); if (isCommonjs) { module.exports = screenfull; } else { window.screenfull = screenfull; } })(); ����������������������������������������������������cacti-release-1.2.19/include/layout.js��������������������������������������������������������������0000664�0000000�0000000�00000352140�14136337723�0017621�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* +-------------------------------------------------------------------------+ | Copyright (C) 2004-2021 The Cacti Group | | | | 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. | +-------------------------------------------------------------------------+ | Cacti: The Complete RRDtool-based Graphing Solution | +-------------------------------------------------------------------------+ | This code is designed, written, and maintained by the Cacti Group. See | | about.php and/or the AUTHORS file for specific developer information. | +-------------------------------------------------------------------------+ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ const MESSAGE_LEVEL_NONE = 0; const MESSAGE_LEVEL_INFO = 1; const MESSAGE_LEVEL_WARN = 2; const MESSAGE_LEVEL_ERROR = 3; const MESSAGE_LEVEL_CSRF = 4; const MESSAGE_LEVEL_MIXED = 5; var theme; var myRefresh; var userMenuTimer; var userMenuOpenTimer = null; var graphMenuTimer; var graphMenuElement = 0; var pulsating = true; var pageLoaded = false; var shiftPressed = false; var sessionMessage = null; var sessionMessageOpen = null; var sessionMessageTimer = null; var myTitle; var myHref; var lastPage = null; var statePushed = false; var popFired = false; var hostInfoHeight = 0; var marginLeftTree = null; var marginLeftConsole = null; var minTreeWidth = null; var maxTreeWidth = null; var pageName; var columnsHidden = 0; var lastColumnsHidden = {}; var lastWidth = {}; var resizeDelta = 100; var resizeTime = 0; var resizeTimeout = false; var formArray; var pageWidth = null; var isHover = false; var hoverTimer = false; var previousMainWidth = null; var previousColumns = null; window.paceOptions = { ajax: true, document: true, elements: false, minTime: 400, startOnPageLoad: false, restartOnPushState: false, restartOnRequestAfter: 120, eventLag: false, }; window.onbeforeunload = renderLoading; function renderLoading () { Pace.stop(); Pace.bar.render(); } var isMobile = { Android: function() { return navigator.userAgent.match(/Android/i); }, BlackBerry: function() { return navigator.userAgent.match(/BlackBerry/i); }, iOS: function() { return navigator.userAgent.match(/iPhone|iPad|iPod/i); }, Opera: function() { return navigator.userAgent.match(/Opera Mini/i); }, Windows: function() { return navigator.userAgent.match(/IEMobile/i); }, any: function() { return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows()); } }; /* simple ajax request queueing */ jQuery.ajaxQ = (function(){ var id = 0, Q = {}; jQuery(document).ajaxSend(function(e, jqx){ jqx._id = ++id; Q[jqx._id] = jqx; }); jQuery(document).ajaxComplete(function(e, jqx){ delete Q[jqx._id]; }); return { abortAll: function(){ var r = []; jQuery.each(Q, function(i, jqx){ r.push(jqx._id); jqx.abort(); }); return r; } }; })(); /** basename - this function will return the basename * of the php script called * @args path - the document.url * @args suffix - remove the named suffix from the file */ function basename(path, suffix) { var b = path; var lastChar = b.charAt(b.length - 1); if (lastChar === '/' || lastChar === '\\\\') { b = b.slice(0, -1); } if (b.indexOf('?') > 0) { var questionPosition = b.indexOf('?'); b = b.slice(0, questionPosition); } b = b.replace(/^.*[\\/\\\\]/g, ''); if (suffix !== undefined && b.substr(b.length - suffix.length) == suffix) { b = b.substr(0, b.length - suffix.length); } return b; } /** getTimestampFromDate - Simple function to convert a MySQL Date * to a timestamp */ function getTimestampFromDate(dateStamp) { if (typeof(dateStamp) != 'undefined') { var dateParts = dateStamp.split(' '); var timeParts = dateParts[1].split(':'); dateParts = dateParts[0].split('-'); var date = new Date(dateParts[0], parseInt(dateParts[1], 10) - 1, dateParts[2], timeParts[0], timeParts[1]); return date.getTime() / 1000; } return ''; } /** base64_encode - Simple function to base64 encode a utf-8 string */ function base64_encode(string) { return btoa(unescape(encodeURIComponent(string))); } /** getQueryString - this function will return the value * of the get request variable defined as input. * @args name - the variable name to return */ function getQueryString(name) { var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search); return match && decodeURIComponent(match[1].replace(/\+/g, ' ')); } /** delayKeyup - this function will delay the keyup to * provide debouncing of input strokes on the keyboard * this preventing your backend server from becoming overloaded * usage: $("#yourid").delayKeyup(function(){ console.log('do something'); }, 500); * @args name - the variable name to return */ $.fn.delayKeyup = function(callback, ms){ var timer = 0; $(this).keyup(function(){ clearTimeout (timer); timer = setTimeout(callback, ms); }); return $(this); }; /** bindFirst - Function ensures that the event is found at the top * of the event stack. */ $.fn.bindFirst = function(which, handler) { var $el = $(this); $el.off(which, handler); $el.on(which, handler); var events = $._data($el[0]).events; var registered = events[which]; registered.unshift(registered.pop()); events[which] = registered; }; /** replaceOptions - function replaces the options in a select dropdown */ $.fn.replaceOptions = function(options, selected) { var self, $option; this.empty(); self = this; $.each(options, function(index, option) { if (selected == option.value) { $option = $('<option></option>') .attr('value', option.value) .prop('selected', true) .text(option.text); } else { $option = $('<option></option>') .attr('value', option.value) .text(option.text); } self.append($option); }); }; /** textWidth - This function will return the natural width of a string * without any wrapping. */ $.fn.textWidth = function(text){ var org = $(this); var html = $('<span style="display:none;white-space:nowrap;position:absolute;width:auto;left:-9999px">' + (text || org.text()) + '</span>'); if (!text) { html.css('font-family', org.css('font-family')); html.css('font-weight', org.css('font-weight')); html.css('font-size', org.css('font-size')); html.css('padding', org.css('padding')); html.css('margin', org.css('margin')); } $('body').append(html); var width = html.width(); html.remove(); return width; }; /** textBoxWidth - This function will return the natural width of a string * without any wrapping. */ $.fn.textBoxWidth = function() { var org = $(this); var html = $('<span style="display:none;white-space:nowrap;position:absolute;width:auto;left:-9999px">' + org.text() + '</span>'); html.css('font-family', org.css('font-family')); html.css('font-weight', org.css('font-weight')); html.css('font-size', org.css('font-size')); html.css('padding', org.css('padding')); html.css('margin', org.css('margin')); $('body').append(html); var width = html.width(); html.remove(); return width; }; /** classes - This function will return an array of all * classes of an element */ $.fn.classes = function(callback) { var classes = []; $.each(this, function(i, v) { var splitClassName = v.className.split(/\s+/); for (var j in splitClassName) { var className = splitClassName[j]; if (-1 === classes.indexOf(className)) { classes.push(className); } } }); if ('function' == typeof callback) { for (var i in classes) { callback(classes[i]); } } return classes; }; /** These three functions will set the cursor into * a textbox or textara and optionally select characters */ $.fn.setCursorPosition = function(position) { if (this.length == 0) return this; return this.setSelection(position, position); }; $.fn.selectRange = function(start, end) { if(!end) end = start; return this.each(function() { if (this.setSelectionRange) { this.focus(); this.setSelectionRange(start, end); } else if (this.createTextRange) { var range = this.createTextRange(); range.collapse(true); range.moveEnd('character', end); range.moveStart('character', start); range.select(); } }); //return this; }; $.fn.focusEnd = function() { this.setCursorPosition($(this).val().length); return this; }; $.fn.getObjectDetails = function() { var coords = {}; coords.width = $(this).outerWidth(); coords.height = $(this).outerHeight(); coords.left = 0; coords.top = 0; $(this).parentsUntil('body').each(function(){ coords.left += $(this).position().left; coords.top += $(this).position().top; }); return coords; }; $.fn.serializeForm = function() { var arrayData, objectData; arrayData = this.serializeArray(); formID = $(this).attr('id'); arrayData = arrayData.concat( $('#'+formID+' input[type=checkbox]:not(:checked)').map(function() { return {"name": this.name, "value": $(this).is(':checked') ? 'on':''} }).get()); objectData = {}; $.each(arrayData, function() { var value; if (this.value != null) { value = this.value; } else { value = ''; } if (objectData[this.name] != null) { if (!objectData[this.name].push) { objectData[this.name] = [objectData[this.name]]; } objectData[this.name].push(value); } else { objectData[this.name] = value; } }); return objectData; }; $.fn.serializeObject = function() { var arrayData, objectData, formID; arrayData = this.serializeArray(); formID = $(this).attr('id'); objectData = {}; $.each(arrayData, function() { var value; if (this.value != null) { value = this.value; } else { value = ''; } if (objectData[this.name] != null) { if (!objectData[this.name].push) { objectData[this.name] = [objectData[this.name]]; } objectData[this.name].push(value); } else { objectData[this.name] = value; } }); return objectData; }; // Borrowed from mustache.js function escapeString(string) { var entityMap = { '<': '<', '>': '>', '"': '"', "'": ''', '`': '`' }; return String(string).replace(/[<>"'`]/g, function fromEntityMap (s) { return entityMap[s]; }); } // Plugin to apply numeric format for tablesorter $.tablesorter.addParser({ id: 'numberFormat', is: function(s) { return /^[0-9]?[0-9,\.]*$/.test(s); }, format: function(s) { return $.tablesorter.formatFloat(s.replace(/,/g, '')); }, type: 'numeric' }); /** Mini jquery plugin to determine if an element has a scrollbar present */ (function($) { $.fn.hasScrollBar = function() { return this.get(0).scrollHeight > this.outerHeight(); }; })(jQuery); /** Mini jquery plugin to create a bind to show/hide events */ (function ($) { $.each(['show', 'hide'], function (i, ev) { var el = $.fn[ev]; $.fn[ev] = function () { this.trigger(ev); return el.apply(this, arguments); }; }); })(jQuery); // helper function which selects row range when shift key is pressed during click function updateCheckboxes(checkboxes, clicked_element) { var prev_checkbox = clicked_element.closest('table').find('[data-prev-check]:checkbox'); if (!prev_checkbox.length) { return; } var check = prev_checkbox.attr('data-prev-check') == 'true'; var start = checkboxes.index(prev_checkbox); var stop = checkboxes.index(clicked_element); var i = Math.min(start, stop); var j = Math.max(start, stop); for (var k = i; k <= j; k++) { var tr = $(checkboxes[k]).prop('checked', check).closest('tr'); if (check) { tr.addClass('selected'); } else { tr.removeClass('selected'); } } } /** applySelectorVisibility - This function set's the initial visibility * of graphs for creation. Is will scan the against preset variables * taking action as required to enable or disable rows. */ function applySelectorVisibilityAndActions() { // Change for accessibility $('input[type="radio"]').off('click').on('click', function() { if ($(this).is(':checked')) { $(this).attr('aria-checked', 'true'); } else { $(this).attr('aria-checked', 'false'); } }); // Apply disabled/enabled status first for Graph Templates $('tr[id^="gt_line"]').each(function(data) { var id = $(this).attr('id'); var search = id.substr(7); if ($.inArray(search, gt_created_graphs) >= 0) { $(this).addClass('disabled_row'); $(this).find(':checkbox').prop('disabled', true); } }); // Create Actions for Rows $('tr[id^="gt_line"].selectable:not(.disabled_row)').off('click').on('click', function(event) { selectUpdateRow(event, $(this)); }); // Create Actions for Rows $('tr[id^="line"].selectable').filter(':not(.disabled_row)').off('click').on('click', function(event) { selectUpdateRow(event, $(this)); }); } function disableSelection() { $('tr.selectable').css('-webkit-user-select','none'); $('tr.selectable').css('-moz-user-select','none'); $('tr.selectable').css('-ms-user-select','none'); $('tr.selectable').css('-o-user-select','none'); $('tr.selectable').css('user-select','none'); } function enableSelection() { $('tr.selectable').css('-webkit-user-select',''); $('tr.selectable').css('-moz-user-select',''); $('tr.selectable').css('-ms-user-select',''); $('tr.selectable').css('-o-user-select',''); $('tr.selectable').css('user-select',''); } /** selectUpdateRow - Highlight a selectable row combined with checkbox * @arg event - The click event to support multiple selections * @arg element - The jQuery selected object */ function selectUpdateRow(event, element) { var checkboxes = element.closest('table').find('input[type=checkbox]:not(:disabled)'); if (event.shiftKey) { updateCheckboxes(checkboxes, element.find(':checkbox')); } else { element.toggleClass('selected'); if (element.hasClass('selected')) { element.find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true'); } else { element.find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check'); } } if (element.closest('table').find(':checked').length) { disableSelection(); } else { enableSelection(); } } /** dqUpdateDeps - When a user changes the Graph dropdown for a data query * we have to check to see if those graphs are already created. * @arg snmp_query_id - The snmp query id the is current */ function dqUpdateDeps(snmp_query_id) { $('tr[id^="dqline'+snmp_query_id+'_"]').addClass('selectable').removeClass('disabled_row').find(':checkbox').prop('disabled', false); var snmp_query_graph_id = $('#sgg_'+snmp_query_id).val(); var removeSelectAll = false; // Check if select all is clicked var allChecked = $('#all_'+snmp_query_id).is(':checked'); // Next for Data Queries $('tr[id^="dqline'+snmp_query_id+'_"]').each(function(data) { var id = $(this).attr('id'); var pieces = id.split('_'); var dq = pieces[0].substr(6); var hash = pieces[1]; if ($.inArray(hash, created_graphs[snmp_query_graph_id]) >= 0) { if ($(this).hasClass('selected')) { removeSelectAll = true; } $(this).addClass('disabled_row').removeClass('selected').removeClass('selectable'); $(this).find(':checkbox').prop('disabled', true).prop('checked', false); } else { removeSelectAll = true; } }); if (allChecked && removeSelectAll) { $('#all_'+snmp_query_id).prop('checked', false); } $('tr[id^="dqline'+snmp_query_id+'_"]').not('.disabled_row').off('click').on('click', function(event) { selectUpdateRow(event, $(this)); }); } /** selectAll - This function will select all non-disabled rows * @arg attrib - The Graph Type either graph template, or data query */ function selectAll(attrib, checked) { if (attrib == 'chk') { if (checked == true) { $('tr[id^="line"]:not(.disabled_row)').each(function(data) { $(this).addClass('selected'); $(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true'); }); disableSelection(); } else { $('tr[id^="line"]:not(.disabled_row)').each(function(data) { $(this).removeClass('selected'); $(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check'); }); } } else if (attrib == 'sg') { if (checked == true) { $('tr[id^="gt_line"]:not(.disabled_row)').each(function(data) { $(this).addClass('selected'); $(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true'); }); disableSelection(); } else { $('tr[id^="gt_line"]:not(.disabled_row)').each(function(data) { $(this).removeClass('selected'); $(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check'); }); } } else { var attribSplit = attrib.split('_'); var dq = attribSplit[1]; if (checked == true) { $('tr[id^="dqline'+dq+'\_"]:not(.disabled_row)').each(function(data) { $(this).addClass('selected'); $(this).find(':checkbox').prop('checked', true).attr('aria-checked', 'true').attr('data-prev-check', 'true'); }); disableSelection(); } else { $('tr[id^="dqline'+dq+'\_"]:not(.disabled_row)').each(function(data) { $(this).removeClass('selected'); $(this).find(':checkbox').prop('checked', false).removeAttr('aria-checked').removeAttr('data-prev-check'); }); } } } /* graph filtering */ function applyTimespanFilterChange() { var strURL; strURL = '?header=false&predefined_timespan=' + $('#predefined_timespan').val(); strURL = strURL + '&predefined_timeshift=' + $('#predefined_timeshift').val(); loadPageNoHeader(strURL); } /** cactiReturnTo - This function simply returns to the previous page * @args href - the previous page */ function cactiReturnTo(href) { if (typeof href == 'string') { href = href + (href.indexOf('?') > 0 ? '&':'?') + 'header=false'; loadPageNoHeader(href); } else { href = document.location.href; href = href + (href.indexOf('?') > 0 ? '&':'?') + 'header=false'; loadPageNoHeader(href); } } /** applySkin - This function re-asserts all javascript behavior to a page * that can't be set using a live attrbute 'on()' */ function applySkin() { pageName = basename($(location).attr('pathname')); $('#messageContainer').remove(); if (!theme || theme == 'classic') { theme = 'classic'; // debounce submits $('form').submit(function() { $('input[type="submit"], button[type="submit"]').not('.import, .export').prop('disabled', true); }); } else { $('input[type="submit"], input[type="button"], button').button(); // Handle re-index changes $('fieldset.reindex_methods').buttonset(); // debounce submits $('form').submit(function() { $('input[type="submit"], button[type="submit"]').not('.import, .export').button('disable'); }); } setGraphTabs(); setupSortable(); setupBreadcrumbs(); applyTableSizing(); setupPageTimeout(); CsrfMagic.end(); setupSpecialKeys(); setupCollapsible(); ajaxAnchors(); applySelectorVisibilityAndActions(); if (typeof themeReady == 'function') { themeReady(); } makeFiltersResponsive(); setupResponsiveMenuAndTabs(); setupButtonStyle(); // Debug message actions $('table.debug tr:nth-child(1)').off('click').on('click', function() { if ($(this).parent().find('table').is(':visible')) { $(this).parent().find('table').slideUp('fast'); } else { $(this).parent().find('table').slideDown('fast'); } }); $('.cactiTableCopy').off('click').on('click', function(event) { event.preventDefault(); event.stopPropagation(); var containerId = $(this).attr('id'); copyToClipboard(containerId); }); $('i, th, img, input, label, select, button, .drillDown, .checkboxSlider') .tooltip({ close: true }) .on('focus', function() { if ($(this).tooltip('instance')) { $(this).tooltip('close'); } }) .on('click', function() { if ($(this).tooltip('instance')) { $(this).tooltip('close'); } }); $(document).tooltip({ items: 'div.cactiTooltipHint, span.cactiTooltipHint, .checkboxSlider', content: function() { var element = $(this); if (element.is('div')) { var text = $(this).find('span').html(); } else if (element.is('span') || element.is('a')) { var text = $(this).prop('title'); } return text; } }); $(document).on('keyup keydown', function(event) { shiftPressed = event.shiftKey; }); $('#main').css('display', 'table'); var showPage = $('#main').map(function(i, el) { var dfd = $.Deferred(); $(el).show(function() { dfd.resolve(); }); return dfd; }); keepWindowSize(); displayMessages(); renderLanguages(); } function renderLanguages() { if ($('select#user_language').selectmenu('instance') !== undefined) { $('select#user_language').selectmenu('destroy'); $('select#user_language').languageselect({ width: '220', change: function() { var name = $(this).attr('id'); var value = $(this).val(); var page = basename(location.pathname); if (page == 'auth_profile.php') { $.post('auth_profile.php?tab='+currentTab+'&action=update_data', { __csrf_magic: csrfMagicToken, name: name, value: value }, function() { if (name == 'selected_theme' || name == 'user_language') { document.location = 'auth_profile.php?action=edit'; } }); } } }).languageselect('menuWidget').addClass('ui-menu-icons customicons'); } if ($('select#i18n_default_language').selectmenu('instance') !== undefined) { $('select#i18n_default_language').selectmenu('destroy'); $('select#i18n_default_language').languageselect({ width: '220' }).languageselect('menuWidget').addClass('ui-menu-icons customicons'); } $('#user_language-menu').css('max-height', '200px'); $('#i18n_default_language-menu').css('max-height', '200px'); } function setupButtonStyle() { if ($('input#submit').length) { $('input#submit').addClass('ui-state-active'); } else if ($('input#return').length) { $('input#return').addClass('ui-state-active'); } if ($('input#refresh').length) { $('input#refresh').addClass('ui-state-active'); } if ($('input#go').length) { $('input#go').addClass('ui-state-active'); } } function displayMessages() { var error = false; var title = ''; var header = ''; if (typeof sessionMessageTimer == 'function' || sessionMessageTimer !== null) { clearInterval(sessionMessageTimer); } if (sessionMessage == null) { return; } if (typeof sessionMessage.level != 'undefined') { if (sessionMessage.level == MESSAGE_LEVEL_ERROR) { title = errorReasonTitle; header = errorOnPage; var sessionMessageButtons = { 'Ok': { text: sessionMessageOk, id: 'btnSessionMessageOk', click: function() { $(this).dialog('close'); } } }; sessionMessageOpen = {}; } else if (sessionMessage.level == MESSAGE_LEVEL_MIXED) { title = mixedReasonTitle; header = mixedOnPage; var sessionMessageButtons = { 'Ok': { text: sessionMessageOk, id: 'btnSessionMessageOk', click: function() { $(this).dialog('close'); } } }; sessionMessageOpen = {}; } else if (sessionMessage.level == MESSAGE_LEVEL_CSRF) { var href = document.location.href; href = href + (href.indexOf('?') > 0 ? '&':'?') + 'csrf_timeout=true'; document.location = href; return false; } else { title = sessionMessageTitle; header = sessionMessageSave; var sessionMessageButtons = { 'Pause': { text: sessionMessagePause, id: 'btnSessionMessagePause', click: function() { if (sessionMessageTimer != null) { clearInterval(sessionMessageTimer); sessionMessageTimer = null; } $('#btnSessionMessagePause').remove(); $('#btnSessionMessageOk').html('<span class="ui-button-text">' + sessionMessageOk + '</span>'); } }, 'Ok': { text: sessionMessageOk, id: 'btnSessionMessageOk', click: function() { $(this).dialog('close'); $('#messageContainer').remove(); clearInterval(sessionMessageTimer); } } }; sessionMessageOpen = function() { sessionMessageCountdown(5000); } } var returnStr = '<div id="messageContainer" style="display:none">' + '<h4>' + header + '</h4>' + '<p style="display:table-cell;overflow:auto"> ' + sessionMessage.message + '</p>' + '</div>'; $('#messageContainer').remove(); $('body').append(returnStr); var messageWidth = $(window).width(); if (messageWidth > 600) { messageWidth = 600; } else { messageWidth -= 50; } $('#messageContainer').dialog({ open: sessionMessageOpen, draggable: true, resizable: false, height: 'auto', minWidth: messageWidth, maxWidth: 800, maxHeight: 600, title: title, buttons: sessionMessageButtons }); sessionMessage = null; } } function sessionMessageCountdown(time) { var sessionMessageTimeLeft = (time / 1000); $('#btnSessionMessageOk').html('<span class="ui-button-text">' + sessionMessageOk + ' (' + sessionMessageTimeLeft + ')</span>'); sessionMessageTimer = setInterval(function() { sessionMessageTimeLeft--; $('#btnSessionMessageOk').html('<span class="ui-button-text">' + sessionMessageOk + ' (' + sessionMessageTimeLeft + ')</span>'); if (sessionMessageTimeLeft <= 0) { clearInterval(sessionMessageTimer); $('#messageContainer').dialog('close'); $('#messageContainer').remove(); } }, 1000); } function markFilterTDs(child, filterNum) { trNum = 0; $('#'+child).find('tr').each(function() { tdNum = 0; $(this).find('td').each(function() { $(this).attr('id', 'fn'+filterNum+'tr'+trNum+'td'+tdNum); tdNum++; }); trNum++; }); } function makeFiltersResponsive() { storage = Storages.localStorage; filterNum = 0; if ($('div.cactiTableButton').closest('.cactiTable').not('#dqdebug').find('.filterTable').length) { $('div.cactiTableButton').closest('.cactiTable').not('#dqdebug').each(function() { if ($(this).find('.filterTable').length) { filterHeader = $(this).closest('.cactiTable'); id = filterHeader.attr('id'); child = id+'_child'; filterContents = $('#'+child); filterHeader.find('.cactiTableTitle, .cactiTableButton').css('cursor', 'pointer'); if (pageHasHidableColumnsAndProfile()) { if (filterHeader.find('.cactiSwitchConstraints').length == 0) { if (hScroll) { $('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'visible' }); filterHeader.find('div.cactiTableButton').append('<span class="cactiSwitchConstraintWrapper"><a title="'+tableConstraints+'" class="linkOverDark cactiSwitchConstraints" href="#"><i id="overflow" class="fa fa-compress"></i></a></span>'); } else { $('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'hidden' }); filterHeader.find('div.cactiTableButton').append('<span class="cactiSwitchConstraintWrapper"><a title="'+tableConstraints+'" class="linkOverDark cactiSwitchConstraints" href="#"><i id="overflow" class="fa fa-expand"></i></a></span>'); } $('.cactiSwitchConstraints').off('click').on('click', function(event) { event.preventDefault(); event.stopPropagation(); hScroll = !hScroll; $.post(urlPath + 'auth_profile.php?tab=general&action=update_data', { __csrf_magic: csrfMagicToken, name: 'enable_hscroll', value: hScroll ? 'on':'' }, function() { if (hScroll) { $('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'visible' }); $('#overflow').removeClass('fa-expand').addClass('fa-compress'); resetTables(); } else { $('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'hidden' }); $('#overflow').removeClass('fa-compress').addClass('fa-expand'); tuneTables(); } }); }); } } if (filterHeader.find('div.cactiTableButton').find('.cactiFilterAdd').length) { markFilterTDs(child, filterNum); $('.cactiFilterAdd').tooltip(); } if (filterContents.find('#export').length) { title = $('#export').attr('value'); filterHeader.find('div.cactiTableButton').append('<span title="'+title+'" style="display:none;" class="cactiFilterExport"><i class="fa fa-arrow-down"></i></span>'); $('.cactiFilterExport').off('click').on('click', function(event) { event.stopPropagation(); $('#export').trigger('click'); }).tooltip(); } if (filterContents.find('#import').length) { title = $('#import').attr('value'); filterHeader.find('div.cactiTableButton').append('<span title="'+title+'" style="display:none;" class="cactiFilterImport"><i class="fa fa-arrow-up"></i></span>'); $('.cactiFilterImport').off('click').on('click', function(event) { event.stopPropagation(); $('#import').trigger('click'); }).tooltip(); } if (filterContents.find('#clear').length) { if (filterHeader.find('.cactiFilterClear').length == 0) { filterHeader.find('div.cactiTableButton').append('<span title="'+clearFilterTitle+'" style="display:none;" class="cactiFilterClear"><i class="fa fa-trash-alt"></i></span>'); } $('.cactiFilterClear').off('click').on('click', function(event) { event.stopPropagation(); $('#clear').trigger('click'); }).tooltip(); } toggleFilterAndIcon(id, child, true); filterHeader.find('.cactiTableTitle, .cactiTableButton').off('click').on('click', function() { id = $(this).closest('.cactiTable').attr('id'); child = id+'_child'; toggleFilterAndIcon(id, child, false); }); if (storage.isSet('filterVisibility')) { state = storage.get('filterVisibility'); } else { state = 'visible'; } if (state == 'hidden') { if (filterHeader.find('.cactiFilterState').length == 0) { filterHeader.find('div.cactiTableButton').append('<span class="cactiFilterState"><i class="fa fa-angle-double-down"></i></span>'); } } else { if (filterHeader.find('.cactiFilterState').length == 0) { filterHeader.find('div.cactiTableButton').append('<span class="cactiFilterState"><i class="fa fa-angle-double-up"></i></span>'); } } if (typeof showHideFilter != 'undefined') { $('.cactiFilterState').attr('title', showHideFilter).tooltip(); } filterNum++; } }); } else if ($('#dqdebug').length) { $('#dqdebug').find('div.cactiTableButton').each(function() { if ($(this).find('a').length) { anchors = $('div.cactiTableButton').find('a'); anchors.each(function(){ $(this).attr('title', $(this).text()); }); anchors.not('.cactiTableCopy').addClass('fa fa-trash-alt'); anchors.filter('.cactiTableCopy').addClass('fa fa-copy'); anchors.tooltip().text(''); } }); } if ($('#form_graph_view').length) { $('#form_graph_view').filter('input, select').not('#date1, #date2').click(function() { closeDateFilters(); }); } } function toggleFilterAndIcon(id, child, initial) { storage = Storages.localStorage; if (storage.isSet('filterVisibility')) { state = storage.get('filterVisibility'); } else { state = 'visible'; } if (initial) { if (state == 'hidden') { $('#'+child).hide(); $('#'+id).find('.cactiFilterClear, .cactiFilterImport, .cactiFilterExport').show(); } } else if ($('#'+child).is(':visible')) { $('#'+child).hide(); $('#'+id).find('.cactiFilterClear, .cactiFilterImport, .cactiFilterExport').show(); $('.cactiFilterState').find('i').removeClass('fa-angle-double-up').addClass('fa-angle-double-down'); storage.set('filterVisibility', 'hidden'); } else { $('#'+child).show(); $('#'+id).find('.cactiFilterClear, .cactiFilterImport, .cactiFilterExport').hide(); $('.cactiFilterState').find('i').removeClass('fa-angle-double-down').addClass('fa-angle-double-up'); storage.set('filterVisibility', 'visible'); } $(window).trigger('resize'); } function setGraphTabs() { page = window.location.href; if (page.indexOf('graph_view.php') >= 0) { $('.lefttab').removeClass('selected'); $('#tab-graphs').addClass('selected'); if (page.indexOf('action=tree') > 0) { $('#preview, #listview, #treeview').removeClass('selected').prop('aria-selected', false); $('#treeview').addClass('selected').prop('aria-selected', true); } else if (page.indexOf('action=list') > 0) { $('#preview, #listview, #treeview').removeClass('selected').prop('aria-selected', false); $('#listview').addClass('selected').prop('aria-selected', true); } else if (page.indexOf('action=preview') > 0) { $('#preview, #listview, #treeview').removeClass('selected').prop('aria-selected', false); $('#preview').addClass('selected').prop('aria-selected', true); } /* update menu selection */ if (theme == 'classic') { $('.righttab').each(function() { if ($(this).hasClass('selected')) { if ($(this).find('img').length) { imageSRC = $(this).find('img').attr('src'); if (imageSRC.indexOf('_down') < 0) { imageSRC = imageSRC.replace('.gif', '_down.gif'); $(this).find('img').attr('src', imageSRC); } } } else { if ($(this).find('img').length) { imageSRC = $(this).find('img').attr('src'); if (imageSRC.indexOf('_down') >= 0) { imageSRC = imageSRC.replace('_down.gif', '.gif'); $(this).find('img').attr('src', imageSRC); } } } }); } } } function setupResponsiveMenuAndTabs() { $('.maintabs a.lefttab, .dropdownMenu a, .menuoptions a, #gtabs a.righttab').not('[href^="http"], [href^="https"], [href^="#"], [target="_blank"]').off('click').on('click', function(event) { page = basename($(this).attr('href')); if (page == 'logout.php' || page == 'auth_changepassword.php') { return; } else if (page == 'index.php' && $(this).attr('href').indexOf('login') >= 0) { return; } else { event.preventDefault(); } if ($(this).hasClass('selected') || (pageName == page && pageName != 'graph_view.php' && pageName != 'link.php')) { handleUserMenu(true); } else { var id = $(this).attr('id'); var href = $(this).attr('href'); loadTopTab(href, id, false); } }); $(window).on('orientationchange, fullscreenchange', function() { responsiveUI('force'); }); } function getMenuState() { var storage = Storages.localStorage; if (storage.isSet('menuState_' + pageName)) { state = storage.get('menuState_' + pageName); return state; } else { return 'visible'; } } function responsiveUI(event) { var tree = false; if (event != 'force') { if (new Date() - resizeTime < resizeDelta) { var myEvent = event; setTimeout(function() { responsiveUI(myEvent); }, resizeDelta); return false; } else { resizeTimeout = false; } } if ($('.cactiTreeNavigationArea').length > 0) { tree = true; } else { tree = false; } handleUserMenu(false); var mainWidth = getMainWidth(); /* change textbox and textarea widths */ $('input[type="text"], textarea').each(function() { if ($(this).attr('type') == 'text') { var offset = 20; } else { var offset = 5; } if (mainWidth != 100) { if ($(this).width() > mainWidth) { $(this).css('max-width', (mainWidth - offset)+'px'); } else { $(this).css('max-width', ''); } if ($(this).width() > mainWidth) { $(this).css('max-width', (mainWidth - offset)+'px'); } if ($(this).parents('.formColumnRight').is(":visible") && $(this).width() > $(this).parents('.formColumnRight').prop('clientWidth')) { $(this).css('max-width', ($(this).parents('.formColumnRight').prop('clientWidth'))+'px'); } else { $(this).css('max-width', ''); } } }); $('.filterTable').each(function() { tuneFilter($(this), mainWidth); }); tuneTables(); } function getMainWidth() { if ($('#navigation').length && $('#navigation').is(':visible')) { var mainWidth = $('body').innerWidth() - $('#navigation').width(); } else { var mainWidth = $('body').innerWidth(); } return mainWidth; } function responsiveResizeGraphs() { var mainWidth = getMainWidth() - 30; var myColumns = $('#columns').val(); var isThumb = $('#thumbnails').is(':checked'); var graphRow = $('.tableRowGraph:first').width(); var drillDown = $('.graphDrillDown:first').outerWidth() + 15; if (myColumns == null) { myColumns = 1; } if (mainWidth < graphRow) { graphRow = mainWidth - drillDown; } else if (graphRow == 0) { graphRow = mainWidth; } // Dont resize if nothing changed if (previousMainWidth == null || (previousMainWidth == mainWidth && previousColumns == myColumns)) { previousMainWidth = mainWidth; return true; } var myWidth = parseInt((graphRow - (drillDown * myColumns)) / myColumns); $('.graphimage').each(function() { var graph_id = $(this).attr('graph_id'); if (!(graph_id > 0)) { graph_id = $(this).attr('id').replace('wrapper_',''); graph_id = $(this).attr('id').replace('graph_',''); } var rra_id = $(this).attr('rra_id'); var type = $(this).attr('graph_type'); var original_cwidth = $('#wrapper_'+graph_id).attr('graph_width'); var original_cheight = $('#wrapper_'+graph_id).attr('graph_height'); /* original image attributes */ var image_width = $(this).attr('image_width'); var image_height = $(this).attr('image_height'); var canvas_top = $(this).attr('canvas_top'); var canvas_left = $(this).attr('canvas_left'); var canvas_width = $(this).attr('canvas_width'); var canvas_height = $(this).attr('canvas_height'); var remove_whcss = false; var ratio = myWidth / image_width; /* optimize display and set correct ratio if image is full size */ if (image_width * original_cwidth / canvas_width < myWidth) { remove_whcss = true; ratio = original_cwidth / canvas_width; } var new_image_width = parseInt(image_width * ratio) var new_image_height = parseInt(image_height * ratio) var new_canvas_width = parseInt(canvas_width * ratio); var new_canvas_height = parseInt(canvas_height * ratio); var new_canvas_graph_top = parseInt(canvas_top * ratio); var new_canvas_graph_left = parseInt(canvas_left * ratio); $(this).attr('graph_width', new_canvas_width); $(this).attr('graph_height', new_canvas_height); $(this).attr('graph_top', new_canvas_graph_top); $(this).attr('graph_left', new_canvas_graph_left); if (!remove_whcss || type == 'svg+xml') { $(this).css('width', new_image_width); $(this).css('height', new_image_height); } else { $(this).css('width', ''); $(this).css('height', ''); $(this).removeAttr('width'); $(this).removeAttr('height'); } }); previousMainWidth = mainWidth; previousColumns = myColumns; if ($('.cactiTreeNavigationArea').length) { resizeTreePanel(); } } function countHiddenCols(object) { var hidden = 0; $(object).find('th').each(function() { if ($(this).css('display') == 'none') { hidden++; } }); return hidden; } function tuneTables() { var mainWidth = getMainWidth(); $('.cactiTable').each(function() { $(this).find('th:first-child').each(function() { var object = $(this).closest('.cactiTable'); tuneTable(object, mainWidth); }); }); } function pageHasHidableColumnsAndProfile() { if (typeof userSettings != 'undefined' && userSettings && $(document).find('th').length) { return true; } return false; } function resetTables() { $('.cactiTable').each(function() { $(this).find('th:first-child').each(function() { var object = $(this).closest('.cactiTable'); resetTable(object); }); }); } function resetTable(object) { var id = $(object).attr('id'); var column = 1; $(object).find('th').each(function() { $('#'+id+' th:nth-child('+column+')').show(); $('#'+id+' td:nth-child('+column+')').show(); column++; }); } function tuneTable(object, width) { var rows = $(object).find('tr').length; var width = width; var tableWidth = $(object).width(); var totalCols = $(object).find('th').length; var reducedWidth = 0; var columnsHidden = countHiddenCols(object); var visibleColumns = totalCols - columnsHidden; var id = $(object).attr('id'); if (rows > 101) return false; // Enable horizontal scroll bar if (hScroll) { $('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'visible' }); return false; } else { $('#main, .cactiConsoleContentArea').css({ 'overflow-x': 'hidden' }); } if (width < tableWidth) { var calculatedColumns = []; var calculatedWidth = 0; var calculatedPadding = 15; var tableHeaders = $(object).find('th'); var tableCheckBox = $(tableHeaders).each(function() { if ($(this).index() == tableHeaders.length) { calculatedColumns.addClass('noHide'); } }); $($(object).find('th').get()).each(function() { var isLastCheckBox = $(this).hasClass('tableSubHeaderCheckbox') && $(this).index() == tableHeaders.length - 1; if ($(this).hasClass('noHide') || isLastCheckBox) { var columnWidth = $.textMetrics(this).width; calculatedColumns.push($(this).index()); calculatedWidth += columnWidth + calculatedPadding; } }); $($(object).find('th').get()).each(function() { if (!calculatedColumns.includes($(this).index())) { var columnWidth = $.textMetrics(this).width; if (width < calculatedWidth) { $(this).hide(); } else { calculatedColumns.push($(this).index()); calculatedWidth += columnWidth + calculatedPadding; } console.log($(this).parent().id + ' - ' + $(this).index() + ' - ' + width); } }); $($(object).find('td').each(function() { if (!calculatedColumns.includes($(this).index())) { $(this).hide(); } })); } } function tuneFilter(object, width) { if ($(object).find('#timespan').length && $(object).find('#timespan').is(':visible')) { var timespan = true; var timeShiftWidth = $(object).find('.shiftArrow').closest('td').width(); var dateWidth = $(object).find('#date1').closest('td').width() + $(object).find('#date1').closest('td').prev('td').width(); var clearWidth = $('#tsclear').width(); var refreshWidth = $('#tsrefresh').width(); } else { var timespan = false; var clearWidth = $(object).find('#clear').width(); var saveWidth = $(object).find('#save').width(); var exportWidth = $(object).find('#export').width(); var importWidth = $(object).find('#import').width(); } var minTds = 2; var visTds = $(object).find('td:visible').length; if ($(object).find('input[type="button"]').length) { minTds++; } if ($(object).width() > width) { if (!timespan) { $($(object).find('td').get().reverse()).each(function() { if ($(this).find('input[type="button"]').length == 0) { if ($(this).is(':visible')) { $(this).hide(); visTds--; if ($(this).closest('td').prev().find('input, select').length == 0) { $(this).closest('td').prev().hide(); visTds--; } } if ($(object).width() < width) { return false; } if (visTds <= minTds) { return false; } } }); if ($(object).width() > width) { if (saveWidth > 0) { $('#save').hide(); } } if ($(object).width() > width) { if (exportWidth > 0) { $('#export').hide(); } } if ($(object).width() > width) { if (importWidth > 0) { $('#import').hide(); } } if ($(object).width() > width) { if (clearWidth > 0) { $('#clear').hide(); } } } else { $('#date1').closest('td').hide().prev('td').hide(); $('#date2').closest('td').hide().prev('td').hide(); if ($(object).width() > width) { $('.shiftArrow').closest('td').hide(); } if ($(object).width() > width) { $('#tsclear').hide(); } if ($(object).width() > width) { $('#tsrefresh').hide(); } } } else { if (!timespan) { if ($(object).width() + clearWidth < width) { $('#clear').show(); } if ($(object).width() + importWidth < width) { $('#import').show(); } if ($(object).width() + exportWidth < width) { $('#export').show(); } if ($(object).width() + saveWidth < width) { $('#save').show(); } if ($(object).width() < width) { $(object).find('td').each(function() { if ($(this).find('input[type="button"]').length == 0) { if (!$(this).is(':visible')) { showWidth = $(this).width(); if ($(this).next('td').find('input, select').length > 0) { showWidth += $(this).next('td').width(); } if ($(object).width() + showWidth < width) { $(this).show(); if ($(this).next('td').find('input, select').length > 0) { $(this).next('td').show(); } } else { return false; } } } }); } } else { if ($(object).width() + refreshWidth < width) { $('#tsrefresh').show(); } if ($(object).width() + clearWidth < width) { $('#tsclear').show(); } if ($(object).width() + timeShiftWidth < width) { $('.shiftArrow').closest('td').show(); } if ($(object).width() + (2 * dateWidth) < width) { $('#date1').closest('td').show().prev('td').show(); $('#date2').closest('td').show().prev('td').show(); } } } } function handleUserMenu(toggle) { var windowWidth = $(window).width(); var savedState = getMenuState(); var curState = $('#navigation').is(':visible') ? 'visible':'hidden'; //console.log('handle called, curState:'+curState+', savedState:'+savedState+', Toggle:'+toggle); if ($('#navigation').length) { if (theme != 'classic') { if (curState == 'visible' && toggle) { menuHide(true); } else if (curState == 'hidden' && toggle) { menuShow(); } else if (savedState == 'visible') { if (windowWidth < 640) { menuHide(false); } else { menuShow(); } } else { menuHide(false); } } else if (windowWidth < 640) { menuHide(true); } else if (savedState == 'visible') { menuShow(); } else { menuHide(); } } } function menuHide(store) { var storage = Storages.localStorage; var myClass = ''; var curMargin = parseInt($('#navigation_right').css('margin-left')); if ($('.cactiTreeNavigationArea').length) { myClass = '.cactiTreeNavigationArea'; if (curMargin > 0) { marginLeftTree = curMargin; $('.cactiTreeNavigationArea').css('width', curMargin); } } else if ($('.cactiConsoleNavigationArea').length) { myClass = '.cactiConsoleNavigationArea'; if (curMargin > 0) { marginLeftConsole = curMargin; } } $('#navigation_right').animate({'margin-left': '0px'}, 20); if (myClass != '') { $(myClass).hide('slide', {direction: 'left'}, 20, function() { responsiveResizeGraphs(); }); } $('#navigation').hide(); if (myClass == '.cactiTreeNavigationArea' || pageName == 'graph_view.php') { responsiveResizeGraphs(); } if (store) { storage.set('menuState_' + page, 'hidden'); } } function menuShow() { var storage = Storages.localStorage; var myClass = ''; if ($('.cactiTreeNavigationArea').length) { if (marginLeftTree == null) { marginLeftTree = minTreeWidth; } var treeWidth = $('.cactiTreeNavigationArea').width(); myClass = '.cactiTreeNavigationArea'; if (marginLeftTree > treeWidth) { $('#navigation_right').animate({'margin-left': marginLeftTree}, 20); $('.cactiTreeNavigationArea').css('width', marginLeftTree); } } else if ($('.cactiConsoleNavigationArea').length) { myClass = '.cactiConsoleNavigationArea'; if (marginLeftConsole > 0) { $('#navigation_right').animate({'margin-left': marginLeftConsole}, 20); } } if (myClass != '') { $(myClass).show('slide', {direction: 'left'}, 20, function() { responsiveResizeGraphs(); }); } $('#navigation').show(); storage.set('menuState_' + pageName, 'visible'); } function loadTopTab(href, id, force) { statePushed = false; var cont = false; if (force == undefined) { force = false; } if (!force) { cont = checkFormStatus(href, 'toptab', id); } else { cont = true; } if (cont) { var thref = stripHeaderSuppression(href); var url = thref+(thref.indexOf('?') > 0 ? '&':'?') + 'headercontent=true'; $('.submenuoptions').slideUp(120); $('.menuoptions').slideUp(120); if (href.indexOf('graph_view.php') >= 0) { $('.cactiGraphHeaderBackground').show(); $('.cactiConsolePageHeadBackdrop').hide(); } else { $('.cactiGraphHeaderBackground').hide(); $('.cactiConsolePageHeadBackdrop').show(); } closeDateFilters(); clearAllTimeouts(); $.ajaxQ.abortAll(); $.get(url) .done(function(html) { var htmlObject = $(html); var matches = html.match(/<title>(.*?)<\/title>/); $('#main').hide(); if (matches != null) { var htmlTitle = matches[1]; var breadCrumbs = htmlObject.find('#breadcrumbs').html(); var parts = html.split(''); var html = parts[1]; checkForLogout(html); $('title').text(htmlTitle); $('#breadcrumbs').html(breadCrumbs); $('div[class^="ui-"]').remove(); $('#cactiContent').replaceWith(html); myTitle = htmlTitle; myHref = cleanHeader(href); pushState(myTitle, href); } else { checkForLogout(html); $('#cactiContent').replaceWith(html); thref = stripHeaderSuppression(href); pushState(myTitle, href); } var hrefParts = href.split('?'); pageName = basename(hrefParts[0]); if (pageName != '') { if ($('#menu').find("a[href^='"+escapeString(href)+"']").length > 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href^='"+escapeString(href)+"']").addClass('selected'); } else if ($('#menu').find("a[href*='/"+pageName+"']").length > 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href*='/"+pageName+"']").addClass('selected'); } } applySkin(); if (isMobile.any() != null) { window.scrollTo(0,1); } else { window.scrollTo(0,0); } handleUserMenu(); handleConsole(pageName); $('#main').css('display', 'table'); Pace.stop(); return false; }) .fail(function(html) { getPresentHTTPError(html); } ); /* update menu selection */ if ($('#'+id).hasClass('lefttab')) { $('.lefttab').removeClass('selected'); $('.submenuoptions').find('.selected').removeClass('selected'); $('#'+id).addClass('selected'); hideTabId = id.substring(0, id.length-9); if (hideTabId) { $('#'+hideTabId).addClass('selected'); } } else if ($('#'+id).parents('.submenuoptions').length > 0) { $('#'+id).parents('.submenuoptions').find('.selected').removeClass('selected'); $('#'+id).addClass('selected'); } return true; } else { return false; } } function loadPage(href, force) { statePushed = false; cont = false; if (force == undefined) { force = false; } if (!force) { cont = checkFormStatus(href, 'loadpage'); } else { cont = true; } if (cont) { closeDateFilters(); clearAllTimeouts(); $.ajaxQ.abortAll(); $.get(href) .done(function(html) { var htmlObject = $(html); var matches = html.match(/(.*?)<\/title>/); if (matches != null) { var htmlTitle = matches[1]; var breadCrumbs = htmlObject.find('#breadcrumbs').html(); var html = htmlObject.find('#main').html(); checkForLogout(html); $('#main').empty().hide(); $('title').text(htmlTitle); $('#breadcrumbs').html(breadCrumbs); $('div[class^="ui-"]').remove(); $('#main').html(html); myTitle = htmlTitle; myHref = cleanHeader(href); pushState(myTitle, href); } else { checkForLogout(html); $('#main').empty().hide(); $('#main').html(html); thref = stripHeaderSuppression(href); pushState(myTitle, href); } var hrefParts = href.split('?'); pageName = basename(hrefParts[0]); if (pageName != '') { // Workaround for Create Device if (pageName == 'host.php') { if (href.indexOf('create') >= 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href='"+escapeString(href)+"']").addClass('selected'); } else { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href$='host.php']").addClass('selected'); } } else if ($('#menu').find("a[href^='"+escapeString(href)+"']").length > 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href^='"+escapeString(href)+"']").addClass('selected'); } else if ($('#menu').find("a[href*='/"+pageName+"']").length > 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href*='/"+pageName+"']").addClass('selected'); } if (pageName == 'graph_templates_items.php' || pageName == 'graph_templates_inputs.php') { $('#menu').find('a[href*="graph_templates.php"]').addClass('selected'); } } applySkin(); if (isMobile.any() != null) { window.scrollTo(0,1); } else { window.scrollTo(0,0); } handleConsole(pageName); Pace.stop(); return false; }) .fail(function(html) { getPresentHTTPError(html); } ); } return false; } function setNavigationScroll() { var object = ''; $('.cactiConsoleNavigationArea, .cactiTreeNavigationArea').unbind('mousemove').on('mousemove', function(pos) { object = ''; if ($('.cactiConsoleNavigationArea').length) { object = '.cactiConsoleNavigationArea'; } else if ($('.cactiTreeNavigationArea').length) { object = '.cactiTreeNavigationArea'; } if (object != '') { var mpos = $(object).position(); var width = $(object).outerWidth(); var height = $(object).outerHeight(); if (pos.pageX < mpos.left || pos.pageY < mpos.top || pos.pageX > mpos.left + width - 1 || pos.pageY > mpos.top + height - 1) { if (isHover) { clearTimeout(hoverTimer); hoverTimer = setTimeout(function() { $(object).css('overflow-y', 'hidden'); }, 500); } isHover = false; } else { if (!isHover) { clearTimeout(hoverTimer); hoverTimer = setTimeout(function() { $(object).css('overflow-y', 'auto'); }, 500); } isHover = true; } } }); $('.cactiConsoleNavigationArea, .cactiTreeNavigationArea').unbind('mouseleave').on('mouseleave', function(pos) { if ($('.cactiConsoleNavigationArea').length) { object = '.cactiConsoleNavigationArea'; } else if ($('.cactiTreeNavigationArea').length) { object = '.cactiTreeNavigationArea'; } isHover = false; clearTimeout(hoverTimer); hoverTimer = setTimeout(function() { $(object).css('overflow-y', 'hidden'); }, 500); }); } function loadPageNoHeader(href, scroll, force) { statePushed = false; cont = false; if (scroll == undefined) { scroll = false; } if (force == undefined) { force = false; } if (!force) { cont = checkFormStatus(href, 'noheader', scroll); } else { cont = true; } if (cont) { closeDateFilters(); clearAllTimeouts(); $.ajaxQ.abortAll(); $.get(href) .done(function(html) { var htmlObject = $(html); var matches = html.match(/<title>(.*?)<\/title>/); if (matches != null) { checkForLogout(html); var htmlTitle = matches[1]; var breadCrumbs = htmlObject.filter('#breadcrumbs').html(); var html = htmlObject.filter('#main').html(); $('#main').empty().hide(); $('title').text(htmlTitle); $('#breadcrumbs').html(breadCrumbs); $('div[class^="ui-"]').remove(); $('#main').html(html); myTitle = htmlTitle; myHref = cleanHeader(href); pushState(myTitle, href); } else { checkForLogout(html); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(html); var hrefParts = href.split('?'); pageName = basename(hrefParts[0]); if (pageName != '') { // Workaround for Create Device if (pageName == 'host.php') { if (href.indexOf('create') >= 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href='"+escapeString(href)+"']").addClass('selected'); } else { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href$='host.php']").addClass('selected'); } } else if ($('#menu').find("a[href^='"+escapeString(href)+"']").length > 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href^='"+escapeString(href)+"']").addClass('selected'); } else if ($('#menu').find("a[href*='/"+pageName+"']").length > 0) { $('#menu').find('.pic').removeClass('selected'); $('#menu').find("a[href*='/"+pageName+"']").addClass('selected'); } if (pageName == 'graph_templates_items.php' || pageName == 'graph_templates_inputs.php') { $('#menu').find('a[href*="graph_templates.php"]').addClass('selected'); } } applySkin(); pushState(myTitle, href); } if (isMobile.any() != null) { window.scrollTo(0,1); } else { window.scrollTo(0,0); } handleConsole(pageName); Pace.stop(); return false; }) .fail(function(html) { getPresentHTTPError(html); } ); } return false; } function getPresentHTTPError(data) { if (typeof data != 'undefined') { var errorStr = data.status; var errorSub = data.statusText; var errorText = errorReasonUnexpected; var found = false; if (typeof data.responseText != 'undefined') { var dataText = data.responseText; var title_match = dataText.match(/<title>(.*?)<\/title>/); var head_match = dataText.match(/<h1>(.*?)<\/h1>/); var para_match = dataText.match(/<p>(.*?)<\/p>/); if (title_match != null) { var errorSub = title_match[1]; found = true; } if (head_match != null) { var errorSub = head_match[1]; found = true; } if (para_match != null) { var errorText = para_match[1]; found = true; } if (!found && dataText != '') { var errorText = dataText; } var returnStr = '<div id="httperror" style="display:none">' + '<h4>' + errorOnPage + '</h4><hr>' + '<div style="padding-bottom: 5px;"><div style="display:table-cell;width:75px"><b>' + errorNumberPrefix + '</b></div> ' + '<div style="display:table-cell"> ' + errorStr + ' ' + errorSub + '</div></div>' + '<div><div style="display:table-cell;width:75px"><b>' + errorReasonPrefix + '</b></div> ' + '<div style="display:table-cell"> ' + errorText + '</div></div>' + '</div></div>'; var messageWidth = $(window).width(); if (messageWidth > 400) { messageWidth = 400; } else { messageWidth -= 50; } $('#httperror').remove(); $('body').append(returnStr); $('#httperror').dialog({ resizable: false, height: 'auto', width: messageWidth, title: errorReasonTitle, buttons: { Ok: function() { $(this).dialog('close'); } } }); } } } function ajaxAnchors() { $('a.pic, a.linkOverDark, a.linkEditMain, a.console, a.hyperLink, a.tab').not('[href^="http"], [href^="https"], [href^="#"], [href^="mailto"], [target="_blank"]').off('click').on('click', function(event) { event.preventDefault(); event.stopPropagation(); if ($(window).width() < 640) { if (theme != 'classic') { menuHide(false); } } /* determine the page name */ var href = $(this).attr('href'); if (href == '#') { return false; } /* update menu selection */ if ($(this).hasClass('pic')) { $(this).addClass('selected'); } /* update menu selection */ if ($(this).hasClass('lefttab')) { $('.lefttab').removeClass('selected'); $(this).addClass('selected'); } /* update menu selection */ if ($(this).hasClass('righttab')) { $('.righttab').removeClass('selected'); $(this).addClass('selected'); } if (href != null) { pageName = basename(href); } loadPage(href); return false; }); } function checkFormStatus(href, type, scroll_or_id) { var changed = false; if ($('.cactiFormStart').not('#chk').length) { $('.cactiFormStart').not('#chk').each(function() { var formID = $(this).attr('id'); var submitData = $(this).serializeForm(); if (typeof formArray != 'undefined' && typeof formArray[formID] != 'undefined') { var formData = formArray[formID]; $.each(submitData, function(index, value) { if (typeof formData[index] != 'undefined') { if (formData[index] != value) { if (index == 'settings_sendmail_path' || index == 'rrd_archive' || index == '__csrf_magicSubmit' || index == '__csrf_magic' || index == 'settings_smtp_password' || index == 'settings_smtp_password_confirm') { // Ignore this entry } else if (index.indexOf('[]') > 0) { // Ignore this entry } else { console.log('Index:-'+index+'-:Submit:'+value+', Orig:'+formData[index]); changed = true; } } } }); } }); if (changed) { warningMessage(href, type, scroll_or_id); return false; } else { return true; } } else { return true; } } function setupCollapsible() { var storage = Storages.localStorage; $('.collapsible').each(function(data) { var id = $(this).attr('id')+'_cs'; if (storage.isSet(id)) { var state = storage.get(id); } else { var state = 'show'; } if (state == 'hide') { $(this).addClass('collapsed'); $(this).nextUntil('div.spacer').hide(); $(this).find('i').removeClass('fa-angle-double-up').addClass('fa-angle-double-down'); storage.set(id, 'hide'); } }); $('.collapsible').off('click').on('click', function(data) { var id = $(this).attr('id')+'_cs'; if ($(this).find('i').hasClass('fa-angle-double-up')) { $(this).addClass('collapsed'); $(this).nextUntil('div.spacer').slideUp('slow'); $(this).find('i').removeClass('fa-angle-double-up').addClass('fa-angle-double-down'); storage.set(id, 'hide'); } else { $(this).removeClass('collapsed'); $(this).nextUntil('div.spacer').slideDown('slow'); $(this).nextUntil('div.spacer').each(function(data) { $(this).find('input, select').change(); }); $(this).find('i').removeClass('fa-angle-double-down').addClass('fa-angle-double-up'); storage.set(id, 'show'); } }); } function openUserMenu() { $('.user').removeClass('usermenuup').addClass('usermenudown'); $('.menuoptions').slideDown(120, 'easeInOutCubic'); } function closeUserMenu() { $('.user').removeClass('usermenudown').addClass('usermenuup'); $('.menuoptions').slideUp(120, 'easeInOutCubic'); } function handleConsole(pageName) { if (pageName == null) { pageName = basename($(location).attr('pathname')); } // Modify the console pic $('#menu_main_console').find('.menu_parent').attr('href', 'index.php').addClass('console selected'); $('#menu_main_console_div').remove(); if (pageName != 'index.php') { $('#menu_main_console').find('.menu_parent').removeClass('selected'); } } function setupUserMenu() { handleConsole(); $('.menuoptions').mouseenter(function() { clearTimeout(userMenuTimer); }).mouseleave(function() { if ($('.menuoptions').is(':visible')) { userMenuTimer = setTimeout(function() { closeUserMenu(); }, 1000); } }); $('.user').mouseenter(function(data) { clearTimeout(userMenuTimer); userMenuOpenTimer = setTimeout(function() { openUserMenu(); }, 400); openUserMenu(); }).mouseleave(function(data) { if ($('.menuoptions').is(':visible')) { userMenuTimer = setTimeout(function() { closeUserMenu(); }, 1000); } else { clearTimeout(userMenuOpenTimer); } }); } function setupSpecialKeys() { if (!isMobile.any()) { $('#filter, #rfilter').focus(); } else { $('#filter, #rfilter').prop('size', '15'); } } /** setupSortable - This function will set all actions for sortable columns * every time a page is regenerated */ function setupSortable() { $('th.sortable').on('click', function(e) { document.getSelection().removeAllRanges(); var $target = $(e.target); var sortAdd = ''; var url = ''; if (!$target.is('.ui-resizable-handle')) { var page = $(this).find('.sortinfo').attr('sort-page'); var column = $(this).find('.sortinfo').attr('sort-column'); var direction = $(this).find('.sortinfo').attr('sort-direction'); var returnto = $(this).find('.sortinfo').attr('sort-return'); if (shiftPressed) { sortAdd='&add=true'; } else { sortAdd='&add=reset'; } var url = page+(page.indexOf('?') > 0 ? '&':'?') + 'sort_column=' + column + '&sort_direction=' + direction + '&header=false' + sortAdd; closeDateFilters(); $.ajaxQ.abortAll(); $.get(url) .done(function(data) { checkForLogout(data); $('#'+returnto).empty().hide(); if (returnto == 'main') { $('div[class^="ui-"]').remove(); } $('#'+returnto).html(data).show(); applySkin(); }) .fail(function(data) { getPresentHTTPError(data); } ); } }); } function setupBreadcrumbs() { $('#breadcrumbs > li > a').click(function(event) { event.preventDefault(); event.stopPropagation(); var href = $(this).attr('href'); if (href != '#') { href = href.replace('action=tree_content', 'action=tree'); $(this).prop('href', href); document.location = href; } }); } /** saveTableWidths - This function will initialize table widths on page * load. It includes the 'initial' boolean to initialize the page */ function saveTableWidths(initial) { // We will save columns widths persistently var storage = Storages.localStorage; var key; // Initialize table width on the page $('.cactiTable').each(function(data) { var key = $(this).attr('id'); if (storage.isSet(key)) { var sizes = storage.get(key); } else { var sizes = new Array(); } var items = sizes ? sizes: new Array(); var width = $(document).width(); // if the table width changes, reset the columns if (key !== undefined && sizes == undefined) { storage.remove(key); var sizes = new Array(); var items = new Array(); } else if (key !== undefined && initial) { if (items.length > 0) { if (items[0] + 18 < width) { storage.remove(key); var sizes = new Array(); var items = new Array(); } } } var i = 1; items[0] = width; sizes[0] = width; if (key !== undefined) { if (initial && items.length) { $('#'+key).find('th.ui-resizable').each(function(data) { if (items[i] == 0) { items[i] = $(this).width(); sizes[i] = items[i]; } if (items[i] != 0) { $(this).css('width', items[i]); $(this).attr('resizeWidth', items[i]); } i++; }); } else { $('#'+key).find('th.ui-resizable').each(function(data) { sizes[i] = $(this).width(); if (sizes[i] != 0) { $(this).css('width', items[i]); $(this).attr('resizeWidth', sizes[i]); } i++; }); if (i > 1) { storage.set(key, sizes); } } } }); } /** applyTableSizing - This function sets all table headers to be resizable using * the jQueryUI function resizable. It also calls the saveTableWidths function * to store the widths in localStorage every time a column is resized. */ function applyTableSizing() { var originalSize = 0; var colWidth = 0; $('.tableHeader').not('.tableFixed').find('th').resizable({ handles: 'e', start: function(event, ui) { colWidth = $(this).width(); originalSize = ui.size.width; if (originalSize == 0) { originalSize = $(this).width(); } $(ui.originalElement).siblings().each(function(data) { $(this).attr('resizeWidth', $(this).width()); }); }, resize: function(event, ui) { var resizeDelta = ui.size.width - originalSize; var newColWidth = colWidth + resizeDelta; var nextWidth = $(ui.element).next().attr('resizeWidth'); $(ui.element).next().css('width', nextWidth-resizeDelta); $(ui.element).prevUntil('tr').each(function(data) { $(this).css('width', $(this).attr('resizeWidth')); }); $(this).css('height', 'auto'); }, stop: function(event, ui) { saveTableWidths(false); } }); saveTableWidths(true); } function appendHeaderSuppression(url) { if (url.indexOf('action=tree_content') < 0 && url.indexOf('action=tree') >= 0) { url = url.replace('action=tree', 'action=tree_content'); } if (url.indexOf('header=false') < 0) { url += (url.indexOf('?') > 0 ? '&header=false':'?header=false'); } return url; } function stripHeaderSuppression(url) { return url.replace('header=false', '').replace('?&', '?').replace('&&', '&'); } /** setupPageTimeout - This function will setup the page timeout based upon * the plugin developers $refresh requirements. It also sets up a location * to redirect the user to upon timeout. This is generally done for automatically * logging out the user, but can be used for simply refreshing the page as in the * case of the Graphs page. */ function setupPageTimeout() { if (typeof myRefresh != 'undefined') { clearTimeout(myRefresh); } if (typeof refreshMSeconds != 'undefined') { myRefresh = setTimeout(function() { if (refreshIsLogout) { document.location = urlPath+'logout.php?action=timeout'; } else { if (previousPage != '') { refreshPage = previousPage; } /* fix coner case with tree refresh */ refreshPage = appendHeaderSuppression(refreshPage); closeDateFilters(); $.ajaxQ.abortAll(); $.get(refreshPage) .done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }) .fail(function(data) { getPresentHTTPError(data); } ); } }, refreshMSeconds); } } function pulsateStart(element) { pulsating = true; pulsate(element); } function pulsate(element) { if (pulsating) { $(element || this).delay(100).fadeOut(800).delay(100).fadeIn(800, pulsate); } } function pulsateStop(element) { pulsating = false; } function setTitleAndHref() { myHref = $(location).attr('href'); myTitle = $(document).attr('title'); } function clearAllTimeouts() { if (typeof installTimer != 'undefined') { return true; } var id = window.setTimeout(function() {}, 0); while (id--) { window.clearTimeout(id); // will do nothing if no timeout with id is present } } function setZoneInfo() { var dt = new Date(); var tz = -dt.getTimezoneOffset(); $.cookie('CactiDateTime', dt.toString(), { expires: 365, path: urlPath, secure: true }); $.cookie('CactiTimeZone', tz.toString(), { expires: 365, path: urlPath, secure: true }); } $(function() { statePushed = false; popFired = false; var tapped = false; // Use traditional popstate handler window.onpopstate = function(event) { handlePopState(); } $('#filter, #rfilter').keydown(function(event) { if (event.keyCode == 8 && $(this).val() == '') { handlePopState(); } }); setZoneInfo(); setTitleAndHref(); setupUserMenu(); applySkin(); setupEllipsis(); handleUserMenu(); $('#navigation_right').show(); if (isMobile.any() != null) { $(window).on('touchstart', function(event) { if (!tapped) { tapped = setTimeout(function() { tapped=null; }, 300); } else { clearTimeout(tapped); tapped = null; if (screenfull.enabled) { screenfull.request(); } } }); $(window).on('load', function(event) { setTimeout(function() { window.scrollTo(0, 1); }, 0); }); } }); /* only perform the recalculation of elements at the final end of the windows resize event */ var waitForFinalEvent = (function () { var timers = {}; return function (callback, ms, uniqueId) { if (!uniqueId) { uniqueId = "Don't call this twice without a uniqueId"; } if (timers[uniqueId]) { clearTimeout(timers[uniqueId]); } timers[uniqueId] = setTimeout(callback, ms); }; })(); function setupEllipsis() { $('<div class="dropdownMenu">' +'<ul id="submenu-ellipsis" class="submenuoptions" style="display:none;">' +'</ul>' +'</div>').appendTo('body'); $('.maintabs-submenu, .usertabs-submenu, .submenu-ellipsis').off('click').on('click', function(event) { event.preventDefault(); var submenu_index = $(this).attr('id').replace('menu-', 'submenu-'); var submenu = $('#'+submenu_index); if (submenu.is(':visible') === false) { /* close other drop down menus first */ $('.submenuoptions').slideUp(120); $('.menuoptions').slideUp(120); /* re-position */ var position = $(this).position(); if (position.left - parseInt(submenu.outerWidth()) < 0) { submenu.css({'left': 0}).slideDown(120); } else { submenu.css({'left': position.left - parseInt(submenu.outerWidth()) + parseInt($(this).outerWidth())}).slideDown(120); } } else { submenu.slideUp(120); } return false; }); $('.submenuoptions').mouseenter(function(event) { clearTimeout(userMenuTimer); }).mouseleave(function(event) { if ($('.submenuoptions').is(':visible')) { userMenuTimer = setTimeout(function() {$('.submenuoptions').stop().slideUp(120);}, 1000); } else { clearTimeout(userMenuOpenTimer); } }); $(window).on('click', function(event) { if($(event.target).parents('.submenuoptions').length == 0 && $('.submenuoptions').is(':visible')) { $('.submenuoptions').slideUp(120); } if($(event.target).parents('.menuoptions').length == 0 && $('.menuoptions').is(':visible')) { $('.menuoptions').slideUp(120); } }); } function keepWindowSize() { $(window).resize(function (event) { waitForFinalEvent(function() { $('.cactiGraphContentArea').show(); var resizeTime = new Date(); var myEvent = event; if (resizeTimeout === false) { resizeTimeout = true; setTimeout(function() { responsiveUI(myEvent); }, resizeDelta); } heightPage = $(window).height(); if ($('#cactiPageHead').is(':visible')) { heightPageHead = $('#cactiPageHead').outerHeight(); } else { heightPageHead = 0; } if ($('#breadCrumbBar').is(':visible')) { heightBreadCrumbBar = $('#breadCrumbBar').outerHeight(); } else { heightBreadCrumbBar = 0; } if ($('#cactiPageBottom').is(':visible')) { heightPageBottom = $('#cactiPageBottom').outerHeight(); } else { heightPageBottom = 0; } heightPageContent = heightPage - heightPageHead - heightPageBottom - heightBreadCrumbBar; if (theme != 'classic') { $('body').css('height', heightPage); $('#cactiContent, #navigation, #navigation_right').css('height', heightPageContent); // Handle links pages $('#content').css({'width':'100%', 'height':heightPageContent-4}); } else { // Handle links pages $('#content').css({'width':'100%', 'height':$(document).height()}); } var navWidth = $('#navigation').width(); if (navWidth > 0) { $('#searcher').css('width', navWidth-70); } responsiveResizeGraphs(); /* close open dropdown menues first off */ $('.dropdownMenu > ul').hide(); if ($('#gtabs > .tabs').is(':visible')) { var graphTabWidth = $('#gtabs > .tabs').outerWidth(); } else { var graphTabWidth = 0; } if ($('.usertabs').length) { var userTabs = $('.usertabs').outerWidth(); } else { var userTabs = 0; } var bodyWidth = $('body').width(); var otherWidth = 0; $('#tabs').find('div:not(.maintabs):visible').each(function() { otherWidth += $(this).outerWidth(); }); var ellipsisWidth = $('.maintabs-submenu-ellipsis').outerWidth(); var tabHeight = $('#tabs').outerHeight(); var mainTabPos = false; if ($('.maintabs').length) { mainTabPos = $('.maintabs:first').position(); } if ($('.usertabs').length) { mainTabHeight = tabHeight; userTabPos = $('.usertabs').position(); } else if (mainTabPos != false) { mainTabHeight = $('.maintabs:first nav').outerHeight(); userTabPos = mainTabPos; } pageWidth = bodyWidth; var items = $($('.maintabs nav ul li a.lefttab').get()); var done = false; items.each(function() { var id = $(this).attr('id'); showCurrentTab(id); }); // Hide top menus if you have to var items = $($('.maintabs nav ul li a.lefttab').get().reverse()); var done = false; items.each(function() { var id = $(this).attr('id'); if (!done) { if (tabsWrapping()) { hideCurrentTab(id, true); } else { done = true; } } }); if ($('#submenu-ellipsis li').length == 0) { $('.ellipsis').hide(); } else { $('.ellipsis').show(); } }, 50, 'resize-content'); }).trigger('resize') } function hideCurrentTab(id, shrinking) { if ($('#'+id+'-ellipsis').length == 0) { var myid = id+'-ellipsis'; var href = $('#'+id).attr('href'); var selected = $('#'+id).hasClass('selected'); var text = $('#'+id).text(); if (shrinking) { $('#submenu-ellipsis').prepend('<li><a class="lefttab' + (selected ? ' selected':'') + '" id="'+myid+'" href="'+href+'">' + text + '</a></li>'); } else { $('#submenu-ellipsis').append('<li><a class="lefttab' + (selected ? ' selected':'') + '" id="'+myid+'" href="'+href+'">' + text + '</a></li>'); } setupResponsiveMenuAndTabs(); $('#'+id).parent().hide(); } } function showCurrentTab(id) { $('#'+id+'-ellipsis').parent().remove(); $('#'+id).parent().show(); } function tabsWrapping() { var mainTabPos = $('.maintabs:first').position(); var tabHeight = $('#tabs').height(); if ($('.usertabs').length) { var mainTabHeight = tabHeight; var userTabPos = $('.usertabs').position(); } else { var mainTabHeight = $('.maintabs:first nav').height(); var userTabPos = mainTabPos; } var bodyWidth = $('body').width(); var otherWidth = 0; $('#tabs').find('div:not(.maintabs):visible').each(function() { otherWidth += $(this).outerWidth(); }); var ellipsisWidth = $('.maintabs-submenu-ellipsis').outerWidth(); var mtabsWidth = $('.maintabs:not(.usertabs)').outerWidth(); if ($('#gtabs>.tabs').length) { var gtabsWidth = $('#gtabs>.tabs').outerWidth(); } else { var gtabsWidth = 0; } if ($('.usertabs').length) { var utabsWidth = $('.usertabs').outerWidth(); } else { var utabsWidth = 0; } if (gtabsWidth + mtabsWidth + utabsWidth + otherWidth + ellipsisWidth > bodyWidth - 20) { return true; } if (mainTabPos.top != userTabPos.top || mainTabHeight > tabHeight) { return true; } else { return false; } } /* Graph related javascript functions */ if (typeof urlPath == 'undefined') { var urlPath = ''; } var graphPage = urlPath+'graph_view.php'; var pageAction = 'preview'; function checkForLogout(data) { if (typeof data == 'undefined') { return true; } else if (typeof data == 'object') { return true; } else if (data.indexOf('cactiLoginSuspend') >= 0) { document.location = urlPath + 'logout.php?action=disabled'; } else if (data.indexOf('cactiLoginLogo') >= 0) { document.location = urlPath + 'logout.php?action=timeout'; } return false; } function clearGraphFilter() { var href = appendHeaderSuppression(graphPage+'?action='+pageAction+'&clear=1'); closeDateFilters(); $.ajaxQ.abortAll(); $.get(href) .done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }) .fail(function(data) { getPresentHTTPError(data); } ); } function closeDateFilters() { date1Open = false; date2Open = false; $('#date1').datetimepicker('hide'); $('#date2').datetimepicker('hide'); } function saveGraphFilter(section) { closeDateFilters(); $.post(graphPage+'?action=save', { columns: $('#columns').val(), graphs: $('#graphs').val(), graph_template_id: $('#graph_template_id').val(), predefined_timespan: $('#predefined_timespan').val(), predefined_timeshift: $('#predefined_timeshift').val(), thumbnails: $('#thumbnails').is(':checked'), __csrf_magic: csrfMagicToken }).done(function(data) { checkForLogout(data); $('#text').show().text(filterSettingsSaved).fadeOut(2000, function() { $('#text').empty(); }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function applyGraphFilter() { var href = appendHeaderSuppression(graphPage+'?action='+pageAction+ '&rfilter=' + base64_encode($('#rfilter').val())+ (typeof($('#host_id').val()) != 'undefined' ? '&host_id='+$('#host_id').val():'')+ '&columns='+$('#columns').val()+ '&graphs='+$('#graphs').val()+ '&graph_template_id='+$('#graph_template_id').val()+ '&thumbnails='+$('#thumbnails').is(':checked')); closeDateFilters(); $.ajaxQ.abortAll(); $.get(href) .done(function(data) { checkForLogout(data); $('#main').hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); pushState(myTitle, myHref); }) .fail(function(data) { getPresentHTTPError(data); } ); } function cleanHeader(href) { href = stripHeaderSuppression(href); href = href.replace('action=tree_content', 'action=tree'); href = href.replace('?nostate=true', '?').replace('&nostate=true', '').replace('?&', '?'); return href; } function pushState(myTitle, myHref) { if (myHref.indexOf('nostate') < 0) { if (statePushed == false) { if (typeof window.history.pushState != 'undefined') { var myObject = { Page: myTitle, Url: cleanHeader(myHref) }; window.history.pushState(myObject, myObject.Page, myObject.Url); } } } else if (typeof window.history.popState == 'function') { window.history.popState(); } statePushed = true; } function handlePopState() { var href = document.location.href; if (popFired == false) { if (href.indexOf('#') == -1) { if (href.indexOf('header=false') > 0) { loadPageNoHeader(href + '&nostate=true'); } else if (basename(href) == lastPage) { loadPageNoHeader(href + (href.indexOf('?') > 0 ? '&header=false&nostate=true':'?header=false&nostate=true')); } else { href.replace('header=false','').replace('?&', '?').replace('&&', '&'); document.location = href + (href.indexOf('?') > 0 ? '&nostate=true':'?nostate=true'); } } } popFired = true; lastPage = basename(href); } function applyGraphTimespan() { var href = appendHeaderSuppression(graphPage+'?action='+pageAction+ '&predefined_timespan='+$('#predefined_timespan').val()+ ($('#rfilter').length ? '&rfilter=' + base64_encode($('#rfilter').val()):'') + '&predefined_timeshift='+$('#predefined_timeshift').val()); closeDateFilters(); $.ajaxQ.abortAll(); $.get(href) .done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }) .fail(function(data) { getPresentHTTPError(data); } ); } function refreshGraphTimespanFilter() { var json = { custom: 1, button_refresh_x: 1, date1: $('#date1').val(), rfilter: base64_encode($('#rfilter').val()), date2: $('#date2').val(), predefined_timespan: $('#predefined_timespan').val(), predefined_timeshift: $('#predefined_timeshift').val(), __csrf_magic: csrfMagicToken }; var href = appendHeaderSuppression(graphPage+'?action='+pageAction); closeDateFilters(); $.ajaxQ.abortAll(); $.post(href, json).done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }); } function timeshiftGraphFilterLeft() { var json = { move_left_x: 1, move_left_y: 1, date1: $('#date1').val(), date2: $('#date2').val(), predefined_timespan: $('#predefined_timespan').val(), predefined_timeshift: $('#predefined_timeshift').val(), __csrf_magic: csrfMagicToken }; var href = appendHeaderSuppression(graphPage+'?action='+pageAction); closeDateFilters(); $.ajaxQ.abortAll(); $.post(href, json).done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }); } function timeshiftGraphFilterRight() { var json = { move_right_x: 1, move_right_y: 1, date1: $('#date1').val(), date2: $('#date2').val(), predefined_timespan: $('#predefined_timespan').val(), predefined_timeshift: $('#predefined_timeshift').val(), __csrf_magic: csrfMagicToken }; var href = appendHeaderSuppression(graphPage+'?action='+pageAction); closeDateFilters(); $.ajaxQ.abortAll(); $.post(href, json).done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }); } function clearGraphTimespanFilter() { var json = { button_clear: 1, date1: $('#date1').val(), date2: $('#date2').val(), predefined_timespan: $('#predefined_timespan').val(), predefined_timeshift: $('#predefined_timeshift').val(), __csrf_magic: csrfMagicToken }; var href = appendHeaderSuppression(graphPage+'?action='+pageAction); closeDateFilters(); $.ajaxQ.abortAll(); $.post(href, json).done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); }); } function removeSpikesStdDev(local_graph_id) { var strURL = urlPath+'spikekill.php?method=stddev&local_graph_id='+local_graph_id; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); redrawGraph(local_graph_id); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function removeSpikesVariance(local_graph_id) { var strURL = urlPath+'spikekill.php?method=variance&local_graph_id='+local_graph_id; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); redrawGraph(local_graph_id); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function removeSpikesInRange(local_graph_id) { var strURL = urlPath+'spikekill.php?method=fill&local_graph_id='+local_graph_id+'&outlier-start='+graph_start+'&outlier-end='+graph_end; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); redrawGraph(local_graph_id); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function removeRangeFill(local_graph_id) { var strURL = urlPath+'spikekill.php?method=float&local_graph_id='+local_graph_id+'&outlier-start='+graph_start+'&outlier-end='+graph_end; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); redrawGraph(local_graph_id); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function dryRunStdDev(local_graph_id) { var strURL = urlPath+'spikekill.php?method=stddev&dryrun=true&local_graph_id='+local_graph_id; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function dryRunVariance(local_graph_id) { var strURL = urlPath+'spikekill.php?method=variance&dryrun=true&local_graph_id='+local_graph_id; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function dryRunSpikesInRange(local_graph_id) { var strURL = urlPath+'spikekill.php?method=fill&dryrun=true&local_graph_id='+local_graph_id+'&outlier-start='+graph_start+'&outlier-end='+graph_end; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); redrawGraph(local_graph_id); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function dryRunRangeFill(local_graph_id) { var strURL = urlPath+'spikekill.php?method=float&dryrun=true&local_graph_id='+local_graph_id+'&outlier-start='+graph_start+'&outlier-end='+graph_end; closeDateFilters(); $.getJSON(strURL) .done(function(data) { checkForLogout(data); redrawGraph(local_graph_id); $('#spikeresults').remove(); $('body').append('<div id="spikeresults" style="overflow-y:scroll;" title="'+spikeKillResults+'"></div>'); $('#spikeresults').html(data.results); $('#spikeresults').dialog({ width:1100, maxHeight: 600 }); }) .fail(function(data) { getPresentHTTPError(data); } ); } function redrawGraph(graph_id) { var mainWidth = getMainWidth() - 30; var isThumb = $('#thumbnails').is(':checked'); var myColumns = $('#columns').val(); var graphRow = $('.tableRowGraph').width(); var drillDown = $('.graphDrillDown:first').outerWidth() + 10; if (mainWidth < graphRow) { graphRow = mainWidth - drillDown; } else if (graphRow == 0) { graphRow = mainWidth; } var myWidth = (graphRow-(drillDown * myColumns)) / myColumns; var graph_height = $('#wrapper_'+graph_id).attr('graph_height'); var graph_width = $('#wrapper_'+graph_id).attr('graph_width'); closeDateFilters(); $.getJSON(urlPath+'graph_json.php?rra_id=0'+ '&local_graph_id='+graph_id+ '&graph_start='+graph_start+ '&graph_end='+graph_end+ '&graph_height='+graph_height+ '&graph_width='+graph_width+ (isThumb ? '&graph_nolegend=true':'')) .done(function(data) { if (typeof data.status == 'undefined') { if (myWidth < data.image_width) { ratio=myWidth/data.image_width; data.image_width = parseInt(data.image_width * ratio); data.image_height = parseInt(data.image_height * ratio); data.graph_width = parseInt(data.graph_width * ratio); data.graph_height = parseInt(data.graph_height * ratio); data.graph_top = parseInt(data.graph_top * ratio); data.graph_left = parseInt(data.graph_left * ratio); } $('#wrapper_'+data.local_graph_id).html( "<img class='graphimage' id='graph_"+data.local_graph_id+"'"+ " src='data:image/"+data.type+";base64,"+data.image+"'"+ " rra_id='"+data.rra_id+"'"+ " graph_type='"+data.type+"'"+ " graph_id='"+data.local_graph_id+"'"+ " graph_start='"+data.graph_start+"'"+ " graph_end='"+data.graph_end+"'"+ " graph_left='"+data.graph_left+"'"+ " graph_top='"+data.graph_top+"'"+ " graph_width='"+data.graph_width+"'"+ " graph_height='"+data.graph_height+"'"+ " width='"+data.image_width+"'"+ " height='"+data.image_height+"'"+ " image_width='"+data.image_width+"'"+ " image_height='"+data.image_height+"'"+ " canvas_top='"+data.graph_top+"'"+ " canvas_left='"+data.graph_left+"'"+ " canvas_width='"+data.graph_width+"'"+ " canvas_height='"+data.graph_height+"'"+ " value_min='"+data.value_min+"'"+ " value_max='"+data.value_max+"'>" ); $('#graph_'+data.local_graph_id).zoom({ inputfieldStartTime : 'date1', inputfieldEndTime : 'date2', serverTimeOffset : timeOffset }); } else { getPresentHTTPError(data); } }) .fail(function(data) { getPresentHTTPError(data); } ); } function initializeGraphs(disable_cache) { disable_cache = (disable_cache === 'undefined') ? false : true; $.ajaxQ.abortAll(); $('a[id$="_mrtg"]').each(function() { var graph_id = $(this).attr('id').replace('graph_','').replace('_mrtg',''); $(this).attr('href', urlPath+'graph.php?local_graph_id='+graph_id); $(this).off('click').on('click', function(event) { var graph_id=$(this).attr('id').replace('graph_','').replace('_mrtg',''); event.preventDefault(); event.stopPropagation(); closeDateFilters(); $.ajaxQ.abortAll(); $.get(urlPath+'graph.php?local_graph_id='+graph_id+'&header=false') .done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('#breadcrumbs').append('<li><a id="nav_mrgt" href="#">'+timeGraphView+'</a></li>'); $('div[class^="ui-"]').remove(); $('#main').html(data); applySkin(); clearTimeout(myRefresh); }) .fail(function(data) { getPresentHTTPError(data); } ); }); }); // Get these outside of the each to reduce calls var timestampDate1 = getTimestampFromDate($('#date1').val()); var timestampDate2 = getTimestampFromDate($('#date2').val()); $('a[id$="_csv"]').each(function() { var graph_id=$(this).attr('id').replace('graph_','').replace('_csv',''); // Disable context menu $(this).children().contextmenu(function() { return false; }); $(this).attr('href',urlPath+ 'graph_xport.php?local_graph_id='+graph_id+ '&rra_id=0&view_type=tree&graph_start='+timestampDate1+ '&graph_end='+timestampDate2); $(this).off('click').on('click', function(event) { var graph_id = $(this).attr('id').replace('graph_','').replace('_csv',''); event.preventDefault(); event.stopPropagation(); document.location = urlPath+ 'graph_xport.php?local_graph_id='+graph_id+ '&rra_id=0&view_type=tree&graph_start='+timestampDate1+ '&graph_end='+timestampDate2; Pace.stop(); }); }); $('#form_graph_view').off('submit').on('submit', function(event) { event.preventDefault(); event.stopPropagation(); applyFilter(); }); var mainWidth = getMainWidth() - 30; var myColumns = $('#columns').val(); var isThumb = $('#thumbnails').is(':checked'); var myWidth = (mainWidth-(30*myColumns))/myColumns; var numGraphs = $('.graphWrapper').length; $('.graphWrapper').each(function() { var graph_id = $(this).attr('graph_id'); if (!(graph_id > 0)) { graph_id=$(this).attr('id').replace('wrapper_',''); } var rra_id = $(this).attr('rra_id'); if (!(rra_id > 0)) { rra_id=0; } var graph_height = $(this).attr('graph_height'); var graph_width = $(this).attr('graph_width'); closeDateFilters(); $.getJSON(urlPath+'graph_json.php?rra_id='+rra_id+ '&local_graph_id='+graph_id+ '&graph_start='+graph_start+ '&graph_end='+graph_end+ '&graph_height='+graph_height+ '&graph_width='+graph_width+ (disable_cache ? '&disable_cache=true':'')+ (isThumb ? '&graph_nolegend=true':'')) .done(function(data) { if (myWidth < data.image_width) { ratio=myWidth/data.image_width; data.image_width = parseInt(data.image_width * ratio); data.image_height = parseInt(data.image_height * ratio); data.graph_width = parseInt(data.graph_width * ratio); data.graph_height = parseInt(data.graph_height * ratio); data.graph_top = parseInt(data.graph_top * ratio); data.graph_left = parseInt(data.graph_left * ratio); } var wrapper_id = '#wrapper_'+data.local_graph_id; if (rra_id > 0) { wrapper_id += '[rra_id=\'' + data.rra_id + '\']'; } $(wrapper_id).html( "<img class='graphimage' id='graph_"+data.local_graph_id+"'"+ " src='data:image/"+data.type+";base64,"+data.image+"'"+ " rra_id='"+data.rra_id+"'"+ " graph_type='"+data.type+"'"+ " graph_id='"+data.local_graph_id+"'"+ " graph_start='"+data.graph_start+"'"+ " graph_end='"+data.graph_end+"'"+ " graph_left='"+data.graph_left+"'"+ " graph_top='"+data.graph_top+"'"+ " graph_width='"+data.graph_width+"'"+ " graph_height='"+data.graph_height+"'"+ " width='"+data.image_width+"'"+ " height='"+data.image_height+"'"+ " image_width='"+data.image_width+"'"+ " image_height='"+data.image_height+"'"+ " canvas_top='"+data.graph_top+"'"+ " canvas_left='"+data.graph_left+"'"+ " canvas_width='"+data.graph_width+"'"+ " canvas_height='"+data.graph_height+"'"+ " value_min='"+data.value_min+"'"+ " value_max='"+data.value_max+"'>" ); var graph_id = '#graph_'+data.local_graph_id; if (rra_id > 0) { graph_id += '[rra_id=\'' + data.rra_id + '\']'; } $(graph_id).zoom({ inputfieldStartTime : 'date1', inputfieldEndTime : 'date2', serverTimeOffset : timeOffset }); if (typeof(realtimeArray) != 'undefined') { realtimeArray[data.local_graph_id] = false; } if (!--numGraphs) { responsiveResizeGraphs(); } }) .fail(function(data) { getPresentHTTPError(data); } ); }); $('#realtimeoff').off('click').on('click', function() { stopRealtime(); }); $('#ds_step').off('change').on('change', function() { realtimeGrapher(); }); $('a[id$="_util"]').each(function() { var graph_id = $(this).attr('id').replace('graph_','').replace('_util',''); $(this).attr('href',urlPath+ 'graph.php?action=zoom&local_graph_id='+graph_id+ '&rra_id=0&graph_start='+timestampDate1+ '&graph_end='+timestampDate2); $(this).off('click').on('click', function(event) { var graph_id = $(this).attr('id').replace('graph_','').replace('_util',''); event.preventDefault(); event.stopPropagation(); closeDateFilters(); $.ajaxQ.abortAll(); $.get(urlPath+'graph.php?action=zoom&header=false&local_graph_id='+graph_id+'&rra_id=0&graph_start='+getTimestampFromDate($('#date1').val())+'&graph_end='+getTimestampFromDate($('#date2').val())) .done(function(data) { checkForLogout(data); $('#main').empty().hide(); $('div[class^="ui-"]').remove(); $('#main').html(data); $('#breadcrumbs').append('<li><a id="nav_butil" href="#">'+utilityView+'</a></li>'); applySkin(); clearTimeout(myRefresh); }) .fail(function(data) { getPresentHTTPError(data); } ); }); }); $('a[id$="_realtime"]').each(function() { // Disable right click $(this).children().on('contextmenu', function(event) { return false; }); $(this).off('click').on('click', function(event) { var graph_id = $(this).attr('id').replace('graph_','').replace('_realtime',''); event.preventDefault(); event.stopPropagation(); if (realtimeArray[graph_id]) { $('#wrapper_'+graph_id).html(keepRealtime[graph_id]).change(); $(this).html("<img class='drillDown' title='"+realtimeClickOn+"' alt='' src='"+urlPath+"images/chart_curve_go.png'>"); $('graph_id'+graph_id).tooltip().zoom({ inputfieldStartTime : 'date1', inputfieldEndTime : 'date2', serverTimeOffset : timeOffset }); realtimeArray[graph_id] = false; setFilters(); } else { keepRealtime[graph_id] = $('#wrapper_'+graph_id).html(); $(this).html("<i style='text-align:center;padding:0px;' title='"+realtimeClickOff+"' class='drillDown fa fa-circle-notch fa-spin'/>"); $(this).find('i').tooltip(); realtimeArray[graph_id] = true; setFilters(); realtimeGrapher(); } }); }); } $.widget('custom.languageselect', $.ui.selectmenu, { _renderItem: function(ul, item) { var li = $('<li>'); var wrapper = $('<div>', { text: item.label }); if (item.disabled) { li.addClass( 'ui-state-disabled' ); } $('<span>', { style: item.element.attr('data-style') + ';float:right', 'class': 'right flag-icon flag-icon-squared ' + item.element.attr('data-class') }).appendTo(wrapper); return li.append(wrapper).appendTo(ul); } }); // combobox example borrowed from jqueryui $.widget('custom.dropcolor', { _create: function() { $('body').append('<div id="cwrap" class="ui-selectmenu-menu ui-front">'); this.wrapper = $('<span><span class="ui-select-text"><div id="bgc" class="ui-icon color-icon" style="margin-left:2px;margin-right:3px;"></div></span></span>') .addClass('class="ui-selectmenu-button ui-selectmenu-button-closed ui-corner-all ui-button ui-widget"') .insertAfter(this.element); this.element.hide(); this._createAutocomplete(); this._createShowAllButton(); }, _createAutocomplete: function() { var selected = this.element.children(':selected'); var value = selected.val() ? selected.text() : ''; var regExp = /\(([^)]+)\)/; var hex = regExp.exec(value); if (hex != null) { this.wrapper.find('#bgc').css('background-color', '#'+hex[1]); } this.input = $('<input class="ui-autocomplete-input ui-state-default ui-selectmenut-text" style="background:transparent;border:0px;margin-left:-22px;padding:0px 3px 0px 22px;" value="'+value+'">') .appendTo(this.wrapper) .on('click', function() { $(this).autocomplete('search', ''); }) .autocomplete({ delay: 0, minLength: 0, source: $.proxy(this, '_source'), select: $.proxy(this, '_select'), search: function() { $(this).data('ui-autocomplete').menu.bindings = $(); }, close: function() { $(this).data('ui-autocomplete').menu.bindings = $(); }, create: function() { $(this).data('ui-autocomplete')._renderItem = function(ul, item) { var regExp = /\(([^)]+)\)/; var hex = regExp.exec(item.label); var mylabel = $($.parseHTML(item.label)); var label = mylabel.text(); if (hex !== null) { color = hex[1]; return $('<li>').attr('data-value', item.value).html('<div><span style="background-color:#'+color+';" class="ui-icon color-icon"></span>' + label + '</div>').appendTo(ul); } else { return $('<li>').attr('data-value', item.value).html('<div><span class="ui-icon color-icon"></span>' + label + '</div>').appendTo(ul); } } $(this).data('ui-autocomplete')._resizeMenu = function () { var ul = this.menu.element; ul.outerWidth('220px'); } } }); this._on(this.input, { autocompleteselect: function(event, ui) { ui.item.option.selected = true; this._trigger('select', event, { item: ui.item.option }); }, autocompletechange: '_removeIfInvalid' }); }, _select: function(event, ui) { var regExp = /\(([^)]+)\)/; var hex = regExp.exec(ui.item.label); var id = $(ui.item.option).attr('value'); if (hex !== null) { color = hex[1]; this.wrapper.find('#bgc').css('background-color', '#'+color); this.wrapper.find('input').val(ui.item.value); } else { this.wrapper.find('#bgc').css('background-color', ''); this.wrapper.find('input').val(ui.item.value); } }, _createShowAllButton: function() { var input = this.input; var wasOpen = false; $('<span>') .attr('tabIndex', -1) .appendTo(this.wrapper) .addClass('ui-icon ui-icon-triangle-1-s') .on('mousedown', function() { wasOpen = input.autocomplete('widget').is(':visible'); }) .on('click', function() { input.trigger('focus'); // Close if already visible if (wasOpen) { return; } input.autocomplete('search', ''); }); }, _source: function(request, response) { var matcher = new RegExp($.ui.autocomplete.escapeRegex(request.term), 'i'); results = this.element.children('option').map(function() { var text = $(this).text(); if (this.value && (!request.term || matcher.test(text))) { return { label: text, value: text, option: this }; } }); response(results); }, _removeIfInvalid: function(event, ui) { // Selected an item, nothing to do if (ui.item) { return; } // Search for a match (case-insensitive) var value = this.input.val(); var valueLowerCase = value.toLowerCase(); var valid = false; this.element.children('option').each(function() { if ($(this).text().toLowerCase() === valueLowerCase) { this.selected = valid = true; return false; } }); // Found a match, nothing to do if (valid) { return; } // Remove invalid value this.input.val(''); this.element.val(''); this._delay(function() { this.input.tooltip('close').attr('title', ''); }, 2500 ); this.input.autocomplete('instance').term = ''; }, _destroy: function() { this.wrapper.remove(); this.element.show(); } }); function expandClipboardSection(section) { var isVisible = section.is(':visible'); if (!isVisible) { section.slideDown('fast'); } var children = section.find('table').each(function (i) { expandClipboardSection($(this)); }); } function copyToClipboard(containerId) { var clipboardDataId = containerId.replace('copyToClipboard','clipboardData'); var clipboardData = document.getElementById(clipboardDataId); var messageWidth = $(window).width(); if (messageWidth > 350) { messageWidth = 350; } else { messageWidth -= 50; } if (clipboardData == null) { $('body').append('<div style="display:none;" id="clipboardMessage" title="'+clipboard+'">'+clipboardCopyFailed+'<br/><br/>'+clipboardID+': '+clipboardDataId+'</div>'); $('#clipboardMessage').dialog({ resizable: false, draggable: false, height: 170, width: messageWidth, buttons: { Ok: function() { $(this).dialog('close'); $('#clipboardMessage').remove(); } } }); $('#clipboardMessage').dialog('open'); } else if (!document.queryCommandSupported('copy')) { $('body').append('<div style="display:none;" id="clipboardMessage" title="'+clipboard+'">'+clipboardNotAvailable+'</div>'); $('#clipboardMessage').dialog({ resizable: false, draggable: false, height: 120, width: messageWidth, buttons: { Ok: function() { $(this).dialog('close'); $('#clipboardMessage').remove(); } } }); $('#clipboardMessage').dialog('open'); } else { var clipboardHeaderId = containerId.replace('copyToClipboard','clipboardHeader'); var clipboardHeader = document.getElementById(clipboardHeaderId); if (clipboardData != null) { expandClipboardSection($(clipboardData)); } if (clipboardHeader != null) { expandClipboardSection($(clipboardHeader)); } // get Selection object from currently user selected text var selection = window.getSelection(); // unselect any user selected text (if any) selection.removeAllRanges(); // create new range object var range = document.createRange(); // set range to encompass desired element text if (clipboardHeader == null) { range.selectNode(clipboardData); } else { range.selectNode(clipboardHeader); } // add range to Selection object to select it selection.addRange(range); var success = document.execCommand('copy'); selection.removeAllRanges(); var successMessage = (!success ? clipboardNotUpdated : clipboardUpdated); $('body').append('<div style="display:none;" id="clipboardMessage" title="'+clipboard+'">'+successMessage+'</div>'); $('#clipboardMessage').dialog({ resizable: false, draggable: false, height: 120, width: messageWidth, buttons: { Ok: function() { $(this).dialog('close'); $('#clipboardMessage').remove(); } } }); $('#clipboardMessage').dialog('open'); } } var snmp_password = ''; var snmp_auth_protocol = ''; var snmp_priv_protocol = ''; var snmp_priv_passphrase = ''; var snmp_security_initialized = false; function storeSNMPSecurity() { if ($('#snmp_version').val() == '3') { if ($('#snmp_auth_protocol').val() != '[None]') { snmp_auth_protocol = $('#snmp_auth_protocol').val(); snmp_password = $('#snmp_password').val(); } else { snmp_auth_protocol = ''; snmp_password = ''; } if ($('#snmp_priv_protocol').val() != '[None]') { snmp_priv_protocol = $('#snmp_priv_protocol').val(); snmp_priv_passphrase = $('#snmp_priv_passphrase').val(); } else { snmp_priv_protocol = ''; snmp_priv_passphrase = ''; } } else { $('#snmp_security_level').val(defaultSNMPSecurityLevel); } } function setSNMPSecurity() { if ($('#snmp_version').val() == '3') { if (!snmp_security_initialized) { if ($('#snmp_auth_protocol').val() == '[None]') { $('#snmp_security_level').val('noAuthNoPriv'); } else if ($('#snmp_priv_protocol').val() == '[None]') { $('#snmp_security_level').val('authNoPriv'); } else { $('#snmp_security_level').val('authPriv'); } var selectmenu = ($('#snmp_security_level').selectmenu('instance') !== undefined); if (selectmenu) { $('#snmp_security_level').selectmenu('refresh'); } $('#snmp_password').keyup(function() { checkSNMPPassphrase('auth'); }); $('#snmp_password_confirm').keyup(function() { checkSNMPPassphraseConfirm('auth'); }); $('#snmp_priv_passphrase').keyup(function() { checkSNMPPassphrase('priv'); }); $('#snmp_priv_passphrase_confirm').keyup(function() { checkSNMPPassphraseConfirm('priv'); }); } snmp_security_initialized = true; } } function setSNMP() { var snmp_version = $('#snmp_version').val(); storeSNMPSecurity(); setSNMPSecurity(); switch(snmp_version) { case '0': // Not in Use $('#row_snmp_username').hide(); $('#row_snmp_password').hide(); $('#row_snmp_community').hide(); $('#row_snmp_security_level').hide(); $('#row_snmp_auth_password').hide(); $('#row_snmp_auth_protocol').hide(); $('#row_snmp_priv_passphrase').hide(); $('#row_snmp_priv_protocol').hide(); $('#row_snmp_engine_id').hide(); $('#row_snmp_context').hide(); $('#row_snmp_port').hide(); $('#row_snmp_timeout').hide(); $('#row_max_oids').hide(); if ($('#row_snmp_engine_id')) { $('#row_snmp_engine_id').hide(); } if ($('#row_snmp_retries')) { $('#row_snmp_retries').hide(); } break; case '1': // SNMP v1 case '2': // SNMP v2c $('#row_snmp_username').hide(); $('#row_snmp_password').hide(); $('#row_snmp_community').show(); $('#row_snmp_security_level').hide(); $('#row_snmp_auth_password').hide(); $('#row_snmp_auth_protocol').hide(); $('#row_snmp_priv_passphrase').hide(); $('#row_snmp_priv_protocol').hide(); $('#row_snmp_engine_id').hide(); $('#row_snmp_context').hide(); $('#row_snmp_port').show(); $('#row_snmp_timeout').show(); $('#row_max_oids').show(); if ($('#row_snmp_engine_id')) { $('#row_snmp_engine_id').hide(); } if ($('#row_snmp_retries')) { $('#row_snmp_retries').show(); } break; case '3': // SNMP v3 $('#row_snmp_username').show(); $('#row_snmp_password').show(); $('#row_snmp_community').hide(); $('#row_snmp_security_level').show(); $('#row_snmp_auth_password').show(); $('#row_snmp_auth_protocol').show(); $('#row_snmp_priv_passphrase').show(); $('#row_snmp_priv_protocol').show(); $('#row_snmp_engine_id').show(); $('#row_snmp_context').show(); $('#row_snmp_port').show(); $('#row_snmp_timeout').show(); $('#row_max_oids').show(); if ($('#row_snmp_engine_id')) { $('#row_snmp_engine_id').show(); } if ($('#row_snmp_retries')) { $('#row_snmp_retries').show(); } if ($('#snmp_security_level').val() == 'noAuthNoPriv') { $('#snmp_auth_protocol option[value*="None"').prop('disabled', false); $('#snmp_priv_protocol option[value*="None"').prop('disabled', false); if ($('#snmp_auth_protocol').val() != '[None]') { snmp_auth_protocol = $('#snmp_auth_protocol').val(); snmp_password = $('#snmp_password').val(); } if ($('#snmp_priv_protocol').val() != '[None]') { snmp_priv_protocol = $('#snmp_priv_protocol').val(); snmp_priv_passphrase = $('#snmp_priv_passphrase').val(); } $('#snmp_auth_protocol').val('[None]'); $('#snmp_priv_protocol').val('[None]'); $('#row_snmp_auth_protocol').hide(); $('#row_snmp_priv_protocol').hide(); $('#row_snmp_password').hide(); $('#row_snmp_priv_passphrase').hide(); } else if ($('#snmp_security_level').val() == 'authNoPriv') { $('#snmp_auth_protocol option[value*="None"').prop('disabled', false); $('#snmp_priv_protocol option[value*="None"').prop('disabled', false); if ($('#snmp_priv_protocol').val() != '[None]') { snmp_priv_protocol = $('#snmp_priv_protocol').val(); snmp_priv_passphrase = $('#snmp_priv_passphrase').val(); } if (snmp_auth_protocol != '[None]' && snmp_auth_protocol != '' && $('#snmp_auth_protocol').val() == '[None]') { $('#snmp_auth_protocol').val(snmp_auth_protocol); $('#snmp_password').val(snmp_password); $('#snmp_password_confirm').val(snmp_password); } else if ($('#snmp_auth_protocol').val() == '[None]' || $('#snmp_auth_protocol').val() == '') { if (defaultSNMPAuthProtocol == '' || defaultSNMPAuthProtocol == '[None]') { $('#snmp_auth_protocol').val('MD5'); } else { $('#snmp_auth_protocol').val(defaultSNMPAuthProtocol); } } $('#snmp_priv_protocol').val('[None]'); $('#row_snmp_priv_protocol').hide(); $('#row_snmp_priv_passphrase').hide(); $('#snmp_auth_protocol option[value*="None"').prop('disabled', true); $('#snmp_priv_protocol option[value*="None"').prop('disabled', false); checkSNMPPassphrase('auth'); } else { $('#snmp_auth_protocol option[value*="None"').prop('disabled', false); $('#snmp_priv_protocol option[value*="None"').prop('disabled', false); if (snmp_auth_protocol != '' && $('#snmp_auth_protocol').val() == '[None]') { $('#snmp_auth_protocol').val(snmp_auth_protocol); $('#snmp_password').val(snmp_password); $('#snmp_password_confirm').val(snmp_password); } else if ($('#snmp_auth_protocol').val() == '[None]' || $('#snmp_auth_protocol').val() == '') { if (defaultSNMPAuthProtocol == '' || defaultSNMPAuthProtocol == '[None]') { $('#snmp_auth_protocol').val('MD5'); } else { $('#snmp_auth_protocol').val(defaultSNMPAuthProtocol); } } if (snmp_priv_protocol != '' && $('#snmp_priv_protocol').val() == '[None]') { $('#snmp_priv_protocol').val(snmp_priv_protocol); $('#snmp_priv_passphrase').val(snmp_priv_passphrase); $('#snmp_priv_passphrase_confirm').val(snmp_priv_passphrase); } else if ($('#snmp_priv_protocol').val() == '[None]' || $('#snmp_priv_protocol').val() == '') { if (defaultSNMPPrivProtocol == '' || defaultSNMPPrivProtocol == '[None]') { $('#snmp_priv_protocol').val('DES'); } else { $('#snmp_priv_protocol').val(defaultSNMPPrivProtocol); } } $('#snmp_auth_protocol option[value*="None"').prop('disabled', true); $('#snmp_priv_protocol option[value*="None"').prop('disabled', true); checkSNMPPassphrase('auth'); checkSNMPPassphrase('priv'); } if ($('#snmp_auth_protocol').val() == '[None]') { $('#row_snmp_password').hide(); $('#snmp_password').val(''); $('#snmp_password_confirm').val(''); } if ($('#snmp_priv_protocol').val() == '[None]') { $('#row_snmp_priv_passphrase').hide(); $('#snmp_priv_passphrase').val(''); $('#snmp_priv_passphrase_confirm').val(''); } selectmenu = ($('#snmp_security_level').selectmenu('instance') !== undefined); if (selectmenu) { $('#snmp_security_level').selectmenu('refresh'); $('#snmp_auth_protocol').selectmenu('refresh'); $('#snmp_priv_protocol').selectmenu('refresh'); } break; } } function checkSNMPPassphrase(type) { var minChars = 8; if (type == 'priv') { var pass = '#snmp_priv_passphrase'; var conf = '#snmp_priv_passphrase_confirm'; var span = 'priv'; } else { var pass = '#snmp_password'; var conf = '#snmp_password_confirm'; var span = 'auth'; } if ($(pass).val().length == 0) { $('#'+span).remove(); $('#'+span+'conf').remove(); } else if ($(pass).val().length < minChars) { $('#'+span).remove(); $(pass).after('<span id="'+span+'"><i class="badpassword fa fa-times"></i><span style="padding-left:4px;">'+passwordTooShort+'<span></span>'); checkSNMPPassphraseConfirm(type); } else { $('#'+span).remove(); $(pass).after('<span id="'+span+'"><i class="goodpassword fa fa-check"></i><span style="padding-left:4px;">'+passwordPass+'</span></span>'); checkSNMPPassphraseConfirm(type); } } function checkSNMPPassphraseConfirm(type) { var minChars = 8; if (type == 'priv') { var pass = '#snmp_priv_passphrase'; var conf = '#snmp_priv_passphrase_confirm'; var span = 'priv'; var spanconf = 'privconf'; } else { var pass = '#snmp_password'; var conf = '#snmp_password_confirm'; var span = 'auth'; var spanconf = 'authconf'; } if ($(conf).val().length < minChars) { passphrase = $(pass).val(); if (passphrase.indexOf($(conf).val()) == 0) { $('#'+spanconf).remove(); $(conf).after('<span id="'+spanconf+'"><i class="badpassword fa fa-times"></i><span style="padding-left:4px;">'+passwordMatchTooShort+'<span></span>'); } else { $('#'+spanconf).remove(); $(conf).after('<span id="'+spanconf+'"><i class="badpassword fa fa-times"></i><span style="padding-left:4px;">'+passwordNotMatchTooShort+'<span></span>'); } } else { if ($(pass).val() != $(conf).val()) { $('#'+spanconf).remove(); $(conf).after('<span id="'+spanconf+'"><i class="badpassword fa fa-times"></i><span style="padding-left:4px;">'+passwordNotMatch+'</span></span>'); } else { $('#'+span).remove(); $('#'+spanconf).remove(); $(pass).after('<span id="'+spanconf+'"><i class="goodpassword fa fa-check"></i><span style="padding-left:4px;">'+passwordMatch+'</span></span>'); } } } (function($) { $.textMetrics = function(el) { var h = 0, w = 0; var div = document.createElement('div'); document.body.appendChild(div); $(div).css({ position: 'absolute', left: -1000, top: -1000, display: 'none' }); $(div).html($(el).html()); var styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing']; $(styles).each(function() { var s = this.toString(); $(div).css(s, $(el).css(s)); }); h = $(div).outerHeight(); w = $(div).outerWidth(); $(div).remove(); var ret = { height: h, width: w }; return ret; } })(jQuery); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/plugins.php������������������������������������������������������������0000664�0000000�0000000�00000003617�14136337723�0020142�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /* +-------------------------------------------------------------------------+ | Copyright (C) 2004-2021 The Cacti Group | | | | 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. | +-------------------------------------------------------------------------+ | Cacti: The Complete RRDtool-based Graphing Solution | +-------------------------------------------------------------------------+ | This code is designed, written, and maintained by the Cacti Group. See | | about.php and/or the AUTHORS file for specific developer information. | +-------------------------------------------------------------------------+ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ global $plugin_hooks, $plugins_integrated, $plugins; $plugin_hooks = array(); $plugins = array(); $plugins_integrated = array('snmpagent', 'clog', 'settings', 'boost', 'dsstats', 'watermark', 'ssl', 'ugroup', 'domains', 'jqueryskin', 'secpass', 'logrotate', 'realtime', 'rrdclean', 'nectar', 'aggregate', 'autom8', 'discovery', 'spikekill', 'superlinks', 'debug'); �����������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/realtime.js������������������������������������������������������������0000664�0000000�0000000�00000020064�14136337723�0020103�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������var realtimeArray = []; var keepRealtime = []; var inRealtime = false; var count = 0; var resltimeTimer = ''; var originalRefresh = 0; var timeOffset; var realtimeTimer; var realtimePopout = false; var rtWidth = 0; var rtHeight = 0; var graphsRendered = null; var prevTotalGraphs = null; var url; var local_graph_id = null; function realtimeDetectBrowser() { if (navigator.userAgent.indexOf('MSIE') >= 0) { var browser = 'IE'; } else if (navigator.userAgent.indexOf('Chrome') >= 0) { var browser = 'Chrome'; } else if (navigator.userAgent.indexOf('Mozilla') >= 0) { var browser = 'FF'; } else if (navigator.userAgent.indexOf('Opera') >= 0) { var browser = 'Opera'; } else { var browser = 'Other'; } return browser; } function imageOptionsChanged(action) { var graph_start = $('#graph_start').val(); var graph_end = 0; var ds_step = $('#ds_step').val(); var size = $('#size').val(); var isThumb = $('#thumbnails').is(':checked'); var url = ''; if (size == null) { size = 100; } local_graph_id = $('#local_graph_id').val(); if (rtWidth == 0) { rtWidth = $(window).width(); } if (rtHeight == 0) { rtHeight = $(window).height()+50; } if (action == 'countdown') { url = 'graph_realtime.php?action=countdown&top=0&left=0&local_graph_id='+local_graph_id+'&ds_step='+ds_step+'&count='+count+'&size='+size+'&graph_nolegend='+isThumb; } else if (action == 'initial') { url = 'graph_realtime.php?action=initial&top=0&left=0&local_graph_id='+local_graph_id+'&graph_start=-'+(parseInt(graph_start) > 0 ? graph_start:'60')+'&ds_step='+ds_step+'&count='+count+'&size='+size; } else { url = 'graph_realtime.php?action='+action+'&top=0&left=0&local_graph_id='+local_graph_id+'&graph_start=-'+(parseInt(graph_start) > 0 ? graph_start:'60')+'&ds_step='+ds_step+'&count='+count+'&size='+size+'&graph_nolegend='+isThumb; } Pace.stop; $.getJSON(url) .done(function(data) { var image_format = (data.image_format == 'svg+xml') ? 'svg+xml' : 'png'; if ($('#rimage').length) { $('#rimage').empty().attr('src', 'data:image/'+image_format+';base64,'+data.data); } else { $('#image').empty().html('<img id="rimage" class="realtimeimage" src="data:image/'+image_format+';base64,'+data.data+'"/>'); } realtimePopout = $('#rtfilter').outerHeight() + 60 + $('#rimage').outerHeight() + 30 > window.innerHeight || $('#rimage').outerWidth() + 40 > window.innerWidth ? true : false; if (realtimePopout) { setRealtimeWindowSize(); if ($('#ds_step').val() != data.ds_step) { $('#ds_step').val(data.ds_step); if ($('#ds_step').selectmenu('instance') !== undefined) { $('#ds_step').selectmenu('refresh'); } } var curStart = Math.abs(data.graph_start); if ($('#graph_start').val() != curStart) { $('#graph_start').val(Math.abs(data.graph_start)); if ($('#graph_start').selectmenu('instance') !== undefined) { $('#graph_start').selectmenu('refresh'); } } if ($('#size').val() != data.size) { $('#size').val(data.size); if ($('#size').selectmenu('instance') !== undefined) { $('#size').selectmenu('refresh'); } } if (data.thumbnails == 'true') { $('#thumbnails').prop('checked', true); } else { $('#thumbnails').prop('checked', false); } destroy(data); } }) .fail(function(data) { getPresentHTTPError(data); }); } function setRealtimeWindowSize() { if (realtimePopout == true) { /* set the window size */ var height1 = $('#rtfilter').outerHeight() + 60; var height2 = $('#rimage').outerHeight() + 30; var width = $('#rimage').outerWidth() + 40; if (width > 60) { window.outerHeight = height1+height2; window.outerWidth = width window.resizeTo(width, height1+height2); } } } function countRealtimeGraphs() { var graphs = 0; for (key in realtimeArray) { if (realtimeArray[key] == true) { graphs++; } } return graphs; } function stopRealtime() { var graph; for (key in realtimeArray) { var graph_id = key; $('#wrapper_'+graph_id).html(keepRealtime[graph_id]).change(); $('#graph_'+graph_id+'_realtime').empty().html("<img class='drillDown' alt='' title='"+realtimeClickOn+"' src='"+urlPath+"images/chart_curve_go.png'>").find('img').tooltip(); // Disable right click $(this).children().bind('contextmenu', function(event) { return false; }); $('graph_'+graph_id).zoom({ inputfieldStartTime : 'date1', inputfieldEndTime : 'date2', serverTimeOffset : timeOffset }); $('.dispose_'+graph_id).remove(); $('#graph_'+graph_id).css('position','').css('top','').css('left', ''); realtimeArray[graph_id] = false; } setFilters(); tuneFilter(); } function setFilters() { var inRT = false; var key; for (key in realtimeArray) { if (realtimeArray[key] == true) { inRT = true; break; } } if (!inRT) { $('#timespan').show(); $('#realtime').hide(); $('#search').show(); $('#device').show(); restorePageRefresh(); } else { $('#timespan').hide(); $('#realtime').show(); $('#search').hide(); $('#device').hide(); } } function restorePageRefresh() { clearTimeout(realtimeTimer); refreshMSeconds = originalRefresh; setupPageTimeout(); } function realtimeGrapher() { clearTimeout(myRefresh); clearTimeout(realtimeTimer); if (originalRefresh == 0) { originalRefresh = refreshMSeconds; } var graph_start = $('#graph_start').val(); var graph_end = 0; var ds_step = $('#ds_step').val(); var size = $('#size').val(); var isThumb = $('#thumbnails').is(':checked'); var totalGraphs = countRealtimeGraphs(); var key; if (size == null) { size = 100; } if (graphsRendered == null || graphsRendered >= totalGraphs || prevTotalGraphs != totalGraphs) { //console.log('Rendering: Total Graphs:' + totalGraphs + ', Rendered Graphs:' + graphsRendered); graphsRendered = 0; prevTotalGraphs = totalGraphs; for (key in realtimeArray) { if (realtimeArray[key] == true) { local_graph_id = key if (isThumb) { if (rtWidth == 0) { rtWidth = $('#wrapper_'+local_graph_id).find('img').width(); rtHeight = $('#wrapper_'+local_graph_id).find('img').height(); } } var position = $('#wrapper_'+local_graph_id).find('img').position(); Pace.ignore(function() { if ($('#wrapper_'+local_graph_id).find('img').length) { position = $('#wrapper_'+local_graph_id).find('img').position(); } else { position = $('body').position(); } $.get(urlPath+'graph_realtime.php?action=countdown&top='+parseInt(position.top)+'&left='+parseInt(position.left)+(isThumb ? '&graph_nolegend=true':'&graph_nolegend=false')+'&graph_end=0&graph_start=-'+(parseInt(graph_start) > 0 ? graph_start:'60')+'&local_graph_id='+local_graph_id+'&ds_step='+ds_step+'&count='+count+'&size='+size) .done(function(data) { var results = $.parseJSON(data); if (realtimeArray[results.local_graph_id] == true) { var image_format = (results.image_format == 'svg+xml') ? 'svg+xml' : 'png'; $('#graph_'+results.local_graph_id).attr('src', 'data:image/'+image_format+';base64,'+results.data).change(); if (isThumb) { $('#graph_'+results.local_graph_id).width(rtWidth).height(rtHeight); } else { $('#graph_'+results.local_graph_id); } } destroy(data); destroy(results); destroy(position); graphsRendered++; }) .fail(function(data) { getPresentHTTPError(data); }); }); } } } if (totalGraphs == 0) { stopRealtime(); } else if (graphsRendered < totalGraphs) { destroy(realtimeTimer); realtimeTimer = setTimeout(function() { realtimeGrapher(); }, $('#ds_step').val()*1000); } else { count--; destroy(realtimeTimer); realtimeTimer = setTimeout(function() { realtimeGrapher(); }, $('#ds_step').val()*1000); } } function destroy(obj) { for (var prop in obj){ var property = obj[prop]; if (property != null && typeof(property) == 'object') { destroy(property); } else { obj[prop] = null; } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/session.php������������������������������������������������������������0000664�0000000�0000000�00000005663�14136337723�0020147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /* * Have Cacti use the database for PHP session storage. * This allows for easier distrubution of Web UI. */ // Don't run from the database if using the command line if (php_sapi_name() == 'cli') { return; } function cacti_db_session_check() { if (!db_column_exists('sessions', 'user_id')) { db_execute('ALTER TABLE sessions ADD COLUMN user_id int unsigned NOT NULL default "0", ADD COLUMN start_time timestamp NOT NULL default current_timestamp, ADD COLUMN transactions int unsigned NOT NULL default "1"'); } if (!db_column_exists('sessions', 'user_agent')) { db_execute('ALTER TABLE sessions ADD COLUMN user_agent VARCHAR(128) NOT NULL default "" AFTER user_id'); } } function cacti_db_session_open($savePath = '', $sessionName = '') { // Cacti database is already active cacti_db_session_check(); return true; } function cacti_db_session_close() { // Cacti database is not closed by sessions return true; } function cacti_db_session_read($id) { db_execute_prepared('UPDATE IGNORE sessions SET access = ? WHERE id = ?', array(time(), $id)); $session = db_fetch_cell_prepared('SELECT data FROM sessions WHERE id = ?', array($id)); // work with PHP 7.1 if (empty($session)) { $session = ''; } return $session; } function cacti_db_session_write($id, $data) { $access = time(); cacti_db_session_check(); if (!isset($_SESSION['sess_user_id'])) { session_decode($data); } if (isset($_SESSION['sess_user_id'])) { $user_id = $_SESSION['sess_user_id']; } else { $user_id = 0; } $client_addr = get_client_addr(); $user_agent = $_SERVER['HTTP_USER_AGENT']; if ($user_id > 0) { db_execute_prepared('INSERT INTO sessions (id, remote_addr, access, data, user_id, user_agent) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE data = VALUES(data), access = VALUES(access), user_agent = VALUES(user_agent), transactions = transactions + 1', array($id, $client_addr, $access, $data, $user_id, $user_agent)); } elseif (strpos($data, 'ses_user_id') !== false) { db_execute_prepared('INSERT INTO sessions (id, remote_addr, access, data, user_agent) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE data = VALUES(data), access = VALUES(access), user_agent = VALUES(user_agent), transactions = transactions + 1', array($id, $client_addr, $access, $data, $user_agent)); } return true; } function cacti_db_session_destroy($id) { db_execute_prepared('DELETE FROM sessions WHERE id = ?', array($id)); return true; } function cacti_db_session_clean($max) { $old = time() - $max; db_execute_prepared('DELETE FROM sessions WHERE access < ?', array($old)); return true; } // register database session handling session_set_save_handler( 'cacti_db_session_open', 'cacti_db_session_close', 'cacti_db_session_read', 'cacti_db_session_write', 'cacti_db_session_destroy', 'cacti_db_session_clean' ); register_shutdown_function('session_write_close'); �����������������������������������������������������������������������������cacti-release-1.2.19/include/themes/����������������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0017226�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/��������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0020647�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/billboard.css�������������������������������������������0000664�0000000�0000000�00000010367�14136337723�0023322�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/default/������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022273�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/default/index.php���������������������������������������0000664�0000000�0000000�00000000050�14136337723�0024106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/�������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022114�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/128/���������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022426�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/128/bar-alpha.png��������������������������������0000664�0000000�0000000�00000003034�14136337723�0024763�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/128/bar.png��������������������������������������0000664�0000000�0000000�00000002064�14136337723�0023702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/128/map.png��������������������������������������0000664�0000000�0000000�00000110316�14136337723�0023713�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/cacti_logo.gif�����������������������������������0000664�0000000�0000000�00000013011�14136337723�0024702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/cacti_logo.svg�����������������������������������0000664�0000000�0000000�00000041220�14136337723�0024737�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/favicon.ico��������������������������������������0000664�0000000�0000000�00000002576�14136337723�0024247�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/favicon.png��������������������������������������0000664�0000000�0000000�00000014233�14136337723�0024252�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/index.php����������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/logotype-a.png�����������������������������������0000664�0000000�0000000�00000030026�14136337723�0024703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/logotype-b.png�����������������������������������0000664�0000000�0000000�00000041221�14136337723�0024703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/tab_list.gif�������������������������������������0000664�0000000�0000000�00000001522�14136337723�0024404�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷|�€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###������������������������������������������������������������������������������������������&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¤�,�������/�I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/tab_preview.gif����������������������������������0000664�0000000�0000000�00000001541�14136337723�0025113�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ �������������������������������������������������������  !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��D�,�������>�‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/images/tab_tree.gif�������������������������������������0000664�0000000�0000000�00000001542�14136337723�0024372�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ ����������������������������������������������������������������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¥�,�������?�K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/index.php�����������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0022462�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/jquery.multiselect.css����������������������������������0000664�0000000�0000000�00000005277�14136337723�0025244�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/jquery.multiselect.filter.css���������������������������0000664�0000000�0000000�00000000622�14136337723�0026515�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/jquery.zoom.css�����������������������������������������0000664�0000000�0000000�00000012347�14136337723�0023672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; height:0; position:absolute; z-index:auto; filter:alpha(opacity=40); -moz-opacity:0.4; -khtml-opacity:0.4; opacity:0.4; overflow:hidden; padding:0; margin:0; background: rgba(0, 0, 0, 0.25); box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; height:0; position:absolute; z-index:auto; filter:alpha(opacity=30); -moz-opacity:0.3; -khtml-opacity:0.3; opacity:0.3; overflow:hidden; padding:0; margin:0; background: rgba(0, 0, 0, 0.5); box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #191970; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid red; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid red; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #FFE87C; padding-left: 3px; padding-right: 3px; border: 1px solid rgba(0,0,0,0.75); } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #111111; } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #FFE87C; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #111111; } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #FFE87C; z-index: auto; } .zoom-menu { border:1px solid #aaa; position:absolute; background:#fff; display:none; font-size: 1em; z-index:auto; } .zoom-menu .first_li span { width:150px; display:block; padding:5px 10px; cursor:pointer } .zoom-menu .inner_li { display:none; margin-left:150px; position:absolute; border:1px solid #aaa; border-left:1px solid #ccc; margin-top:-28px; background:#fff; } .zoom-menu .sep_li { border-top: 1px solid #c5c5c5; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float:left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { float: right; margin-left: 0.4em; margin-right:0.2em; margin-top: 2px; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } .zoom-menu-hover { background: #E0EDFE; cursor: pointer; } .zoom-menu-highlight { background: #E0EDFE; } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/main.css������������������������������������������������0000664�0000000�0000000�00000071712�14136337723�0022315�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main styles */ html, body { height: 100%; width: 100%; margin: 0px; overflow: auto; } body, table, tr, td, textarea { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 11px; } textarea { padding: 5px; width: 400px; height: 100px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } body { background-color: #FFFFFF; background-repeat: repeat-y; } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: left; } td, th, select { padding: 0px; margin: 0px; } th { border-right: 1px groove white; white-space: nowrap; user-select: none; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; } img { border: none; vertical-align: middle; } i.fa, i.fas, i.fab, i.far, i.fal { padding: 0px 3px; vertical-align: middle; font-size: 13px; } .menu_parent i.fa, .menu_parent i.fas, .menu_parent i.fab, .menu_parent i.far, .menu_parent i.fal { color: white; } div { display: block; } fieldset { border: none; padding: 0px; margin: 0px; } hr.menu { border: 0; height: 1px; background: #333; background-image: linear-gradient(to right, #ccc, #333, #ccc); } .reindex_methods span { font-size: 9px; } .checkboxLabel { display: none; } .realms .checkboxLabel { display: inline !important; } /* links */ a, a:active, a:visited { color: blue; text-decoration: none; } a:hover { text-decoration: underline; color: #333333; } th .fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } tr.selectable td { padding: 3px; } #main { display: none; position: relative; width: 100%; height: 100%; } input { padding: 0.4em; font-size: 12px; max-width: 400px; } select { padding: 2px; font-size: 12px; } tr.selected { background-color: khaki; } label { white-space: nowrap; } .tableRow { line-height: 18px; } .tableRowGraph td { padding: 3px; vertical-align: top; } .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right !important; } .left { text-align: left !important; } .center { text-align: center !important; margin-left: auto; margin-right: auto; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; font-weight: bold; cursor: pointer; } .badpassword_message { padding: 2px; color: red; font-size: 1.0em !important; vertical-align: bottom; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: green; font-size: 1.5em !important; vertical-align: bottom; } .associated { color: green; font-weight: bold; } .notAssociated { color: red; font-weight: bold; } .disabled_row span, .disabled_row td, .disabled_row a { color: grey; } .disabled { color: grey; font-weight: bold; } .idle { color: green; font-weight: bold; } .running { color: orange; } .errored { color: red; font-weight: bold; } .newObject { color: blue; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: green; } .failed { color: red; } .accessGranted { color: green; font-weight: bold; } .accessGrantedItem { color: green; } .accessRestricted { color: red; font-weight: bold; } .accessRestrictedItem { color: red; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .graphDrillDown { vertical-align: top; align-self: left; z-index: 4; padding: 3px; height: 100%; width: 20px; } .iconWrapper { } .deleteMarker { color: red !important; height: 14px !important; vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .deleteMarkerDisabled { color: grey !important; height: 14px !important; vertical-align: middle; text-decoration: none !important; } .deleteMarkerDisabled:hover { text-decoration: none !important; } .drillDown { cursor: pointer; } .moveArrow { color: #00438C !important; height: 14px !important; display: inline-block; width: 11.75px; font-size: 14px !important; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { display: inline-block; width: 11.75px; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } .cactiTooltipHint { cursor: pointer; color: #6D88AD; } .monoSpace { font-size: 9px; font-family: monospace; } .utilityPick { width: 200px; } .itemlist { max-height: 400px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { padding-left: 0.5em !important; display: block; } .deviceUp { color: rgba(40, 180, 40, 1.0) !important; } .deviceDown { color: #FF0000 !important; } .deviceUnknown { color: #0000FF !important; } .deviceDisabled { color: #A1A1A1 !important; } .deviceRecovering { color: #FF8F1E !important; } .deviceError { color: #750F7D !important; } .deviceDownMuted { color: #FFE333 !important; } .deviceThreshold { color: #FFA833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #AA7807 !important; } .deviceAlert { color: #660000 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #FF0000; } .deviceUnknownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #0000FF; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #A1A1A1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #FF8F1E; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #FFE333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #FFA833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #AA7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: green; } .notBeingGraphed { color: #484848; } .menuoptions { background: none repeat scroll 0 0 #EEE; border-color: #F5F5F5 #E5E5E5 #CCC; border-style: solid; border-width: 0px 1px 1px 1px; z-index: 2; display: block; float: right; position: absolute; right: 12px; top: 58px; list-style: none; text-align: right; margin: 0px; padding: 0px; } .menuoptions li a { display: block; height: 14px; padding: 4px; } .menuoptions li a:hover { display: block; text-decoration: none; background-color: #E1E1E1; } .import_label { opacity: 0; display: none; } .import_button { opacity: 1; } .import_text { display: none; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0px 5px 0px 0px; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: lime; font-weight: bold; font-size: 14px; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: rgba(255, 204, 0, 0.8); font-size: 14px; } .deletequery { cursor: pointer; padding: 2px; vertical-align: middle; text-decoration: none; color: red !important; font-weight: bold; font-size: 14px; } .deletequery:hover { color: red !important; text-decoration: none; padding: 2px; vertical-align: middle; } .odd { background: none repeat scroll 0 0 #F5F5F5; border: none; } .odd td, .even td, .even-alternate td { padding: 2px; } .even { background: none repeat scroll 0 0 #E5E5E5; border: none; } .even-alternate { background: none repeat scroll 0 0 #E7E9F2; background-color: #E7E9F2; border: none; } .saveRow { background-color: #EAEAEA; text-align: right; padding: 4px; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid #006400; vertical-align: top; } .linkMarker { color: #C16921; } .filteredValue { background-color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438C; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { color: #000000; font-size: 10px; font-weight: normal; font-family: monospace; } .hostDown { color: #FF0000; font-size: 10px; font-weight: normal; font-family: monospace; } .cactiPageHead { background: #A9A9A9 url("./images/cacti_logo.svg") no-repeat scroll right 40% / 400px auto; border-bottom: 1px solid #00438C; height: 36px; width: 100%; } .cactiGraphPageHeadBackdrop { background-color: #A9A9A9; vertical-align: bottom; padding-bottom: 0px; float: right; width: 400px; height: 36px; z-index: -1; } .cactiConsolePageHeadBackdrop { padding-bottom: 0px; float: right; width: 0px; height: 36px; z-index: -1; } .navigation { } .debug td { padding: 3px; margin: 0px; } .breadCrumbBar { background-color: #E9E9E9; padding: 2px; height: 16px; } ul#breadcrumbs { font-size: 8px; margin: 0; padding: 0; list-style: none; } .infoBar { vertical-align: middle; display: block; min-width: 15%; max-width: 40%; margin-right: 10px; float: right; text-align: right; } #breadcrumbs li { float: left; font-size: 10px; padding-top: 2px; } #breadcrumbs a { padding-left: 5px; padding-right: 5px; float: left; text-decoration: none; color: blue; position: relative; } .cactiContent { clear: both; width: calc(100% - 1px); height: 100%; vertical-align: top; display: table; } .cactiTreeNavigationArea { display: table-cell; background: #EFEFEF url('./../../../images/shadow_gray.gif') repeat-x center top; border-right: #AAAAAA 1px solid; padding-left: 5px; padding-right: 5px; padding-top: 10px; width: 250px; max-width: 400px; height: 100%; float: left; vertical-align: top; overflow-y: auto; overflow-x: hidden; } .jstree { position: relative; display: block; } .cactiConsoleNavigationArea { display: table-cell; background: snow url('./../../../images/shadow_gray.gif') repeat-x center top; border-right: #AAAAAA 1px solid; padding-left: 0px; padding-right: 0px; padding-top: 5px; vertical-align: top; float: left; width: 162px; overflow-x: hidden; height: 100%; } .cactiConsoleNavigationArea table { width: 160px; } .treeTable { width: 100%; } .treeArea { vertical-align: top; } .cactiLogo { padding-top: 20px; background: #F5F5F5 url('./images/cacti_logo.svg') no-repeat 30px; display: block; cursor: pointer; height: 140px; width: 156px; margin-top: 0px; margin-left: 2px; margin-right: 2px; } .loginLeft, .logoutLeft { width: 33%; float: left; } .loginCenter, .logoutCenter { position: relative; padding: 30px 0px 5px 20px; top: 15%; max-width: 350px; max-height: 350px; margin-left: auto; margin-right: auto; } .cactiLoginLogo, .cactiLogoutLogo { position: relative; float: right; top: 15%; background: transparent url('./../../../images/auth_background.gif') no-repeat center; width: 350px; height: 128px; z-index: 2; margin-top: -90px; margin-left: 0px; margin-bottom: -20px; } .loginArea, .logoutArea { position: relative; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .cactiLoginTable input { border: 1px solid #BBBBBB !important; } .loginErrors, .logoutErrors { color: red; min-height: 0px; } legend { font-size: 22px; font-weight: bold; text-align: right; } .loginRight, .logoutRight { width: 33%; float: right; } .loginBody, .logoutBody { } .versionInfo { padding-top: 5px; float: right; font-size: 10px; color: black; } .actionsDropdown { vertical-align: middle; padding: 3px; width: 100%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdownButton { vertical-align: top; float: right; margin-top: 1px; margin-left: 3px; margin-right: 5px; display: table-column; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .loginPanel { padding: 4px 0px; } .cactiGraphContentArea { background: #FFFFFF url('./../../../images/shadow.gif') repeat-x center top; display: table-cell; padding-top: 10px; padding-right: 5px; padding-left: 5px; vertical-align: top; height: 100vh; } .spikekillData, .spikekillData td { border: 1px solid #999; } .spikekillNote { padding: 1px; } .spikekillMenu { background: #F5F5F5 none repeat scroll 0 0; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; margin: 0; padding: 2px; line-height: 1.5em; } .spikekillMenu li { vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .cactiConsoleContentArea { background: #FFFFFF url('./../../../images/shadow.gif') repeat-x center top; padding-top: 10px; padding-right: 5px; padding-left: 5px; margin-left: 162px; height: 100vh; width: 100%; vertical-align: top; display: table-cell; overflow-y: auto !important; } .hyperLink, .hyperLink:hover, .hyperLink:visited { color: blue !important; font-size: 1.1em; padding: 3px; cursor: pointer; text-decoration: none; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .noLinkEditMain { color: blue; text-decoration: none; font-weight: bold; padding: 3px; white-space: nowrap; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: blue; text-decoration: none; font-weight: normal; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: blue; text-decoration: underline; font-weight: normal; } .linkOverDark, .linkOverDark:visited, .linkOverDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: white; text-decoration: underline; } .linkCopyDark, .linkCopyDark:visited, .linkCopyDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkCopyDark:hover { color: white; text-decoration: underline; } /* text styles */ .textError { font-size: 12px; font-weight: bold; color: red !important; } .textWarning { font-size: 12px; font-weight: normal; color: orange !important; } .textInfo { font-size: 12px; font-weight: bold; color: black; } .textHeader { font-size: 12px; font-weight: bold; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; display: none; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: #FFFFFF; border: 1px solid #BBBBBB; position: relative; z-index: 4; } .textHeaderDark { font-size: 12px; font-weight: bold; color: #FFFFFF; } .templateHeader { background-color: #888888; } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { font-size: 10px; color: #FFFFFF; font-weight: bold; padding: 0px; } .tableBody { background-color: #E1E1E1; } .cactiBorderWall { border-width: 1px; border-color: #00438C; border-style: solid; } .cactiTable { width: 100%; border-width: 0px; border-color: #00438C; border-style: solid; margin-left: auto; margin-right: auto; display: table; } .cactiInstallLoaderSpinnerTheme { border-top-color: #00438c !important; } .cactiTableTitleRow { color: white; float: left; line-height: 25px; text-align: left; display: block; width: 100%; background-color: #00438C; font-size: 12px; vertical-align: middle; } .cactiInstallTableTitleRow { border-color: #00438C; } .cactiTableTitle { color: white; float: left; line-height: 25px; text-align: left; display: block; width: 70%; background-color: #00438C; font-size: 12px; user-select: none; } .cactiTableButton { float: right; display: block; line-height: 25px; text-align: right; width: 30%; background-color: #00438C; white-space: nowrap; user-select: none; } .cactiTableButton.debug { background: transparent; height: 1em; } .cactiTableButton span, .cactiTableTitle span { color: white; padding: 0px; line-height: 25px; white-space: nowrap; overflow: hidden; background: transparent; user-select: none; } .cactiTableButton i { padding: 0px 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0px 8px !important; } .cactiTableButton .fa, .cactiTableTitle .fa { display: inline; } .cactiTable td { padding: 3px; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { width: 100%; line-height: 30px; overflow-y: auto; } .formColumn { float: left; text-align: left; } .formColumnLeft { float: left; padding-left: 4px; width: 45%; text-align: left; } .formColumnRight { float: left; width: 45%; text-align: left; } .formData { display: inline-block; float: left; text-align: left; } .formRadio { line-height: 22px; } .formSubCheckbox { line-height: 20px; float: left; } .formSubCheckbox input { margin: 0px; vertical-align: -10%; } .formSubCheckbox label { } .formCheckbox { vertical-align: -15%; } .formFieldName { display: inline-block; color: #444; float: left; text-align: left; font-weight: bold; padding-left: 3px; } .formFieldDescription { float: left; font-weight: normal; text-align: left; line-height: 14px; } .formTooltip { display: inline-block; padding-left: 4px; } .formHeader { float: left; width: 100%; text-align: left; color: #FFFFFF; font-weight: bold; cursor: pointer; vertical-align: middle; text-align: left; border-right: 1px groove #EFEFEF; font-size: 11px; background-color: #6D88AD !important; } .formHeaderText { padding: 3px; } .formHeaderAnchor { float: right; padding-right: 8px; } .hostInfoHeader { width: 100%; } .queryAdd, .templateAdd { padding: 3px; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-row; } .formColumnLeft { float: left; display: table-row; width: 90%; text-align: left; } .formColumnRight { float: left; display: table-row; width: 100%; text-align: left; } .formFieldName { color: #444; float: left; text-align: left; white-space: nowrap; padding-left: 3px; } .formData { float: left; } .hostInfoHeader { overflow: hidden; } .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } } .graphItem { background-color: #D5D5D5; } .graphItemAlternate { background-color: #D2D6E7; } .break { height: 4px; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { background-color: #00438C; } .cactiNavBarBottom { background-color: #00438C; } .tableHeader { display: table-row; background-color: #6D88AD !important; line-height: 18px; } .tableHeader td { color: #FFFFFF; font-weight: bold; } .tableHeader th { color: #FFFFFF; font-weight: bold; vertical-align: middle; text-align: left; border-right: 1px groove #EFEFEF; font-size: 11px; line-height: 18px; background-color: #6D88AD !important; padding: 2px; } .tableHeader th.sortable { cursor: pointer !important; } .tableHeader th:last-child { border-right: none !important; } .tableHeader th div { display: block; padding-right: 8px; font-size: 10px; } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { color: #FFFFFF; font-weight: bold; vertical-align: middle; text-align: left; cursor: pointer; padding: 3px; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .graphSubHeaderColumn { color: #FFFFFF; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { background-color: #819BC0; max-width: 20px; width: 20px; } .image_table { width: 100%; } .tableConfirmation { background-color: #F5F5F5; border: 1px solid #AAAAAA; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { color: white; width: 100%; text-align: center; vertical-align: middle; display: table; margin-left: auto; margin-right: auto; line-height: 18px; background-color: #00438D; font-size: 12px; } .navBarNavigation a, .navBarNavigation a:visited, .navBarNavigation a:hover { color: white; text-decoration: none; font-weight: normal; font-size: 12px; } .navBarNavigationPrevious { text-align: left; cursor: pointer; font-weight: bold; white-space: nowrap; display: table-cell; width: 10%; padding: 2px 0px; vertical-align: middle; } .navBarNavigationCenter { text-align: center; display: table-cell; white-space: nowrap; width: 80%; padding: 2px 0px; margin-top: auto; } .navBarNavigationCenter span { vertical-align: middle; display: table-cell; } .navBarNavigationNext { text-align: right; white-space: nowrap; display: table-cell; width: 10%; vertical-align: middle; } .navBarNavigationNone { text-align: center; display: table-cell; white-space: nowrap; width: 100%; height: 16px; margin-top: auto; padding-top: 3px; padding-bottom: 3px; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 10px; background-color: #F5F5F5; } .popupBox { z-index: 2; position: absolute; padding: 0px; display: none; overflow: auto; color: #FFFFFF; background-color: #E5E5E5; border: 1px solid #E5E5E5; } .installArea { background-color: #FFFFFF; padding: 10px; } .textAreaNotes { font-size: 12px; } .textEditTitle { font-size: 10px; font-weight: bold; } .textMenuHeader { color: #FFFFFF; background-color: #9C9C9C; font-size: 10px; font-weight: bold; } .textMenuItem { background-color: #F5F5F5; font-size: 10px; } .textMenuSubItem { background-color: #FFFFFF; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-size: 10px; } .txtErrorTextBox { border: 2px solid #FF0000; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: bold; } /* tabs */ .tabSpacer { width: 0px; padding-right: 2px; padding-left: 0px; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #DFDFDF; white-space: nowrap; width: 1%; } .tab { border-color: #999 #666 -moz-use-text-color #999; border-style: solid solid none; border-width: 1px 1px medium; } .tabs li a { background-color: #DFDFDF; float: left !important; padding: 5px 4px; text-decoration: none; font-size: 9px; border-color: #999 #666 !important; border-style: solid solid none; border-width: 1px 1px medium; font-weight: bold; } div#tabs { padding-bottom: 0px; float: left; vertical-align: bottom; height: 36px; overflow: hidden; width: 70%; } td#tabs { padding-bottom: 0px; float: left; vertical-align: bottom; } .cactiGraphHeaderBackground { height: 36px; float: right; z-index: -1; } div#gtabs { padding-bottom: 0px; vertical-align: bottom; float: right; height: 36px; overflow: hidden; } .tabs { } .tabs a:hover { background-color: silver; } .tabs a.selected { background-color: silver; } .tabs li { bottom: -1px; float: left; margin: 0 3px 0 0; } .tabs li.current a { background: #FFFFFF; border-bottom: 1px solid #FFFFFF; } .tabs li.current a:hover { background: #FFFFFF; border-bottom: 1px solid #FFFFFF; } .tabs nav { padding: 0px 4px 0px 0px; background-repeat: repeat-x; zoom: 1; } .tabs nav:after { clear: both; display: block; height: 0; visibility: hidden; } .tabs ul { list-style: none; margin: 0; padding: 0; } /* Navigation Area */ #nav { margin: 0px; overflow-y: auto; } #nav li a { display: block; font-size: 11px; padding: 2px 4px; background: #ccc; border-bottom: 1px solid #666; border-top: 1px solid #eee; text-decoration: none; color: blue; } #nav li a.active { color: snow !important; background-color: #9c9c9c; border-bottom: 1px solid #666; font-weight: bold; } #nav li a.pic:hover, #nav li ul li a.selected { background-color: #e1e1e1; } #nav li ul { display: none; padding: 0; } #nav li ul li a { padding: 2px 4px; background: #F5F5F5; border-bottom: 1px dotted #ccc; } #nav li ul li { list-style: none; padding: 0; } ul#nav { list-style: none; padding: 0; width: 100%; } .clogError { background-color: #FF3932; } .clogWarning { background-color: #EACC00; } .clogSQL { background-color: #6DC8FE; } .clogDebug { background-color: #C4FD3D; } .clogStats { background-color: #96E78A; } .clogLimit { background-color: #EACC00; } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } @media print { .noprint { display: none; } } .ui-tooltip { max-width: 500px; word-break: break-word; } .ui-tooltip-content div.header { color: blue; } .ui-tooltip-content { min-width: 100px !important; overflow: auto !important; opacity: 0.95; border-radius: 5px !important; border: transparent; } .ui-tooltip-content div.content { font-size: 10px; color: #333333; } div.preformatted { font-family: monospace; white-space: pre; } ul.pagination { display: inline-block; padding: 0px; margin: 0px; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { color: white; float: left; padding: 0px 2px 2px 2px; text-decoration: none; margin: 0px 1px; vertical-align: -40%; } ul.pagination li span { color: white; float: left; padding: 0px 0px; text-decoration: none; margin: 0px 1px; } ul.pagination li a.active { background-color: #E1E1E1; color: black; } ul.pagination li a:hover:not(.active) { background-color: #9C9C9C; color: black; } tr#realtime td:first-child { height: 54px; } .logEmergency { background-color: #FF0606; text-align: center; padding: 3px; width: 12.5%; } .logCritical { background-color: #F21721; text-align: center; padding: 3px; width: 12.5%; } .logWarning { background-color: #FF7A30; text-align: center; padding: 3px; width: 12.5%; } .logAlert { background-color: #F21924; text-align: center; padding: 3px; width: 12.5%; } .logError { background-color: #FB4A14; text-align: center; padding: 3px; width: 12.5%; } .logNotice { background-color: #FAFD9E; text-align: center; padding: 3px; width: 12.5%; } .logInfo { background-color: #CCFFCC; text-align: center; padding: 3px; width: 12.5%; } .logDebug { background-color: #CDCFC4; text-align: center; padding: 3px; width: 12.5%; } .menuitem { white-space: nowrap; } .menu_glyph { display: none; } .ui-multiselect, .ui-multiselect span { padding: 1px; color: black; font-size: 12px; } .ui-widget { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; padding: 0.4em; } .ui-corner-all { border-radius: 0px; } .ui-state-default { background: #FFFFFF !important; border: none; font-weight: normal; padding: 2px; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect-checkboxes span { font-size: 12px; } .ui-multiselect-header { background-color: #E5E5E5; } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-filter, .ui-widget-header { font-weight: normal !important; width: 100%; margin-bottom: 4px; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; } .ui-widget { font-size: unset; } .graphWrapper { position: relative; } .checkboxLabelWanted { display: inline-block; } .right { text-align: right; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } ������������������������������������������������������cacti-release-1.2.19/include/themes/classic/main.js�������������������������������������������������0000664�0000000�0000000�00000002040�14136337723�0022125�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { height = get_height(); $('#navigation, .cactiConsoleNavigationArea').css('height', height); $('#navigation, #navigation_right').show(); keepWindowSize(); $(window).unbind().resize(function(event) { if (pageName == 'graph_view.php') { treeWidth = $('#navigation').width(); totalWidth = $('body').width(); contentWidth = totalWidth - treeWidth - 25; $('#navigation').css('width', treeWidth); $('#navigation_right').css('width', contentWidth); } if (!$(event.target).hasClass('ui-resizable')) { height = get_height(); $('#navigation, .cactiConsoleNavigationArea').css('height', height); } }); } function get_height() { nsh = parseInt($('#navigation').prop('scrollHeight')); nrsh = parseInt($('#navigation_right').prop('scrollHeight')); nh = parseInt($('#navigation').height()); nrh = parseInt($('#navigation_right').height()); wht = $(window).height(); return Math.max(nsh, nrsh, nh, nrh, wht); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/pace.css������������������������������������������������0000664�0000000�0000000�00000004003�14136337723�0022266�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: #00438C; position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 3px; } .pace .pace-progress-inner { display: block; position: absolute; right: 0px; width: 100px; height: 100%; box-shadow: 0 0 18px #00438C, 0 0 5px #00438C opacity: 1.0; -webkit-transform: rotate(3deg) translate(0px, -4px); -moz-transform: rotate(3deg) translate(0px, -4px); -ms-transform: rotate(3deg) translate(0px, -4px); -o-transform: rotate(3deg) translate(0px, -4px); transform: rotate(3deg) translate(0px, -4px); } .pace .pace-activity { display: block; position: fixed; z-index: 2000; top: 25%; right: 50%; width: 25px; height: 25px; border: solid 4px transparent; border-top-color: #00438C; border-left-color: #00438C; border-radius: 18px; -webkit-animation: pace-spinner 400ms linear infinite; -moz-animation: pace-spinner 400ms linear infinite; -ms-animation: pace-spinner 400ms linear infinite; -o-animation: pace-spinner 400ms linear infinite; animation: pace-spinner 400ms linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-moz-keyframes pace-spinner { 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes pace-spinner { 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes pace-spinner { 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/classic/rrdtheme.php��������������������������������������������0000664�0000000�0000000�00000001520�14136337723�0023170�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php #$rrdcolors['back'] = 'F3F3F3'; #$rrdcolors['canvas'] = 'FDFDFD'; #$rrdcolors['shadea'] = 'CBCBCB'; #$rrdcolors['shadeb'] = '999999'; #$rrdcolors['grid'] = 'C4C4C4'; #$rrdcolors['mgrid'] = '1A1C1C'; #$rrdcolors['font'] = '000000'; #$rrdcolors['axis'] = '2C4D43'; #$rrdcolors['arrow'] = '2C4D43'; #$rrdcolors['frame'] = '2C4D43'; # RRDtool graph fonts in RRDtool 1.2+ #$rrdfonts['title']['font'] = 'Arial'; #$rrdfonts['title']['size'] = '11'; #$rrdfonts['axis']['font'] = 'Arial'; #$rrdfonts['axis']['size'] = '8'; #$rrdfonts['legend']['font'] = 'Courier'; #$rrdfonts['legend']['size'] = '8'; #$rrdfonts['unit']['font'] = 'Arial'; #$rrdfonts['unit']['size'] = '8'; #$rrdfonts['watermark']['font'] = 'Arial'; #$rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 1; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/�����������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0020147�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/billboard.css����������������������������������������������0000664�0000000�0000000�00000010367�14136337723�0022622�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/default/���������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021573�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/default/index.php������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023406�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/����������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021414�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/128/������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021726�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/128/bar-alpha.png�����������������������������������0000664�0000000�0000000�00000003034�14136337723�0024263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/128/bar.png�����������������������������������������0000664�0000000�0000000�00000002064�14136337723�0023202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/128/map.png�����������������������������������������0000664�0000000�0000000�00000110316�14136337723�0023213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/cacti_backdrop.gif����������������������������������0000664�0000000�0000000�00000016441�14136337723�0025041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a%�÷¡��������������    !&)+. "1#'1(-2,1404524634832;30@3,E2*H2'J1#M0 O/P.P.O.N- K+"J)$L'%N'%O'&P'&Q'&Q'&Q''Q'(S)*U,.X15Z7;\=A]ACa?Ad?=i<9q<7w>2}?/@,…A'„@%ƒ@#‚?!?!?!? €>>~>~>{=z=|>}> |> {= z= z= z= z= z= z= z= z= {= }> ‚@†BŠCDŽDŽDŽDŽD‘E“E•F–F•F“E’E’E’F“F”F–F–F–F"˜F'šG(›G'›G'›G&›G&›G'œG+G/ŸG1 H4 H4ŸH5 I7¢I<¦H?¨HB©HDªHF«HG§JI¡JKšFN•BQ–AT™AV—@X—@[šA]CZ¢DS©FN®GN¯GN°GP±GT²GX´GYµG[µF_¸Fe¹Ei¸Ef¹EeºGe¸JcµN^°P[®QY©UX¥XY¡[]™^^•^a“_a•`c“cfedšec¤fc¥fe§hg¨ik§kvŸtšy…z„¦s€©j}«gy¬go­im¯in±jr´jv·mw¸mx¹mzºn}¼n~½n½n¾nƒÀn†Ãn‰Ån‹ÇnŒÇnŒÈn‰Æn‡Äm‚Âg~¿^„»UйP‰¸N‡¹J…¿F…ÂD‡ÄDŠÅE‹ÆFŽÆGÇG‘ÇH’ÈI’ÈI“ÈJ–ÉL–ÉL–ÉL—ÈM™ÈOÉPžÌOžÌOŸÍP¡ÍP£ÎR¥ÎS¦ÏS§ÏT©ÐV©ÐYªÑ^«ÒjªÒqªÒt¬Óv°Õy´Ö{¶×}¸Ø~ºÙ€½Ú„ÉÞŸßçÔæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéä!ù ��ÿ�,����%��þ�ÿ H° +Ž*§­\9r#ºƒG;râ2jܘñ›¸nßB~3Ç®dÉݺ]SÉòšË—/Í©›9“µh8£QB„èÏŸ‡^ J¨hQJÌ’2³‘!P£F-HµªÀM!PÚJI˜×¯`/YkIRY³‘$E26¬­[bp=šK·.]c¼òËÕ«o/L ,¸¦\ˆßB<«ãÇztH–ü)”åP€æ@hÚ@*T«U) \@!†,Y¦äÈy³ºõ›×¯ÿœž&͛ڷkë®ý¥·ï/¥P™þç ã\’'×B¥9•#УK?’„:uر{ðÐB*èïU±þ6-·­aÄó)ž‡q#¸C¦ùíœÉ’+]ªÔÓ¥M›çФÎ97átÓN@5”P‡U”RIaОI%x ‰çW]Ö0b%Ɉj¥µ–[mÁ—]u1òˆ‹xõ—_½ða…õ±ÈaŠ-vË-³èчz9e—a–ÃM-P!†!03ÌæÚ•°½qj\®±Û—»ýÖ”2œ)§ÜšUÑÜtIT'uMÔÙDÙiÇwPb¨¡�”“6çEdNzð”Ñ8à¼×8Ñ'Ÿ:÷™óM~ùíG×üG€êxS`NËô”à!°,øJƒF!3þR&ÔY…PÒ'U¢%„‡z"‰$šh [(ªHŒ\,¾H#xñ²6âXØ"†%–‹‹5Fä‘YÙe€èàBSTÈ ”£$„�£ÌÆÚ»®e¹Æi¨È‚Ê`‚)¦q_”if) ·frÎ=œrQgœI4‘'Ûyv+x 4õ‚8ÙˆãP¡ç ª±{v$Ÿ¤âÜÇÎ9)aú5ÝlÚé¦Ô|“Ž€ÚäDê©>© ‹ƒ„ ¥SYÑ Õ¹$AS0ðÚë0€(b°‘D½1oÁå,²v¹¨ì#ÍÎØW^˜H«£Ž<æR˵>jëX‘}) I~¢C äŽàÑàiˆ€þiV®o–°ÕËåºå¦ïoÇ}ñG)ÿv¢æÀZTñæÁ Wg'Ãç1ŸESuPS d“ñC§wGï5i|"dò7-Åî2Ì6]#MéØ|󩜨ʪQ>G8¡Ð*´Ðy”MÙ ôÒˆìˆÂžX5\½`½ìÖ0æò¬_`‹­#˜øˆ6Ú É­9Höƒp_öÉ9û”T£`øyB2Ì& ['ö: 'l“/Þìë8w`œ)'0åh ÎNÂì´0†5,sÙé@$v¼‚¬‚\ÈÝÆ ÕŽôœ£=iTÈB‚I‘ä>){‰JjÇ)Úˆ&ç0Í–3U½‚gþ„€%È5+Z]¨ƒä*Äò¾Â´¶ãi%*Ѱ¨6 9ëXÉš‹‹Á,¯}­{„Û"À‡˜¡-[DÚÖdÖ×>ËÈM›Iˆ“¤b«¼‘ úûûöè?�r©Ô˜¸P†2p! ,Řø@ÉÌ:uR˜Â,xÁ‡iƒÈŸ°  "©Èz4²¡d>­£”IP–)ý° f/û¨¼¡;œððTªâ!´„ÌVõ;Þ›rˆ%2±iO|^ô¤WEõ‹-RÖ¹æÅí%laüø3¾É|E*Rú~ÀƸý@ —gŽøŠÉQ²Ðcÿü÷TΆþ;œoŽSÈ2�Á)…Ö¤…‚rArT/‡¹:YrƒœËä?r… t2Ÿ„¢EJ6êQÝ�HAÒ “±2Sµ{åË:µP]£–Ѹ%PRµ ßB®RJB!âá­héj ‡(QŒy…iÆP¦ÔLD,«©(ÖÞ™µ½å%Øœsl‰¯Û"Ò8uðƒ6†âBøÝ‚ر)0E×/ÿiɞ‘E ÓpÀ~–! Œ»AËÐÈGF² £Â,X§"<Ì À¤Dw*�t’PŸ,ÇF;JŽR~4%)iÉîó‘•lj?5Œ%5n7“ÜÁT¦?ÑþϼC‘xníàŸÀ!Kõ¨MkÚ0’,µX"jSl&\´M-b‘è"÷ò⬬R‹ZÑĵ¶kÆíá»{§ÖWN÷‘S±BH?V¤W�˜ƒ\góºÚ6_¸ƒ=íu¯Ò¯…\ @K‘¦åôÀŠ](cÛØÇF6¢™¼#ƶ‘ÑCUä¨óèGEÊᔼ°$êh™ˆ9Õ²Nµ –7œI_‹Ëš:H=SŠ êF¼`¢Ð ‡~kÔá+jRŒ[¬ę̀:÷E\Ä˳œÅ ÄÐb0ߣc´{¶îz¼ßÕÃæ@Þ²Æ-­?`RSî `rðãþi6AW¿ÙÕ6óµ'¾ò…¸/�¸ e(* Ì-–°Z@%1×Ð&8VsO’è?†™dL8£«;:ªBFm8´ µIÐaÚ–pJµ²-Y<SßE¨e@<ü´h”MÚŽÛ–à&µ¸‘8.SEŒg>kÓd„#´ÆL4ù™¹hò^hÁÅ=0ÂÙéƒv½iå[`9¼[&¯þ`Nr®Õ—ô³JPÕ5‡5pB›¨+à¾P¹ÊuÏtþ¯üšgÆ9®Ï~.(a­3§ÊU‚‡ÎŽ-Ñq#Ä!…´éHÉ(K_Z¤!M‰¦KB Ô²´Ä´»øÌfÂi˜:¶AYÐÎþ^D¥¼w½žÉ-“×Ûß2-¸N<®ZJd"!;•z+:²°‡dcï%ÙW…ê³¹í)s÷ŒÞo8¹L^³¢•œ9p'OéX•û%Ät=÷lð¹†ûÞæ6�4E½ø¥ÿ–aÞ~]\@—ï|ï›ß•»`œ�nI‚gòOp¡Hwv˜Òm‡SbJ™ƒ?)%íRê ¹VwÎøx‚L]T£Z)¶e+03Éh„(qÖMl"2¡fÜ\Ûü©8GÖ4Ás.>ÂØÚ£n“s1‹f3¢èÒî&µ­e-ëéd5k(ÈIÎqi^åq¯üÚ¬uw¹yݺáD½ì Ȳÿ¦Ÿhïg=þ0ã¸=ßü¦Ž /¸Ð€gÇî<š® BáB±ÇïqÇ(KéðˆƒãwÝ}.åÊWb\ñ«…;+y’÷45¿c——½„­öjcp0TDÕcHU&BsRc ËåL½UÀz€=ç,@wUÄ6І{š` ºwe½W$vp^ð“$¡�f? ïÕSCC£ð^ð•mÆðäuùTOÓ‡ Ö·O…”}ý¤_€e`ægâw“´PvÒó`v<RWY¡ ˜ì±Yx÷÷Qøg;›ÆÔ  -¡x±Kè@è0j6y˜3"÷b–§’¬&4ìt<x7Tþ¾%zŠh ¦gz¥wz8§"r±EŽ‚!ˆd¯×dÔõsPÕ·‡{¹We»Ç{E^z0ƒdUƒIB|9h|r« ¬`fQtEkÀ‚s^÷†ƒ„xµ„½Ñ„wVsP�µ€fH\€0Ò±0XX'•'´¢hÿ@.‡�¢ÃÁàï` çQ!u §¤à0q”âi®ÄR¯DC¸“£’Î Î@ RS by7%:Å56YƒˆE¥ˆ¶&sR£kh‚8ת÷¬W‰­Wl²7{Œ1t 8m^ƒá$ƒç¥9`ƒ8øw�„ó3£ð'Ma‹ª±k°%úsþ÷Ån¸¡_xÕ_Ä„gwg\0¨ Ü'ß÷@•0Ñq'ÑX'ZHè×9'�É È0†ì¡YဧB‡iûA)ªt2äŽîè)µóh‘÷ øè½ãb7Õ È ò#4-�C.ÊÕP Å`MôD@ÖˆK… Øk˵,"Øй˜—P‘ÚÃÆà‰ è‰Im¦Ø‘¨u6ÈŠ?@®(G_H.À’t r0/1iW¾ø%7‰“ûÒ„NXHÆ¡gŒ3RØHU0'G™”Y˜'(Ç^œG.‘ È€ a•ñ—B©£•÷wŽ ¥J”ÂJ3$b‹—RÔÐxêþé0€ôhj[}ø––·€…@c´2õ”Ÿ·{ér0‡L˜ƒ¹‘¨=½°5–ø‹Ù){Öòd+m{ Ü4ŠÖæ{á4ƒëÃ!™$#¹tÐ�¢)� ”_,Ù’¦ O2é?»‘öðÆWˆsv±iHÆX¥ŒŒTÏÈ›å›Õ(Q²�ìGœ!Ôäi•g蜠Z+Q2ªÄügZ�xb±tCÜé8‘–÷(ž¸ hyHÑ€å"4±xwÂ!{™ˆ~) Œd „Ù†™ŸÊR‰ý©˜ˆ`l�:{Ì6™{€fc6£¨ ©t™ªxœ™þt&Iˆª~9&„rPš¦yšð$OYB“_"v#J8&êÄXŒÇÁ8f›S£Ð!£v’'#Ð�\86Ú£Å9•Üi1i GŽÏ¹•)3Zì°Žùád¬Â逇ôè Ï0¥‡Ð–HžåI[ÌðMâS¥¨9¦•à[Ÿ>VsgЦöé}ѦÙŸˆÀ9§ˆ6 ø]Œ Š£¸—é‘Ä÷ ‚J|B tP¨ï…¨þŠ� `‹¸¨kš›G Š»Ñ 7 Hò–¢…”þÂ8|–¢:ª1jª¾i7MY4ÖŠa«Å©´ú“æ Õaù—2*þ ›Æ2¦õiÿab¡F¬óyh©¬ø #w¥–7HA¡²"4È×9V'�²F –­‰È­ò9s5WŸ Ù½¦Enú¦\D˜Ô•lŠ]Eçl{p-µ0е0FEB§ˆŠde¯–Á™B°¯üšþZ6Pš‹‹mfšó%@з«‘œ@¢�“©Ãˆ¢Å±K`lr`Z±2j~<(YÇCY2 •"‹ Ñ1îð&Û²aø§«ù¡i”‚Úà÷2'æ)×°ÄZK‘G ‘G¥B¡K>û³Hñ…¿Y+ë™D\±´cÑ—~Ù­P»TQC˜Ìåk½–Ÿ;wµpÊE™€šh-¹ðl_þ ^zJ¶|Ú§ ª™«ÈŠBШûº$�2€’²0 ›°¯Ú¾«q°³Ñ “ª°¶ñìŒ�E¸„dkH†”¸{±£ £¦Ú`ØÁ$B£hwd¹"{ äPBœûë±:˜¶²,!q½Jq,aÿǺÿÑxèð¤y¨‡zèˆ`j¨—‚0@+—MÁ±Ò¥$¿Ë´M[k(R¦Qk¼iº¦k ‘‰ÙŸ®½?ljˆa½Úße ·0¶»W¶g{ЧØe?`ƒ9€¯á ·ZÜ ³Ðų` *¡š·¦Ù|¨ ¿°±W6¦ &›Ê©ÿË}Šk±Œh¥ZÀM°” Ð�‘Û…EC.þ£�—«âЛûò)(+¡Ë•,{ …LJ—º0³ºªu!,Ây˜³Îà;ûC·‹j,<™—0Lf^*+5L sn‘Tói¼¯®4òL;÷¦#ÈEŒ½|A½ˆ±_«ÄÏæMNL̋ЧÊ™VŒÅ„ªÅûú^, µÆÚ¾oÐ|²€Æöë·ùd“z6LÈ¿‡KHÇÑ @ioŒÄ¸¹©Pœ'�«« œÂB‚|¹ÊBîpÈ )Šü(L¤)\ß R¬�¢™LKõÈ œ<»!7¶«Â+̈pžcF+ÆS­Y±ÀËÊ¡'\NËÆË’pE>Üþ Å`µX»E™Ð¾üËH¬ÄJü]ÄLmµP Š wà§ôJ|Ë|NBVÎŒ‹D(ͧq·îkš²±uiL@¯Án†s“¥pšj¸pœj‡ÎUÇ‘ÃÎí|À°»*лMÁ~öŒ ÷¬Ïî`ïÁB)+»b½šxLJ–ci M¬/5Â$̇C)ü¬£ÜZJˆŠö…²öÑÁ‹Ã"M¼Æ5Ðu Í„Ÿ†™ Òd®º¼Ë.(#¾ ¶Ž̤Í´pÓ?’ÓÛ+ƒSÌŠA=ÔDíÌr ú3 |ÐfÛ¾´}rõ{¥#*ÅaXÍ“þË[ 0Ê!ÀUxÜXð¼Ç9þ–À™$h-²÷|ÏêpÈm2‚gŽCJ×.Év­¤¨ËÁý)™üxMÂ%̬BQ•Wž£ÌÂÒúŠ´RGt´ÊãØeÑ—‘ýÊ;,5.‚¦WD#Ë;UB¼E»ÜË1-Ú4]Ó{€Ó©ÓÇŒ¶hÛÚ@$W ÛC-Û¸èÅ]Ü aLƦ©%Eøu¿Í°xE8ÃØ¿ÇmHÉ}oÌÝÜÏmhÙ!%§ìÇ·ò'¯JÚ€Ýj­ Ê€ìŠ;r=¤�}öñ•&VCzí)ÞP‡™L€îM ;Û³†=`ßÓJ+2|<xcaÃÿÃ(B¼`¼ˆ�dÁ@ËkÊà‹y®ÍËÇÚÖKÚþ4=á¨=¶:Å~Ú½ä´Ì.vàÌj ÑÌfK}â0‰WùD@”®,nOœÀ/\пäÌŒ3ÞÕ^íÜxpÚÇQ±Ñºåª![œ÷<äÈŽðZà Ð-AºìÀi°4‡ØiÑà éÉ9¤‡=»¹DÑ}Øé„ßæÒªê¢´hnàÕ m5u‘¦~±¼Ï„dŒ@‚d‘Óˆ™Àü|¾¯€Ó9Ó;m‚>’V|èY¼¯bLP [7ÆKýv„8ùÛi°}�0Æ‘‡ãZ-ÇlçÕ‘sã9>ÖŠI8öã:ÊêD^œ3ù@º•̲èøä½Zþqï¸x  ç@¬é`QZì‘G ¾ʇÍÂË®^ÔI€�@€–@ Ñ. �¾æ#í@ ‘àš¼Ê«ÙÒ4îžØàæ~ {Þç5}Å èµ°½^$ôÎáö.¡ì˾ÒÇïötš879g”þ·_‚ÃA}š>ÎÇÝðÜ× 5~`¢nªEphböKž¡ßÇc­•K±ÚêD~Ï3³¹Xi/òkÉvm³ã½þ8 mÑÐÞîí ð Ê*\ߣÜ�Y!E[41þ JKe‘桗Ñô·OÙtá'½¼k*#àŽ‰Mõ1} Áü]ž8 [ÿî]Ÿá=þ¶a9`ïÍܨ⻳`/µ€ ¹mͯ‘ýxåö¸±Í_ò–Ê@ ±wÜ¿÷uãK)´;6VøMqøØ½ñŒ¿Ýˆüƒ—�q­Û5p¯]c§Ž;tâ¨u£vÚD‰'^ŒFMºt¯Es ¤3’%½B‰’!A-]‚ÙhLÜl BçN2þýTèУP@JáÕ¥J–œZ’µ˜°aU­V5&)ÒV®‘}„‰1b½z•%–‹#Fؾ…Û6×\ºtoeê³'ïÞ=}1Ý|«ÖàÁšôè¡sñB 9 !•-ç “y ÍvfÍþBšÏ9¥MËy“ú *Y¡QñIulÚµí 2%«ª/e|ÿÎ¥Œp.Źü)•¼T'-Í;o]útéEš€À~O~'*áæMäÄ!C¦ ½2öêÓ©sçŽ8pÝê¬ßMÿÀ‚Å-THo"’¨"‹.šH$8ꤑLr†’RRI–^˜6t¡ñrâNPÀ#¨ŽB*a.y *¨$)faˆ¹ «GºòÊ‘¯Üº„˜±Î2+-^âbË­¸êBò®½øÊkZL°Âô°ã°Äô`¬± “Œ2Ë*Ãl39èsZX“E–?Ö í4ÕR뤵Ðþˆþ-µ/jÃó6Sv+EŽÞ€ n8㊓C¹äªxî9êN‰ë@ðP�CT¡DKÇ» qÈA/=ö<Eæ½øÜéF‚ìÛo þ ºÆœ„^=è Š4šŒ¼AGŽÐqB)|å—^ÒP&™i‚)ÑRð@‘‚Vl1*©†¡±Æ`ŒÁ1w|D’±ÔR-^Œ$ò­=1ɹnÉE“uûbrYj‘’°);ìŽ<Ë’Ëȼü³1ÉÔÌ4eá¤M7ßìĵYè¬í <cûâ‹RtÃíŽ/„t8‘åbCKIÔ¹*¥N %:Èî&(U¡gIÄT€Qȹf½ô<þuO¡øô35¿TYíïœW"PÖ‹jµU$\Óáèœ|5é`-& 7„Éeq¢Ô»›‡b妤F†’§$yÆk$‹Û®ùvG±È2ë¬\xÉÅHÁÓuw®ZŒ‘—z·0|/ìJÄòÈCÆx²/+ÓãÅÔ$Í47yã4ÔÞ|#âYZ£øb<3ÞMaSîàâã‰#™ ;NF4å•Y–Îeì"ÝŽæÎþ.ç·ñ¹½öDšhTõ¨úþ®Q:Àsš~AŒD:‡ÁtÌÁBm‚Ii¥aÉ0&°kPÁ& ”ä…:1Ú`†aÑ)k¥"K°Ò•Gäíˆ˸þТ–\ô]ébË W‹¹hBqzÁ`_§/}¦J‰¡œå&ÍmîSf8&Ü8¬4¨{Ã&Z“¦NÄf ®Ãì\cŠ?|Ìv¿!Ž U(C¥¬9À«Žð@°,šâ~CQ9Àñ³Oµ'TB#Uª´hëaïUá^÷¤ hœCWñÆÕÊçŒs ¯B]óØ`Rƒ@k~õ{"Pä—"aPËÿ+F�h7¯€«€_ÁDZÐÒ‹¿¥‚pY—1à…$ Ê«/l’½^A˜|ÕÂ0üÒC³´%Ì2?8 ×ÐÑ¡bop ßðÖ°¦†´±ØÅ2ö…Nl,7¨]0(D’íÎP½Kõ2Hg4SýJ�;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/cacti_backdrop2.gif���������������������������������0000664�0000000�0000000�00000007612�14136337723�0025123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aÈ�%�÷c����������������������     ,6 DNOPOPPQRRT !V%Y,b4p":‚)=’-?˜.?š/?›/@œ0A0Cž2E 4D 3E 4E 4E 4E 4G¡5H¡6I¢7K£:O¥>Q¥@Q¢>S—:P€8Lj9GW;EN@GPBLXFSbLXmO\rSi}`r…kw‰p{s›u~©q{µlyºiy¼iy¼iy¼jx»jx»jx»jwºjwºiv¹ht¸gs·er¶dq¶dq¶coµan²^l±Zj³Tj·Hk¼>l¾9n¿7pÁ6pÁ6qÂ7sÂ7sÂ7sÂ7rÂ7uÄ9wÄ9xÅ:xÅ:xÅ:yÅ:zÆ;yÆ;zÇ<}È=€Ê>€Ê>Ê>Ê>€Ê>€Ê>€Ê?€É?ƒËA…ÍA†ÌA†ÌB†ÌB…ÌD…ÌE…ÌE†ÍD†ÍB‡ÍAˆÎB‹ÏCŒÏCŒÏDÐDÐDÐEÐEÐEŽÑEÑEÑEÒF‘ÒF“ÔG“ÔG’ÓG’ÓF“ÔG—ÖI˜ÖJ™ÖJš×Kš×K›ØL›ØLœØMÙNžØPØUšÖV•ÓW’ÑXÐYÎ[‹Ì]‰Ë^ˆÊ`ˆÉbˆÉc‰ÊdŒÌeŽÍfÎfÎfÎfÏg’Ðg“Ðh”Ñh”Ñh•Ñi•Òi–Òi–Òj˜ÓkœÕlŸÖnŸ×oŸÖnŸ×oŸÖnŸÖmŸ×m¡Øl£Ùn¤Úo¥Úo¥Úp¥Úp¥Úp§Ûq«Ýr­Þr®Þt¯ßu°ßv°ßv°àv±àw´à|ºâŠÕæÁæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéäæéä!ù ��ÿ�,����È�%��þ�ÿ HÈ€ƒgdZȰáBMÍ"JœQY¤‹!EÒ©£GE‰)r“2a'Q [©L—°N~bÊô3‡&Í98snºÅ³§OžrÐ:4ŒÑ0¯nYÊ´ˆ§P\H•º‚…U«UYiÕaÃÆ„ÂRÐ�„ Ù³hÓª¨�áÁ ZšK×Å»Í6aôø1¤HHƒF<ø“Je¿XþJÜrΠš8oæÌ©fPºtÝʬùg4jˆ ƒ†tP¯L)Qr¤õ‘Õ«§R½Êb…íQZ©te€°X >Ö žÖ†Û âÎÍD×Ò&¼ñÝiPõëƒ+¼}û Å-Qþ&þÕR×/B6%OÆY9rÏÌ?o½ò$z´éÒynµZêºHë§0Lem+˜`BZ¥Ò•q)ðÄE!Ç P‡CÍÑ• tY²QG‹D²È"€U§H„¥Ø bˆ‘§‹1º´ô LéA¶že8¾×YOIÝšh¦…”Rþ¹fdS™@ +XÁJ*©pÅàAüV–„X¦eÐq 1´\†–ØÅa3ÊtÒ‘ˆ"ŽX!€iÇ]`„)Ò¢‹Âó‹KÂübÓ”á$‡e ð´c|Ÿ¤Q­¼²Ÿ‘FJÁ‚ &@ŠU²�e*ºÙÐÖA¾‰¥C– žõ•[ÉÉæ\•<7f3ÆxäˆþÖ Ø"y—¢ƒøaž1y¶T̯ãR“r¨ç§ÈÎQ¬ >Õ’TRŸ�YZiGÚŠŒI[mµ1Y`—v5ê�Š¥A¨è tC…ŽÈÅÜ»¨VRɪ}¸Q¬&Ê 'œ¶F‹™É¸Rž ò'Ÿ•ý”eñÅW QFM+d‰šRd¶0œpUU”xà¥\ñ†P•b—.¨>T¨Ð©–È+¯˜*Ãɇ,âÈ_ƒÐŠbйö<ÈJ.ƈçJºìiðdÈ&‹,žø´É³òÉÔh ‰FR‹f{DJNê­U\š©[†EÃÉ¡nŠ\–ÀË\Ë.«s«Y’"´ºÉïþ­¹nBtyáýIN®ìÒÊÒ0·zŸGµ"9ŒBA…ÆX±`‚m¿PJ¸š"T®XW¢-á”9rªË.O¤Ì]Ê("­ùžÈsϸâú¯.Å=´0ºlb#ÒIŽFP>AÝã- P}¨¨é§õPж9ç.”\©=�Éañ`:–)sév¼¬ÃL¦ë±sR3v€Åúf¿¸÷kï‰ ¼ž…¾tÒrPCÓ54”áq Cu­Êµ†@œ£”¤�%Pèf\( 4> y9`b]Ü(ò:2ÅN¾¨Y¬Ø¤¯Û &w0ÜÄ/z8¢OXëàáäPË|‚'þO‹ZÔ’šç i rHT+Lá@(ÀÀ*'¸žÇ²¶p‰¬A¿¡@é:(ÔäB_¡¼ Á¾ŠœP²*Qvâ´/ÂÀ0WŸøUfô<àuâF `�˰,!òj«Z·€”WhÅ5PhM"ŸX›n.{0øÜ(¢äÅ,~Š‹Ã)Ÿ[jÐ1º,f|ÝÛ7¢›Åô{a®Þ¨«ÚÐ%ºÈañއ†9ôP(;ù£.õÃ<A1 [@!ÀERïT°Š³—=lS^Ôà¹09œ.€.ž„D% ¡*Qšð„Æð‰FÒ¦½ñ-w«ìÄï^yC¤í0ijàaPµ<åÝâaFþ„œ(^ñŠZ01‘Æ<‚móHfBJ£(EèD—Å-R-9¨ Ð'Bm’ñ›£Œ1q·º0ÄÕ'\ Ëýy‚p³D–âIKÅéÒž­ÈCBHBžAQ‡<f"ù‚e2S‚Â$S1 `p�–|èZ¶ä– ÀMŒÚܦ1b‡QÆÎ,tSwxR\ Ë<ú+©yby¸wp¥Aá!nA ÆñZ3=bø©b xe‚9E Š€ ’ÄÔ©ô›i*5-ƒý¢'ǸÍçdô„Å(SHræBU²2&‘áÀÄz'] ¢–)  hËÀÒM´µ­­x«~@1ÓšÖ”ŸýþÅ]óZL`/{~5`�®„!±ÔâaÓB¡ãÐ�ªÛLn$¨šÑÈ*# Ñ×V¹Š»™8æù«#,£ ôäž+ o„(¶šWµ·ˆ+M ŠZ°¢¥˜-^Iì­@÷Å- Žð9(áà8£ Ë%‡{–* ›É%‘] NZѪ²]í™c0‹'ÎÞé·@ƒ@ ÏѲT„8-jßÊÏ3üÒµÀ¤+^A‹"ìô®N€‚mð[ Ü•B%j*vðÁ,–À‰(—XUm.¢±UlŒɼ½‰º!‰cŠ%ÃÄl—»›!–{ÈGñ Eæ=-/ÿ(ÓAs [¸©þ!YALÚ굑'À/nE@g(ôwTø`p d¦"dMp%Á‰ªž‘<â¬lý0ëÕÇÌص°y6ó =ž•‡áýL+b¶Â–y'>30“HWÙÒv‘'8AuËjÝR¡“Å(Ž` ì�Ègñâ�ÆÀØAûúȘ*d•á\b£‘P^¥LC“Ápw‹¹†uщïrY¤%íÔE 1·•—¬h­k³ ÄV b§x¥žmãœ_VÓù@•d �œEâz šìËŠükHøâ±ä‰l1ªóÑêJØ`«CM6£Ý oF3ÿS)¦ÅËG4|ÂÛmeÅ-4Î j¡Í GäþZ!_€VÆøõ«ÊapPï Bà ŸœØ]GõÈ8O.'†í\—Igr³åP‡:LÛÕÌ´3³áÃuù¬¤UÃx×éYÜ3µ—!‚æ3£#g…‹ï úâÖ@6Á  0Y¢ ®øîï m ¹‚&ш’lìÈú ]¥£ýPôšâÊðáŒ.*½0ñ:^­hè¶.º½ñÊk\ À C¼ò,äá½’ÃVŒ …”ç÷ÝtV;ŠPŠþÒ:‹g£û@ ÌXœ¹f>ïyß•q³~uU&Ž©‰˜ý§ wVÏLµÿÏ•f» ÐÊ,(ouŽW>5Õ<ç·þ…$JŽC¸+õv ƒV§\å"(;BK± eQ¸²ÿGqÝ2‹úÚ#ƒvlìrolT&;ðSVx× ‹q'É·VòuÚÆGãUÇVm5}ÝF Z‘y„´y Ç}aP #g z¥SN”vº•z&@%k©00—E&#{~öFökƒF"–às»ç\›À7‹&eÌVtCt Æ].q€<Aµt<'u8u{@}x Ó·q¥rÛ—ä6rñµSäç1çW‚tVvFT£Pq—Tñ÷ºf3¨w³#lüY‹eB7eG“pƒpxe„<Ñ<–1q }S'(H þÓ§u˜\°Üvß÷b;urÇr’$k¯WXiøùv4Ѓֆ5³ ºÇÇæ3!%xv€I£x°Ø›@K€(u<4uBqˆºØm1e…›—èyß'vãwLT�T%†%Èr°F†íwï7s@fM²Mn8"&‡±#œàF‚çUéAtÂWÃ÷'H‹>ñ‡]Æ€L(Ð' a&b ÈXØyY Ãè\Xv%x_¨—z+ ñ&kЂ¿1wñ·.ÇQ–ÀQJû·{Kö–U]6|v(„Êò °ˆ€=„˜–m·}T 0»H ­@¨yÀÈþ}Xè}P2v;åN 9™zt¶P@A¢@TXp†Ò‰?P!¡ˆzG"‘@»·±ó ÞøFÁ—p '„Gã8(Gøe^v‹î}·’È ÁŒh‰…Ø ©À ¥Pv\è/°“<IgR  %k[°‰¿Ñ‰ÿpT Š#"5³ÙØwÎ#¿°¿W•D„åˆR[ôaз€&y@TW¼ ‹¬@ hÜ'“Xˆ…Z¡[8~8 ui‰tFRð9ŸãÏèÑØ‰BæcP39"# ¨#âÑŒ†N­øs@Ž 7˜Á‹óeCQ’}HDy»8 Ÿ©s7𥉅—â–\8~åw~u†RÐŒ¥`€žÒ‰18�5 ˜¼©w‘ÀK¦˜;Rù ‡pâ8éœïÑöe‚˜™¤šd‰ˆ¬0 y€fhIš¥™È ²—pyŒåY—,Dz £D)ö†%�;����������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/cacti_logo.gif��������������������������������������0000664�0000000�0000000�00000013011�14136337723�0024202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/cacti_logo.svg��������������������������������������0000664�0000000�0000000�00000041220�14136337723�0024237�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/favicon.ico�����������������������������������������0000664�0000000�0000000�00000002576�14136337723�0023547�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/favicon.png�����������������������������������������0000664�0000000�0000000�00000014233�14136337723�0023552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/index.php�������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023227�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/logotype-a.png��������������������������������������0000664�0000000�0000000�00000030026�14136337723�0024203�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/logotype-b.png��������������������������������������0000664�0000000�0000000�00000041221�14136337723�0024203�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/tab_list.gif����������������������������������������0000664�0000000�0000000�00000001522�14136337723�0023704�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷�ÿÿÿ€€€������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!ù ���,�������/�H° Áƒ*\˜€Ã‡#>dH±¢E‰#ZÜÈÑ`Æ�:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/tab_preview.gif�������������������������������������0000664�0000000�0000000�00000001541�14136337723�0024413�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷�ÿÿÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!ù ����,�������>�H° Áƒ*\ȰáÂ�€±àĉ ^¤€£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/images/tab_tree.gif����������������������������������������0000664�0000000�0000000�00000001542�14136337723�0023672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷�ÿÿÿ€€€������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!ù ���,�������?�(€Áƒ*,x°!€… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/index.php��������������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0021762�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/jquery.multiselect.css�������������������������������������0000664�0000000�0000000�00000005277�14136337723�0024544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/jquery.multiselect.filter.css������������������������������0000664�0000000�0000000�00000000622�14136337723�0026015�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/jquery.zoom.css��������������������������������������������0000664�0000000�0000000�00000012352�14136337723�0023166�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; background-color:ForestGreen; height:0; position:absolute; z-index:auto; filter:alpha(opacity=40); -moz-opacity:0.4; -khtml-opacity:0.4; opacity:0.4; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; height:0; position:absolute; z-index:auto; filter:alpha(opacity=30); -moz-opacity:0.3; -khtml-opacity:0.3; opacity:0.3; overflow:hidden; padding:0; margin:0; background: rgba(0, 0, 0, 0.5); box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #191970; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid red; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid red; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #161616; padding-left: 3px; padding-right: 3px; border: 1px solid rgba(0,0,0,0.75); } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #111111; } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #FFE87C; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #111111; } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #FFE87C; z-index: auto; } .zoom-menu { border:1px solid #aaa; position:absolute; background:#161606; display:none; font-size: 1em; z-index:auto; } .zoom-menu .first_li span { width:150px; display:block; padding:5px 10px; cursor:pointer } .zoom-menu .inner_li { display:none; margin-left:150px; position:absolute; border:1px solid #aaa; border-left:1px solid #ccc; margin-top:-28px; background:#161606; } .zoom-menu .sep_li { border-top: 1px solid #c5c5c5; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float:left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { float: right; margin-left: 0.4em; margin-right:0.2em; margin-top: 2px; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } .zoom-menu-hover { background: #31442B; cursor: pointer; } .zoom-menu-highlight { background: #31442B; } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/main.css���������������������������������������������������0000664�0000000�0000000�00000145077�14136337723�0021623�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main styles */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(22,22,6,0.7); border-radius: 6px; } ::-webkit-scrollbar-thumb { border-radius: 6px; background: rgba(49,68,43,0.8); -webkit-box-shadow: inset 0 0 4px rgba(49,68,43,0.5); } html, body { height: 100%; width: 100%; margin: 0px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; overflow: hidden; } body { background: #161616 none repeat scroll 0 0; color: #bbbfc2; font-size: 12px; } li { } table, tr, td, textarea { -ms-overflow-style: scrollbar; } textarea { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 1.0em; padding: 5px; width: 400px; height: 100px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: left; } td, th { padding: 0px; margin: 0px; } th { white-space: nowrap; user-select: none; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; } img { border: none; vertical-align: middle; } i.fa, i.fas, i.fab, i.far, i.fal { padding: 0px 3px; font-size: 13px; vertical-align: middle; } .menu_parent i.fa, .menu_parent i.fas, .menu_parent i.fab, .menu_parent i.far, .menu_parent i.fal { color: snow; } div { display: block; } fieldset { border: none; padding: 0px; margin: 0px; } hr.menu { border: 0; height: 1px; background: #ccc; background-image: linear-gradient(to right, #333, #ccc, #333); } .reindex_methods span { font-size: 9px; } .checkbox { text-align: center; } .checkboxLabel { display: none; } .realms .checkboxLabel { display: inline !important; } /* links */ a, a:active { color: #e3e3e3; text-decoration: none; } a:hover { text-decoration: none; color: #fff; } th i.fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } #main { display: none; width: 100%; position: relative; z-index: 3; margin-bottom: 10px; } input { padding: 5px; font-size: 12px; max-width: 400px; } select { padding: 0.5em 0.5em 0.5em 0.5em; font-size: 12px; } *:focus { outline: none; } label { white-space: nowrap; } .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right !important; } .left { text-align: left; } .center { text-align: center !important; margin-left: auto; margin-right: auto; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; cursor: pointer; } .filter { position: relative; left: -20px; margin-right: -10px; font-size: 11px !important; } .badpassword_message { padding: 2px; color: red; font-size: 1.0em !important; vertical-align: bottom; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: rgba(148, 179, 107, 0.8); font-size: 1.5em !important; vertical-align: bottom; } .associated { color: rgba(148, 179, 107, 0.8); } .notAssociated { color: red; } .disabled_row span, .disabled_row td, .disabled_row a { color: grey; } .disabled { color: grey; } .idle { color: rgba(148, 179, 107, 0.8); } .running { color: orange; } .errored { color: red; } .newObject { color: yellow; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: rgba(148, 179, 107, 0.8); } .failed { color: red; } .accessGranted { color: rgba(148, 179, 107, 0.8); } .accessGrantedItem { color: rgba(148, 179, 107, 0.8); } .accessRestricted { color: red; } .accessRestrictedItem { color: red; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .graphDrillDown { vertical-align: top; align-self: left; z-index: 4; padding: 3px; height: 100%; width: 22px; min-width: 22px; } .iconWrapper { display: none; } .drillDown { cursor: pointer; } .monoSpace { font-size: 10px; font-family: monospace; color: snow; } .utilityPick { width: 200px; } .itemlist { max-height: 200px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { padding-left: 0.5em !important; display: block; } .deviceUp { color: rgba(148, 179, 107, 0.8) !important; } .deviceDown { color: #ff0000 !important; } .deviceUnknown { color: #0000ff !important; } .deviceDisabled { color: #a1a1a1 !important; } .deviceRecovering { color: #ff8f1e !important; } .deviceError { color: #750F7D !important; } .deviceDownMuted { color: #ffe333 !important; } .deviceThreshold { color: #ffa833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #aa7807 !important; } .deviceAlert { color: #660000 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff0000; } .deviceUnknownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #0000ff; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #a1a1a1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff8f1e; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffe333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffa833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #aa7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: rgba(148, 179, 107, 0.8); } .notBeingGraphed { color: #484848; } .menuoptions { background: none repeat scroll 0 0 #161616; border-color: #161606; border-style: solid; border-width: 0px 1px 1px 1px; z-index: 4; position: absolute; display: block; float: right; right: 26px; top: 22px; list-style: none; text-align: right; margin: 0px; padding: 0px 5px; } .menuoptions li a { border-top: 1px solid #161616; display: block; height: 14px; padding: 4px; } .menuoptions li a:hover { background: #155413 url("images/ui-bg_highlight-soft_33_155413_1x100.png") 50% 50% repeat-x; } .import_label { opacity: 1; } .import_button { opacity: 0; display: none; } .import_text { opacity: 1; } .color-icon { background-image: none !important; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0px 5px 0px 0px; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: rgba(148, 179, 107, 0.8); font-size: 14px; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: rgba(255, 204, 0, 0.8); font-size: 14px; } .deletequery { cursor: pointer; padding: 2px; vertical-align: middle; color: red; font-size: 14px; } .deletequery:hover { color: red; text-decoration: none; padding: 2px; vertical-align: middle; } .odd { background: none repeat scroll 0 0 #202020; border: none; box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .odd td, .even td, .even-alternate td, .selectable td { padding: 3px; } .even { background: none repeat scroll 0 0 #0F0F0F; border: none; box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .even-alternate { background: none repeat scroll 0 0 #0F0F0F; border: none; box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .saveRow { background-color: #262626; text-align: right; padding: 4px; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid rgba(148, 179, 107, 0.8); vertical-align: top; } .linkMarker { color: #c16921; } .filteredValue { background-color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438c; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { color: #FFFFFF; font-size: 10px; font-family: monospace; } .hostDown { color: #ff0000; font-size: 10px; font-family: monospace; } .cactiPageHead { background: #161616 none repeat scroll 0 0; height: 30px; position: fixed; padding-top: 5px; top: 0px; left: 0px; z-index: 4; } .cactiGraphPageHeadBackdrop { background: transparent url("./images/cacti_logo.svg") no-repeat scroll left 40% / 380px auto; padding-bottom: 0px; float: right; width: 400px; height: 35px; top: 0px; position: fixed; right: 0px; z-index: -1; } .cactiConsolePageHeadBackdrop { background: transparent url("./images/cacti_logo.svg") no-repeat scroll left 40% / 380px auto; padding-bottom: 0px; float: right; width: 400px; height: 35px; top: 0px; position: fixed; right: 0px; z-index: -1; } .navigation { } .debug td { padding: 3px; margin: 0px; } .breadCrumbBar { width: 100%; position: fixed; padding: 4px; top: 29px; left: 0px; z-index: 4; background: rgba(76,76,76,1); background: -moz-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(76,76,76,1)), color-stop(12%, rgba(89,89,89,1)), color-stop(25%, rgba(102,102,102,1)), color-stop(39%, rgba(71,71,71,1)), color-stop(50%, rgba(44,44,44,1)), color-stop(51%, rgba(0,0,0,1)), color-stop(60%, rgba(17,17,17,1)), color-stop(76%, rgba(43,43,43,1)), color-stop(91%, rgba(28,28,28,1)), color-stop(100%, rgba(19,19,19,1))); background: -webkit-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -o-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -ms-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: linear-gradient(to bottom, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); } ul#breadcrumbs { font-size: 8px; margin: 0 0 1px 0; padding: 0; list-style: none; } .infoBar { background: #161606; border-width: 1px; border-style: solid; padding: 0.5px 8px 0.5px 5px; white-space: nowrap; border-color: #161616; border-radius: 5px; box-shadow: 0 0 2px rgba(0,0,0,.2); overflow: hidden; display: block; min-width: 15%; max-width: 40%; margin-right: 10px; float: right; text-align: right; } #breadcrumbs { background: #161606; border-width: 1px; border-style: solid; border-color: #161616; border-radius: 5px; white-space: nowrap; max-width: 100%; box-shadow: 0 0 2px rgba(0,0,0,.2); overflow: hidden; max-width: 60%; min-width: 30%; float: left; } #breadcrumbs li { float: left; } #breadcrumbs a { padding: .4em 1em .2em 2em; float: left; text-decoration: none; color: #FFFFFF; position: relative; font-size: 10px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); background-color: #505050; background-image: linear-gradient(to right, #161606, #505050); } #breadcrumbs li:first-child a { padding-left: 1em; border-radius: 5px 0 0 5px; } #breadcrumbs a:hover { background: #505050; } #breadcrumbs a::after, #breadcrumbs a::before { content: ""; position: absolute; top: 50%; margin-top: -1.5em; border-top: 1.5em solid transparent; border-bottom: 1.5em solid transparent; border-left: 1.1em solid; right: -1em; } #breadcrumbs a::after { z-index: 4; border-left-color: #505050; } #breadcrumbs a::before { border-left-color: #161606; right: -1.1em; z-index: 3; } #breadcrumbs a:hover::after { border-left-color: #505050; } #breadcrumbs .current, #breadcrumbs .current:hover { background: none; } #breadcrumbs .current::after, #breadcrumbs .current::before { content: normal; } .cactiContent { clear: both; background: #161616 none repeat scroll 0 0; width: 100%; vertical-align: top; padding-top: 56px; } .cactiTreeNavigationArea { background: #161616; border-right: #aaaaaa 1px solid; margin-left: 5px; margin-right: 5px; padding-top: 10px; display: none; vertical-align: top; position: fixed; left: 0px; top: 56px; z-index: 2; overflow-x: hidden; overflow-y: auto; } .cactiTreeNavigationArea a { padding-right: 18px !important; } .cactiTreeNavigationArea li { padding-bottom: 3px; } .jstree { position: relative; display: block; } .tableRowGraph td { padding: 3px 0px; } .tableRow { line-height: 16px; } .cactiConsoleNavigationArea { background: #161616; border-right: #aaaaaa 1px solid; padding-left: 0px; padding-right: 0px; padding-top: 5px; vertical-align: top; left: 0px; top: 56px; overflow-y: hidden; overflow-x: hidden; width: 167px; float: left; } .cactiConsoleNavigationArea table { width: 162px; } .cactiLogo { background: #161616 url('./images/cacti_logo.svg') no-repeat 30px; display: block; cursor: pointer; padding-bottom: 178px; margin-bottom: 60px; width: 146px; margin-top: -6px; margin-left: 2px; margin-right: 2px; } .loginLeft, .logoutLeft { width: 33%; float: left; } .loginCenter, .logoutCenter { -moz-border-radius: 10px; border-radius: 10px; position: relative; padding: 30px 0px 5px 20px; background-color: snow; top: 30%; max-width: 360px; max-height: 300px; margin-left: auto; margin-right: auto; background: -ms-linear-gradient(top, #363636 0%, #071204 100%); background: -moz-linear-gradient(top, #363636 0%, #071204 100%); background: -o-linear-gradient(top, #363636 0%, #071204 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #363636), color-stop(100, #071204)); background: -webkit-linear-gradient(top, #363636 0%, #071204 100%); background: linear-gradient(to bottom, #363636 0%, #071204 100%); text-shadow: 1px 1px 1px rgba(9, 61, 16, 0.66); } .cactiLoginLogo, .cactiLogoutLogo { position: relative; float: right; background: transparent url('./images/cacti_logo.svg') no-repeat center; width: 120px; height: 148px; z-index: 2; margin-top: -95px; margin-left: 240px; margin-bottom: -20px; } .loginArea, .logoutArea { -moz-border-radius: 10px; border-radius: 10px; position: relative; min-height: 200px; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .loginErrors, .logoutErrors { color: red; min-height: 15px; } legend { font-size: 22px; color: #bbbfc2; } .loginRight, .logoutRight { width: 33%; float: right; } .loginBody, .logoutBody { background: #161616; background-image: -ms-linear-gradient(top, #161616 0%, #000000 100%); background-image: -moz-linear-gradient(top, #161616 0%, #000000 100%); background-image: -o-linear-gradient(top, #161616 0%, #000000 100%); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #161616), color-stop(100, #000000)); background-image: -webkit-linear-gradient(top, #161616 0%, #000000 100%); background-image: linear-gradient(to bottom, #161616 0%, #000000 100%); } .versionInfo { padding-top: 5px; float: right; margin-top: 10px; color: snow; } .actionsDropdown { vertical-align: middle; padding: 3px; width: 100%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdownButton { vertical-align: top; float: right; margin-left: 3px; display: table-cell; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .cactiTooltipHint { cursor: pointer; padding-left: 5px; font-size: 12px !important; } .spikekillData, .spikekillData td { border: 1px solid #999; } .spikekillNote { padding: 1px; } .spikekillMenu { background: #161616 none repeat scroll 0 0; border: 1px solid #373737; box-shadow: 2px 2px 2px #292929; margin: 0; padding: 2px; line-height: 1.5em; } .spikekillMenu li { color: snow; vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .loginPanel { padding: 4px 0px; } .treeTable { width: 100%; } .treeArea { vertical-align: top; } .cactiGraphContentArea { background: #161616; padding-top: 10px; padding-right: 5px; padding-left: 5px; display: none; vertical-align: top; overflow-y: auto !important; overflow-x: hidden !important; height: 100vh; } .cactiGraphContentAreaPreview { height: 100vh; background: #161616; padding-top: 10px; padding-right: 5px; padding-left: 5px; display: none; vertical-align: top; overflow-y: auto !important; overflow-x: hidden !important; } .cactiConsoleContentArea { background: #161616; padding-top: 10px; padding-right: 5px; padding-left: 5px; vertical-align: top; overflow-y: auto !important; overflow-x: hidden; } .hyperLink, .hyperLink:hover, .hyperLink:visited { color: rgba(148, 179, 107, 0.8) !important; cursor: pointer; text-decoration: none; } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .noLinkEditMain { color: rgba(44,130,29,1); text-decoration: none; font-size: 12px; font-weight: normal; padding: 3px; white-space: nowrap; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: rgba(148, 179, 107, 0.8); text-decoration: none; font-size: 12px; font-weight: normal; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: show; white-space: nowrap; text-decoration: none; } .linkOverDark, .linkOverDark:active { color: snow; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: snow; text-decoration: none; } .linkCopyDark, .linkCopyDark:active { color: snow; font-weight: normal; text-decoration: none; cursor: pointer; } .linkCopyDark:hover { color: snow; text-decoration: none; } .linkOverLight { color: #161616; text-decoration: none; font-weight: normal; text-align: center; } .linkOverLight:hover { color: #464646; text-decoration: none; font-weight: normal; } /* text styles */ .textError { font-size: 12px; font-weight: normal; color: red !important; } .textWarning { font-size: 12px; font-weight: normal; color: yellow !important; } .textInfo { font-size: 12px; font-weight: normal; color: snow; } .textHeader { font-size: 12px; font-weight: normal; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; display: none; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: #222222; border: 1px solid #161616; position: relative; z-index: 4; } .textHeaderDark { font-size: 12px; font-weight: normal; color: snow; } .templateHeader { background: rgba(76,76,76,1); background: -moz-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(76,76,76,1)), color-stop(12%, rgba(89,89,89,1)), color-stop(25%, rgba(102,102,102,1)), color-stop(39%, rgba(71,71,71,1)), color-stop(50%, rgba(44,44,44,1)), color-stop(51%, rgba(0,0,0,1)), color-stop(60%, rgba(17,17,17,1)), color-stop(76%, rgba(43,43,43,1)), color-stop(91%, rgba(28,28,28,1)), color-stop(100%, rgba(19,19,19,1))); background: -webkit-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -o-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -ms-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: linear-gradient(to bottom, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { font-size: 11px; color: snow; font-weight: normal; padding: 3px; white-space: nowrap; } .cactiBorderWall { border-width: 1px; border-color: #154313; border-style: solid; } .cactiTable { display: table; width: 100%; margin-left: auto; margin-right: auto; color: snow; } .cactiInstallLoaderSpinnerTheme { border-top-color: #252426 !important; } .cactiTableTitleRow { float: left; text-align: left; padding-left: 5px; display: block; width: 100%; height: 22px; line-height: 22px; background: -webkit-gradient( linear, left top, left bottom, color-stop(0, #252426), color-stop(1, #0C0D0D)); background: -o-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -moz-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -webkit-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -ms-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: linear-gradient(to bottom, #252426 0%, #0C0D0D 100%); } .cactiInstallTableTitleRow { border-color: -webkit-gradient( linear, left top, left bottom, color-stop(0, #252426), color-stop(1, #0C0D0D)); border-color: -o-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); border-color: -moz-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); border-color: -webkit-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); border-color: -ms-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); border-color: linear-gradient(to bottom, #252426 0%, #0C0D0D 100%); } .cactiTableTitle { float: left; text-align: left; padding-left: 5px; display: block; width: 70%; height: 22px; line-height: 22px; background: -webkit-gradient( linear, left top, left bottom, color-stop(0, #252426), color-stop(1, #0C0D0D)); background: -o-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -moz-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -webkit-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -ms-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: linear-gradient(to bottom, #252426 0%, #0C0D0D 100%); } .cactiTableButton { float: right; padding: 0px; display: block; text-align: right; width: calc(30% - 5px); height: 22px; line-height: 22px; white-space: nowrap; background: -webkit-gradient( linear, left top, left bottom, color-stop(0, #252426), color-stop(1, #0C0D0D)); background: -o-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -moz-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -webkit-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -ms-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: linear-gradient(to bottom, #252426 0%, #0C0D0D 100%); } .cactiTableButton.debug { background: transparent; float: right; padding: 0px; padding-bottom: 3px; margin-right: -5px; } .cactiTableButton span, .cactiTableTitle span { padding: 0px; white-space: nowrap; vertical-align: middle; } .cactiTableButton i { padding: 0px 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0px 8px !important; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-column; text-align: left; } .formColumnLeft { float: left; display: table-column; width: 45%; text-align: left; } .formColumnRight { float: left; display: table-column; width: 45%; text-align: left; } .formData { display: inline-block; float: left; text-align: left; } .formRadio { line-height: 22px; } .formSubCheckbox { line-height: 20px; float: left; } .formSubCheckbox input { margin: 0px; vertical-align: -10%; } .formSubCheckbox label { } .formCheckbox { vertical-align: -15%; } .formFieldName { display: inline-block; color: snow; float: left; text-align: left; font-weight: normal; padding-left: 3px; } .formFieldDescription { float: left; font-weight: normal; text-align: left; line-height: 14px; } .formTooltip { display: inline-block; padding-left: 4px; } .formHeader { float: left; width: 100%; text-align: left; line-height: 25px; background: -moz-linear-gradient(top, #45484d 0%, #000000 100%); background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%); background: -o-linear-gradient(top, #45484d 0%,#000000 100%); background: -ms-linear-gradient(top, #45484d 0%,#000000 100%); } .formHeaderText { padding-left: 3px; } .formHeaderAnchor { float: right; padding-right: 8px; } .hostInfoHeader { width: 100%; } .queryAdd, .templateAdd { padding: 3px; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 35px; } .formColumn { float: left; display: table-row; } .formColumnLeft { float: left; display: table-row; width: 90%; text-align: left; } .formColumnRight { float: left; display: table-row; width: 100%; text-align: left; } .formFieldName { color: snow; float: left; text-align: left; white-space: nowrap; padding-left: 3px; } .formData { float: left; } .hostInfoHeader { overflow: hidden; } .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } .ui-button-text-only .ui-button-text { padding: 0.4em; } /* dropdown menus */ .menuoptions, .submenuoptions { width: 100%; left: 0 !important; border-left: none !important; border-right: none !important; } .menuoptions li a, .submenuoptions li a { padding: 4px 25px 4px 4px; } } .graphItem { background-color: #362616; } .graphItemAlternate { background-color: #262606; } .break { height: 4px; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { background: -webkit-gradient(linear, left top, left bottom, color-stop(0, #252426), color-stop(1, #0C0D0D)); background: -o-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -moz-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -webkit-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -ms-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: linear-gradient(to bottom, #252426 0%, #0C0D0D 100%); } .cactiNavBarBottom { background-color: #00438c; } .tableHeader { display: table-row; background: -moz-linear-gradient(top, #45484d 0%, #000000 100%); background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%); background: -o-linear-gradient(top, #45484d 0%,#000000 100%); background: -ms-linear-gradient(top, #45484d 0%,#000000 100%); height: 24px; } .tableHeader th:hover:not(.primarySort) { border: 0px solid #155413; background: #155413 url("images/ui-bg_highlight-soft_33_155413_1x100.png") 50% 50% repeat-x; } .tableHeader th.sortable { cursor: pointer !important; line-height: 10px; } .tableHeader th.primarySort, th.tablesorter-headerDesc, th.tablesorter-headerAsc { background: rgba(0, 0, 0, 0) linear-gradient(to bottom, rgba(167, 217, 134, 0.4) 0%, rgba(148, 179, 107, 0.4) 100%) repeat scroll 0 0; } .tableHeader th.secondarySort { background: rgba(0, 0, 0, 0) linear-gradient(to bottom, rgba(187, 227, 154, 0.2) 0%, rgba(168, 199, 127, 0.2) 100%) repeat scroll 0 0; } .tableHeader th, .tableHeader td { color: snow; vertical-align: middle; text-align: left; font-size: 12px; font-weight: normal; padding: 4px !important; line-height: 12px; } .tableHeader th div { display: block; padding-right: 8px; font-size: 12px; white-space: nowrap; } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { color: snow; vertical-align: middle; text-align: left; cursor: pointer; padding: 3px; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .graphSubHeaderColumn { color: snow; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { max-width: 20px; width: 20px; background: -moz-linear-gradient(top, #45484d 0%, #000000 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#45484d), color-stop(100%,#000000)); background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%); background: -o-linear-gradient(top, #45484d 0%,#000000 100%); background: -ms-linear-gradient(top, #45484d 0%,#000000 100%); background: linear-gradient(to bottom, #45484d 0%,#000000 100%); } .image_table { width: 100%; } .tableConfirmation { width: 100%; text-align: center; background-color: #f5f5f5; border: 1px solid #aaaaaa; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { color: snow; width: 100%; text-align: center; vertical-align: middle; display: table; background: -webkit-gradient( linear, left top, left bottom, color-stop(0, #252426), color-stop(1, #0C0D0D)); background: -o-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -moz-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -webkit-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: -ms-linear-gradient(bottom, #252426 0%, #0C0D0D 100%); background: linear-gradient(to bottom, #252426 0%, #0C0D0D 100%); } .navBarNavigationPrevious { text-align: left; white-space: nowrap; display: table-cell; width: 10%; height: 20px; vertical-align: middle; } .navBarNavigationCenter { text-align: center; display: table-cell; white-space: nowrap; width: 80%; height: 20px; margin-top: auto; } .navBarNavigationCenter span { vertical-align: middle; display: table-cell; } .navBarNavigationNext { text-align: right; white-space: nowrap; display: table-cell; width: 10%; height: 20px; vertical-align: middle; } .navBarNavigationNone { text-align: center; display: table-cell; white-space: nowrap; width: 100%; height: 22px; margin-top: auto; padding-top: 6px; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 12px; background-color: #161616; } .textArea a { font-size: 1.1em; } .popupBox { z-index: 2; position: absolute; padding: 0px; display: none; overflow: auto; color: snow; background-color: #e5e5e5; border: 1px solid #e5e5e5; } .installArea { background-color: snow; padding: 10px; } .textAreaNotes { font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; } .textEditTitle { font-weight: normal; } .textMenuHeader { color: snow; background-color: #9C9C9C; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: normal; } .textMenuItem { background-color: #efefef; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuSubItem { background-color: snow; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .txtErrorTextBox { border: 2px solid #ff0000 !important; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: normal; } /* tabs */ .tabSpacer { width: 0px; padding-right: 2px; padding-left: 0px; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #dfdfdf; white-space: nowrap; width: 1%; } .deleteMarker { color: red !important; height: 14px !important; vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .deleteMarkerDisabled { color: grey !important; height: 14px !important; vertical-align: middle; text-decoration: none !important; } .deleteMarkerDisabled:hover { text-decoration: none !important; } .moveArrow { color: #00438C !important; display: inline-block; width: 11.75px; !important; font-size: 14px !important; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { display: inline-block; width: 11.75px; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } td.tab { border-top: 1px solid #999; border-right: 1px solid #666; border-left: 1px solid #999; padding-left: 3px; padding-right: 3px; min-width: 0%; border-bottom: none; border-top-left-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; } td#tabs { padding: 0px !important; } .cactiGraphHeaderBackground { background: transparent url("./images/cacti_logo.svg") no-repeat scroll left 10% / 380px auto; height: 35px; width: 500px; float: right; position: fixed; top: 0px; right: 0px; z-index: -1; } div#gtabs { padding-bottom: 0px; vertical-align: bottom; position: fixed; right: 5px; top: 5px; height: 30px; } .maintabs { overflow: hidden; height: 25px; } .maintabs-submenu { display: none; } .ellipsis { display: none; } .submenuoptions { border: 0px solid #155413; background: #161616; color: snow; border-style: solid; position: absolute; top: 30px; list-style: none; text-align: left; margin: 0px; padding: 10px 0px 10px 0px; z-index: 200; } .submenuoptions li a { display: block; padding: 4px 15px; font-size: 12px; font-weight: 500; color: snow; text-decoration: none; } .submenuoptions li a:hover { display: block; border: 1px solid #155413; background: #155413 url("images/ui-bg_highlight-soft_33_155413_1x100.png") 50% 50% repeat-x; color: snow; } .tabs a, .maintabs a { -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; background: #222222 url("images/ui-bg_highlight-soft_35_222222_1x100.png") repeat-x scroll 50% 50%; color: snow; float: left !important; padding: 5px; text-decoration: none; font-size: 12px; vertical-align: bottom; } .tabs a:hover, .maintabs a:hover { border: 0px solid #155413; background: #155413 url("images/ui-bg_highlight-soft_33_155413_1x100.png") 50% 50% repeat-x; } .tabs a.selected, .maintabs a.selected { background: #31442b url("images/ui-bg_highlight-hard_20_31442b_1x100.png") repeat-x scroll 50% 50%; } .tabs li, .maintabs li { bottom: -1px; float: left; margin: 0 3px 0 0; position: relative; line-height: 14px; } .tabs li.current a, .maintabs li.current a { background: #fff; border-bottom: 1px solid #fff; } .tabs li.current a:hover, .maintabs li.current a:hover { background: #fff; border-bottom: 1px solid #fff; } .tabs nav, .maintabs nav { padding: 0 0 0 4px; zoom: 1; } .tabs nav:after, .maintabs nav:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } .tabs ul, .maintabs ul { list-style: none; margin: 0; padding: 0; } /* Navigation Area */ #nav { float: left; width: 150px; border-top: 0px solid #151515; border-right: 0px solid #151515; border-left: 0px solid #151515; font-size: 12px; margin: 0px 0; } #nav li a { display: block; padding: 2px 4px; background: #ccc; text-decoration: none; color: #fff; } #nav li a.active { color: snow; background-image: linear-gradient(to top, #060606, #363636); } th { border-right: 1px groove #eee !important; } th:last-child { border-right: none !important; } tr.selected { background: rgba(167,217,134,1); background: -moz-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,1)), color-stop(100%, rgba(148,179,107,1))); background: -webkit-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -o-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: linear-gradient(to bottom, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); color: #000000; } tr.selectable:hover:not(.selected) { background: rgba(167,217,134,0.4); background: -moz-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,0.4)), color-stop(100%, rgba(148,179,107,0.2))); background: -webkit-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -o-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: linear-gradient(to bottom, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); } tr.selectable:hover:not(.selected) a { color: snow; } tr.selected a { color: black !important; } #nav li a.pic:hover, #nav li a.selected { background: -moz-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,0.4)), color-stop(100%, rgba(148,179,107,0.2))); background: -webkit-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -o-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: linear-gradient(to bottom, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); } #nav li a.pic { padding-left: 12px; } #nav li ul { display: none; padding: 0; } #nav li ul li a { padding: 2px 4px; background: #191919 none repeat scroll 0 0; } #nav li ul li { list-style: none; padding: 0; } ul#nav { list-style: none; padding: 0; width: 100%; } .clogError { background-color: rgba(255, 0, 0, 0.2); } .clogWarning { background-color: rgba(255, 255, 0, 0.2); } .clogSQL { background-color: rgba(0, 0, 255, 0.2); } .clogDebug { background-color: rgba(0, 0, 220, 0.1); } .clogStats { background-color: rgba(0, 255, 0, 0.1); } .clogLimit { background-color: rgba(255, 255, 0, 0.2); } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } @media print { .noprint { display: none; } } div.preformatted { color: snow !important; font-size: 11px !important; } ul.pagination { display: inline-block; padding: 0px; margin: 5px; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { color: #bbbfc2; float: left; padding: 3px; text-decoration: none; } ul.pagination li span { color: #bbbfc2; float: left; padding: 0px 0px; text-decoration: none; margin: 0px 1px; } ul.pagination li a.active { background: rgba(0, 0, 0, 0) linear-gradient(to bottom, rgba(167, 217, 134, 1) 0%, rgba(148, 179, 107, 1) 100%) repeat scroll 0 0; color: #161616; border-radius: 3px; padding: 3px; } ul.pagination li a:hover:not(.active) { background: rgba(167,217,134,0.4); background: -moz-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,0.4)), color-stop(100%, rgba(148,179,107,0.2))); background: -webkit-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -o-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: linear-gradient(to bottom, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); border-radius: 3px; padding: 3px; color: snow; } tr#realtime td:first-child { height: 64px; } .logEmergency { background-color: rgba(255, 6, 6, 0.4); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logCritical { background-color: rgba(242, 23, 33, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logAlert { background-color: rgba(242, 25, 36, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logWarning { background-color: rgba(255, 122, 48, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logError { background-color: rgba(251, 74, 20, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logNotice { background-color: rgba(250, 253, 158, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logInfo { background-color: rgba(204, 255, 204, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .logDebug { background-color: rgba(205, 207, 196, 0.2); text-align: center; width: 12.5%; padding: 3px; color: #eeeeee; } .menuitem { white-space: nowrap; } .menu_glyph { font-size: 18px !important; line-height: 18px; float: middle; vertical-align: middle; text-align: left; width: 24px; } .graphWrapper { position: relative; } .ui-autocomplete { height: 300px; overflow-y: scroll; overflow-x: hidden; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect .ui-icon { margin-top: 0px; } .ui-button { padding: 0.3em 1em !important; } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-filter, .ui-widget-header { font-weight: normal !important; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter { margin-bottom: 4px; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; } .ui-tooltip { max-width: 500px; word-break: break-word; } .ui-tooltip-content div.header { color: rgba(148, 179, 107, 0.8); } .ui-tooltip-content div.content { font-size: 10px; color: #333333; } .ui-tooltip-content { overflow: auto !important; opacity: 0.95; border-radius: 5px !important; border: transparent; } .ui-widget { font-size: unset; } .ui-checkboxradio-icon { display: none; } /* New Checkbox Stuff */ .checkboxSwitch { position: relative; display: inline-block; width: 45px; height: 24px; margin-right: 5px; vertical-align: middle; } .checkboxSwitch input { display: none; } .checkboxSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background: -moz-linear-gradient(top, #45484d 0%, #000000 100%); background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%); background: -o-linear-gradient(top, #45484d 0%,#000000 100%); background: -ms-linear-gradient(top, #45484d 0%,#000000 100%); -webkit-transition: .4s; transition: .4s; } .checkboxSlider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:disabled + .checkboxSlider { cursor: not-allowed; } input:checked + .checkboxSlider { background: #31442b url("images/ui-bg_highlight-hard_20_31442b_1x100.png") repeat-x scroll 50% 50%; } input:focus + .checkboxSlider { box-shadow: -moz-linear-gradient(top, #45484d 100%, #000000 100%); box-shadow: -webkit-linear-gradient(top, #45484d 100%,#000000 100%); box-shadow: -o-linear-gradient(top, #45484d 100%,#000000 100%); box-shadow: -ms-linear-gradient(top, #45484d 100%,#000000 100%); } input:checked + .checkboxSlider:before { -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } /* Rounded.checkboxSliders */ .checkboxSlider.checkboxRound { border-radius: 5px; } .checkboxSlider.checkboxRound:before { border-radius: 50%; } .checkboxLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; } .right { text-align: right; } .radioSwitch { position: relative; display: inline-block; margin-left: 5px; margin-right: 5px; height: 24px; width: 24px; vertical-align: middle; } .radioSwitch input { display: none; } .radioSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; height: 24px; width: 24px; background: -moz-linear-gradient(top, #45484d 0%, #000000 100%); background: -webkit-linear-gradient(top, #45484d 0%,#000000 100%); background: -o-linear-gradient(top, #45484d 0%,#000000 100%); background: -ms-linear-gradient(top, #45484d 0%,#000000 100%); -webkit-transition: .4s; transition: .4s; } .radioSlider:before { display: none; position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:disabled + .radioSlider { cursor: not-allowed; } input:checked + .radioSlider { background: #31442b url("images/ui-bg_highlight-hard_20_31442b_1x100.png") repeat-x scroll 50% 50%; } input:focus + .radioSlider { box-shadow: -moz-linear-gradient(top, #45484d 100%, #000000 100%); box-shadow: -webkit-linear-gradient(top, #45484d 100%,#000000 100%); box-shadow: -o-linear-gradient(top, #45484d 100%,#000000 100%); box-shadow: -ms-linear-gradient(top, #45484d 100%,#000000 100%); } input:checked + .radioSlider:before { display: block; } /* Rounded.radioSliders */ .radioSlider.radioRound { border-radius: 24px; } .radioSlider.radioRound:before { border-radius: 50%; } .radioLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; line-height: 20px; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } .bb-chart { } .bb-chart-arc path { fill: #A8A8A8; } .bb-tooltip { } .bb-legend-item { fill: #A8A8A8; } .bb-grid { fill: #A8A8A8; } .bb-axis { fill: #A8A8A8; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #161616; empty-cells: show; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; opacity: 0.9; } .bb-tooltip tr { border: 1px solid #050505; } .bb-tooltip th { background-color: #161616; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFFFFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #050505; border-left: 1px dotted #999; } .bb-tooltip td > span { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip td.value { text-align: right; } /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: transparent; } .bb path, .bb line { fill: none; stroke: #E0E0E0; } .bb text { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused { opacity: 0.3 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #E0E0E0; stroke: none; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } .bb-chart-arc .bb-gauge-value { fill: #000; /* font-size: 28px !important;*/ } circle { stroke: #7e818f; stroke-width: 1px; fill: transparent !important; } [id*='_edit'] .tableRowGraph:hover { background-color: rgba(0, 200, 200, .1) !important; border-left: 2px solid yellow !important; border-right: 2px solid yellow !important; } .tableRowGraph { border: 2px solid rgba(0,0,0,0); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/main.js����������������������������������������������������0000664�0000000�0000000�00000020173�14136337723�0021434�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { var hostTimer = false; var clickTimeout = false; var hostOpen = false; $('body').css('height', $(window).height()); $('.formItemDescription').hide(); keepWindowSize(); // Setup the navigation menu setMenuVisibility(); // Add nice search filter to filters if ($('input[id="filter"]').length > 0 && $('input[id="filter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="filterd"]').length > 0 && $('input[id="filterd"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filterd"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="rfilter"]').length > 0 && $('input[id="rfilter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="rfilter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchRFilter).parent('td').css('white-space', 'nowrap'); } $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); $('.colordropdown').change(function() { id=$(this).attr('id'); color=$('#'+id+' option:selected').attr('data-color'); $('<span>', { style: 'background-color:#'+color+',width:16px;height:16px;', 'class': 'color-icon' }).appendTo($('#'+id+'-button')); }); $('.checkboxgroup').children('br').remove(); $('.checkboxgroup').buttonset(); // Turn file buttons into jQueryUI buttons $('.import_label').button(); $('.import_button').change(function() { text=this.value; setImportFile(text); }); setImportFile(noFileSelected); function setImportFile(fileText) { $('.import_text').text(fileText); } maxWidth = 300; $('select.colordropdown').dropcolor(); $('select').not('.colordropdown').each(function() { if ($(this).prop('multiple') != true) { $(this).each(function() { id = $(this).attr('id'); $(this).selectmenu({ open: function(event, ui) { var instance = $(this).selectmenu('instance'); instance.menuInstance.focus(null, instance._getSelectedItem()); }, change: function(event, ui) { $(this).val(ui.item.value).change(); }, position: { my: "left top", at: "left bottom", collision: "flip" }, width: 'auto' }); $('#'+id+'-menu').css('max-height', '250px'); }); } else { $(this).addClass('ui-state-default ui-corner-all'); } }); $('#drp_action').change(function() { if ($(this).val() != '0') { $('#submit').button('enable'); } else { $('#submit').button('disable'); } }); $('#graph_type_id').change(function() { switch($(this).val()) { case '4': case '5': case '6': case '7': case '8': $('#alpha').selectmenu('enable'); } }); $('#host').unbind().autocomplete({ source: pageName+'?action=ajax_hosts', autoFocus: true, minLength: 0, select: function(event,ui) { $('#host_id').val(ui.item.id); callBack = $('#call_back').val(); if (callBack != 'undefined') { if (callBack.indexOf('applyFilter') >= 0) { applyFilter(); } else if (callBack.indexOf('applyGraphFilter') >= 0) { applyGraphFilter(); } } else if (typeof applyGraphFilter === 'function') { applyGraphFilter(); } else { applyFilter(); } } }).addClass('ui-state-default ui-selectmenu-text').css('border', 'none').css('background-color', 'transparent'); $('#host_click').css('z-index', '4'); $('#host_wrapper').unbind().dblclick(function() { hostOpen = false; clearTimeout(hostTimer); clearTimeout(clickTimeout); $('#host').autocomplete('close').select(); }).click(function() { if (hostOpen) { $('#host').autocomplete('close'); clearTimeout(hostTimer); hostOpen = false; } else { clickTimeout = setTimeout(function() { $('#host').autocomplete('search', ''); clearTimeout(hostTimer); hostOpen = true; }, 200); } $('#host').select(); }).on('mouseenter', function() { $(this).addClass('ui-state-hover'); $('input#host').addClass('ui-state-hover'); }).on('mouseleave', function() { $(this).removeClass('ui-state-hover'); $('#host').removeClass('ui-state-hover'); hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); hostOpen = false; }); var hostPrefix = ''; $('#host').autocomplete('widget').each(function() { hostPrefix=$(this).attr('id'); if (hostPrefix != '') { $('ul[id="'+hostPrefix+'"]').on('mouseenter', function() { clearTimeout(hostTimer); }).on('mouseleave', function() { hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); $(this).removeClass('ui-state-hover'); $('input#host').removeClass('ui-state-hover'); }); } }); // Hide the graph icons until you hover $('.graphDrillDown').hover( function() { element = $(this); // hide the previously shown element if (element.attr('id').replace('dd', '') != graphMenuElement && graphMenuElement > 0) { $('#dd'+graphMenuElement).find('.iconWrapper:first').hide(300); } clearTimeout(graphMenuTimer); graphMenuTimer = setTimeout(function() { showGraphMenu(element); }, 400); }, function() { element = $(this); clearTimeout(graphMenuTimer); graphMenuTimer = setTimeout(function() { hideGraphMenu(element); }, 400); }); function showGraphMenu(element) { element.find('.spikekillMenu').menu('disable'); element.find('.iconWrapper').show(300, function() { graphMenuElement = element.attr('id').replace('dd', '');; $(this).find('.spikekillMenu').menu('enable'); }); } function hideGraphMenu(element) { element.find('.spikekillMenu').menu('disable'); element.find('.iconWrapper').hide(300, function() { $(this).find('.spikekillMenu').menu('enable'); }); } setNavigationScroll(); } function setMenuVisibility() { storage=Storages.localStorage; // Initialize the navigation settings // This will setup the initial visibility of the menu $('li.menuitem').each(function() { var id = $(this).attr('id'); if (storage.isSet(id)) { var active = storage.get(id); } else { var active = null; } if (active != null && active == 'active') { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); } else { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); } if ($(this).find('a.selected').length == 0) { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); storage.set($(this).closest('.menuitem').attr('id'), 'collapsed'); } else { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); storage.set($(this).closest('.menuitem').attr('id'), 'active'); } }); // Functon to give life to the Navigation pane $('#nav li:has(ul) a.active').unbind().click(function(event) { event.preventDefault(); id = $(this).closest('.menuitem').attr('id'); if ($(this).next().is(':visible')) { $(this).next('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).next().slideUp( { duration: 200, easing: 'swing' } ); storage.set(id, 'collapsed'); } else { $(this).next('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true'); $(this).next().slideToggle( { duration: 200, easing: 'swing' } ); if ($(this).next().is(':visible')) { storage.set($(this).closest('.menuitem').attr('id'), 'active'); } else { storage.set(id, 'collapsed'); } } $('li.menuitem').not('#'+id).each(function() { text = $(this).attr('id'); id = $(this).attr('id'); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).find('ul').slideUp( { duration: 200, easing: 'swing' } ); storage.set($(this).attr('id'), 'collapsed'); }); }); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/pace.css���������������������������������������������������0000664�0000000�0000000�00000004131�14136337723�0021570�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: rgba(148, 179, 107, 0.4); position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 3px; } .pace .pace-progress-inner { display: block; position: absolute; right: 0px; width: 100px; height: 100%; box-shadow: 0 0 18px rgba(148, 179, 107, 0.4), 0 0 5px rgba(148, 179, 107, 0.4); opacity: 1.0; -webkit-transform: rotate(3deg) translate(0px, -4px); -moz-transform: rotate(3deg) translate(0px, -4px); -ms-transform: rotate(3deg) translate(0px, -4px); -o-transform: rotate(3deg) translate(0px, -4px); transform: rotate(3deg) translate(0px, -4px); } .pace .pace-activity { display: block; position: fixed; z-index: 2000; top: 25%; right: 50%; width: 25px; height: 25px; border: solid 4px transparent; border-top-color: rgba(148, 179, 107, 0.4); border-left-color: rgba(148, 179, 107, 0.4); border-radius: 18px; -webkit-animation: pace-spinner 400ms linear infinite; -moz-animation: pace-spinner 400ms linear infinite; -ms-animation: pace-spinner 400ms linear infinite; -o-animation: pace-spinner 400ms linear infinite; animation: pace-spinner 400ms linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-moz-keyframes pace-spinner { 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes pace-spinner { 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes pace-spinner { 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/dark/rrdtheme.php�����������������������������������������������0000664�0000000�0000000�00000001474�14136337723�0022500�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $rrdcolors['back'] = '161616'; $rrdcolors['canvas'] = '060606'; $rrdcolors['shadea'] = '0B0B0B'; $rrdcolors['shadeb'] = '292929'; $rrdcolors['grid'] = '545454'; $rrdcolors['mgrid'] = '6A6C6C'; $rrdcolors['font'] = 'FFFFFF'; $rrdcolors['axis'] = '2C4D43'; $rrdcolors['arrow'] = '2C4D43'; $rrdcolors['frame'] = '060606'; # RRDtool graph fonts in RRDtool 1.2+ $rrdfonts['title']['font'] = 'Arial'; $rrdfonts['title']['size'] = '11'; $rrdfonts['axis']['font'] = 'Arial'; $rrdfonts['axis']['size'] = '8'; $rrdfonts['legend']['font'] = 'Courier'; $rrdfonts['legend']['size'] = '8'; $rrdfonts['unit']['font'] = 'Arial'; $rrdfonts['unit']['size'] = '8'; $rrdfonts['watermark']['font'] = 'Arial'; $rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 1; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/index.php�������������������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0021041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021230�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/billboard.css�����������������������������������������0000664�0000000�0000000�00000010367�14136337723�0023703�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/colors.css��������������������������������������������0000664�0000000�0000000�00000003646�14136337723�0023254�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Definition of a custom color style sheet used by the other CSS' */ html { --hue: 233; --accent-hue: 240; --special-hue: 233; --progress-hue: 208; --text-color-normal: hsl(var(--hue), 7%, 50%); --text-color-light: hsl(var(--hue), 7%, 75%); --text-color-lighter: hsl(var(--hue), 7%, 95%); --text-color-richer: hsl(var(--hue), 50%, 72%); --text-color-highlight: hsl(var(--accent-hue), 4%, 95%); --background: hsl(var(--hue), 19%, 17%); --background-content: hsl(var(--hue), 23%, 14%); --background-filter: hsl(var(--hue), 23%, 14%); --background-navigation: hsl(var(--hue), 19%, 17%); --background-highlight: hsl(var(--hue), 19%, 17%); --background-progress: hsl(var(--progress-hue), 84%,40%); --border-color: hsla(var(--hue), 0%, 100%, 20%); --border-color-hightlight: hsl(var(--hue), 0%, 75%); --scrollbar-thumb: hsl(var(--hue), 7%, 50%); } html[data-theme-color='light'] { --black: 0; --hue: 210; --special-hue: 208; --text-color-normal: hsl(var(--hue), 0%, 0%); --text-color-light: hsl(var(--hue), 7%, 53%); --text-color-lighter: hsl(var(--hue), 7%, 95%); --background: hsl(var(--hue), 0%, 100%); --background-content: hsl(var(--hue), 8%, 95%); --background-filter: hsl(var(--hue), 17%, 18%); --background-navigation: hsl(var(--hue), 12%, 27%); --background-highlight: hsl(var(--special-hue), 84%, 40%); --background-progress: hsl(var(--black), 0%, 75%); --border-color: hsl(var(--hue), 0%, 75%); --border-color-hightlight: hsl(var(--hue), 0%, 75%); } html[data-theme-color='light',data-theme-mode='legacy'] { --special-hue: 208; --background-navigation: hsl(var(--special-hue), 84%, 40%); } html.color-theme-in-transition, html.color-theme-in-transition *, html.color-theme-in-transition *:before, html.color-theme-in-transition *:after { transition: all 750ms !important; transition-delay: 0 !important; }������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/����������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022654�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/32px.png��������������������������������������0000664�0000000�0000000�00000006061�14136337723�0024161�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��@���`���[•[���PLTE���Z¡U`©��999���…eG �� â¬k~~~¥¥¦¥¥¥¹[¢Ubª��¨§©ùùùÁ¦�[ߟe^ uw|‡¥��q¾÷©©§¥¥¥X¸.±ÿýÿ² vw|/$…É--Á!!*‡,U¯=tÇM«�Y+š ¨烃­ï““|¥õóõa¹AË õ““fºIaŠÏktÁY›Ûz^±JÕoÒpìggÔIIµçYYêcc´��êÚ¾°W8üøò¤¤¤á«iÿÿÿììí&&&þüýÞcúîáUW[¨§©$›�øçÖýöÕ\cpöõöýøíñòñßßàéèèûòéàÈ÷íÆ˜™˜¡ŒU5¯�6°ñòñÓÓÔðÒ·óÜ»ôÝÆéמɳ{·¡gÎÀ’Ý̧FmC€‚‰ððï6®÷åÔ¥¹¥úîàêëëšægÎãÃáââtv{-£�2«�ûòè]Ä*/¦�}×H·ñŒÏö¯Z®BüûûÒ��è��ëìíÒçÆ9°çççöãÐã��í©Ë¢@·5—‚ØM³ïˆO¿ÕÔÕý÷믯ãJ½÷êÙ²è‘ÅÀ"–xÔBåååòôòÝÞÞÔÕÖÊÂÔÇ Þ€‘ÖphÌ1^­F'ž�`Ç,#ŠÕÓÕÿ˜˜ÙöàÊñ��þffýøìû‹‹*‰nÂK¸Ì½œãnÖøºìïì{ÇZùóä¯Ü™ŽËmw¾Zq»W¸°ÅµÖÖÙÿ´´Ý��ýwwø&&ñÖºð==ëQÄeÄ7‡ÒaˆÓb‰Õ`¨ßЬðxoÎ8Éϸ°Í­÷íÞ¶b¹Cö11ÞÌ©ÿ««ƒ–‡ º¤Q£:ÌÕ¾‹Ïl¢Ø‡†¾n?¢«™U•ã^œÕ{¢éo¿Ñµ;Ž4½ñ•1)¹¼–—±Ÿ,”R¾ÿÞÞÿÉÉÿ||ÝΩ°Ã¶ËÙ÷œYèuuu˜vœœPx‘¤¼«ªì{°¹Ž¨®ˆl÷Öb���ítRNS�ý.ZA& ý€þÿ[þ5"þþþ\Gù9ýé¬ELö¡ýûnÿýüÙÙ¬„`ÝíØ´é«ÝœúÙƒúèóúÕ"éÕë¯èÐòÐWûùÒj“ýÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùµfŒT��óIDATxÚíœyXÓfÇ Úz (sιM&ê¯î¾ïã[ÂhËQž®PYJ[ÀQ"¨(8FA‰ˆ ž SйMqŠ×œ^›îtºÛ9w;Ý}ßï›´L~IYB'Æ÷4<Ï›¼i>|“¼oøJÕµŒ rû馻¿?I $$$$ Äj¸Ï€h$¿ù ¹¹¹Ù*0v}ï^±±½zéc{ëõv¨‹Ök÷aý¥ùHIÉQ`õVí¡iV´Óç9„Çc¡Áv¯¦c‡õ°@£1O`vŽò¨/¤) ɳX,^ (hò¶É3gΜŒ€RÚR½bË’_A))Æ \�%GP߉ud$L߉ ô¯‰m˜Á²3°BLX_곚ÒÇ_>¾m†Ø÷¦³H`õÊ%+^_y°‹\$n§/#CbõæÀþä¤HFÿ± ì”)l!"P`áöIŸ×”––ÖÔl/öóþÖƒ[PTõ‡›_{åÕU¡ ÀŒ”Ü4¬OX` ¤e0Á$+2úm°Z­SF i(pǼO'!6ÏÛQØ·CsÔÅKߘ·ñHõÆ'KJ^þà},0§0CF½”=Àñ™d%PFÿXà2d…†h.Üùfé“߬ø¸vÑœ—ÊÞ^”™™9· ü9f#qÙ|�3ÆK=@/›'~|Øþê_¸ïnG—ïF§°,åÖ–<]RR;§rt ÿ>©›S9mÚ´¹M4,0ÃÉ t"Æ% ÁK hÿzÖêpì^†²œÀ²üüÊÊÊüüü2ð&²ëëéÓ§O:uC¸=òçÎrfcn·{|°®2‡"2ú׳‡cþjB+ ¤ú$%%=…¾’Ê(H ýÕ3¸uÃ&p{­*'‰sg§¸ÝéééRhVW Œþ9Ø!º—ÀC’|„À_=S_¿áGx{.ljĹsÄvÁ8P–@•\«—¯žï°Âå‰!!}ÐGHÈ.p mq8þ8q|òÇíºðwvnnzNJzºôvë™eáA“1PËO5ð@œêYY¶aS‹±§0ˆ ð Æ®7cúâ‡f’&h#Æs(6ÿ¼Fâá4=m"H $I ù©$@H $ $H; á IlÐn0zp oÚÛHÞO‘9/5/Ϥ¼&ºlm0€�ƒm}ÁóˆâÅi6Ôî¯<z¬Ú üì©y“)U ,0"l¸‚Ô› ,æëq`1(ÐÈw€ëƒöÊa2!h)ýŠýò6¡ (Þ¿pc2“\À9\ ,ð×nÙV� ü⣓ 2(\˜ñRy MñBìDÍ¢˜ ;Iû×$2É ã3 |ÓWXZ³øÉÖƒ[ëŒÆ:áúÀÔøG0ñb;‘?Ñò•„€Õmã‚Ô¿æÜYÌZ$0¹ Àh+öXì«üsÞN@ _XWÇ×þ¬’(0`í”Wü�Mò2(¹,Ðåš…—òõµeÆŽÛÕþdP)y¬7Ðv8Bñ’ÀöíPÿ§¶  jÎ]ëzÑéZ; jz,ÞùÍÓˆÚÊLH ê“ë¦N[åVJî%Еå3X�&ðÍUù™°@Ãa_}àÜCF[ÐØ}K‘@gVV–Óér1L1xéã/oƒÚþâë1Œ@ž¢ Þ…»�‰ý£»p6h‡1mC`YãúÀ:¼=<æ‚©E ÐKpÆ]’A‰i&ëÝwàº@¶‰\q ®„®q†4§óä‰ãuh,ÄÀ×@•ƒü-l5Ù)ÎDÒ¬_€@“1p&ÂýØH :õ™/aŒKd*gjm-jm5™UJ#ñ”§‰töaÂ.|›Ríäy ¡;BH $$’@$@H ž5<À/´$ÒrU$^D^u¡À Z„ÈöºžaŠ·uçå ¿_Þ‹ F^ôíE°A­."B'b0Œû­«…í©ð†Þ¶e `pHùý-c##oܳç;Ø 6‚¢Â#´â½”#¾§2ƒwÁí7sù»®Ÿ»º¼ªâÀº–––5kÞÛsxІSÅ ò ¤´·§8`äÁ[Ç üÝ‚ëçFt¨ŸÓ¨•WT<»ß¾ï[Ö\ªø¨˜A^ —v8á ¼ðáú¹›Æ„ŽÄõsÃúCúÊòŠÙϾ°nݾKÕ!Ø Ðuç¥):Ly p®Ÿq=®Ÿ®¢¾¿Š3x·Zà.‹"ƒ¢q½J¼÷¿Â_?7*^ãœör(ð!¿Á8&<Ÿ¯Ÿ»$JÀ_Ly368ûû"U’NaN`\zQæX°ÿù¸~î¡ü ml,onÞ[Q1û{ï‘tñÆ=äõ¢Ï3Xà¸�ëë¯ÈŸêÚ·bËG.¯ª:°_Ê0FÖÏÿ§.ñJô?1<TèðՃߊ‰¹2:zPcUóÕjIéë,þÿ`§Ðª4¢„ÛÔƒ‡BâÔƒbÃØ€S9ÏüŸ´•?† FŸ­i[Hx˜Ö¯J_¿3ú–ûǤ§,þ;áE6°®"üw´:î<ZhÏÊ$’@$°ñ9rÆ nïŒ����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/40px.png��������������������������������������0000664�0000000�0000000�00000003530�14136337723�0024156�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���ð��à���¬*���?PLTE���333333333333333333ÒÒÒÿÿÿ333333333333333333333333ííí333333<<<{n`f���tRNS�þ\ýüY! ]PëS½þ��µIDATxÚíÝë’Ü&†ab'–rtöþ¯5‡Ê:cë„àCtÓ/ÿFZ©xj4š†Mi’’S°0`À€ 0à©ÁË ¼ä¼Dÿ핉³¯JœÝxEâìÇ«gG^‰8{ò*ÄpÎuç*¼qxUg窼íâ¬ð©ÎÎUz‡ƒßëq÷Ü(o+øÿšÜ;7ÌÛ~­Ësã¼mà¯kS~n · üm}JÏô¶€·5*;7Ô«ç‚Sƒ½ÒGú ˰WùÒú³ì6K_h¦½ºŽÇY1ä•u-½xUƒ7^ÑðPæõ�NJ¯ƒGúBl§­Œi)½Æ›¥ ±¥°6j©ôîZ^ˆm³Äà¤ôÞ g”^›!uØÎ~ïX¬¸›Å0í‘Xs7‹ø}±ên§Zöĺ»-öÁ)Kï¸X¤åe±ýÒê-ò/©%^ÚR¼Ä´x©‡ñ’Kã¥+;F€ 0`À€ 0`À€ 0`À€ ¸©,K,ð"^Oe¼H×admæu°6±(÷kS¹—^±8+½šdHó`Qúg¾U‚5 ¾K¾Y–Q`Q ·°*Iß3ØvÄì 2»=-gb»kæ ÷¥b?Í’Hì ,;·‹½›ÅîÀ­bàF±Cp›Ø#¸IìÜ"Ì#ÍK‹f‰Ž]K  �âñ5AKÇsKu• 7ÕÂdÓ¥V_ZÓOˆ‹R¼v<–¬H[ò9xXRp{ê¡Ç�@¨äÒxéÃn `À€ 0`À€ 0`À€ 0`À€ øä6Ò!®¿Ÿ¬Þ ¨Ã–CJpAí²†+!ç'¼wêÙm_)¸Ì[^ÏŽ;iIÀ¥ÞÒzvÝ;L�.÷–Õ³óniÍà;Þ’zvßN."î7ü´W"€UÞ’×›mðÝ_upé/î¦7·þÍ(ðí·ªCpu{äüú¡¢Õt~ýTÓKð~ýXÕ+r~%ÖõÝ‚k{½^éê^¾Ó—Vý¨Æg³ÔÔrÙñ8ÏÚµl â¹ìK=æ<4-Ž–ö×3«ƒ´nÇÃ{ïí�ÀîÁò ›û¨å¬`YàÜ| ^>5b}ªE>ùe~2M>½i}ºT?m}B\Ÿ¢`=åAŸ„b=©EŸfd=m)éÉŒ'¦ÖÑÒýä`?0`À€ 0`À€ 0`À€ 0`À€ 8.¸_ŠEp×4#{àΉdæÀ½S­»'ƒ÷O÷µ~ ¡Ûø‰”}“àÚóÞÀ,»1nüŸà£_îTàØá»ÊÞ3 0`À€ p°:ÆÀ7 0`À€ç�‡ â… ÓÆ ć›j‰7™nº4Þ„x¼”‡xI-ñÒ–R¸Ä´tÖµœì§� 0`À€ 0`À€ì­‚€ 0`À€üÈýº§:� x8‡ç_‚?äïb?e‘ØX#ö–ˆ]óOÑÀùc4pþ Üü;öÓ¿—_ƒô´¬üû§?¼—¿1Zìüó÷¯å÷?§k¿qàÑÀ? 84ØÎ~ZÏ€S´o0`À€ 0`À€ Ø øS4ðdÛ<º+€ 0`À€ 0`À€ 0`À€=‚×Ç.ò N€cWÀvÀ«› 0àðàü¦¬[6ÎùñZqÙåa“àóßn×í mñëÃÁÿe\¾­U—]6®L2=¸êÛÃöÀ•iµWm›×.Ôß¿j{ظ2uúàªÃÆÀ•ÉâWí¶®MŽ¿Þ„Í&¸~1ÀÞ•ûw³nYüP¼U‰!pÛbÒ¥#vÀÛ®I)¶Öñةᚄbk]˽®I'<xØü<5-HÉÒ¯!àÍ IÖ‚\/uÞTBÖ‚¤ë¥}À›jèZ}ñà˜Ö¦"¤ 5¼©Š²1ø oª"mAìý†7U· ÖÞÒ÷KÏÐßZ>EOëÎbø9úÒ7ÿO2Z*ßì`Õ¾†÷´.Çû«öu8.âQº™ÅÚrKS1­ÂÍ;Ö&¯©¨eÙf% àãÃ"EñºúGúäð¨OI|²ú¥uvxXL« [Û,Ä»Ž?Wv<ÎŒZ^ÆÛ§Ë�¸š_˜/Çãb>eÂ,žóù£ó´þHRpA!õ°x­+¾á._¹p÷'†oØ8xìî-=¦� 0`ÀÁŒ[J¿Šù����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/index.php�������������������������������������0000664�0000000�0000000�00000000050�14136337723�0024467�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/style.css�������������������������������������0000664�0000000�0000000�00000072325�14136337723�0024537�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* jsTree default theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: #7e818f; white-space: nowrap; /* padding: 0 4px 0 1px; */ margin: 0; vertical-align: top; padding: 3px !important; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-anchor:hover { color: #f2f2f3 !important; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf > .jstree-ocl { cursor: default; } .jstree .jstree-open > .jstree-children { display: block; } .jstree .jstree-closed > .jstree-children, .jstree .jstree-leaf > .jstree-children { display: none; } .jstree-anchor > .jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor > .jstree-themeicon-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor > .jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; background:transparent; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf > .jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .vakata-context { display: none; z-index: 10; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; -moz-box-shadow: 5px 5px 4px -4px #666666; -webkit-box-shadow: 2px 2px 2px #999999; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; display: inline; } .vakata-context li > a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; -moz-text-shadow: 1px 1px 0 white; -webkit-text-shadow: 1px 1px 0 white; text-shadow: 1px 1px 0 white; -moz-border-radius: 1px; -webkit-border-radius: 1px; border-radius: 1px; } .vakata-context li > a:hover { position: relative; background-color: #e8eff7; -moz-box-shadow: 0 0 2px #0a6aa1; -webkit-box-shadow: 0 0 2px #0a6aa1; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li > a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li > a:focus { outline: 0; } .vakata-context .vakata-context-hover > a { position: relative; background-color: #e8eff7; -moz-box-shadow: 0 0 2px #0a6aa1; -webkit-box-shadow: 0 0 2px #0a6aa1; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator > a, .vakata-context .vakata-context-separator > a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; -moz-text-shadow: 0 0 0 transparent; -webkit-text-shadow: 0 0 0 transparent; text-shadow: 0 0 0 transparent; -moz-box-shadow: 0 0 0 transparent; -webkit-box-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context li > a > i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li > a > i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li > a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li > a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator > a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li > a > i { margin: 0 -2em 0 0; } .vakata-context-rtl li > a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-default .jstree-anchor, .jstree-default .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-default .jstree-hovered { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-clicked { background: #beebff; border-radius: 2px; box-shadow: inset 0 0 1px #999999; } .jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon { display: none; } .jstree-default .jstree-disabled { background: transparent; color: #666666; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-disabled > .jstree-icon { opacity: 0.8; filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default .jstree-search { font-style: italic; color: #8b0000; font-weight: bold; } .jstree-default .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #e7f4f9; } .jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { #background: #e7f4f9; } .jstree-default > .jstree-striped { background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-default > .jstree-wholerow-ul .jstree-hovered { background: transparent; } .jstree-default > .jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; color: #f2f2f3 !important; } .jstree-default .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-default .jstree-wholerow-hovered { #background: rgba(0,0,0,0.1); border: none; } .jstree-default .jstree-wholerow-clicked { border-left: 3px solid #151725; color: white; } .jstree-default .jstree-node { min-height: 20px; line-height: 20px; margin-left: 7px; min-width: 22px; } .jstree-default .jstree-anchor { line-height: 20px; height: 20px; color: #7e818f; } .jstree-default .jstree-icon { width: 22px; height: 20px; line-height: 20px; } .jstree-default .jstree-icon:empty { width: 22px; height: 20px; line-height: 20px; } .jstree-default.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-default .jstree-wholerow { height: 24px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-image: url("32px.png"); } .jstree-default .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-default .jstree-last { background: transparent; } .jstree-default .jstree-open > .jstree-ocl { background-position: -132px -4px; } .jstree-default .jstree-closed > .jstree-ocl { background-position: -100px -4px; } .jstree-default .jstree-leaf > .jstree-ocl { background-position: -68px -4px; } .jstree-default .jstree-themeicon { background-position: -260px -4px; } .jstree-default > .jstree-no-dots .jstree-node, .jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -4px; } .jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -4px; } .jstree-default .jstree-disabled { background: transparent; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-checkbox { background-position: -164px -4px; } .jstree-default .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default .jstree-checked > .jstree-checkbox { background-position: -228px -4px; } .jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default .jstree-checked > .jstree-checkbox:hover { background-position: -228px -36px; } .jstree-default .jstree-anchor > .jstree-undetermined { background-position: -196px -4px; } .jstree-default .jstree-anchor > .jstree-undetermined:hover { background-position: -196px -36px; } .jstree-default > .jstree-striped { background-size: auto 48px; } .jstree-default.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default.jstree-rtl .jstree-last { background: transparent; } .jstree-default.jstree-rtl .jstree-open > .jstree-ocl { background-position: -132px -36px; } .jstree-default.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -100px -36px; } .jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -68px -36px; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -36px -36px; } .jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -4px -36px; } .jstree-default .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default .jstree-file { background: url("32px.png") -100px -68px no-repeat; } .jstree-default .jstree-folder { background: url("32px.png") -260px -4px no-repeat; } .jstree-default > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; background:transparent; } #jstree-dnd.jstree-default { line-height: 20px; padding: 0 4px; } #jstree-dnd.jstree-default .jstree-ok, #jstree-dnd.jstree-default .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default i { background: transparent; width: 24px; height: 20px; line-height: 20px; } #jstree-dnd.jstree-default .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-default .jstree-er { background-position: -36px -68px; } .jstree-default.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default.jstree-rtl .jstree-last { background: transparent; } .jstree-default-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-default-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-default-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-default-small .jstree-wholerow { height: 18px; } .jstree-default-small .jstree-node, .jstree-default-small .jstree-icon { background-image: url("32px.png"); } .jstree-default-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-default-small .jstree-last { background: transparent; } .jstree-default-small .jstree-open > .jstree-ocl { background-position: -135px -7px; } .jstree-default-small .jstree-closed > .jstree-ocl { background-position: -103px -7px; } .jstree-default-small .jstree-leaf > .jstree-ocl { background-position: -71px -7px; } .jstree-default-small .jstree-themeicon { background-position: -263px -7px; } .jstree-default-small > .jstree-no-dots .jstree-node, .jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -7px; } .jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -7px; } .jstree-default-small .jstree-disabled { background: transparent; } .jstree-default-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-small .jstree-checkbox { background-position: -167px -7px; } .jstree-default-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-small .jstree-checked > .jstree-checkbox { background-position: -231px -7px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-small .jstree-checked > .jstree-checkbox:hover { background-position: -231px -39px; } .jstree-default-small .jstree-anchor > .jstree-undetermined { background-position: -199px -7px; } .jstree-default-small .jstree-anchor > .jstree-undetermined:hover { background-position: -199px -39px; } .jstree-default-small > .jstree-striped { background-size: auto 36px; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl { background-position: -135px -39px; } .jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -103px -39px; } .jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -71px -39px; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -39px -39px; } .jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: -7px -39px; } .jstree-default-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-small .jstree-file { background: url("32px.png") -103px -71px no-repeat; } .jstree-default-small .jstree-folder { background: url("32px.png") -263px -7px no-repeat; } .jstree-default-small > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; background:transparent; } #jstree-dnd.jstree-default-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-default-small .jstree-ok, #jstree-dnd.jstree-default-small .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-default-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-default-small .jstree-er { background-position: -39px -71px; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-default-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-default-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-default-large .jstree-wholerow { height: 32px; } .jstree-default-large .jstree-node, .jstree-default-large .jstree-icon { background-image: url("32px.png"); } .jstree-default-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-default-large .jstree-last { background: transparent; } .jstree-default-large .jstree-open > .jstree-ocl { background-position: -128px 0px; } .jstree-default-large .jstree-closed > .jstree-ocl { background-position: -96px 0px; } .jstree-default-large .jstree-leaf > .jstree-ocl { background-position: -64px 0px; } .jstree-default-large .jstree-themeicon { background-position: -256px 0px; } .jstree-default-large > .jstree-no-dots .jstree-node, .jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px 0px; } .jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px 0px; } .jstree-default-large .jstree-disabled { background: transparent; } .jstree-default-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-large .jstree-checkbox { background-position: -160px 0px; } .jstree-default-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-large .jstree-checked > .jstree-checkbox { background-position: -224px 0px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-large .jstree-checked > .jstree-checkbox:hover { background-position: -224px -32px; } .jstree-default-large .jstree-anchor > .jstree-undetermined { background-position: -192px 0px; } .jstree-default-large .jstree-anchor > .jstree-undetermined:hover { background-position: -192px -32px; } .jstree-default-large > .jstree-striped { background-size: auto 64px; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-large.jstree-rtl .jstree-last { background: transparent; } .jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl { background-position: -128px -32px; } .jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -96px -32px; } .jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl { background-position: -64px -32px; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node, .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { background-position: -32px -32px; } .jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { background-position: 0px -32px; } .jstree-default-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-large .jstree-file { background: url("32px.png") -96px -64px no-repeat; } .jstree-default-large .jstree-folder { background: url("32px.png") -256px 0px no-repeat; } .jstree-default-large > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; background:transparent; } #jstree-dnd.jstree-default-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-default-large .jstree-ok, #jstree-dnd.jstree-default-large .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-default-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-default-large .jstree-er { background-position: -32px -64px; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-large.jstree-rtl .jstree-last { background: transparent; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive > i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive > .jstree-ok { background-image: url("40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive > .jstree-er { background-image: url("40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-default-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-default-responsive .jstree-icon { background-image: url("40px.png"); } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-default-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-default-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; } .jstree-default-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; } .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node { margin-right: 0; background:transparent; } .jstree-default-responsive .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-default-responsive .jstree-leaf > .jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-open > .jstree-ocl { background-position: 0 0px !important; } .jstree-default-responsive .jstree-closed > .jstree-ocl { background-position: 0 -40px !important; } .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl { background-position: -40px 0px !important; } .jstree-default-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-default-responsive .jstree-checkbox, .jstree-default-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, .jstree-default-responsive .jstree-checked > .jstree-checkbox, .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover { background-position: 0 -80px; } .jstree-default-responsive .jstree-anchor > .jstree-undetermined, .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover { background-position: 0 -120px; } .jstree-default-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-default-responsive > .jstree-striped { background: transparent; } .jstree-default-responsive .jstree-wholerow { border-top: 1px solid rgba(255, 255, 255, 0.7); border-bottom: 1px solid rgba(64, 64, 64, 0.2); background: #ebebeb; height: 40px; } .jstree-default-responsive .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default-responsive .jstree-wholerow-clicked { background: #beebff; } .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #666666; } .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow { box-shadow: inset 0 6px 3px -5px #666666; border-top: 0; } .jstree-default-responsive .jstree-children .jstree-open + .jstree-open { box-shadow: none; } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-node > .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-image: url("40px.png"); background-size: 120px 240px; } .jstree-default-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-default-responsive .jstree-last { background: transparent; } .jstree-default-responsive .jstree-leaf > .jstree-ocl { background-position: -40px -120px; } .jstree-default-responsive .jstree-last > .jstree-ocl { background-position: -40px -160px; } .jstree-default-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-responsive .jstree-file { background: url("40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-default-responsive .jstree-folder { background: url("40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-default-responsive > .jstree-container-ul > .jstree-node { margin-left: 0; margin-right: 0; background:transparent; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/style.min.css���������������������������������0000664�0000000�0000000�00000062005�14136337723�0025313�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-node{white-space:nowrap}.jstree-anchor{display:inline-block;color:#000;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}.jstree-anchor:focus{outline:0}.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;-moz-box-shadow:5px 5px 4px -4px #666;-webkit-box-shadow:2px 2px 2px #999;box-shadow:2px 2px 2px #999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none;display:inline}.vakata-context li>a{display:block;padding:0 2em;text-decoration:none;width:auto;color:#000;white-space:nowrap;line-height:2.4em;-moz-text-shadow:1px 1px 0 #fff;-webkit-text-shadow:1px 1px 0 #fff;text-shadow:1px 1px 0 #fff;-moz-border-radius:1px;-webkit-border-radius:1px;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;-moz-box-shadow:0 0 2px #0a6aa1;-webkit-box-shadow:0 0 2px #0a6aa1;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url(data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==);background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;-moz-box-shadow:0 0 2px #0a6aa1;-webkit-box-shadow:0 0 2px #0a6aa1;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:#fff;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;-moz-text-shadow:0 0 0 transparent;-webkit-text-shadow:0 0 0 transparent;text-shadow:0 0 0 transparent;-moz-box-shadow:0 0 0 transparent;-webkit-box-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:0 0;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:#fff;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url(data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7);background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:#fff;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default .jstree-anchor,.jstree-default .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default .jstree-hovered{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #ccc}.jstree-default .jstree-clicked{background:#beebff;border-radius:2px;box-shadow:inset 0 0 1px #999}.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default .jstree-disabled{background:0 0;color:#666}.jstree-default .jstree-disabled.jstree-hovered{background:0 0;box-shadow:none}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:700}.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none!important}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:0 0;box-shadow:none}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:0 0}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}.jstree-default>.jstree-striped{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==) left top repeat}.jstree-default>.jstree-wholerow-ul .jstree-hovered,.jstree-default>.jstree-wholerow-ul .jstree-clicked{background:0 0;box-shadow:none;border-radius:0}.jstree-default .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-moz-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#beebff),color-stop(100%,#a8e4ff));background:-webkit-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:-o-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:-ms-linear-gradient(top,#beebff 0,#a8e4ff 100%);background:linear-gradient(to bottom,#beebff 0,#a8e4ff 100%)}.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default .jstree-anchor{line-height:24px;height:24px}.jstree-default .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default.jstree-rtl .jstree-node{margin-right:24px}.jstree-default .jstree-wholerow{height:24px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-image:url(32px.png)}.jstree-default .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default .jstree-last{background:0 0}.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default .jstree-themeicon{background-position:-260px -4px}.jstree-default>.jstree-no-dots .jstree-node,.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default .jstree-disabled{background:0 0}.jstree-default .jstree-disabled.jstree-hovered{background:0 0}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-checkbox{background-position:-164px -4px}.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default>.jstree-striped{background-size:auto 48px}.jstree-default.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==);background-position:100% 1px;background-repeat:repeat-y}.jstree-default.jstree-rtl .jstree-last{background:0 0}.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default .jstree-file{background:url(32px.png) -100px -68px no-repeat}.jstree-default .jstree-folder{background:url(32px.png) -260px -4px no-repeat}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default .jstree-ok,#jstree-dnd.jstree-default .jstree-er{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default i{background:0 0;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default .jstree-er{background-position:-36px -68px}.jstree-default.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==)}.jstree-default.jstree-rtl .jstree-last{background:0 0}.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-small .jstree-wholerow{height:18px}.jstree-default-small .jstree-node,.jstree-default-small .jstree-icon{background-image:url(32px.png)}.jstree-default-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-small .jstree-last{background:0 0}.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-small>.jstree-no-dots .jstree-node,.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-small .jstree-disabled{background:0 0}.jstree-default-small .jstree-disabled.jstree-hovered{background:0 0}.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-small>.jstree-striped{background-size:auto 36px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==);background-position:100% 1px;background-repeat:repeat-y}.jstree-default-small.jstree-rtl .jstree-last{background:0 0}.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default-small .jstree-file{background:url(32px.png) -103px -71px no-repeat}.jstree-default-small .jstree-folder{background:url(32px.png) -263px -7px no-repeat}.jstree-default-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-small .jstree-ok,#jstree-dnd.jstree-default-small .jstree-er{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-small i{background:0 0;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-small .jstree-er{background-position:-39px -71px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==)}.jstree-default-small.jstree-rtl .jstree-last{background:0 0}.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-large .jstree-wholerow{height:32px}.jstree-default-large .jstree-node,.jstree-default-large .jstree-icon{background-image:url(32px.png)}.jstree-default-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-large .jstree-last{background:0 0}.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-large .jstree-themeicon{background-position:-256px 0}.jstree-default-large>.jstree-no-dots .jstree-node,.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-large .jstree-disabled{background:0 0}.jstree-default-large .jstree-disabled.jstree-hovered{background:0 0}.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-large .jstree-checkbox{background-position:-160px 0}.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-large>.jstree-striped{background-size:auto 64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==);background-position:100% 1px;background-repeat:repeat-y}.jstree-default-large.jstree-rtl .jstree-last{background:0 0}.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url(throbber.gif) center center no-repeat}.jstree-default-large .jstree-file{background:url(32px.png) -96px -64px no-repeat}.jstree-default-large .jstree-folder{background:url(32px.png) -256px 0 no-repeat}.jstree-default-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-large .jstree-ok,#jstree-dnd.jstree-default-large .jstree-er{background-image:url(32px.png);background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-large i{background:0 0;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-large .jstree-er{background-position:-32px -64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==)}.jstree-default-large.jstree-rtl .jstree-last{background:0 0}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:700;font-size:1.1em;text-shadow:1px 1px #fff}#jstree-dnd.jstree-dnd-responsive>i{background:0 0;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url(40px.png);background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url(40px.png);background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-responsive .jstree-icon{background-image:url(40px.png)}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px}.jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:0 0}.jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0!important}.jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px!important}.jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0!important}.jstree-default-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-responsive .jstree-anchor{font-weight:700;font-size:1.1em;text-shadow:1px 1px #fff}.jstree-default-responsive>.jstree-striped{background:0 0}.jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,.7);border-bottom:1px solid rgba(64,64,64,.2);background:#ebebeb;height:40px}.jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default-responsive .jstree-wholerow-clicked{background:#beebff}.jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #666}.jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #666;border-top:0}.jstree-default-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-image:url(40px.png);background-size:120px 240px}.jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-responsive .jstree-last{background:0 0}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-responsive .jstree-file{background:url(40px.png) 0 -160px no-repeat;background-size:120px 240px}.jstree-default-responsive .jstree-folder{background:url(40px.png) -40px -40px no-repeat;background-size:120px 240px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/default/throbber.gif����������������������������������0000664�0000000�0000000�00000003270�14136337723�0025154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��ó��ÿÿÿðððŠŠŠàààFFFzzz���XXX$$$¬¬¬¾¾¾œœœ666hhh!ÿ NETSCAPE2.0���!þCreated with ajaxload.info�!ù ���,�������qHè;uj0І1P›4HЈÁ¨ £`+œI1ƒÍq|¦Ì@×P¸p@\ á8â4‚Q¢®QZº^­ŠÂ-¨ gË8) fl °9£C‘` äO� Tp%#‡ c% U�!ù ���,�������pHhyµÎ9Ȉ1 K²Iƒá€Í*Ûƒ,ŒAlÁ ÇÅ`Èh•  ø|&@ÂsÒHBv¢DŒÃãÁ­~½†UåM^à)àÄH6?Æ xMl< L&‚kljŠ('K'�!ù ���,�������rH(µÎ9ÞN²ICs€âa(Û0F& pP”$‚@à0 ãî±8 (ZF (‰Â ˜(† èiDNÎÔ1¹:Hd%£M ñÀÈ2 £ °ö×x2GOyo 0Oyrn;bq'1b'�!ù ���,�������pH(cµÎ9JñÊ& ŽQNÀ,J¨5PÂ3„Â…`0 ‹J'õ;)—ä£ðl¸_@ÁH$v¦ÇbÑ ]àM+ê  g@Ï ˜Í§)áþêv1[oƒz ;„|zM1n&&&�!ù ���,�������fHh)µÎ9N†ñÊ& † ¹}@A†Œ±Pu, è\+™ÐI 4EÈÀ|ž Êq ؜ɱä] ÚMkI±7JêÙŠÕH”!íõ8¨ÂÈeÜçs†¾êyVn‚y†&„ƒ�!ù ���,�������xH¨RµÎRBñÃ&…' RrÕð ë°T(É�2—‚c‡ dŒ&08¯ÏÀ³ éÀg0‚`»ÕlÄâAa~6£Ü¦K¦!êË~M }�<U\o ]Ym� ]UK�!ù ���,�������sHèµÎT ó1Ã&X"2DÉUƒ¨‘X6+ót„Ÿ…÷9 ‹ƒëÀlsªÙ$ƒlj$GÒ,Niñs©ƒÐ2-<¨Á‘É`coO:€x.OL  7]'|�!ù ���,�������qHèµÎpPJ$Ã&}ø=%W !8< •uâu%Ew7¦SpZ¢ä& %Ÿ&€¢@M<5Åãð³y–4e®ƒ ½“Ç`¦pУ €ml - !ƒ5Q%\�!ù ���,�������sHh¸tê{ǸJ¥Q_à™Œ(a¦ù ƒeq´’˜Bj•âÅ<ŒØ 3 i´` hÞ’£Aaš°(Š Œ³$ ÁÕ€°T ƒc`@0‚ñ¨0²ƒÀáH€—Bl|  ‰&YJgSg�!ù ���,�������sHh¸têËù¨õuƒJX0^Ê`Y«÷ Œ sh¶¥ž”ç±(>B€Ab©pž$ÁSÑ®I€±Jž½ËÃÁ¨†Ç™°ŠC¡’p ŒA±Hˆ4zY *‰f�!ù ���,�������oHh¸têË{ÕÔà¢6 aWba£(¥â¥5ÐßU‰ìò@ ÀNA;4‹Br™‰Ô$På(®ÜEðHTC!@80YQ¡ÀÂcà’L z YSY>Z g t�!ù ���,�������sHh¸tjµÆý˜(ž6 Àa$_Šˆ! †_^5ÔFB²«X …æ8ˆ²ZX©Uý(¬I@Ñ« †Žñ’(Ì.AàQX%(¡ÅQê,!DM ˆS‡ a[ 0�;����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/�����������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022475�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/128/�������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0023007�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/128/bar-alpha.png������������������������������0000664�0000000�0000000�00000003034�14136337723�0025344�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/128/bar.png������������������������������������0000664�0000000�0000000�00000002064�14136337723�0024263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/128/map.png������������������������������������0000664�0000000�0000000�00000110316�14136337723�0024274�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/bar-alpha.png����������������������������������0000664�0000000�0000000�00000004223�14136337723�0025033�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������³¹V4���tEXtSoftware�Adobe ImageReadyqÉe<��5IDATxÚÜ\!%E MRmH$KB"‘H‹Ã"qX‡Äâ0Wu‡Eâpaç×þ©žLÞKzþÞA1UW·g¶g:ý’¼¼ô|uw•éxýúõüQ^½zåOÿ)9ø<æ‹§c$;4àÒ /ãÉ&ó€þd“Ãçpþd³É¦73Å'Ô¦®ogÊd@¿r3}Âá{eå|gÊKOÚPß%OO?pÏoƒY<å ïO¥/9e}Ćžx\ù ‡ï7l¶ðtþ0ØJáïé€xÛàlÅÀSeƒï¿»‚Ã,i7Ú¼¸ë-ƒže=»ø ‡LFõ|;]e}$Z#²éz‚[¯V¹³HÐsP^ž}—Ùìds”—µiG]Áá¥À»`½`jz‡2®Rà0r¡Ã”½÷ÊkÆt¢;õ2ÀÚ‚­¬ŠHY<Dœ[jÆW!â�§Š¦œM›-õ”ƒ-ÁÌËÍSxI~hMû•TÄìÝ Üñ”Ù†JrõíwwîÆN¸Œ\'ÍËÚå›d*¾+5ÆCV@úÊM6~ü@½ìÏ6Õ,|uÂV+ZÇé›7ö1}0ò$ÞŒà·xhó‰h“gNmÀw£ï+Ã!¤3 â«:Ô¾óúb„õò'“sÇâ$Çм|•ë)ÚI½›bXOòHgµ!?Ôgßµ‰ÿI‚ÃýT/{â1̆ey«„¢ÑR¬"œ™­VžÐ7~šàÌ—Yâ‡êÓ£hÕË™ÿj'IU‹¢ æ°Ï`ÎË2ååJsÝÿ&âx4<ÀAýBK³èrÌÙçS<4°zZ$øC^þ¬QÛ¡ói^îDmD$èzÖ é0m ¢kyb_†Áƒn3ãð�‘ g¸Î“kÆ´ÀÞ|S/OÀfqЀ9R²”¡ß³àÛû¹ ‡Ÿ'‚ƒ¼ìçàÎU í 4ÅCPâPI´Và>çeŸp¸:i®Jtô Ù“ šbFçVÒ¥Vd¾â6^¨MñÜ-~pæ‰á‰Í)Ó‚ie>=ÏÊ}J-£.:û²¬ ª÷ìwyWc=<Ù4j)sp2½ÿñŒÛ)˲òU®‚­M⿜/HôCç[:6J§‘‡KWvfé“¥Y™m„eÙB¤Ñ‡sÞµ—‹–Ô1ʤ*oúóɇcp’ƒ+"o‘Ûa¥Ù"8°ûÞOù pfš¬'šl±+{µú£ ˆþF*b•ö¥Iä‘"àê¬ÛduH¦Ëøä»šå˜AÜ©²_êIHfaÄùøíKìaDèQÂbõŽÃ¯ç p†ø!¬§Ç®l•b¤±HЧf�•º7Ÿ.æHê9DC޹û¶eyY E)c°Ž´/-¤dmpEÍt׈EMþ•µÞ†Ão]F“:DÁס-$i"*öŸG“Wk—xŽ$XVûB˜×xÄáÝ&sŽ9<Á”—=Ô1ÙW·Uf_#¥¿ZéazB%ê›Aö¤Ýl8ü6‰‡ò2Úo3×~°Ÿb Ü{ãÚSNA¶tP~œ�?ŠhÍtYO…ñ—3þg¡ïç!o;ª”PFù¨Üש‘õXFÁ„ø·!Ýæ;9î·‘Bë:|6Ýêޙ»)keJ2+tÅ4% rWïäxÝ="›H¨§+Ýæ”S2œuXƒfÛHÉåDžJ«�'ƒ.u6~Oú%Hƒˆ½ïh•—¤ô¯ Î°i#±›“Uf‘gï§#pj%½Ò¬6´A$€X?wZIRµÔ‘̬¨c f‹cIò5Íyù‡ ey’c”èØÎ¢4c„EüЊ4@ $ÖyÔ†²tº)ÚËôCœüäzB¦ˆ4G®‡.RBáDÈf<!ÉJ ˜OÞ²áðÇà»H—‘¤ö‹üPG3«uJ7A:¶4ErGÁö—X@ h¦¢¼;ç¨ëdËðDj>gL ‘%GíbS²¤‚npã‡?%6ó%©—=;Ï*)4eaêü�<†éΦÝ}/�Ùø`§:DB_Oþg¤7`¨¬Â®ˆ7¦‚¤ îÉ;+£0n€õ³â1«PoyùçgzPzlêÕ~Ä­ô”-J%HUëI£òNûmDø%Mòvêû¬ó( ·”lÊ+ÍV)ÈéiŸƒ/TöigÃá/ÀfY¼‹{ØO{:»ÜFéáÐEÎÎ’{*¦Iw¸LÄ&Ú›å ¾k‰–rl6]¦O¤û±«^”ʧQûòBÈíè²·xøk¨Ý²zYšºŽŒ" ¥ƒöûËU“°|OÊÉïhäauJ´™I²W޽7Úa\•:âU_¯Úç¾Ü ±†^sê/ÿ¸ ª—£n£¡W*¬•¹RÖJU€¯¾tà+«\ z.|@¹Ò„á°Rß:SoÕz•;¦n¸ò¾^«°áð ÉËÙÞajÓ•¯_ÐÊD¿Z¢ùê‹ùJªÔƒn£€«dœ[äüÞÀ!§(¡ÞU‡YNQÒâ*?òGU°HsцÃßåÜ?Îêéâ°Ó6Ò¦+Â}_«®¸ÔäZŠ:#ð? *šò•Ö_ˆæy—ÛTÁ œÉ†Ã?ˆMü »ÚLëèã»zÔ½Ð_»„ô°vöÝŒSwò²®~ýBéšWòrëK6ªb±lw~øç Î’ý‰­x؅ϲ/wI”®Ø>Æ£ßñßoÃ#ö‥vå YuuËË-âP’:f ‡Kê¸Þl„¿ý±^ê¢o¿%Où7\Z° ‡?â»W¿gé¿mÃÿG<|·ú#7ùG€�»ÏË™  ­7����IEND®B`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/bar-opacity.png��������������������������������0000664�0000000�0000000�00000000206�14136337723�0025413�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������Km)Ü���tEXtSoftware�Adobe ImageReadyqÉe<���(IDATxÚb<sæ  ÃÙL 8�éŒÿÿÿ‡sΞ=K ;� �BÖpWÄË9����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/bar-pointer.png��������������������������������0000664�0000000�0000000�00000000306�14136337723�0025424�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������Ëm8���tEXtSoftware�Adobe ImageReadyqÉe<���hIDATxÚb,)ÊúÏ€Ü=H�;·¯GÑÏ"º{§ÂJ‹³ÿk(È04½ LèŠ@ Ðm%Æ08�y€VŒO 6ÛANyˆqº4Ø\È„Ë0B^©©EŒÔŽe€��kÉcÏ+Kë"����IEND®B`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/bar.png����������������������������������������0000664�0000000�0000000�00000000576�14136337723�0023757�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����8���Ê(â���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATxÚìÚË‚0…áC¾ÿóÈØ5b(à%ŸÅµ³)­'mA&Y’.ª™zK}þ’Z©òey rÿjAêÌg_çó¯U-ø´äý«…<Nާ΃¢õÁ«Ù0TÞK äÙ8}šhJ>mmhJJv6•ü€t^ñÎÖ¢†ÃÅÿþÛ9ÅŸ­ÃÅ_ãÈ_rkCQ–lhX/~q‘‰d"™H&ÆÉDKÅùòMË\biX@�„bˆÅ1 }M&@l–e#™�¬uKÂû§-d"�DŒÃwç‰ã¦� kïâ‰�“å14™�á׉Ëy¢Ø;@ì8|8O|^'Ža �ˆõ÷¹9�’•÷¹9�p8?w^NÉD�¹mÎ^�“߯“ë:����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/cacti_logo.gif���������������������������������0000664�0000000�0000000�00000013011�14136337723�0025263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/cacti_logo.svg���������������������������������0000664�0000000�0000000�00000041220�14136337723�0025320�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/favicon.ico������������������������������������0000664�0000000�0000000�00000002576�14136337723�0024630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/favicon.png������������������������������������0000664�0000000�0000000�00000014233�14136337723�0024633�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/index.php��������������������������������������0000664�0000000�0000000�00000000050�14136337723�0024310�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/logotype-a.png���������������������������������0000664�0000000�0000000�00000030026�14136337723�0025264�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/logotype-b.png���������������������������������0000664�0000000�0000000�00000041221�14136337723�0025264�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/map-opacity.png��������������������������������0000664�0000000�0000000�00000000213�14136337723�0025422�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������‘h6���tEXtSoftware�Adobe ImageReadyqÉe<���-IDATxÚb<sæ 6`llŒUœ‰D0ªÀøÿÿ¬gÏž %úi�0�Bµ€°4Eû����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/map-pointer.png��������������������������������0000664�0000000�0000000�00000000530�14136337723�0025434�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������;Ö•J���tEXtSoftware�Adobe ImageReadyqÉe<���úIDATxÚ¤S» ƒ0=‰ è�*v€T”¬ÀÌÁ ttUºˆ )-P°9÷Ð )Q>V8éùì»÷ìóèÙ,FÌ(=c_HÜ¢WSJÁŒ2Š"•e™jÛVMÓ´yŒG<áïض}OÓT-ËrãdÂð¦øqäÁ“…öRK$Ør†ƒ™ß�ñ<©`ÛBŒ’dÅOÂ}ðd ñ‰›s†dÆ…û}·<ð¡CÓãPdo¤|¹šqªr8:b|èPö8 &qIÏ\á7u]càkŠ}á7_«ª¢u]#î;?„xàCwøž½°Ãoû¯_õ`�Wcd±dÙ<|����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/map.png����������������������������������������0000664�0000000�0000000�00000230645�14136337723�0023772�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR����� $���ÂH»¼���tEXtSoftware�Adobe ImageReadyqÉe<�1GIDATxÚì½k›ìJN&ªh÷ûæÆüR~$0‡8 ô =ÐÐ4ôN]«Ò¶¤RDØiW9Ÿ½vUe:ö›¡Û+…Tð›�¼ýƒÆÏÖsx-ó\äµ=ÿ=ŽÉ<y®ç˜WÿÝ{Ì,\{ŽÙã_vm·ž‹È›÷ûùå]þïÇ‘“a^ÄOý›Ü_ë=™ç¬ÏðŽ¯Ž‰bï§½&ŸóŽ¡¯YÏÑËsǃýþÓŸþôëßo¿ÿçþç×ß—Ÿ?úÑà‡?üá×ßÿíßþíëÏï|ç;_þùŸÿùןögߺÅñ~ÜÏûøÔ@ǽG,ZöùÒù9EÜK¯ÅÆ1>Gëxåõ¢SfYóˆ·~ZÏI ¿ü½<G³üo–~ñ�~ò“ŸÀüãÕò¿=~ðƒÀ÷¿ÿý¯¿÷»ßýúóþá¾þü‹¿ø‹õZoà~ÜÛø°–¼ œV{/pÍG{8! ëa<?»éÉ–9ëk\Ãó9µèÚù=Ë®Yø¬µ_Ž[¬ý›…§V±øoÖÿíß›å{¼YÿÅò/qÿ¿ÿû¿¯±ÿ?ýÓ?}ýùío›q·p?îÇíœßè`|§[ìXszŸ%çöZpœq_c‹gí­ïX{^±à%Ç— µ×,7&,}Ñ|iý¥µ§^Ábù©Õ_âþÅx³þ‹@ÿ·Øñ�þõ_ÿõëïÿüÏÿ̸€Å3¸=€ûq?nà<€“?>ܪO°ìæÞ;÷¸>Ç“(ŠÅnzÞw&,3¶®»«ÃbŸãXõ°ôé_y‹®äð‹åH–Ÿþ£qÿÛc±þ”ù_<€ÿøÿøúó-ð½ï}Yü%+°x /U� a?«‡Ó€8l’À‹¤`ÏçkÂÙún WÝUŠä\h)E¨‹rLJ´„^ST¸éqÄÅG)ìo×JI?©�¨ÛOÀ›ðS°õ¢�ÞB€·ËïTð—÷Ý!Àý¸wpŒ±uÜÉ3u¥aÝqf˜qÇ ëÚMà)V:œöSBŒÔï-©§¹ñëŽZi­üüËù'I=ZÔ#=€7¯€¤û %ü4âz�Kêz�ÔÏ-Ç/ç¼=€ûq?n`_l]»[ýÎâ ))1ƒˆƒ˜ù¬Fj°4¾ƒbšî6QW:ãûbÝg°�'äq~¡i=ÇúËêkÏ˘ŸZ‹èӿ熤ÀÛµD<€7P¦ésKÌ¿ü¤Àn êªî,ðÝã9¨èbiÖ<?³çsTåd…�ÉJ»ÒøÛr÷ ýœÙg)�!´%èæ£Bø•ˆË/€¬ã§ÿèN>‹ñ*„"ÀB�Ò€þ.Ÿ[yÿò9wp?îÇìSÅF ™­~W¨‘ÀÀÊ•~NÚƒìWæí±aÅ£Ö\³î¦§ C‰`ξ뎆Õ׬}‰¤ó ÷5À²ü-@«ñ7<€7«Äz—å÷7ëNÓ€ÒÚ¿ý¤!uýI rºpãÊ„¾›[ˆ”®êoÙ ªéºG‹g ÜËå¯å×/Ô °ùM¶Þ *!¶ž7Jw‹ãö[‚o¹ü(6õMø5@Ë|—ׯßP�4î_nºÐ:�ùûr¼|ú™{(€rà—ƒ>EÈ9ט>§–*S^Ǩ’hÄøæ5‰û)žÀG­½gÕ=ËÞˆõK`^eÅ3Bï}‹BX”­ï_O*¯ègùýM€—ç¨E*‚¢ ;ý)»-ŸI1½9€ûq?nàœÖßp÷gu°qÇv>{.‹áwkç½BbáÌshïw,¼—¶SCź‡Ý}ÇÒ[»òJ ¨G2ù¨#RÞ«ÅûÄõGê Ð@ÛåGC�Í þþMÌ”î>-–®ÿ´à â,wŠÀ{nxFéx$iÀÏ’xª ßrÝÅ{Š‘¾Ã„˯…²¯Šã¥b O…y9î›Eßrù±•úóÒ}JµÒzh!�mñEã«€æòå>å9úTðïà~Üû1%˜Îú ÂjÔÝoz-÷<bñ!‹I”¯[Íhïqšg`à}jaUë9AEä5¿bYtå8Ó3°²�ò½‰(Yþ€ûoUû­aÌhuÿo¿/VÞ"õÞþ=À¯ç•î¾ô2,`D”“ þ,¡ÝŸ®0þVy°ö¹í·­x?[–ë¦ðŒÐ¡xñ=rBÀ JÔÍ.ìVŠ +_²l?Ýã$å×~¥ÃS– i@-¦—¯Q>@S�2öŸ¥�f·ˆ.“¿«V*ŽTF?GÊNë=ZaP–Ôsb}‹ÄÓ„Õ;iYý ilZ¼®ÿÊÈXúJ|—ë-ž Å> Èv~jŵ礠œÁò  Àü!0“ø›dõ{¿gNÑ„7âÊ[!„ñ—·Hº  Ë÷Z$¢ê1H&^*)Å’c# pC�!¨–¥oæø‰P‰?© 4á–eÞ?àÐH B”ÅAqH…¾Ç¸IÀûq?nðxâOËU`ù³.»I¦µ,¸Çû5:àb€c¨ˆA/†·\ztbüâXrŸ«^õ´X^‹ééµÐ¦¢åV±<‚åxà­ZÿLÞßÛñgìüCêPw_Z}"PËþÃþé:¡ˆæús�¸ƒ^áüžL(£–n,:¿×$íJ îwk÷b¯4Ž39)\FÜ® zÄÝW9�Âö£8uýh5I?‹ýoäý‹ÅP% „)1HÝ)ôôw-Þ_r/Â0pÂ/»q&+ø%"ÅJS l)Ÿ`ý~‰TñIbÐcä­´žGjq¾ádâ{Ôøˆ�ã_kç5ñ x! (°ÿHÓ}RhÂûôŠ´„\¾&šŒ®ÏYýz=€®ï92ÖØõ„ &Êv›Bß å˜i¤òÜ]t Ö¿(¿»¤ž“ÂÓR~*y§(¤Ýr´seØþgÈ€*¾"½P¶õ¤Ÿ©,%ð΢)�§0#­Ñ`Ön÷ ,Ë“€÷ã~Ü>à¨Â¡LŠ0B FÁ@ ~(íרø+Éø?êâ£CðY.»E¢æhF2Ço~¨qV</ÏC­»HP#þZ >¢©?¨Ýrç—ç(1hUöiiFƒ V_;Z”N·?[‰©ü‹ÄíQaŽ€Ulßpá[Â%ù´žzE «4…à°ü¥‡ô“žâî{ñ?=–) ‹á§ç‹f¤›o”û"ˆŠ@Y�$Ü|¤ä tçò`eG¡Ðä” °?MN&�g ÔêGßý|ɼ{Œí‹sLi¥ü¤r |h´Ï ½®x¬HGã;ZÛy%W`Õó/HÆÞêâN±fåì¿›þSҀ̪Kk.ICjÝ5`OÀLp¤î?ûÞ¬ðG­~¦j£$ SɇÙ@ e+oZðÉßòÌ}…ôÓúòKÐ=÷_ "$ ºÁG³öÏ3Ë}©"©?ÍͧJÀf/3 ß#­¾rº?ÀS‡¤3™†ÉÂI6[cYYˆh Ò†M÷^Á ÕX£$XýŒÀ%~G«@içUD,Z)e#6 ~"E>•²XŽ¡ˆý™•o¥þ´0@fè±2ž·\|ç{Y�o6 x@Å`ÔS(fÑü$ßî…-å‰ëKÃýpبÂCËChXx¯jO-Ê‘¼@ƒÜC'p]ðÅÛÒ»(-÷/ãy¥æŸ¹ûžXRZ% hRYvKÀ—®ÀÐꃑá; x?îÇÜ/HtãÅàn¼H…^ŠtÜþQËßJßY–¿8¯™¬{+×xŸÆ)§Ð§4¬}EjE?FOÓÒSËG uO 8?&ñ×ÁþWq¾tó P‘ˆÒ ß£—ðR~¯à�B 1²Šb‚ðgJw1~$úì0jú£î¼¿ʤG!°²[í·RzZÈ¡)/,ŠBt¡`Ô½þš"x8…hf�"J@iû­¦ð´­Â^LOŸ{†Õ6çÓr�‰&›E1KøCd`¯Eo°öÀ‹ÿ«Ô !¤Q…`ÅüÅiÞY¼:«ÈG« ° {dæ@« ñ}”Œ’à7üX•€fÝé1-`e4+o)Œ0’Lyw>p\ä|)¢®åD,º¦týøšV[Q$ª’QX|‹Á×,}Ëå÷*ýÌ?øùýJà[!€èïg5õ‘€ÚtÇíoͪ@Ë͗®ýhVžîð†œ.?é$¡! 'þŸyÞ‚ˆÕ÷ÜùV©®eÕ3 Ã˘]{i½”uù•ø¥‚°X~úgƒz±¾tï—ôb£¨â�´|¿Qøƒš�ÓÐÂSšÕÖrú2~÷ªý4¡²þ]ÀîÈú7þP:8€âÄð^|ï¥�£D_1ö÷—ˆ`o¸üV©®ºOßPtQk±­UÔSzÜ{ú9‘>ZÓ+$ð”� ¦¾.Ò€UÈ =�ÌHÎT�)â/àúccß¾×m§%ü˜äZäž«§C€`h`)fј^uá–ßrù5¡-~_,µBâ•Fm?ZÏG8�"°Årûƒ±¿™J@›¼¼nô*¨¼ù<}ÏBz•€–WpHh¸Ñ%Ü×#{Ø ’¡@( èZ…<‘p!ì,ºéòkVž ¼Û£È6Tîºd»Xßå�ˆ@)èVì¯ ºä¢J€ ¨Eø-ÇJÎ@SQ¢ï@ï$Ýô뙼}Æuºô^ln‘†ÅIÇY[tÑ#-oB¸«P²@K¸eè d ´ò^Ô<#‡F_t:ýT»½ÝÁ`×å·âw+î—ÂÞzO„ñÊã‘ "4­¿›7¼‚&)§]W¤F hVÙ ŠÑ³8-º2.¾ymcï‘„R¸ f¥ÒŸ¯eÈþ�4öôGŸõù{ç_%è§`)MÈe€¼>ÊD˜~ËÝÊì,!õš¼ÓõŸ-ü¦w¾'ÐÈÝ›J¢A†ÜrÙËRÚûeí>Ø-½ÐéóWŒþýU¸ð,mòoñÒz-·_€r@ã5Uȵù™2`)�­0¨åtWÎH×EDrH†­p  x ~XQÞ¶R~_XðQ •Ðøƒbyš°F\}зújzT/AZ+ï°ö•…÷ ¤¥·rþÔSpÆ›)ÁWx�0(Ün!ø{ï­#J!Àä7Ïï1õF|Qv¼�-×B“´<�MÀ­÷6~Tvó¡ ä½4\}+ h5üXž/ZÚOÛùg€®òÑ„\b¢ÔT‰GøYÂ4ŒmðªÂŸ$ñ— šÌ|Ë®½æQx}áÀP ØŠù]pM˜Å{µóy5úÌK¡^Bñ6=Ÿ/^ɯmÆýZ!­´W$ÔŠ÷ô�¢%Àá´ž'Ä­´\457Ù#ˆxÅ™¸c¦­œ¿ãÖë9O =?èhy~­ò¯©D<E Xt“Ó*ù,@«ØëQZ8 m6ÒB Ô£÷å~´8H{]–[¯$øKGºmºuOZÿT¾~Ä#ðêó'„{[|©X¬Í>a@³àÀ§ó¸^á¥>g«µí·Å,D¡Óü­t Qü£f4Ï®S+Þ·ܳò­òß)…@;+€^ë?E)x¹úH¡¿·”õQÛá±øC�IÍ¡ÕïÏ#5×Þ`ü[‚Zò«q�J­il²J…›Ä£ÃË¿e‘P„ðË(€¬ë„ˆ4Ý€ ª%þPÊÎêhº/âî›çŸ`ñÃ�4J{µ¿FÎZ®>U FÃOm3F•€åöki<«@ ¬ø~>uó3ò•ë) `Äúïäú§Žm)„F¯ùÞ†'àñZ—Å÷ÒzFšOõ ÒO+é­ŽQê�P+ú‰„�šbÐö9€pRM>@³ØáGãýˆ•¸ø¯`D”ëÞ+äo!­(‚±}Ó¢Äúžr°F„´«2JŽÞ ¨ûî‘~Ê®¾ªô×:¦‘0ƒ&ÈN½ñ>£¼ç¼9Ywß+䡯Óöá/ zÀ b "Þ€Wé‡ÞßXßÊû›Ÿcá»,~Æ#06ö¨(•(UpK¯¦éy-áÔj ¼b¤VÀÈH˜ <òÏR�ÙÚþì±{)�·ÌÖ³Ð=J£Ã#ˆ(„¨ùorA+_,wß°ÞÕ9Í<ýÛð�Ô´Ÿæ!Xe¾P—ý¢±C°R ŒÁ~�²@Ký¥¼ük ´–Þ“ÅA’V>Rþ{X ÷!w+ôf?×�ÏÌù'<m3‘–ϯ6)ûýѨLÿñ�´×[aµóÏ" ¢¢ ªSýÎqnØ`‘…Nƒë½))×z–ÕŸ1ªï À­ÐË<×ã X;ò<«Þȯ¤7áÞ[ÞG ¦�±ÑÒ«y¼'øâ~ŠE Ò0A†/Ž¢(†€k1;{®E6:E¼³e™Õ $â5x,´è^$`VÈ{‚¨ë;*„Vú.’Ô„ß 4/A|‹åoZx‹äó¬9Ô%½¦P+qx1¼¯#–ßo†­ø¿%Üš�Gâ}m/@«:ÐR/ó�Z¹ÿp’õR-ANäû[V¾)¼w^²ôâïn@y]¦ô\ënxM¡¶B�‡è )šˆ›ŸxíKx­óy1½<NÖ´Ò|{q�™Öß½‚-tVŽ7Ðrñ­Y}èTøA ÷¯½ß¼i}VQXû0ëO'hñÕ2aiݵ~ÿ©>Ò[ðºÿX„SQrOZóEѪâ“ùÿh._þm)‡£=€fo–WéàäâCÇ$x‚¦Ë®Xî&1hUðiç XùÖi¿ÖŽ¿"­=½~#°*­¾~Í>JÉé{iÜŠé5ÅÐÛõg·JÀƒÉ¿0+ßCæeÈ=ÅrGã}µ® ¥($ŸgõUA³âJÌNÐsû‹%ØZüì)…†—@=A±ÈCOqô¼åÊ{Š!Úþ«7Ýgz�t_ò YyOСÑe'Z°~hoþ©Xvåð ÔÕî¾ü’×­üVì×ê'óøÂX^–¡–Œ++þ.Diš¯—ÊH{ßã]šéßË1ß æëãÅ@ÏK÷ yÿ·žJÉyQ -Ç/! Ò÷,‹îÀësô¢Ï?ÒÏ£ ˜>G8¢Ðîô¹¥&€¬'Tö£Tç //?ð�B=Ñ—Àëó—þV ÊKp¼‘bß¼€æ-h�Hk¯p ž›o’|†ËïzB˜Ñ# [ï£ >n ÅðGßrÿ{HA¯ ÕÒÛš2’­{%ÐT Оôö@üžQÅ©ïo¥�[JÅTOØ÷…B‚)X)=Ê!x BîÒPæè.«>@45•€RIëu+OÈ5Á¦ÏõÈ_¯ØEôjªÈ.½áñJ°E·"8Ü@IçYó*Ƹ“&DË£ðªú¤‚°„Û(å­îÑ‹õ½à !U÷!´¼†V¸ã)…åÑ*²HÂVÛ¯zž,ñáE˜žÅ¤¿CŠÂ ŒZ�u@ˆQàS:¾ëo¾§åQ(ïg¥´ñBÅ2[Å8@bepj ŠQÀ)1nz ³B(/3ZØ3£èKt6ä7òhc¹Õ˜Þx®¹Ygç¿£BÞV]Õ•×,³VÇÒ›.ßãTò¡–ö€´},+ )Ëk°B€@€)èšup�J_þ°ÐK,µ*É–@þï9­bÐJzçµjL`´ÃoOèÐÛêxÒß- žòDa17*¸a‚2DÖ£¼e?UAâ²´,µx{<ëî nËKÐ,q¶5WttW«àÈÇa «"Ö?Rì“(ì1Ùë} ¶vßä¬ûn·‘çG¯Ô7Àúk¿Ë»²ø–kï+èÆC¤ØÚ€«ßí%D6öhò•±²þÕ º;oÈšw*‹Lê¯$R{èyZqP0mgÅ÷i (”•{/IE/gy QAÏXwrήxß õlmÊóÜISÐgõñ4 z@Oš/pÈwQaWЇ¼ ¾VAP¤ÀxŸù4ŠxÌcdŸVØ£¸¯­B ¯‹{û–È<h=^1=FÖø?D1U0„´@H+�ǪÏË¿#EAô5rÞªÈH(\¤…AV¡</åä±Êߨü(¯Ù…@@ï{ZÖ¿%à¡t_ôXï8£Œ ÎBƒžXß ˆu‰Äüf±ð’¼Ó¿@¦Àõ�4ëØSäIù)ŠÏõ´ü½—Ï·ŽoÕ Œ>v Ö˜©vÿ“{ú½sZƒ>B•€×¾'¯ï ¶ÆÞaö|“äs²^Ð<Ÿ—ð”FÔ݃5-W JÇ­BŒ0ùÑÉEÒëшd‰AÙBìå$ 7,êþ'αèá”^@Í�O)I@OYH%k!>$Ì‚#(N¡u³ 8*ìAÏ¡dHÿaz-!ÕÒ‚V̵òš'‘yoæµÃB€Üÿ^÷ ¼'lÕ£Ö^aðÑ)J <U ÚÎ<Í¢G‚âÚb# ö HÜlm.-¶,´åÞ{]Ë ˆ†ž•„Ó»• �†ÜÿIÍïG {Ì]Œ3­}Kà­4Ÿ‘ÁÚƒ…BÒÝ·ŠzÜ0!â(‚¬>o… ¢7ÜÜD³ôžÐ[u^ I¾ÙÕ~S³�a!dû#<B¨>_Vð¹Q½§mÿÕ¦òhzéój)°A¡"ÌÖùBïSB³ E²ü{¿¼®¼ßcîÚë ã¯mûÕŽE1ŒÃbç×íÀÚ1r˯²e¬÷yY�µÇV‹Õ'[Œéúõÿ©Y€ð kŸqõ›ÖÞ+èi½æ°üžò�Ç;ˆdÀªApüÊb  ”6âàyJ§õýŽÇ`ZS+$Д˜eé5RMQbVÈ¢rQv¿¡4±EÂEBío¯]X l¶û2#–O¼Çí'h5uÜý°¶Þ!ÝcœÏ6ãö�£VÊNsÑ —¬¾©0,öÒ~Jûmmg¢Ù‰×(Bƒ`¤ŸQz”€ÅÊ[!ƒGÊyŠCøŠ¥o AO(ÐÚptõ31<ôXøF*°™ pbxlYvã9-§_)‡h±ú(]z#ŽJwŸJ̺ªDœ =Ô¶îjÏ‹î:nЋ߅`ª\„ç´”ƒg±3±ÿ|Àˆȶ� Õ´øƒ@wà¬[<‚K&:¯› T?@úU$Sèã¹ü9ç’~šBðv6Bˆ€$ àv²<Ï›ˆz–rð\ó‘ qQ%r * ‹!]O¢Qå^çóÍçYlñ­¢žhH XÕV@Ô’W¿G‡ç®Þ‹©<ZÇ{EFžàñ^ ATøguÞ3  ŽËÖâò†Å ‡јÞ+Ê1²²öÞëÈcfŒ,€¶íV­Úó¬ŠbÅ- ¤!<ŽšÖñ{Y€VÃPñœÆî›ÏYÙÉÖ?7Rï2äøÆJ>Cï²ú^ÍäwÊÜËŸÚs2<SÎ Öë Gɤ³�S½ƒHª~‚ß¼†Ìl5‹èsâë+߈ç!™ðB„ è¹ø™,�´,»÷œEä¼íû u9¶ÖV’ì…^Óh³Ï#gR�]nO”ˆüŒï-æ=ìêËX»E z.½‘Ö3•€­˜¿‘(^!= #~7C‡Þ@# 3¿{ÕzQÖÝR4-9˜)Ÿ/Q�ñZØ{S~á¿|Wà¨Â’…MÅшñ]NÀ‹ù[¦4¬â$/w S^„¦$:¿ªÉo­ßl™n6uw) ¸�¼¸| ÆO+“LàÍçˆ�ƒ¯3hM@JÁJH” IC?ZãÀ SxÝÒÜÖy"¹ñèØ®HAC‘€ó€À\À"0\0ƒ T¶&ûdo¶×­±ôâ‹×XllA§˜§êÇç-bË 6^› äv°$ YÆkx¨~¢>À"«2`Pš}(õH€‚ôz¬à øvkÞtåo)ôªtØ" Rïå$`x¨GB›eöð{.W6®ð¸‚VJ¯‘æƒD�jU€BÙ¸œ€—Fu¨æû•:�ˆð^uÞh ü´~o¹ÿ^óÞôð�Úk­ÍE§©H*�sßÀ@Î?Êè›ED^˜„­ê=C Í:�£ZÎÌ$D\(ÏK©B‚;©�cDŽoyM^W ŒûyˆôjhïÀÌÇ즠¡úü¨Ð‚]³®ÈÔ y‚p¥_+Ö‡D% &˜†7¢ÆèI¨_•Ö3Xÿê| ¢®R Á§)“&w°ô¦E8‚ huayD•Iëõ§0KŒ¤öBÛ…-EÑáò7CGÀ£Ê£ÅлÖÜPž§À<€†òPk ¬!Èú›¼EK`-â±%¬‘*ÁVÕ åU"™�OID²�‘ CÆùŒN@{x ap@CEcw‹´s-ºBàad‡^"h„2+VŽ÷š ü,÷·4 }$ɇVá‹ÅtÆZ±Ê¿I¨³Tì‰cÌJ@©,i5Ô5%Ë>‹ä³ÞÓ"[Ä ]¾a( :IÇ­6ÔÞ;“t·ïÚ<>ï«ç°ø­áݽÿ#ÞƒW~ìÄ÷n@Ôåo¹ìZ¡8‚iñc�ôéF­Ú~µg^ô}À³ø-—•ñà–òðolÐÈñá`p²Ï»ß+ÔA¡‡ˆÐ3 ì^&á×* jðég’vF&@ítÔÚ«Üé×"ìR`“ŒËf<rΊõŸ¦G}FýÍt`‚~‘TãˆPßÓ:>$Э×ÐçíZ\¨7ÿh©¶™€©P¼ŸŠ—S Œ'è–ÂXÞ‡ö(u08 Wð½Ý€ÞÁŒ2˜A ž0]þì9,a‹äõ“‚î½G³àÐàÀ`¶­m°8".¬•cÖv«0Ȉéeü®öÿS¼ ¯ðGÛåçþM‹{¬X߉Éåg£ÇX±¼Uøcqô»ÔŠ„´]~Êî>Çk(œƒÆŒu€–`[uÿ£DË#ˆ¤ä P�ä¥ûBî}ÀP= chx .#oÅï@6EbvË‹Ð<�ï\Vìm…ž´,}ä¸̼4ž‡»¾=@HX;Š|†<q\DYDBˆ¦»öÐ’u·5—>s|öü ¥$ ¯¥ª´„S$«eX&ðÜóh˜°gAÏé8€ˆ`w¤÷úÉUVù.´²šðjÂìd vó�¼ó÷ü´ŠiŒ˜µt¨g¥[á“æ‰D…<s\¯B8¢WÀ0òkn Ê*’YÊ!Ò$!€@v�:„G¹­ð`†tû!ªD,.Ãá,´Ïw=#e YØòf°ñ^£‘…Ñ=hF!±ã/¯›‚Ù #Dž[(ívi0€=þ[{¯EÜ©?J¶Ú{Ië ¿xÒóAgÌwëoYd'‡|hÇ)»Á â*òÐi㥂 Ø* jtØØÙ' ¿ª G’ŠÁ7•„äÔË";Ä`©—uùSžQ䣹ï­ô^«¥x˼OËÛ[Š'€!dUáRÐcqò}^zP(&7†ï‰÷£á…U@ÔI~ÙsLÙ ˜$”!ü2E@ —¿©8Z!€G&ŠÕÞË.ôÞçe !�()LS¸{LEäÕhqz£‚¹3pDð£»ùZn{kCR4{0“ØKŒðÍaƒIêY ¦ZÇz…EÃFy0D<…(lj¯£XÛŒ[–[n£‰)´Î¡ÄËêó^ªÐ:‡’;/Y. §Š0ªön¶WG æü¾LX´ú!Áv^SûÏàíæ«â{¹aDzvRP,‹ç=ßZTÞÎ4å5V¤ù¨½ —µ%ctG çñ>ÈMBäõoy›xDµ 6ÂhqÖû¬8ßy½â¨Y› ß h `óôN9‰¸ÿx<í@|o&èö�ÀÞ3àq�²~�‚ݪ+ÐÜÞæù¥åñj!SÓï²ü3B€ˆõo… 7y}0îï-~dJù%Ã,V(èO÷Õòú­Ña y ÄhŠ@ß[1¿x)<í|-—¿•„Æ®>Ç­w…Z(±s´™îk½!õäõµê÷­´f—ð’:€@‡WÍ„­~Ô3h„-Â.Ò1¨ÅìCÖ#h¹J¥×hƒÐˆí›[u+ܲþ®!ÿ"qÀh2ò/ 2i4Xƺ{„L²ú Ð œ¼}³xÅâ,—Ø)ñ¦àz£Ã\rÒÈégÑbøÇóMïCë ¬|oèe!Zµ†×Öä ‚Ü€ÊÐïVã œ<¿Å1@ 6`` )4Ü÷4Y8`Ù!P$ßÍÀK:}[ ¤U ?Ûí:lı–€@`èh±Þv% zŒ‘îs]kƒàs]üÖ¦ž¨õ÷jZ^Àj0rŠ`€ôëâ ¼wk(b¾'˜1|@9xi>°Â ¯Ø Ý¿•ŽÓ\~'¾÷ˆ0OÙ©éÁHG^¯Éi0vtë |‹€=öl IïE\~ZùLz0òð>3‘�cÇ›VÁ§ ¼ã˜çŽäí=÷H?¨'7Çh>^sË¢;®d_�Nãiñe©0ü°—â˜6<ÒÊ»¥ÃBŠŸg¬xÀðöÿC´ 0 ¤ÊÁ;€VÛ¯y  uÅ5Ž/Ïߨpã{"Àj/ECyȦ^€ú=ɑݖ—àl;®tXÇ:<‚ÿËxßgñ�Éßá�R^hã®®Bô^„8ôfÇ5 C#Ž´Â Y·Òq­y�ЊÁ™ÓËV¸‘tã{+~·<+ÃÐøÞ[»Sk)Ò‹`Bî¼Úƒ«‡�^¼¶ðÁ4`óó"õõN/x$žEjUw-aubò,)è p: ØÂÁ*ÖȱŒ¥ÇÀÄÞ–`Gø‹(Yç yF©]V̬ˆºðÙIª-EÑJ³�ÞäáðÜÀ¨pyŒF f‚GÒal¹{QÃ!9À_¬@F€{½„B~”2q�Ýþ)ÏE²�ÑX¿Á„މ ‘T,=ˆÁ¬àÅèÞµD87çoÅØ%!&ë´x¯!§&Œi ‡#äñ›¯Ž›ËÌh÷u„˜lå3Ö:}lÄ€À Ð÷:cÑ]e6xþp˜)“¢¾²ïliÀª%µÐÅxMºpÖñØñœ:ú+jå{¬~$ŽÆÉ!â.C :©²é aÆùA)è † žK¯¦­ A-L˜í¼°2F†¼ã”óü]o¼öõï/=]{vùG­yÏqQo úœ²*->b(¦ßKaŒ( +ü˜@.ï>dó ñü0p6LÝœ‚H„S=€Àžþ1?x£ÊZùü€’0ãE¹6?ê‰GÑ–æáöeVü߈磱¾Ï{çÉr§ò�ZUz Ážiõ{C�HtuÙÃðtØÅW¾»©@&þoTvg2»UtÏâl!@³`ÐÍz…QZÜ:pŠ~ ÁøGSlC.þÌ:�e†Ÿf�¼Í@n@TP¢V¿75¨(HÈ*‡#C†W*�UÈÒ€® g•H"hñ�nM¿fÉùül˜U*^÷ð>?+œ3*-Áô,ŒæÿÓ›…’Öû•€q�ÝÂÞç§ö´öû;– ÑÛËç7bus/B0ï:Þ*T îðØwÏÛAk?e·½®ÆV@ÙØ•ŠýÜ~–Õ4ʃGúÿÏ@`Ž@°iôÄùZ:1â9h_`—ÐØé*ÄÌn@‹³°&óG-¾ã!4-y˰<‡¨U¦|ä "ëxÄúki»QOa°aOÐÅòƒÑ´ÃíïÉX¤dt°•@‡Å6]w¯‡Õä³!à "®º·{ ¾±ÍØ ¢ÇF]ÿßëÌ\ïçî0AÈ‹’²È† Q¥‘øå zL©8œs6­sö«.ÀØ`×à0)˜9F»¶–`F<†K<ª²ÞA‡W3•È�Úí¼[)½¡÷$-{‹�4Ùleˆ" wݱÈ3§ç ½k OÅ%xu–⑌ü<{¿±_ÀõN–'¼ž€†w¡¦ƒ„!z©>-w‚Yxú¾Sp�vµ³F;šô¼‡f& ᮇˆÂ`hå¼zƒÞ4 úøg->tdš@‹íœ»õþË ¢ñûåC€ €—Ä`Ñœê”âhŒÿ2IÎFÏÁ°°{ŠÂëX!ñhøå"Ûx#‚=gEðeâîL\>ª,²nÿËæ$@ÑbýF®¶‹HlSh³Š#UȶóÍËÙ["œ@@©4I½Ìd M€ 7<¬HZÍ;ZÓ}"ƒ=½ š‹-ám)¤žGï4♀'è.¹© èqß;^«„°gWb„ÐróZjL E¬^Ëó‡ö'DæZñ<ýÎ4ªDY)ÏF¾"M? ^…˜Žý[¯ÉøÞŠÑ•^æì?¥ Ytßÿk9€`¼_Ù‚ðëAN GQ4ßÓâ‚®»É{zýµ�"AÖÂG ŸäóÂP•UÆð¬jt¾ —Ìz=!ÄÑ.ÿQ@&ÞÏr©¸?˜JJB^OkÌX·p·Š‚‚¤_dðˆéª·HÂ^%aÅù^*0®²Gæ ?KÐ÷Ra�Ne_#¯:Gà:º¹ÃC0•JBI¸)±Qá¿R"¤_0g³=‚ˆ’ð†Œ´fF„Õh£Šý#qwoÁÏŒ<öa pL‹¹æùÍÂ"Ï{´‹d´sX1¼)d–õ„ºv¿5CеÆ2÷¯ÄÛMŽ ðÓJ‰ª1?YG)¯ÃQ´¥±@UNV~­¸Ñž,û«õŠ0b#‡Êå[5A> Ȇ ‘x?* 4 ‰†¦·¨&¬Úš%<hÕì&a"¼ù %×mñJÑË¿›5=©½Vˆ°Ç#Þ¼œT�Ýî~ÖuϹ÷ÞÁcLÁR !ÞÑ÷ïõÓÈX 5ô©Êáx½Gè;€Ýzf¿€³*€©8,äI+íYØL9²F@#þ†=…z‡óUBvË›ˆ\Dx[Ê"+àQ…qÆÇn  AZ„žY30²«0ª œQåwP¼†-A„ªå‰¸7åIìl¹›ÂvKqhç)ˆÅÐÃüg­v&C1‹Ü“t3A o£4È=ë\!Q”—¢C>1~ÀXŒŽE zEF!:@Äâ;ž4ÒŒ&?"fÜGH@õX)ìÁnÉͶe†AE)…Þ£·K ¥ã’zÆ^ƒãIÀÄVáðŒ¿ŽÚ×âwxME¢| áì«Y|hÌ0x ’®RΆ5רz¯#O؈}­óFÈÁ–›ßC Žºÿ§Ü 0AD™þH.êQVÐô¨ÂfZƒH[YpöD\|z Í »¨°k{<Å`„ ¡†³„:&\±!ˆÙàÃsç­ãƒ©ÁH@Sad^ïnˆº¯s‚7)8q(äd<€ $tL¯°G+ò2J"¯G-u¢WH1dù€ÈçO)Š6 I4)-ò£Æ‚qÊŠ±5D…C‘Åm õxžŸQ)wxDhà˜ˆrpoZ=#<¥ZÇFÎeñ�BãG›~hÏYw$üÂÞBoÉp‹h1ó–^�NDÚ¢±øžòq2a"cÉ÷8¦Ç'Štõ¼Öç‚Ýÿ)€&ÄÙf!b0XrÜò.ZC´ (­Óƒ™Veám ?±±ª‘=FKûeš‘X‚ñª¼°¡åævÿEøõ¦ {@FXÃŒ&\èˆå[<CDȵëŒ*£ˆe÷ÂÒÈ ´\SÞ®×Ñ9š "ZõyŸ'¬ÙÆœ½ÛR> ¹I{gó�Â)ºàVæ%„:äx £¥X<áì¨Yȃ!íŠf3Ô�oNf&gãõ¢pF?ÿH™òècÖ9Ó$`P¨‹ <b-ìYdâø€àºŸ·P…F!WüŸ&§YÓ I$ýB$ØEBÞˆ3}ÐRri&‹œðÎø¬‚°Š€Ä¶ÃcdÁ9$`U3XêäΣ$]XÉ$¦{„^høG€kˆp‘87KÈE¯Á ZJÉcÓ±~k;î.ˆð+Ç€sÜ®„_DžÏ �2aAV¨{½€LNG¶HÀlƒõª 3„ž%„F¿åÒFÇŠG,wFˆ3$`FnŽœú{4pV0 ´ÞÜ,4$ÈI KADÓmÙôÜìçZñyoî~Dø¯þ8pn4¶ïV lEØÒG9˜âÓB¨”@ÊXrTdC€Ù‚>‹‹”ñvpÓ†…NW�³H@+åd¨êòf¶O ûªãÌrS GIÀA—Éu÷’€ÍÍRÞ{´va©Ñ¨Âˆzu{‘€)"Ð#ü4žÅðL^Kfž›‘I) Äý!…Ó™•è)QΜf„� ”,+ìzwJoä=–dsõYá?Sðå!@Ô‚g§ Eë ‚q~ø= ËÞýö.Æ0ÌD¾' *Œr”´HÄLáPÂz§F2Ä8UMÀˆèÙÓߥDBÝu˜}Ow•žá½„ÜÒD½A·’rS…»5ÊÌKëe¸‘4a 8B¾šh<Z4·g:-zOXqï3Y€Œ6­±âª[®¢ŸRA…Ñô:"©ÃˆÒÉ c»ßã1d7÷œy3PÑ…è0d˰ŒWÐãdãûH0âÖ·ŽÍ`­^SºV‘T\Ć Q½±›0íVg,xÖUqí£×Õ°„W[„Ù‰CS„‘*ÂÓ +èjÑõæ(lμLÂQ¿ËÌ”äÄ$¥Ôû¢JO VÖ¦'M¨æ 50QÖx¤ŸŸ–-€Á Àœ,€w|$çuÄŒµèa²p$c0²¨.sȽO°ía‹Þ“Ž‹(È‘bœˆ…îÉ ô„YkÝ3@ôÔ»@ÊOÆõ)…ÉìUƒT*ŸÐ)¬M?«T²qûHž}fÊ.#ÔÑa說—S�- t!/¡G!tqXx'+K€YÖ¢W!Œ |¯µŸ%ð=]"C"|>*;0¤�21ÿa@wXð ΦÂEc«j$õ˜ 1ªcöì¨ð÷äû3Ê +ð=îÿQYƒQvùw Â^@Ö+€FQO0 pˆBHðàÅûGöˆk>bíg)޳¹ÿÃY€¤ËŸ-ú±<Œ¨ 9Ö¦áõ+0Å)Rª±ÀR‹>ÂcLú=­ £\ŠåuÑ=­ bÕi:’YïXÒP-¦ßbû#©ÏÓ¿[ kñ£Š¢4CËš½³ŸžsÞpæ!Y„dÅ÷»y“~wy‚N ú~ïïή;Ójú35 §#g„³Bƒž¿!¸±È³rÐWa8*ˆÃCR`÷Rêy{º^—¼±¾‡”Á•6�]Q¤Š$ûD¶ùĶ?+‹¨€¾ZA$&öv O&`’5‡ðø’éÝx #ñ{⹇0Õ €Ôaoh0QØ^íL{O¯«ß²ÈGZûˆ«¯Uõ9=råÐ�­¥�Ní $» *…̹šd£Ç÷ð§P½Âpß›ŸÕIÆ•=„ÿ£y�gR�=^@—’èU ï©§àh†@ïîÌPƒ!�@0 8"üÁP2mý?½€yi«Q6½#¿³ì~$^†)4hÍ›ç ¸òé÷µÒl#¯=z\ýÈ£g<ùe�ÄZny‚Ùä&„†„?H…�½¡CËj&-vÈš÷ºò^Œ:3Žo Û V?2ž=i<wW ¬hP¨=F½€¨ÛÞ°ÄÖ9 [(zAPÆ Ír_»¿³è`”èkšBÒ¦óìFAçß2®d;Ê$CìP ©â #<€Ì¦¡ŒÇ0Ãè%âÝŽS@Æ*wºüÃ$[À»y"- £*/%ÈW¼Çò¿Ò¢Ÿ1H…YÅÐáUÌP©ñ6ºy„%‘¶˜£ÂP"]çŠdz\úY„ÞŒLÁQÊâKGJÎíÓ7 ÝfÜãÌ [žAÓÚÏT“\ç.Q@q&y×ké÷(îyôÎü2+'oÁlkŸ%ï²ï-6òˆ¼®bXX'ÅÌG*•ðû{,}oKò¨ðfbÿ£„üH ÙGpb A·h,Öè9p¢âÙ‹,ëòŽøÛØÅ{ ÿì–]ž's$Wp¤˜5$$,È;*)BšÈ*|š¿÷²ê³…?“ËÿP…@*�o(#ÏECg»òC¼…« òV½7®>Bø_Ñçÿ, Àª p7€d¹ƒ^%`½/+Ð3ŠHAÔè9g öúž½Üõ(¡8ÓØ“á÷Æ^{õ�: Áù—Q %ô@²EF½Çd…tE°‡ò˜uLÓï!èW«ÿŸ¢�‚ìû AŸañá f ýA ç¡MYâYŸ½—•Ÿ!è§šµî^@VÐg‚/#{…s–µ?Àâó*AßKøgÏ'8«°KÁä6åd½ƒa%Ðó‡ÃN¡CÒÙËM‡½=Ó<c/f;q?¹’hZt°7.ÌzˆpG˜ùïU³<‚YÖ<-ÔÉs5ϯ=o ÔŒ¡¥G*† �fó{=o0Ðm UÚ^çßÓšïvþ†…ïRG)…Ó’€ ÷=rœëÒ÷x/PY®:ËÌçR´÷ùgXó¨õœáÞÏþÞׂ…šáwÜ—;ÿ’xgx/Sa‰‰;+‚³t·5׎6Õ¼-Ÿp¤07<ŒiÂn¹ù;*˜É#d?;â¼@"ä=uø–ßûxµâ8DÀ@Í@')Ø#ìÁž¡R¡FFaÜõ�öPîú.BÞS…·GZ/ÛlôÔ "àÁ9€=\BW0ˈ W—ç0CÀAl6ÚKAkÝuýÂ<tŽ=â÷–ðž©aÈ,0Ë 8‹HoNJ<ŸŽÌ=»çðÀõF'òÎR�6ßœQø_¾x'0eœROqËíO õ,E0M¸âÿnAì<Ç ÷=%ø3ßóH¿j¡ýéŸþ)64QF“N96p®î÷÷¼6ó=³Î5ës÷|þJx޾y]„I§·ò'ò'S@æøÈq¯RgXl÷óÇ¿çÕÂ?[~ àÿøW�gP{Y‚ìkGy+gâ£0Ù[¸þÙr9xgÐK“‡?<gq¾¨é<DOü¾cüm½ÖC¼uÅìtÝîŒþK9€?ú£?Â#5ÎŽÇÎ8SŒúJ‹¾×g9ž¡¤Ž/ÿãü—)€³ñg\ŒWÄ+¹ì3ÖÑ«âù]Àÿïÿ}ºx%�3¼…W.À „WÃ.sÌ«âù½d°ü·ÿöß^ª�^ä ì6\QQ\Q°rçg¯½=½êÌ{¾÷ã~ÜOû(ÿõ¿þ×]<€½cœ³„3®å¬žÆ™= YßË,—þ•ë|(ø/ÿ応F¼2~º•ÅÇê£cùWyC àÿðñ r&刴ãQ‹ýÕ¯uŽ+sgþ¯ àþàN§�öëŒ5 GZ¾+}Ιsíg!ñ†Àïÿþïï®�Φ^©áRg<æÌñöÙ,ùQòV~ï÷~ï0r޽?»9RHÏúyW´âG­÷‘sÜiÀûq?>ñ£üîïþîaÄÄGñ^íZžÕúž“Ûò+ àw~çwW�Gƒ´÷{^½H¯àB_MèŽÝ_%Wå·û·_¢�FÏuÖ/ôÕüÃÕâå3Zã³2ö»(€ßú­ßº”ƺ’'qÏã,áÐGÁý ëwÖynð~ÜOü(¿ù›¿ùRà šô¬¤ä]äpÏgpÛÏ"?å7~ã7N¡�fóJ!ÅGâ2®âzŸApÏ$;å×ý×ñL7òø…W¼÷£*®d­Ï(/å×~í×ð#ÞØGò.®â|$=ÛÚÛë¼7 x?îÇ'~”_ýÕ_=­pFÒä#yáýg˯"åW~åWð*7|‡×]o·üœŸs‡�÷ã~|æà—ù—O¯U_ñygMsžÑº_Á:_m­õyå—~é—ðê€õ¹Wr¯Ó^Õ ÿHë»üâ/þâ‡ë#ðW·^E?ò¾À­�nð™À/üÂ/àGð ×òÑêG¼Ï¶VËÏÿüÏjÏt]ŸeÁFœÏz]·¸À­�>³ø¹Ÿû¹û˸赞åzn\®{­·¸úËgV�?û³?‹7(Ÿ÷îëüÜ÷P¾|ù‚7ˆ÷}Þ÷ó9ïóV�÷}Þ÷ó™ÀÏüÌÏàýe|ÞÇÑçÆèV�÷â¾1úÌ à[ßúÖ½�î…pOŸôq+€{aÝßÓgV�ß<n°na¹·¸·¸ŸN¼­†ûq?>©¸ Àý¸·¸÷ã~Ü à~Üûq+€ûq?îÇ'Q�o$àÏ}óÛþýôg�~ ×ø7¨Óÿ]Qøx|óÿ]ÔýváüˆöËç{à…þ]ãqD¯ƒé»¸Âšjœ÷§NP=­zƒÚ¹L¯èu<�Øg­ÂÕöH·êSë^À,ê¨è½Þƒ×ê·ðše9Tøð ¼DÀñ æÀ×»“Øc³DoPg"Ú« z¤ÀkA)€ÖyGL Y«£_ì SIÔ«"T�ç�µ­�°ós²Š.€p$ Õ±=Ö§,ÕÔY â¹m(€sê+�L"š½Û‡J­Õì—…±µpæ ÿ j¨=‚¿3¢Ž8¨¶ˆ~Næzs(†Öjæ ê¹äÖB_®7¨“Ý«W#j(€=@…aPu€ÏEï!rÿ|ÕÈ¥ŒBþÔ^POŠh‚‡A“€ž¢ÁÄ1Ø®\«„/y²ú| Â1 žQEœÔZà„¿­ëÏ¢›4V™È›ù;¶4?¨8Ô#ð�f€8Ô|€õwÑ,ÚIÂ;>Ö»ü},ÿ êÞ ¾Ñ@À5žÀàk=‹%ˆ]«Ñ·õ|éÙ[î_ž7¨3@Å„°gPëDT(€sƒÚW Œ¿cÇï+H›ù}ßÇ êúJtûÒ€ç�•+€ÞÏÄ ¿ïPµ:úûøoPw�õPD÷Ý ðZPs•€ª#¨'Ðo¥¬¡Þ‘[ÛÏÚß ž Ѽb@8¨½�Ž ™¹ïIÆ* oæykôU}°7¨£¥ÀYÔ½ëòîiÂ:úñ£0âîKùƒƒºc5à‹% �Nj, ù, ¼¹o¯e­F|\ô²£ä–æ ê,PO†hb7`Fø÷µ¯ U€¸‡ mc0÷^þ~ìÿ êAÔ©œî<Pç¶É?;2V3~žïqƒ:;äÚÑD%àëAÝ�ðóí뎸Õ}–Úd0¯ êÙÔðPÇ ²¨~Ñæ5³.çXÏ *Ü žÑAàXPs»1‰rÅÆ1^Ê`ºv[»Î êImÔœ Ô|G ,)Ù“g™”²îIªÌ˰î*¾T<¨'CtRÀ1 Îk’A’X÷­´žëQ =°ä—iT¸A=?¢Í@絯8[W ÐW9о:¡ÍÞò¸ÍúÄ N¤÷O„h²'àkAíOîµ c_5{ ű´Õ'?$¢Iðµ ÎÙ ÷•D8Zµ:úû\ØoPgƒzrD A^dv7`Ñ´'­ÀyœÁú@ Â9@=¢Áž€£«s¨¹,@¦ ÉHû•Ú×µ.kävÇ8ë*¾Ô“!:¡'àq Ž5écØÑy1ÿÖÑËÌB’_¢7¨= žѧ8#¨½$àH‹Õ~«cFZØcœs-ÿ êÞäßIœ °'¨Ñ®À™é @4‚*ÀôŒUÏx…‘¹QðoPah8èIHêX[ðÖçgPÞ©wEær<èŽk ~ƒºGÓÐM¶ïp¨¹Ù€­Ïí¾¶_5:¾®¥KçÌü  Â1 žÑ°gHèPû¦G>oÖ¼e€tóšÖGµÖmĉš?øƒŠÇÚû=î„h£%ع@•GÖlDåæ­u°Ž||ô6&„¬7¨û‚zDƒA^j®(rÎÞû˜8Äf䋹õ~EpƒúM½Ôþ† #×Öii´¢µÞSϺ­}–î^ê‹ Ì8¨ó{â„ûìÈXíu)¯ऻy¨øém¤Ïê¼Ð·Ñ®~ÞÇÇ/³T¯£ß�^ãߌþ•GüÓì7¨žŒ\Õë¬Òã<€5°ýtVþê âeМÜxPÇÀèý\CIÜ ¾ÑyÊá* öÍ%+3É¢µž}=i={)Þ ¾Ñ`%à9@Í׌^Ï@MD‹°epGo¿™Ž.åT›Éˆ²�çu¬päÚ;J¥[£ìG .£ hÿJÀÔÙ4ÁÁˆvÖ¼Ô¾½�3 ¬[C{­BœQ#bîR½A¹-?‚hLœԾ݀=ësÂѶÑÉ@<g½Þ ÎuÆ&ÄD¡›<¨¹† ™mÊ36YL™aGÏÜ¥zƒºÇ`ãzŒ 9Ô¾–`øÜùmVºzWŒöZ™çú¿ Tü4 ¾ QHy�絯)hOßB_¯Ù”õŒnksZÚ½Tø žÑŽ:€½@‘È¢Þs½“Û×õ.€Ì­Î3`³@ÅÔs šè ¸7¨mÀÇ:E®±§ú`óšÞë-¨÷ÍŒ‚ ŸÔ‘9�; šèôzPçLj¡8ŠG0eÝsúÔóãÿÔA}5¢:€˸¨sgz¿M[ Wµß÷¼å>!¿(¨p<¨'Gt`3Ðñ ös�Yô& =2ÇräR÷5T£ âkAÅóúbD‡ƒ j¬8‚péì‘¢µžÜ L]·3AÍ,Í ê‰ VžÔüd L>7‚îÞªõœwKsÖíѠ‡õ¤ˆ¤u< ÐB5Šd�åVÆ*zZHB;×` *~ PO†h xPs•€˜P½¾×Xe>¶÷¶æEª{‚ û çõ$ˆv }¨cpàçÝ«F.õøÇE@Åë€z0¢Z‚ê¦�ðü?é(û3ÿœ³ônP5PÏ|™\\ÔÛø�Þ ž�Q€™u�G{�7pa�nPσhb:ðëA½³�É˵²�ŸÔ¬8ìŒhb3ÐëA½ë�:n©oÍÞ Î'¢<ÑDG ×ƒzWoeŽõ¿AÝ Ô!Ú18£æ‚zï»/5º=åõdˆîÀCA½wîð{n9Î?<¨'GtB)ðq Þý� ¾Ëúx[Õ*|jPO€h²@ÔùîÔÝ(xóÖð êlPO†hgG |­Ô»'`Ç­íg³nP?�¢=ñ% Þ]“÷A~ƒ:Ô#šl þZPï¹� øæ­ÔÙ žÑŽRà×zO ÞÖøÚ½A=ª!È‹}ñd ¨÷lÀÆóY˜ûèª *ìê Ýy6à\PïéÀ·9—³þ€ â1 fQÛѧÏ5V ü GÙï7 èuP#§?Ñ@À(¨0 Ô\!É¢DÝËXEO…9÷üe{1Páõ ž�ÑFp¨8 Ô|CL~&îw0\íýØ·9gÙ^T<¨£—6Ãܳí êÜé^…59e½Çåó¸A}ªíØ ð:P¿àÙÖôŽý+O°oP?>¢š‚ê»Àkü›±V÷þ7{)Ý ^ÑI à˜Uú/¤rgx«GÜÎ¥ìØ êžÁ�ÅÀ,O§“°ÞãR®é”Þ ÎvñsçÉE jŸ˜AVväY´š˜Ýk×ð â§uFögNÀyAÍ×̺¶„[eë#;ãÖÇ–è 6´ê�õˆöœÔ±J@˜p;‡«½pï޾Tø žÑÎ4`¨ãÄÉXG ÑÒõd±u´yMÄýݰ_G Ô#ÅýMt‡AíÛ 8{«Õ¤A¶™// ñÃuƒ:Ô^Da?D“^êXK0è\ŸžžÜ»:!ÞÇõ¿A=Ô#šìôZPó“"ˆfî'n´}ݬ+s›ÙÜ Îõ¤ˆ&Gƒ½Ô¾–`½ Ø®eçXŽvYƒ ´sìÔ êATŒ?7¨}MA³ˆjwôI¤£ìg÷YÝ·ë êlPOŒh°À,PaÔ\�' > b³|tÀÛs»óìÔ ê«Åyˆv€# â¨s&í=)¨³{UﬕãÚÜ îQ4r íh ö:PçÎĉ¿Ožc9k’Õñ³oP/†èÄá {€ÚëŒ| ㈦Øî1vñ˜Ç ê@4Ñø f·gƒϘ³ 0=c½¤ž[ž·,oP?¢iÀPûC@ õ(º̰ÀÄå@£ªnPGA=)¢ƒA¢�öhÓž:�ï<-T{Ÿœ²î´íü,À êì,ÀLDûë�f‚Š»š+Š ¹ŸÁö™ÓF./Áز½A]4Q€x®jC˜€\Ò`eøª—s,guƒúAM’€3ÔS?¨›À~ž¤í^?Ç–à jÔ :¹)è¾+t~OÀ¿…a½Dc±è9@ÅÔã d^j}޾íÀ=PEh¯U˜¬?_ãµ*|*P_Œh²ðµ Æ²�Ve.›Â^‹6¯é‰íŽã­Î�*~(PO†h¢#ÐëAí› Ø›s̵ôô®Ø?‘2Óf*|xP_ˆhgC×€ÚWÔº®ÑÊŠÉ[×Gj¬úÊ+nP�õ¤ˆvÔ¼Ô¾RàÈçŽÔV¤SÖ#…–½·6Ç>Ý Î�õDˆúœÔ9»÷ÛV5ÔÁzôw˜²foPgƒzrD;Ú‚ï êL ÷˜€vdßJô÷¹B~„Wð@…c@}¢ÁÍ@G‚j¿'¾�èF›tt[ˆ±é½ŒÞ[ž³,?¨“À“!š˜ t¨3=€«<T'fF.©u«ûòÕ7¨G4™ØÔl'ü=£ÃâäöuQ8g@[’7¨= žÑÁž€Ç‚Úß<Û®<‹*´×*tB›½ä}ŒÖ êlPO‚h°ð ÎkÒºþÌÔ…ZØgž ÇhÝ Ýä�DƒmÁÏjn6`f\ÙÈŒ%€®”õÈ�¦Èóã$õ jÔë#:<Ô¾éÀ#³,¦/fÚ×aàã½KnÁ9:ð j/°'C4Ùðµ æ*³2sþr€°nºuY;®ÑT¸ík!ÈœÔ8 ùœè(ó<¢©æ5‘Ë\úd¯õu'PO‚h¢#ÐëAÍ×`ðü¼·«V³—2r»ãËö“€ ûƒúbD;8€×:Öh–díܽj[€ÃÂA=°#:ÐìxP¿à+Paûºsù?5¢ÏÛ¿¨—R�×’X¼Ð¿ѹÿ®ƒé»¸ÈšÚËX}j¯âu%uÅ­�îàõ܈Ân `Oà*|Ü$à êùIÀ+z­4 ÜiÀÔÓ# WõZ…@ 8ïB  Ç€z–B +z­RàN8³0~®Rà@ÅýA=S)ð•@½Öf ä[²_rváÌ]ª7¨3ǃ¿Q¸¨×Ú<xŠžKn-¤ñ¥zƒ:ê+Í)€s‚z­† ©TÌÝ䣃újDa˜|=¨×j Öñ¶œ=·5²ºA êYZ‚] Ôk5íЧwSÐ ê™›‚^ Ôkµï„4{I�{ZþÔ½A}u[ð+z­Á oë7{ËýËóõ#¹¨× ÖãQ£ÁæÚ­Ô # WõZÃA;ùÕÞßçÀƒ:Ô³½¨×Þñ¶è>Çxðê™Æƒ_ Ô¾:�L ™¹ïRÖ™K‹B›_·7¨aP¯(\ Ô<à¡î]—wO;ÖÑ÷ná¸õu6à/D®j, A¯EîÛÁ+ëF>.zÙQHrKóu¨'C®j_@/ª�q ÚÆ*sšY—¿Ÿõ¿Aý ˆÂ•@Û 'þìÈXÍøy¾Ç êÅ…+º)�<àç Ú×q«û,µÔ‹ Wu¬(‹æ ò3`qºÎc—nPOŒ(\ ÔÜn@L¢œ÷ºSÖ=ŽWÊùk÷u6¨'At2é·/¨ùŽ@YR²'Ï2)eÝ“TÙ?5xƒ:Ô“! sê�Žu^C ‚Ä"¸o¥õ\Ïî%¿LoP{@=)¢p%PûJ³u•�}‘íë Úì-Û¬Ô žQ¸¨ýiÀ½vaLâ«fo¡8–¶ºA½0¢p%Pçì„ÎûJ"¼÷ž*œEÿ¼AÝs7àAˆÂ•@{�DGО\´6áqÆëu6¨'@æ »ƒšËdšd[¬<§‘Nk­Ë¹Ý1ÎúuvàňÂ<PqwPÇš‚âÀß=Þ:|Ù0´noPgƒzFD¹¸¨ýmÁ¡ã:{Uê„öØç\˃º7¨¯FR$à9@í¯èi²A`zÆ*zI„8·voPgƒzRDáJ Žµo]SåzWd.Ǻ}ÀÔ£Ú‚Œ(\ ÔÜlÀÖçö_Û‰¯´æÝnßú½A ê …ý@…é öMŽ|Þ¬yË�éæ5­jAܺ½¹Y€ÔÙY€# ûŠÓA•GލÜì õÁÖ‘ÞFŽø’½A ꉅ+š+Šœ³÷>&±ù¢Gn½ÙÞ ~ DáJ ö7¹¶N¥8G;Ͻ­}–î ê……ýA…i Îï ˆî³#cµ×¥¼þqƒz1DaPçû/ôm\_˜oP?¢—Òï �¯ñï"—9¨ÙoP-P¯s©×¹Òã<€5°ýœvéõ DáJ Ž+€èý”sx«×XÓ7¨FŽõ ŠXô>JüØ ³9Öc—ç ê……ã@W ù:€’¼ž’¸ß2FXfY#·¿Ï2½Aý@ˆÂ•@W–5ÛƒÞrLÇ(û‘‚˨š[ xƒ: Ô! Ç‚:¦Ú{Ê�Ú%ð-$ÐÍ6Zj­¿‘u9¶àu&¨'Cއ@õw–àó4KÂç«ZpöB<g½Þ Îõ„ˆÂ•@µ‚”€:íAÓC¸ñ\ï¸è„8b¸ph©Þ Ž69!¢p%Pã-ÁJã¹,š¢þÔPïŠÑ^+ó\ÿÔ½A= ¢p%Põ¦ ¥ÁD8ƒdb­îÕmmN÷µÔÙ žQ8/¨½@õÒñ øþTº}tÂ7&ä³ìÖ êÅ…ó‚ší Ü*òPË è¡Y ݼ¦·Ãz ê}³�7¨³³�/B®j®¨~÷P‹"h—…qÖP›ý Ö ê…@/F®j=°ìô{iˆ­Õ^aÇßû–ä jÔ“# WµŸÈ¢—E:¹V³0Ž@~¬ÍºA½¢p%Pc¥À%€p½ž×µ w´¢ï›µºA ꉅ+š+*IT-‹.zæs£Ž•÷$ŸË¯ÛÔÙ žQx¨ye0žh¡ÚB¯A,cÁ×`�Úc²�7¨F^j^›æ*54!€j?’]Æ*s>üÔ½A= ¢p%PÇ:EÐ,CHv{«Øÿ1;“~7¨Q¸¨›Aé Ÿ£õsÎÒ»AÕ@½�¢p%P_çt\ïíÜ ^�Ñ‹z�GWôz;¾9€Ô ú8€™ô*Œ#}gnP/€è¥@=¦�Ïï﮸A½�¢—uÿJ@h¨ÒÈëèëÌÏW xƒzbD/êü½�à¨Ôè±Æ½}Þ½�7¨BôR »ÐC2pO÷nÀÔ z)Pç÷€N$Ç}Þ~�7¨BôR Îë ´;ÿ|nP/ˆè¥@Ý·' ÿ¶‘d¿ß=oP/€è¥@íë FPlÜÏÇî |ƒšõĈ^ Ô¹s<D!€jé_«„6 ¯µŸ pƒz1D/j®hF… ªÅ^«€6/$žË­ÝÔ£&½ÑK:o6 t ì=¯<÷ùfÞ ^ÑKÚ?¯y(·5TíÇŸ|ƒú½¨±RàŠÐP¹QDmT?Ê(ûÔ@=¢—5Wd!A‚ˆ:Çô@…·¿O!Ð êCôR æ‚´ÔiÖ­+ñc1&aîѱó—í ê@ôR ~ÁÙHGìŒû²ÙÕ‘s¼öqƒzaD/ê<Û70 Ös ö ê'@ôR ¾+�¼Î—s…3—Ò *°m 7¨sAý‚R¹Ÿ×Òß ^Ë3¸¨s@ÏÉJü<?Ž'{ƒz1D/jŸÀ$ƒ’EÝȳô$Uz(¯YÃ7¨ÑKš¯èE°t ,[ïͪfàÞo‰Þ ~D/êX% †PI"Ý®ô×UõÖVQ xƒzqD/êXG HpÔª H[TVϬ®Øc/À ê^FôR öíl©ÐìV+Ýro5SmÝ‚2¢oç¬×ÔÙ žÑK:ÖÌBzæfë ¬„3³ÃzÌâß  ꋽ¨ùÉ@Dg·[iÀ91žë‡ûu6¨'EôR öµëmÀ¦!Wr_x´‹ÚŒ.k„vŽºAý ˆ^ Ô¾¦ =-Uåß´•Qö=ÂÀßcPß ÎõĈ•@Íe¬I ı_ÅF`‹ŽXÈÂ7ÏhÝ Îõdˆ^ Ô9“�æŒ`iY#0ιpìd Ô‹"z)PçÎŒ¢Øƒô�t{ ]:f6à ꎨý›fN\ 2,ÑQŠ{Œ]<æqƒú½¨±RàÈuÉ ¢ŒUÊø=hç®áÔÙ žÑKZþp9ªˆ © >7ãâ9,sàõž›u¸AÝÔ úÍÏÙ7¿¨å<ЋÜèkƒku¾Ñ×üåzƒ:êM(€×ƒZ~?¢�zPÙáXm­öÀ¼÷±±åzƒÚê5À9A-¿×£�zž#²Vg¯¹ÞŸpƒº ¨@4¨�Îjù] o9÷Ïkõ8á¿AÝ ÔrúŸg“ˆüïÌT�3QL¬ÕÙëì\ àõbˆ: à| –ßÎ(€Ùè&‘ku6L3ÔÝ@=9¢Š8/¨å·<ЋÊN¯aißÚ^ó—ë ê(¨'G”(€óƒZ~3«�^øœ·VÏöÜ îêÉm(€s=W~CS�­»}Ñëѵz†×áu7POŽhB¼þõòë-0IçÐÖj/{ŸnPwõäˆ àœ –_³R×'ü=³V_ùû¼%{ƒzAD“ ൠ–_íQ�=¨LxµV{×Ó^ïé[®7¨³À‹uÀù@-¿â)€^¤vz Kì_ýš¿\oPg€zbD…87¨å—3 `ôïÁsyk5û÷È{ç*€ÔÙ àň6À¹@-¿¤Á<ŠÀNçh­ÕYkl®ðß îêI (€ó€Z~1¢�zÑ›ü>,mz¡›ù¾Ør½Aõ¤ˆ* ༠–_ˆd¯²ÏíôþèZ±Îæ ÿ ê^ žÑ„x=¨åç=¸Ë¹žÇ‡à•Ïç—ì ê¨åtÏŸ <GÄ.Ë_½ð5ô^ƒó¼Ö¿doP?�¢Ž8¨ågC_ŸtŒ3øú¬sÀ êá žц8¨åKú2ñÛè8'fŽ|Ü<Á¿AÝÔ#T�ç�µüÌÈWPŽ}ö¾Ž}ßqË÷õ„ˆ&ÀkA-ß:ƒaÛy­žOÈoP?0¢ àþg¹Ð×µÇZýôÔ‹(€ý Þ_Ùý¸ŸTY!Þò?îÇ­�îÇý¸·¸÷ã~Ü à~ÜûñIÀ­îÇýøÔ àí¿·?Þ’åù;–mfú7ϽÿM'¦=èý]_ß_ž)üúòûïoIÆ÷W¾žãíçûÉ×ó­¯aÙfU ÈOâvoi«¯WVÊóÀ÷ëÙæ¿ãúžçÙßÜ_Ž/Ë\øçkåy}oï\‡Æ/× ï)³¯×�^Ï‹CšN+Ïs°¡ôõëoï)Ÿ˜xÞÞó#žo.ȯy¹‰¯Ç.ïy¢¿\WÁ ÃõFñýþ–3½á_ Þ¯Èç/Ÿ¸~™ï˜ÀöÁòY°]ûr –eŶÏ_—Ñz5@þ·b¿Á·€²]Èò=‘¯àý:V<·Àç‚\.ïýzÈ:Ý ~í‰åûú ßôŠn÷A®õ¹H·õ]HóÍç÷õþ=Ïd2AÎó¼ï‚ë›Égàö^*#ì"é÷¹ÈÀºš9<˜S>ªk;úb;>ïKÜûC„Âÿˆáx*çý˜UQÉÓ0‹³ýî|^yüô±Ú›ÕR,Ú6mÌÂSÍ>,—EËA!‡ y‘j½ç'.ÖvñÖÙ¬Ðj ¶š"i`7­·^3$eµ^«µ†ís‘¼‰qfa±Ü¸'X4®Çö{â[l·Ç¬÷âb}Þ­×æ!Q+±Ý…Ø÷H¼‘Û5,"»žÕ-–œá²y~Ì3"VOzI·ŠÏï¶þ¾éu• ëÅx®êÉ,^Âê(w ×ïºeóü`ù~ž^çâåR×dõ ·›]<îþýòM Å·¯E€(½ÁÕ«cÞ—tDê½/¨søë¯?ýéO¹SWÏR"HÜX" õF×GéU¨äb7¨Jø|žc5¦ù»3?À8ËæòçJés¢àv¿¿ ¼ < Ëä9òd¦Õk_¬ÿ‰òÄüoÜnV ñ]¶wkyD–>C¾ØïÀÂB­"yùéþ§TÖU̇$†¡1'"ñVëJ´‰ÛP|@YãKc!±,°Z¤Õ2­Vãiµ ÑÆÌ2 Š|aD¾èM÷q—ªÿ@|¢ÍGzžŸžHohÓÃä³Äj!Z€jïcÑ„fó ˆw@îÙçSKPf¥ú©“µykÀ¸%þgÞ—ÄwBâp`÷t$'°}†k¼ì[ª®ùBÝ^-ÏUŒ(¸m¯üÓêym8—çzX¾óm×ÜÕºn/´Åôðô&©G*ý-®åóÈeÍQyAê]®å‰cùÏoÀj?É¢¯”/2ÏÝ`…¨æ@î÷Ã/®ˆ&l¹a¦t… &´*/í̆;¥)7nt_''BbP,lØ­‡}DÂF¾²¶RyVÈ”»LAàaÔûeÆÕö*kX)–Æâ]?«9¨ÃØÊóâä%pîRõ: g­o¤ºOé~c1–޶æp%0[KÖ蛟?ùÉO{J5Ìj¹¶jn!ñmÙ´9и™x€RÛg~Ù§rKl_µP(Våö^âs›ÎhdqFÂø2 ‚ÓàÅÅ]2�46­NQ4ƒ=±ÚÕá,@v¿ÛP "ë`ý¦Èõ“´@%ŒÛw]T¿âiBÅ9(!‚}–ù�Ê‹P/pãä:* °ú —šÀÙ[b!pž•;+bÝÙ2F3g5([ž�+€žÀO~üÂ)lž@‘f†¥øhšj,š+$]µ¤ùˆåX\&ANQWfËú¦3WŒ¹¨…àŒ"åDÍ’Èù�²”ãŸXÌÇÓEËâ,ŠŠÆÕ}æn,BMÐáóÄ¥žÂ¡îªp+EÌ\Qâ:T+MÁêBãö±f‚•‘b…RÂP©ÌU© ±Ù$,jVRpû{Mm ˼xì"eH¾`À0¤! J¬ˆ5¿yYÈÃÈÅr’ë\ï\±ÖH]oØRÝ9Éï–Ú£Ä'Oa’Äéö ª¦Õ¹L# Þ^ùñŒ¦… ÚœñM…;mJtOÛøÌÔ%{S嬫 G9Hßy0»Ì–Ø.´üøG?B¬\ÛT¢¦+wž@ÜY¤©çOJ¾¢Ÿ!%‘9<(•…R¬¸Ðh…p€uê¦ ÑA¬YYÓt«ç³zK ‡W2m„OÏÑTÒÆr‰ðŽŒôAT*VKP•Sˆ$ô+¤xŠ§ÞˆG¶ü0M!i·Ëe…3„�¦$¤ˆþøº(â;Z׎ð%µ¬µB²¸z!@Hg¨RÆÛ9RÔÜå.P/È‚4ʼêr2¼°µPä-„:M[ªì+óŸ!Ò~ø#\«ÿ„³¸ØŒV«8=ÄŠLPªKM`r‹VªÅ3i$mæ2­ŸüZÿÀΩ橠"§Rn[h[øQ•EPʦÉJÖ$cÌA©�ñY¸UdržIä?A.bEžQWT‚¡ªÝ¦uv|ÔñÒÏ[ß?{;Ji,t£¼.?õ¸¢Ò¸8$¡Ÿ¼F–ë‡ù(®KÿŽøú/?üáûa0UfŒ0à—ÈSÓŠ…pl’jRm;W*¢Ä-5¢p/ZaKuÞR§ �/äà CIiñÓxNFžà58ÒÍÒqE¨PQÎÔTÒ¤?gÔZ>…¯šR“¢¦¯Ú™¦å¾]½¡Á@VK©¦®iê}Úûõ›”>³H7;÷ÿ•øá~¸z�€¼bk­ó†ÍU*–eÅŠ "î$¯s.(¼W”EÙ°YOÂ^"ÍY _r#åh€ÐŠÈ³ÄK8CóÒñKóÌËgˆuÓYN·²†Ik¾—zå(rã„JˆBáÞ­*£á©H\Ôê{¬y´Ž¢*á ¯jÇ&C£ÕêÒüzMð!Ò¼5AOìm�’e ûH ºïmqù ±˜‡P¸{]‰ºÌPjBœ®;™ •!3©Ñ—ét*+,Ä ûxCÑ=¶%¤ d$#ä—ëÿÁ~€¶£©ÖSòÜÈ/JÏõÛÕa^ñ›U¡s3‹s¤Cän'‘)i³Ð|w¥Qç€+_Ô<» ”_!Îî”&íK»NÁÿ^ á†ÛçÏÖƒÆ*>}7>úQÁ:–ÐÙíwH™@¼êEP…5òR·Zþã?~€¬ Pä\<(Ûå†Â½„Úõ*Ü s‹(‰;ÝqÖ\Â-jÀ:î Þ uRsª€×nÖ‘UCâf94ŒYUáÑ[(u¹uiÙ‘vg.rBÊÄ’±]â{-œAAU²ÈÛƒjI7Ûøî­p@ ŸªŠM‘<-‚ZFT2°´¹dPâÐ ¡)1¾aÊ E U.B}b¹÷£[)«úí3ÿãßÿ¸[ë&©¡Çá‹uZÙ×5.Œ¹ ì?-ñ¥%‰�…•a²P‚nz‘ߦ[N¥ª£ÛB¥Û¸^M:ÈJ}…'¹…+iI®•o”üÛ6ý�‰»×°¤({x¹¹d,>uXv…ä–+rŽ®mVP¸P#}hÜCIÃÚE/,�¹Q¦®`ݶ&¯áß„tƒÕ² êŒÒrŽÂJ±¹»Œ«"!eå•Iš­W)‚ E±ÁLfɈ‚ø,ÔCäÞjE&¹ ˆ„\´Ì~-Ù.œp\”èÛÓÿþ¦�tG<ï̘ÞRÂY’'QËeíZDä…C4Ñ<zâŠkÎ3« w²1ÇUÝßb0ÜjQ³y,-^Y‹iŒ ÎýfE´Ã×™çøw¦†X¡°Îºo/8åW¾ÆüFèQ•g¾C™ßÖ‰Hñ[•Y^ØÔú¦ê½K„ã·Bíªxꛟßÿþ÷1DSÚdO I’è‹H'èùÆ —r÷]­<×§îÔžåZî®þ–Õ¢ ª8‚q«ª©~�T%³úeYé `‡¸ï[[¿ŠYo•bˬ uF Y#bû´Ÿ¨  ÞúZ[K±©©({³X6�ê*puؾ<h³™zÕƒ“oÙ˜ü"ÔÖG“,eõðÊ¿ýÛ÷q+ �B/n(bOÀêfl¥…Û)±ëŒ^\¡å˜¢xD-ˆ¨b¢ú¤+\µgái¯B2dC勨†Xóù(4´(o%ûØ -Öa…NbG í Pèp²ã9KM™ Írˆ8åJÌbµTªZyº h§§B|J[l@ös�cç‘Pš½ªTV±ê¥°òîzW'nžwák‘î‰'°h1[e‘i¦€•îRöŸÖ½¬Åc”î¤Û鱈Ö›Ò'ÖÏçuëlï!ɒТ7.{ÀŒô7 à߯[¬²«pê—¶*ЦïÖ ì‡2fîÎë»eá %”]m­Š*§-N¢v¡hµGUá?’—"¯¿ÞR Š[¨ö@0üë­­Ù¶­»â7©}¡Í8¤«ZìÒŠ“ ¾=%mjJÒ®“rvk²BŸR¥ÑJÑýyÔöiPv¦JÕ;4¢k_Ëð&õr•¼AÝš@ì%TzU”ôv¾ï}ï{Sª‹ã{_áP¦=TÀ’¾Íér µÁ‚õY¥ÎzÔ¿.Ú{¸KözÆ÷èßGöŽ"Ÿ0µl-üÁ[‚è‡k³ã6¸~p2(J¶è{ÿú¯[ Q«ŒXõtªX ÃÈ>Ö̃žŸ¸I´^]ZͪG¸ò ß¹™¬*Tø‹Bï·¡d%Õ¤ „ÄeÈJöxºP–X£ºçICØsRŸÏö¡EÛ �* GÙúºµÔ¢)[Q”¤**²¯@­«—›ŽeBµªw7î@ÝÔ‰Ù-œ*¬•åÄ®P²Õé?Ì+µU0U2\lûGá;#A6ÿ`º@CªV.E´ß+t§.’ïc±ú4õø/ÿú/H÷<ÐØ‹ýD÷žå°°ðm¶)r«/ˆ,užuÓíX \ñP‰SÜ5’Ûw é—¶-\ë.³U{ñ$­ÌE´]¢\ÉÚë — ~DÔ÷2 ßÚŒ’sa.ö¶éŠv«©«å¡:}Ë; “ÎBU ´UÌ­ç)2N ²êÓ'+ÝHå“ÏBJ÷Q¤xIú—v2Ú‹(ÉeNh–í{E‘žEòyEl¾¡=ø€ÁµW Qd¯ÜÞÍÉãÂx"32x½î D^û�b‹þ›ø—A¶¸‹×ìFIU±þÚ~ã6º#¯™3QOe¤m„€×Y"^±·ñ]$W¯æ§´ö6ú=ò˜@¤óƒQ¾}£L±è»$ŠÖ)¬۳6߈¬k«ÇÖíÚ麂Š'Y„†/°’sz›$cí+Í6¶mVmlc»übëKíÄ@ -æÅŽO“á_¸\K*É(:+ùu–O¥ðÝï~›1›ÙÉ&PÍ` Zûø­0F ¢RDƒzž¢$€Â·”¹ÄFj®/Nƒ4'œnÜJó®'²{œÒcä´å»ÿü]d-¥AìFÉ€ËOA†Ñ·‹6ÊVù°¯wêvÍ”KÐZ ±€dÎWKбR½)]fø¶P�=â‰ærÅçWÛ6hw%±ÕŠñ/eKkÒëà ²äQ´8[òÒ½'_Ô7[ªðšð(U-‚V «*Û\Z•9ä\•^}³ˆVn]!áX»…Ã%ÉÖBá)Duß¾euí¨—…óö|4•úõÙú§®ºñmÕJRàêö`U‰Í+J×ô i²îb£ NeUË6Ñ„pôKÆ"š¤î½Wþ¥ŽgAÆu ”A#ŸvÄò°¬v×<3›vSÄfŽˆš]±C@Lðžò”e½¬4 k¦B§Ñ=l÷È…Iv˜±ð —SEz¨ôç£<…Òtä®9º¿ò6銌“ã†Xo¹7x­ÖØV¢èèÎÔm –lRªŒõÂak°°œó6‰‰»(8½þùîÉoÀ?±9l²P©‹7ëpEMòŠ^€ŠLÒ�y[iZ?ߪ¥=2(GR×OsæÛ÷Q×ЫeÇ=èödžI¨‹·YE‘[»Æä(òê,GL‹c”8�ôžð(&+5 |ä[©Ï wª•<ÄÒ¯d±Vá 8”Âêæ [²xKnMæÅõÀJp=Jß"ª¥ÄÞ ì0 ¹IoA CÒWÒ+G¶/G¸Rlÿ ˆýËiËÿý¿ßÁÖІfÅ{`‚¯¹¨ qBC:\&ÍÿLoF�Ÿ——ÛÑwX×VÒv¯éØ÷¥¾I+œj_ws¸Eb&HtyùJÓºâîQ4 fÚé^•\ }ï·Z#ÙŠƒbY¾óï @Ô-KݯÄé¨âÊÄȺ~½(¹Wkû¥Þ»¯h³·¨Ucc•&7É­tz”-Ó??û½ÈqÑO*"­¢B ›lÚä«Í¨ýŸB$›ÚŠÜéZå›éõú+‘©Mó9‘Æ~|S�XëV›¯m¤_ó¿ÆþmmãŒi,M99´FÔ£W;ÍÉ~|mË)ãòèZ«@&¬Hn�µÝíELé!‹ ÅBT'ýhE&P+U¯Wñl½µ˜Ï¸ {ôÉ@8\ëâE¸ ‚yÝ=/Zbs A+œ>ˆu?âœ1¯‘Q6mËxÕÂ&.ºU])t£{c�-*°®È ëäth2íY$-¯MBÆË^ŸR¥¿… Î×½(ÿøÿˆH;ôqE­~"8…”Ë¡6‚æÉ™©XÝM)bqÒM´3«Ø Tû²õˆ¸ øØjº �I{ª­}Z]ç•¢Ü6'1Eù�Me_?ìBùíÇ€mpá[¢KA>Î\lN¢J¢nÛ<¾'¤­ð«ŠŒèšBÙY˜÷úGb¶Ý¨„U' •jSÀjù(IÍMQ,À­c1o¯F¿>..}2èU4Š‘¹ æ„,°‘íPF¯ªtI˱Â{7P¾èëýüŸÿó¿ÅèÚ"[]IOuSŠÜÉ "@ÛMÓâVDAV²4ˆ†ÅKIÏ‹tÎýƆJþŠLXDãþeë)G›O€x?Ṳ̀¶±æ4ÖŽÂ�¤•9-òÐ mèâbâSL¬ºÀ˜¢]7¾à;9CG÷Û“ <¦Ð•¾‘¬’ ne,;I“âšBwû›*UJÍèÑÐD2Œ¬´¬6«Uн>²ûUÕ´ƒÈCáÚXa}ÇXÁZ1€Ø¹ ¼Y Šôê:dDÓog+ÿûÛÿ5Ê]aaÔéo,µ'í’X:šÅ˜}*µ48;ÝÙ€Z›hËŶ„VYºI2ëOºâMØŽJMIÚFm¦r1Gé-IxÆæÊ×m4µÉHdÀ%]ÌèÚ{½æ"ÖþH±CTi„¡Vi*;AY™[rÃî`*¥#A– %cõA·æVIºzçhùö·¿åÒÍ›yÎ'¾ëçÍ:ßg‘ê}ÿÏñhuĉµ ¿>¥h6ŠŒyOõäjda‚÷ò´½ÑÁÞ©–oW‰Ýbtƒ‰pµQ2_ô–3ÏZêA•ööT>Šº‚ ¾,j 5vß`Ńy»¨¿¾}75ɤ2úêa›ùޱî|'*ï:„õ Xb› D;YUß<¼8¬Q!¢0PÚƒƒìñ!΄¶ä0´BnU_=ƒøû¿Çz‚.mÑb–ºŽfQf™×I#/­¢ß`©îŒl;vX=)Ä;ð¨ã›ˆsYõ€Ò&mà'Èüše@£¥TUqú0É"¶”Z÷½.&ºÃ°bÒeypÝÌUïóVß['Œˆ%§QK#Óá vÑÙíÓ Èé¸öˆ°:ÆUmÀŒ®ÂˆŠBÑ÷Ô²ý~Åz¥¶mX—pºñ «màÏ{ü_ÿ¿)tHˆÐ£4RG2¯¸¹r(èÖ]Zi¶8çEò([Љu`¥£ ºÅJÅcÊ`ã]ªM¨¬ûÖ–©Ê ²"R³°ÞwÕp%>͘z!4Áˈ‹(—,9€Þš€ÕÕ‚w¬ì4¨KÒéÞf™µô(ÔÊ 6(J¿ÄuK¹œ ÍOÙLAöÁ¯Êi†cSX܃©½³"x!Ð&ÄW¹>¬4Òš1-ö$çÆÜužŠ•ûnô9rM‘NÌ æ2’ø›ßþîïþ¡êA¶1ø¼UWam¨ © ßòÃb1Éñvdo3›Ä³,&–ëÇZ£—½ˆÑMÌ×ý9H}aážâ¢_Ýst:Œ`zÙ—ZD‡z¢€ ðôLáéàib±Q©ð6e¬Áeƒe Ôéª*ï^x¿„ŠÐ%c̹7Q8³]·à‚X”mµ óÂR|t³ò¶î¹wYÄô¨"z12_•¹ÑñZ,›#¹`nz~m “Päb?4kG{Ð T (Ñ–ò Zijð®p¼ö|S�UM;r«(§¦n5ÊÀØð-î)LÈ—uã­Ÿ9ë?/ö Ð1GˆZE`»³hã �ÐÆ&VÚQ䇕:rê–²jäî+hå#(……O¬EÖé·ã„| Mi;Øèè*¬•›À—7³¥0Í@›\¨K³h1 k,vÀõV˜â(¥‹U*oˆŽ[U”È÷O ØeWh7$6<·^¬ ™ ÍÃÙ §ð±dVJ¾VRxÚfØå‘`5XPʹüíÿ÷·È�Õ6W Ö–J (éÞSÄ6K‘ƨ­ßq…²ÅTÞÝ•ºÆUî¿¶îtŽ›ó'¢ìÚ¢a)ŸÑA‹ˆ¸ð�ˆæ–uDY? 54m´-z¾™Ë'ïØÁj5X:Rc½eóŠ¢'aY ·ölW&йòýuM«µ�Òy×h©ŒS)ÛÛ…¢š“v¤’›Æ@︴–¤nR "e^¥ÐÙГڣR›ÔÊMi²ö¢š°]ÏwÔg*“¦¿$-_þöoÿýô‚5.ƒj7<1HëhCªÙŠ‘‡5§{“…Æ@ãEz¾WÜ Šœr5ÅETÞ•zl·¼¿ªÖAjQl²Î«§[ªYñ=^P‰é"éÉP¥°H-6wò /òe\(ÛȧÓ¤Î6©zkÚX§3E ŸÄËËlõ²wVIhËÖf4TÒŠ‹p+SºÉ"¤ºÃPÆP·»«ko@ìtäë¸üÍßü zÙG^s‡F«êx²TÂxç0ù²©fó«)Ú9ÛMëb­<PZ=áÝé¯Q+Yï™·vÚ5Ñ ¡¶¹‹ÎÓ«Jś֊Ì*y¡íÄÍP‚߃õº$Aýz§Ú±þÄf›“£ 5‰·|oˆDc­3’Š÷ ·ü=°Ï»þëÿ÷¯±D ""So÷.qk?ôÉÛ±P�ö7ÞFVOOÒY`=åI’¯ ל8[Æ© /±Ö€TÖòÚìs((½}»ÙôRJÖHe¤ ÍZCžÊ7Jþú¯ÿ÷•Øöu¤ýò 7÷b|²žß°ÌLç.¼ë6§-ƒþ}AÌÉ¿¹ ÕG>šj›Siè–f%š,Föæ7kÃRC@¨ »²L#ÉäNóÐw™UºÇ•ò>ö)ñÆóòÉøWƒ=_erV‹~ŠXOúi¾ 5ˆÓ˜L£5<Ä:{®p°oŠÂ Ä€¼S­-ÔÄ=¹H½ßÛC~¦[r©µ@«nT-áuF?“‚ÒÀ¬Év5-ù@3ÐL:¤-"kõ uM.ï!¿Kþ$V/5¾‘B†äè¥¯Ž¢•–_ _µ˜pû€ˆü¯·I¾Ò/ï)5tJÔ±Ú Ê«‘ÜãÛ?Ôûe¬/‚¡2–oI¨„GQYàìÛ"C9…€VÕÀ@„V¯B ¢äJ-Ú—±DøF-ëƒÊµ¬¹XñcSŒBAV HÈ Lv!¨ )©-xh‚c)¡DiåÚUúuúN›rûÍ¥J¼!c}R‚Ð?Ù6L³lƒiQLHBä, ¥È(V·;¹ h9„™K,»6o­Ëïz㟂¦œÈ J™8íß±fØÿê¯þ ãît‘õyÕ ð¢¸$V«&V„aœ[vB)X5&SÇO)µld€nLe[*½²^ßå"«CëMFµw œ§€¶yÁ¶²râ¯ÒÎÝûlí̲$[zwUQ‹³H;ûÚDÖêF¥Dõ¾6Z>2ŸAœ‡Oë•^(ûBj—¡ÞWç…6¼BÏõê T›ˆü1òúëË__X|Ylšìi è5T:ÌJ®˜ËòUQjMVà‰\›“ùjÔR²¼çºi㱚5 >x.¬¼Êožyð&¨yR×®ˆ-Ÿð@Í.ÈB’ju±j6s#2KòõîÄJ[+ø¾Þþƒxïç•ÊSnÆÁuƒè ¹”ÏŠÙ«-f¸<¶lÌ£VBÈ<ÃÍ;ZŒ5÷rTiÚœªÐ×®N¤ÍÙƒ€Ê†<ááP'”G" Òñcû]¨ûÈh´\¿ô<cNO翪{õƒº™…uú*ÿóþ?X;f 4´„ZƒTj¼ðÞßÚ¸Û²•Ä®i/ÒfŠºÑàéL±±§òpIÉ2¢Ö`Ts=‰#U4ˆۭ&ãue)ÃŸ×øó9X %ÙÚ<!`õÁJÏ;Ú‹OóLoDlVmíF#Ÿ»m¾±m!_:ÕRvoÕPÐÂ[m£Ýöt µïÔá©lXk¥àrÓð} •÷¬òVba÷¦ÖÙœ¢*–ÊZ%/¬;½,¿Þ®¨üå_þ%Vnžê¢£«ÕÍ;¢i&ò­ž…4Ýø�^O^”xÑZlÛæcQ­.ž°€²f¡¼ƒ¦ûŠhÈÆŽlŠQ‹TbV Ô5ä lŒ¢; ±¤{÷«ÊHäÓ›A+½õØX’­)vBëÌ%Ö–5eδԆ©…x^¤‚Š¡ŠC圌tÖ6$…WóѪV,|ª5êz¦6Ç"ULJïZ‹È”k+Tºx+ˆÕdÕ_üå_ U‰µBmŠ*ää FƒsÁ´¶ ŠÊ¦Âû–i lSm¤o F)éÄ ÎH@Ñ‘àRµ±k-çiÕkÝ êýÞ2%*÷ÿ“ ²¯b` ÛÞŒP-žª)1íæ+vÀi8›ß‰ÐÊt›¯&'uu¹"ÜPc›3‘#²î~$fJ¡Uaå…•´óð¬înQ;¯Àß%(}4ôŒoÈJ›u)Pž ùú*þçîOB#‚ ‹«YoÚìö¢=NÖ0™®’BŒ8ù%m[&5?…Äb´[ðvÔâ({Çé¸t±a…M`£[påviÙeVM/…9æ&S|×€™ÒS3š>iÅ),z –XÝ!ôtknÑÀ4U?tÍ`Û†¥Ð©­½ šS#ʤ±Im]#b ¸ô¶ÕÙÅl§ÏveÒT F2[ö!ÀuõòÉ_4ÒŠFR,6µ³.›¦n– +´‹Íª}X7\™¬ÅÙ}K]i:Ùd7 …(‰Cª]lGá&†¼ eZx›nÙ bx%±XŠ«!¢’}ëdá ö …YÀBpªS­H¬ÕºðíxºpãÇäÖæ Ÿúþ®·ó?åKÝX56ÂèB¾½ë!]~±ÛsÕÒ¤#ÝÞü�ÖJ쫲bë{ð�™‚CAºñŽÈÐTÐ®ë “�ð™•ï_åCkíA:£J?VÁ—„°hÈ×%ì©2Â÷µŽ¤ŸÆ—Ç'Ž,|ÑH¬³Úˆµ—ý SvˆØƒI*9w|bŠeUï|²õ|´þ–;~/„7}àL}E³az~¼~ƒÚAtÛ*]ÈÉÚu[´(FŒ0ýsíƒ�D È$¬,u16*{¯ˆp°›|TÆ‚]Œ`Ó‘þˆXmweD`E(ã–ØX¾¤»$ H¨t²dʈ†×h´Tc)c6‹çó7…øþå>ä—SqïÂÿ€‡ê‚!!®ú?n‹¶*æCÞŠ®6b_×Ôc«Ÿø‚¨Ï/ö•¦AAÞPͺY}‘Îî>ªu¾¥ò0ë÷÷•!ÄÖƒR@Tµ¢c–ŒF”‹´¾kòaÑ$Þ”•~ÒŤ‹û]Öqsa(ÓK„ eÃ.ª °.óâmX•"=£ÏóàZó¤å»iÚ¯nû\#Oxƒ±½)*¾„•Ð|Èû¥üɃG¤EKë÷€rò™®f"¬l ªm9‘r(0z,6ÿaóØ€ýŽb -2&Tò_(ïûáÈG¯¯Wˆujrñè©7ôXJ“}Èî4–BÖW $ ‚ÔŠ¥¢ðQ%@Yg—ªòXÅF²lŸIQ¬ xþ(W=Ö+¿hÕd�̰ÖLJW=ÔëœÅâ‘å¢èª/ÌóªÏË+AŒ-G#^¯WÔę̂¦|/„x1 ù‡Û—_}ï<ÚȠ‚£Õ೪r²VªïF’÷Ô[”ã·©…Õö¾ ¸ÆhEQ¼¹y,÷/kXCEïíù](Y¦L ¯aY˜€/¸Äu «mDÉJu1´hå±p0µ,jú 2à,>[GA?xÑ6ñTÚJÅMI<Œ2`)±E¨å�ti‘Wxcº¨¹dÖ ’2¶6ê[Obݾ-§˜åÉV;êN©[á@KjycWàõº4íjí,£ECþf—umi{%P-F&Q?_Jçg”Ù%¹±E¸ôº ã'ê+T’ŸhT?2¸èŠÈt&”õì@½ÕÇÓ  ø2­~"ŠÒ7G`¥æE}ahBy‰íŠà(§àmØ¢³þÐúòQð…ºóRèâ}°ÂláÄ£ŒÁ‹ò åÉ›rDV»­t¥µ ¢ä÷üÕK{÷K×UªÂzøûŽd*í 3*aB Þ-EIy -s[|o‚µTØ+¡–Ô*ߊJYª(Èi°ª Tª1­ÙT`«81…r¢2Vþg­·×¾ \íæž¾Ò\͕Ê륧—Äj%ÝÎ$-j;{ÀØÄP±îÕ]"Z—P·Ÿµ¿TƒÄÛ˜v9)me‡zu]ÅV+]¡A±ðÌ'PjŶ6 /$ :ë0T{¡³ [W„Po‰G½òU�†Z¼$bl¹Q‡•q×ÁºV#l°$$}ÖÀTÞÛù¿àC_­ÝÞö‰¬ß^ÄÞ Ôådö¦ÞÖh”ZÓcÀÞaÄD¢F8÷á£q/ØñF£5A}§Ê–¨98”Æ0·‡Øw3A1½,Ô¨€ÇÀwedHdª’Cɸ ÝŽÒ‘¡:ø@Ï £$¡‰t· @°™BXhk*8™ó c­Œ°}}NÂúŒ€Ô¡q ½ß×Ðn72œï¼fVæ—ׄ*ÉI‹aò‹’G4@ðNš Q°ã÷:¶ÄMlå ªÐXÜZ_8/L–¬€ ¥f¾ûVo<qŸûÚÆdÆnHÉg+ÏP Æz3£¾MQч ëÏÄú<¾{WðFƒ ¡B1Š[•Œå×o÷«~ΗÊú³?Öžùʉ÷^læ¼Þä¼h_Ë:x£°im Ês[+^fnKG:a5˜›÷v=-ÑSnÄænn«®¬b+¼Õ¹|·¢Рçl«"ÞA²š¨¢Hdöz.ÛLÏ!C6Hf-R"x<èŽmS[’%Âæe<ßñ ßá£:‡:W@Y¯DðQUÛL¿Rµ/FÔ„”Å á6~eIyÑê¶6WXq…ñ,Æ)bÑÅ„[!ì·²Xt½µ}C(溿¿ö6êE¥/?V¶ƒÌ?X²(äûc£¹€nŒyÐÂ-¼X…<˜`<„BY®K«uB¡w׺‹ÂYû­7~y~ðA%ÏrÓ·R”‘Ͳªæa ë逶ÿ´^:r¨X /"rUîö$3Ø$"äŠUë-Nq|x|ð¢×|,ßaá“‚–²îeŒ™àýéPeä› YkñÍxЪ:.«¬dm ³Ö9e¯ˆá‡È*£˜V¸.žB­�ä)D²¦c þT(ôܬ`¥ž ³T‹™~DÀVÍg¸ÉÝckòŸH›ÿ¾:N-%UDV Þ÷Ö`tÚî×bÜ¥Ö……ªv+n ‹Þ�­Ç( §´UZ.VíÁFz ßÌ\VoÆË Þ]KºYí¿˜cRU×qâõ})>V%Lá-“~êù>¼¸ Ù2!ùvjŒ =’–q›²—;õ¸†,ê­òtÈׅlÍN°h²E ¢XÍIyK>¶•kê­žìÊjç©P‰ k­<+B|÷{6쫆f#°»QÀÜÓ‡2T㱎mz ²¶Üé£ÔŽ?-X§¤ uÉ„²f-ÉÐÍÑïHû¯!Ѽ›[™vÁÚSü©%¤U–Ô”ÐÏx7w¹¨¬ƒ.«Eò�6Opë)PÖòŠ7á©ç!’Y‰Ät?žu$|B 5C4Ðàc¬x!#ß—A‡½Roé!}ÛçÞ ÊGéù «ÞÄ­QëÛX2ƒUW­°ôj©Ì¾“î%:cð a˳ßãZ$F*Ѷ6iïßɶáè!¼¡-UýÕC.´â×JÉå;[Öö—u>x`¸.xÚ¦ˆì¾B²¿ù¶ó¥Eу-‡ÑYÅFê·Çù©Õ×òùU c¥­ÙB}¬+~^ rpË9ÓI¼ëwú`´-:Z-Vê¹Yú+6A’’|¬6ò±eÇʲq£<ݾmç$›:³z>ÄÂ=…x³z|Ö!Y†Kᙸ0=¶>}BdÖy|t—åR³O.4ty¾þ ãÖ–¥÷t7ÅŒ‹¢/…•šó1ŠÔ nëW/’n^Còù¼ÛÑx”ÇÂlÞÃV´îBÚŸ‚Žm['“ï7ÿòAËâ‰û»î®¤»ÅÎÚwQ@±Cp Í7Y]×c…pe žtµ`XDñ`qăª !÷X·<¢à¯pæI7d”‡vb1—½×¹ÞÏEÝéux棬_áÚù†¦jËãY&\Ö.±k¥qà ™A·�¿5ÃØšYà3ÖÝ_Y-ôƒD¿ïVéQõEGFæ=¨<€mÑÁ-œ(ÏRÅm² ÿ’Ù¹×ïY_†•Cóꀖs#°¬X€u<\½Q¾ Li�oeM„n+{ÿºdx'Ï=èÖoäó$i¸WÖšm"d‹�½Ý‰»ëúÙÆ?X(…ϵ¿Èƃ°<…H®ªp¿¾ŸÈÝûÀú,ÞÊ3ê¬ë—NèÞv³nÖ}»–eCÖ²ãs14щ¾ùò@ÒWÉ—O7ƒmƒGâÊnå¬l#)å”î0çüØÜ˜íK¤ Q„#°ma-Hxô:{-E}< ¤ž(QÕvÓuáCvwç•Ú¬Çj-+÷ž (ݨAG5¯&ˆY-ÛÑðê±ip$[O·b²7D·oÝ—žDi‚òX;æ<ÈÚŸ`ói+kQt^­>pkk¾¶ü­áè›­±'®×‡?VEþõü’_@¾ÿ}jŒ z &1dŸÇƒô<`Äð­ç‹÷V £vžžà6ìuQÀ…5õ”û¤L|q׉Ú[uݦõà9˜§ñ~<Þ1/KÙýb�åð…Æ©(K,ÐîÅÏ{ ,b_‰/ÚZQö`õþÕ^s¬†ªÕUÎÔt³·óÎë_…¼¡bUlÆw}U)P† m’‰ÕÎ8æl#ÖUmÔuDd‰´Ê“B¬jÜ径ú·z“ Šrk¾P~kÍ£0nŠÝûnuÑ"S$|W!Sx•ÒQÒ«@Šd6Þ×íaXªn¿jó.D¦Èf¢'Š6t[®°ª’?¢† D奶¡Kö uÅ(Ê«Ö`kÛõå&ǯ$àwÉíš²¯YpRÏÏ¿L¬Èû"nrËòY»‰6íËgVhcy+Æ?‘Ðêt€H=‚LlÓ(õ ¾eÄK½±f½GÀ«ãÚ™ÔŠª¬.'>Œ-½P§çõîÇ2;@B4:)„.l£1‹¼ Þ—CfqêÎhnÂQÐzŠP|ooŒÊ/Äú{_]paÐx†LÇ׬˜Ë¡¶¬’@¥–c­1oÑÖ¶z Z„F-v¢­‹MWÃ5 -…Á’Nlo­ñnn6Ÿ‹æÊ9ѺB{x„óYÕvçfÝ)ª¤v |h¦<3u¯æ:~æ9ªœ{5¹ù’ábÅè—•’²FÞøEƒ ¿dÒþH»ì–L °v×EÆÎÒ<Êx³ÔU¶îÚz®ñóéÅœv©ºRAˆ<Œ¢NÉèµ]ÕEFTk;ô̤¢d9@ª5ÿ»u ðÐ9\{a+ä'eUƬ{ío»BVV®©ÒñØÒ�^É­¨pŒ üRJŒ.ñóJªý9ìØ©Œ`#¬ «XI–墹XPTã±¢—Ç¢ÈÆ÷µ$XTS ¯©}\/SÙÊF9ÖAÿÏÆ"…Õ¡>ª²WÜ*…P¯YRÔÂÓxK~]¶�'·…J,*?¥ÒZ)\»ÏÚEè´›Sa‹µo¡ž"ÊwIY5?eÑ‹ˆÐ¶Æ°Ô‚јt­²XR¹HÂÆBRÉ¢šQÖ”nJøU;8iPD%e%c�Ïæ=6—3¢->S·k:Žë0Ò%A—+&ÿ¸ "1Jí)¹\¨Êåe¤¼¶c)šºPÌ9K!¬¬¾²_y5–ê<\ÿÞúÜÒÇl±XKŽ”Vým=âV¦üQ…lø#m0¢4á@Ù²[¯{<HËí%—ü؈:pq ¸°*„’E#õœ”CJàkvd« ÅQka¨ '‚Ïg lß˃ìA_‹vÖuÜJNË;Öl>Áš?çUr¬·n³´ç+û 4kPžµ [¹òÚù9°d6šíY‹}˜—ö$ƒq+Dau+[1QíM°f¤«2ÃwÉd,ªvÍbm†l«Sy®¦Ç’~.u)2íš„dý’¬¯[ÒÉ…)dn ·4 Ð$´¦·–`D³1EN+¤–.¢›6gú˜ìx<5ëÚnkÞvYÚl‰k7ËñÌq¯ÍHš†lÈ@fe‘刑f!dŸ¶wO·¶èeMQ>–t%-Zヴ [uÀƒ ö M(YSÊ%•H`Úœ5ŒtÞ ÿ¾xy3’M1[ÕŸì­±¸lJ¡°,>¯#§)U~ §áDö¹±þD¾gG‘ì;ØZh/„´œâ¸VLäÕ¦›@RKOóêŒ9ðÊ@fÛȘ¶|°DÔÚ·ŸôŽ\±#Ù§Íù¯Ç"©Ø£^у»Ð[þ·Ôù¶7£qeH”òÒxvù.dSØgG Dj9 ëXº0ð‹+r #lÕF2àp­.$fç±° Çš#^+”–ñZDÄS ÕZëJäîúZ5Fæ<y·µhåR¸ËŽ€¤Öú‡åž6=·5É/È«°V‹J6lŠ@–Y+óÞ—BŽÇƒ¥Öþk©èV‡\XŽx —H«(šìÃ÷>ó«µff,=…´Ò‰¥^÷üÿ콋’$Irh†mŽÄ›à‡€$€ûÿŸ»9×Û™ÊpSU3̪®žéYt‹ìîlOUf„‡‡»›š>‚Ô˜ E–'ù öþ¯ëbn&Ñ^ãÁr4ÎȇUÜ“«¤‹ÕË@θ8&+q‰i¶b{2ª²Wã¬î ”'?_Tîk¯ò˜¬ö>T\\‹¸Â¦´HÛ—2ÖÃGS’Ú¯Svp;wàç\€&…1§Ì”Óûàz:4£¨kWØx©U>ïÒF4Kfš$jÉM- dÂÄÒú VÑ"z> Ò@Çê®5»¶… NocßÍJ/jèâG +¡²v¤ëcÁ?8¸£.·ò.WäÝß¶¶ª)Èȵµ9¶Ë-ÅÁ¹…Ya"×BŸ‹E] h‡S‘°E2Æ’¦Å–›—«÷ó¶gÞ®!„ŸþØ,dw®±®ˆÐ´„„ÊìgÌîm뱘9o æœhESy*ËžÜä-OMæ›õ-ØA 1Æþô│٠ÙaÞvSïqlÏ ­X¾ÝÌ/8µ” QUkt‚òô!˜ún´ÀŽÖõ9µ�=æ üõLézù¾†QX Œ2«¶UJ$Y£µú@2Êž¯Ð"±O(±Lp®½ŽžËŸ' ÈKÛŬùÀ°òD.ÓJ '`ñÛ+ôq¸æóÏ’†=¦•ÇÁ§»‡“Äè7·x' @ÛpqÓž ›Ó-CΤkì¿à°“ŸzSǶÐ~害u¶·:s<7ŸwPUÒÛÔ×g’û¾7æÖË.XLm>öl§6æóÏÞÛwŽÆ¾Ì‘X°D:Í ˆ#ê>å8<éèçÁÍRÝpi¨Tœ9�è3Á2îÜòÞ] ·õù}“w&ÿ2ŸÍTk‹!4XÒÛõ/£ÉÇ{&”ßÛ×û"_HÒ×ЙuÌb #³þBƒ'ÇE‰’wRÂÈ<?!f‰ée/†]²LÆùMZDé¤Y—róÒ-¬ z¸nt3 ‘¬çÜÿ¿€+éÞrÇÉ´¶PfªÙ,³ú9Å–kTÃ0‹Ã"fm ¨íL¿”n'ÚbÀjH¾ñá'vÆà4Åš í(‡yˆa½Á™ÙR׺ xüí—KÅUª“*Ø!é9R÷GS&·chµ@ãE£�‘ˆ-VQªæ”ê í÷B_fˆG@µ¿8‹ÛvKC2¯ßqg•Å‹ µ¤¢¤–uÞµ¦ÙÇP–WÁ=/ »8tËJɹHR•aMNÂ.ö$°þò ³õÉöøËEêÌR P]½h9d�P43 0\ÜAÉÕÞ”"°®j®,ë4 MMtjûö°E °3Ô©Ò …:I­M‘;t èñÍòûaž…ae©AQ]0ÑÄ* 9&]Ù—Kg¾û…WÏú¬ *€[5oà>Ø’èÚ©6/›=ݯv(Ûe'RØ`i*‹§°$‰×°Dk]²Ýd¿rV2n´ºL'6Jž¤BÅe_$&È„°Í-·]¼sÞŒ`é@¬ ÜÎL‹ÀI 6Ý.;vbú¹ÏqÝ䵯Y1¹_ε;oc¼®1¿ìÈ\v-„—ùE¸74##³(k;.N©R±Ê@>ø°ò¶Ö’¬ÃÅWIZØøw‰±g‹5‚OÝSm8Q÷ r¢;/rûãÂU¨¨ª[ '¡ùþö¬b·!ߺ\¹»bR,±âgí#ÑB¡Ô� uêl–”¡| ‚b¾!#¼L!G}ì­õéù…[ÑŽÅ)ÍZ“¯N7aæp†Ë%1Fñ¶ù(–\œ} áÚ5IñŒÛ­°`¢QJ‚ñnž.MTÞ‹ó!ȉgŸ˜7Q—†Ùz>½ôÉ–V/‚¼mY¬gÏ’Ýßßm¼««P\Š}JKH—ƒS–XÿŸàçnsŒÛ²˜âÜ]ušÒVn`§ÈüÒ¡ðŠ»}5.BÓ çEãmZø(÷ëRr)ëäVæ)׉zoRY1\f(âwq-*Y ÖŠæ°Û5CSÌ2Y(Yp=D ¯ÝüÙV ‰±Ôc—'¯®85™É:eÀi·y|§ÄdsDµPwéèÜŠ[•ªLœPëU&†¯òÔ-è`ê!LdH›k!¦]îê°¤�“eÜ¥·šc>£÷­å†Ymêa ²¸(Üt ò ·M!b jÓp©2mˆOF;þ/êxW-³EÓí6"ìkI’\›'G8¼qˆ÷Û´¢ÇÜûrQ_[äŠQ5Z…³ÈÇ­¹¥E>‘ãLÆ’4HÆAN§34Š'(iƒf<».;+]Dâ'×R¿fÌŒÙf!dz,g •+!ºK~^HˆP£ý¼ÂÚúiKÀ­H´ÎaÅq«ò(kû:/¯†’ÁX©þ97 s;öÈM:ÒölÆ Â½ØmyºPês¡ØÂ<ÿ.´§Ç׉“sÊáaê|—ôÊ ±Riíì~“ .@œeQ sÌa¿´£j’äAê=É]oʃ¹X‡é/Àe>Iud¤-Bæ“—Þ/eD?Z‚/äj™Ü›çöåÀr@Öƒj¶|Ãf¸«‚l/œ–Y9ðB¼þ2O ^Z?¹@%IZ|ÒË'sdóØåc/)KÌ¡7̪º#II6#ÝÜ� CiÊŽCm~9FÖÅ.´Ø©í ¥åG>ÀÈÚµý‰.Šl~ÞfÇefjN¶W¡p3ØM1Y­{ÿÂ>|€Q;£ÜbË3ŒP"Ÿë…g@#Áà  ¶7àâ\�æÌ×îêu¶ÔO[¡¶Qep¹¨Ž(à $€©öUJ�Ä®¯(BøÛã’2ð¬{O¹nÆC®£ “u@`ÑÆL2DPÄe¸jÌ ‚Q/ýú‚*|v¨'.ûvi^¢ÛX ,€('ßêêÑ™ïÂ!qSÁ®{!gIPX ýæΠ±o{l,[A‚±Öû¦²kõUlUÂyØÿ±DI|„/ÇÞ‹Ö»Ee{ù"G_ZÓÇè ,ŠAm&òìѶœMH^6~”â ô6~nFzoÜdäà0¨1ÕG©F•ldÈF¢ÛÆi)ÃzeùV0ÉÒzëÚÒÚP €Lç/fRBµ°ñ�6`ç,@ݑա%÷ËPÞ€"¢ÿ½*,…w` ë¸@ž*¶×ïåI£Ê¹îÉí$ø!zî^ãcÿ¬Ð½Ó¸îÛhv퓞j h¼Ï!%·àòü#%Ϊ ê•®Ïœ Älõ_jÞ>%¬ƒÁÑ%6¦åw$+Tkx…šÅ†ë58À#å„Áø.^?íÖ~ *+4³<‚jO®Öázè@*‡‚º�!è<Z⨼üô‰kÒec팊嫹cÖ®á^ðBg]¥zä /Ôþ£­õKlcÄÎÉ®v{E÷…á±’;¡H™¬Ž cfÈÜËxQáɯªgPœ‘r‹m+[tÙÁ7®õ ã•*gvšébïPæ˜."¯ƒ󱃼´Ø¾Þ1Ç%µz™ ªG`iÑx¬l j©:CIjN &k²Å‹âà¿)ïWºÿ£áUiïk3L›aÀ«‚‰ÕŒ{#*GË0š´`ÎH¸á0w7¼F÷ÅsÒã©OûòÇN^kí3o® ¯†kÆÀ)Ÿ>÷täʼnýÌ ìÞCç[…¾L¯9£á&×¢±Î7m„°inœ‹;t÷¬Ý{öLØ~§˜ƒ½À³Oß~®Ò,îtž_Tt“§F!&»/ó(默/š1Y]¤YGžï‰ŸÜòÿò†ø¯CИ³<w5$¢«Žïì(ãœög¶T‡œ¬~‰öqÚ¹ÉFnnl4„+nôÏÖ'Ò®»¥šßÒäò460r�¹Á2^õ߇¿™èsf² ¼6<I(3ä·©†“Þ,Ók·ŽŸÛ7Ó¼5Á#p$ÆàNŠù­ô‘V‡d÷,Ž N�ÓÜrXÊšdˆqÝ0{¼n¦ßUoQHÇŽUºŠ¯U5þM&u½1êöÉlœüq’ð!›‚`L°ò¿'BH¨òN¨¸zÅqå'T]/“t-êÆ“s@Ö"¨¤Ø¾ñB9}ûþå½õÔÒ݆•§O.Íf¥Æ©¾õZ^ <"C]$¬DËîÛL>;¬pµjÒ&³z éÕI ÜÙ e+_ÁâWp“N¹ Üf–û,¤±ä)c£ÈFÑ•…)¨.Œ‚¯×u•Ç€R]‹-¨'ˆÆšè�®G­}~HêëÒD6ðXVûìÒ8©·!²ÓÐ÷ŠY8ÝK?*"i?�c,l¶c¦ÄeiŠh£*væÜr•/’Q¨r\”ÒPóîÀ©ZÒh\\/º·á2¤º®©rµ–`ànV;ñðÁ chiµ;µx-Jªv²we8›"*-´ƒ‚c9µ-¥Ú ™&›…}y|U­òk}ünɽQÆ37þì,æÀZN¤¾Ò„¶QÌãþ³Vzó¶ˆ}¹[íÈÊæü– ÐÒ– e¯­Fy$•ìˆj§Å ®Z̸ÜmÂæô$ñbÌ„Jáã§1¤¼ÊÜî)ˆinFfä.!Dƒåä"m×!ô¯mõÞõâÖ·«…NpâOÊ®ž–ÖDE¦z»×Ô—#ÐãÞ›|(x êͨ`NÜxÈ!2¥gà‹yµšl%À´õƒ’‘0P�r@bçÍ*áÅiQhÖN"¹ôsG‚*š5\“0S}¼TÐX®èˆÌ—Ž8Nà€7á}ŒIµ=BŽæ{»Ÿìý;ã á~áÚ'Ëh‡:îÀ7<wÚçà%8¯uh&ã–;@÷#sF q�È^ΰ\¼ðË8°8bkˆ¡6À<îÌ1ÆHz�à°Ìˆ^Àû{æ6bë¾Z>ƒ*¿øNÑì£R%ßxžaŸÁ㟎fy`  !„mÁô$äjö˜'Gû3©Æ"wZN;f–�HÙouÿµÖ·'x¥R?¹ÞxjM“©€ˆŽ¤f!†Œ”ØÆ3Ìæé‘âõŽDPUb£n†¬Î:÷ò…à @%§lI¨b×à¼[@1XSI`í¹ëÍv§9¨ ÷8-©ˆèÌð…ëï¿p&Zk†ø¼AlŠ?»ŠóÑ{é)Fo:)ÁI¼[HYmáÆ)tVèdˆí±xmP,sní²H8™¤,W!Qyß9íå%Þ¹$…6ÜÙ™ó®ecJ�RÝwPž½Xàz¢Agfe÷C,±’ƒ[öQœH7i~F“9gjÈhODI R†¦ÙÖ‚šMc²}Q›A9‚‹-}yÑHò`Üu·òú«AõÀ½‡ßi.e)ˆ´’Î�=î3,ÍËP²(Òø8ÄqHq‹!JÝHÄ›ò@çv†zù§€> osXkn×ï hãå ,öq‡vœV\–ÝzÈ>þQõºrA˜| ¦g\.¹¹Á¢¢•>¨­—ÔSH©!žéGZv@¯TIJ#'(æ¹~½žà:ž$A·œ¾L‡yP½É´j†Ô÷K²B,Ë•ÔCÎGû9×Ì[ð„81¸©l¼MÚ±ú:h»æ¹¿ý«q–ŸKÖÕÂ=7�÷È.û1 0¹D;{>fO×b5àFÕÚR ºš¥VüñxoàÎÑAx%g§± §òˆèV`-å:Á€Ñr§´X ×,saë…LJ‡!È*ú9×çTS×–¶y×H1L°µqkôõÃàž´íÂ`_Š´ÐâQ·¸q‘;¥y iéâ¬Þöé„§ƒA…ÓŠƒ¹ÿýymÿ6ù Âjß¡Œ4{4Õš è£ èdã‹OûýÒqL1”&ÀÌD ´Ýót`µrN&šijŒ{(¨ª÷å”ÜÍêó !F*Pd>4ë`†¿Ôh†6[Oï¢{ú²¦˜ìÄÁÂðÄŽ;ÕMþWCtÑ-£)L&µ¨êßqEEg=íF+Âä}ÛS½Ž’¿myOýj¹s8a’÷y†w aâ…rV`ÄPÆß|Œ/rVg|Ã>c"BE˜‡8àLw ø1`µÅ–ÝŠnï Ox‚Ó´9Ë¢Sž ¿òãÌ;ðö­ @ñà»Ë cŠhŠ$5·ÎMÓdˆ!Jó«_­¬©M² Ú<3%F}üÍ“(2€[i‘]—¶¤§nªáFn’‘ÆdcÛeâÉê´RÂ0Cé&m×Og¤QÉ!J)&ÓdvJ8óüE¢éɆ!Bb X)#S¥Öæñ¾'_2ª ÍRlt0‘_uðgDy;²‰+û I6ÌîTtÌÍå]ޤ– ¹<ç b£IbPqYvWš¤á šGp;~åSîž0­Ôy@—ŒÎx½øU²Ô»%°äcl¿¬d%‰"ç\¾˜G�Q“Å7¼ y}t±“åáᶈ ¸ŒiW'>í»× p©³,{²–꣯,®ú¢= ûèJéG¬¬cˆýÄ•ˆÀ6ö¾³à«$#È2~`#OŠ˜VtФê—çfõQ也Ü÷$D‘À²>ƒ±µ%rñ”�Ë2ѰEŠOUÆ ¢n„•‡yÅiBâ"€vß÷…æ¨ä9ÁöqWºNCÏÕƒ`[4O†}«ÖÆA/†cé¼ Z…7ça$òóÙËä“§Aá Yâ­6ƒXƒÎ¶k99b“5¾I¢–0](+ÙBh¶B­`Ó©59ž☪§n‹qäRHrÌ[TGïš®¯•:: îØÂη…ÇÊá òyE§â@¿íáêg°ŸZ/"<'íø¾©‡Ÿ»Û¡Á 7Øž Æ„Ûãlàª$S ÷äZ ÄãQko›{ÔX®¢$Vk§�@B:…èÅòmö¡¼Ry"xî|97s´œÌÁËs€†GXÃ¥ E§!¹�^®NL²©®Å©ô×:r[(†…2 ½ÕgbP¾À€€2¯67ÞÃQ´™!ãð{j`Š'Ývúgè¿Çñcª‹åíàHý.Ý^Üà>÷ðÇ `’Ï-œdyq€Ž¡âɧðÅbý)^ƒ'c˾qC;±¡c†b‡#PñÅo|‘ѱuÿÒ 3k3¿±U5gÇ×níþ0Æ)ïÁîrÑX˜Ñ/hžäÁ‰H«oÉ6V±oZëèæC„ÿÍ «Õæ!¹ ÓüKo{ðI+»p沂ßבy�'ªI®7¥UF-Jn[ HËQÅy+vƒX çá¥å$cLü¨ì„¶Ó õžÁƒC(É  5J=‡ ;ù(*"¯ÜåZÇ9aºR´Ð­TcBgY1C0DP³Ø¼©m¶4" daQ¯WUV—8E 0+uXã®kðß,•óv¯—Bom»xUâaü‘&h± h¢ÊNà]|ÔTr„ÓÍd“hÀ‡«$)¾ ‹m4…aÒ8p½b •Æ»ÂU @ßmØ'ÿÒEÀ^ß´ã7 ‘‡q®&•¼|ôæƒp Úúݤ܉ n9ÿ“ßnN{ªùyÌ$âày'€"-àÖØÂ2M8Râ•…,òPç"—›…_]¶ðkož‚ÅìÒ€ \/ŸÀu ªˆöeÇ'‹)c‘%×Jé˜'8W>æú}ï†Þ4Ç4oÖ £ŸÂjÅ!8)îsv}¡ºORY hã h’¥öº FËg¿`[©%1„—°œÂzDØRÚ ¥5m±ÑµÉ/ñ’ß‘çcÅÇ~pë¨ÆÇ˜B`9 Bëse`&ÉÀ!†š34®<Ï“ÜBlqÀX l9?b)ÙLؼø²ù`kêˆme /ÚVˆ—b"hœJa¿0›ê~á(±àñVËýÇ5ƒ€uÎ0 ò^ù$r¾ÇOž€î+Ξ{<8Éç5Q‡ëßcæÀ91ƒè ÞÀMO[MÈ00éãàüƒc‰Š±®g4³–d` âÀÐßOÚ'I J¨9†úùX‡w 14Êé}É.‹t1ÐàÈIè³Cþ²�„q]wœ{S|/:×a lM¤®¤ý8u®X#"ÑRzñ ý8 Fð�[˜[†�Ægø¥rÕ-J h¶1KN<mÙœp¼ ,ÒQžA•´dUÔn–9…hªSÎL-:åk †5Á‹E˜+Ï1ÂÕ¿uõêu°Í/±�šˆCóú,%²ae/¤<cõ‚عãÃ×4ÌÇí…Ø3!©ÏÎÊÐgd©É²¨+××äœÐð‹%Ÿ#´\¼fŒaPVBÓDõáñ-ÏFOãÖOXÊqÕͶ¸)˜¼ÿù²ÐãM7žÛa6¸'á@  c?õæBˆ£jôE}üäöÕ¶§æªwû0wÒŒ-2‡×Ûn›#p™’\ 9À#ÌÀ2T3ŸÊÄÚ˜A‚HBžÌrÅJMÙpHveZª �G‹%ÅO©bqÑi.¶iIìïÞ.9—‘ËÕË—ì‡%ºK9Øõ�¸ZœO• ƒ˜b†ªi&ã5Îozzöÿ‡·Ãð‡}– ¿¸”¹ f®çÄžD(krêe$°Ç;a{pZ( ùr+Òˆþ.4g:YóÐp0È~E‡åPÆ!qo²4ôL𦨜Yó™}8°ìELÂɪýÈé'%΋ðR`-%L8ŸýšÔÐ|7[ŒMiá‘_?Ü77Tt”æÂÂ$ †La°SÏ– _6Ë…À{|ÃÞu�1ºº-+µö wò ¶ÙZUàßÅ©ØX……¬n2 »äî…dí»” ‰§c/û$+9Äå¢ 2²P¢Ê†xȉ¨ºBÊ/ñMÒÎÚx)NA+ٲƣï½òŽƒ”ÈŒÀÅõ>Î~¨H³ÞQ'  ž½T%åÉ‘z”‰G×üYáΙ|kïkÛ«ƒJ9IúÞD½d90O4M^U kÜdí]+–oZž` [¬Öj/š@Cª9øçZÕ•S¯uUÇÍÐÄ-ÒˆðsÑ…w"²µLÎÄ$:÷E´5ü »S\3ú n ‡ƒ³ VDKo$g&®v½J€Êzn¤4ž{ˆQi6#å½ÿb0ȶ†¬Cx@%Φ šß°Œq‰Æ b÷hî�ی՚HàöÒ›†á)‹u)vblwÓÆ‘› Ä©/[Ã< `Ag0O캲÷d%zi"F ´çŒCSu¨Ûo‹GÄXÿò?¬Á wâœ|u®¬›vçÙ7©F I¿OÑÄø)go0ì`^(i©£yztT¶X¼8WîO\˜#ƺ¼áIÌL¤ä/ŠùÇ ¡»+ã<¦xã,Lëtò¸ƒü-Ì7Gó‘-X7›¸©;TŸ‡SŸÈ—ŠÍâ£RÑ.CâÍRZ<oˆîºzíDqŒìƳ !þ.âçÚqè?ÓŽŸüUÔ›n§Âá»x¢ñ²ãAã¿é¹u� Ñd ØÕ‡åÌBð²Ý/Ï"1 AeHÞ÷I}ôôô3ÙàUP<uiãG9—Èf0“ 5m¡Ú=ôØ*CWóÝ!Æc,Á8ÛQ0ÇIÍl¤gè1pê™Jõ¾Zàdt£¬…ýt< –¾TíP}µ xš ú¾,Îý»~1/óct­eÉLú Ђ[It¦­?'M7(FhÓ©gíz€M´z@åP.,ÁNDÓX×eçZx¤ìù¼¾e(€§ꪖ²8¿p±ãíÅýFý,ŸüW&Éÿ{s‰]"¦€‹Ð|zŽ_Kü8…|¶ÀÉ÷r\‰H4ž®(òÕÒþ‘‚Ìe«LòT‘$ša¨þub»,ñ—v+xlÓÜÍã.»ø&°Õ™˜ª„³\b öÈÔ¸u b_kcRû}#tuQ‰Sô!Qê—S7Ïù-öºÎ@ÝÔ£”x£Å¶[ݹ…�Qlè‚¡^òd†p!œt„Ý!Žn êÊ»%ÀK Œ0÷¦qýV'¥^ËKÂ?Ǩ¼5TÂy­^®ÍPBú’xþ0zGëË‹Ú =õŒ?¸˜ŒšÞ»s#-N" º&²ÄeîûöÚ[¸&¬‚äY@rÓ0ãä‚Ía¶Å¼†ž1² «á¶yíìx ê(ÜÉwÅ2ŒNÊ‹n¸+b H3_8æ·{ ðD葽’\—?T§ ¼�MfLÁK‘,­Ç—Iùv¤ì¼ k!*Ûî•}4”à&ð ºP<=n†ëÍÄM=—í¼"˜D˜vo°{¾')¡Ðæ’àFJ5mH_L(´ï·×ƒòéyWüÙ§2—‚È¢ q:3½l>/,%¦=¹¤ŒœSKã••ÕÐç_ ÁjOŒ…`’Þâ4¸´e¢%ÿôb]ÌԸʜbÒÑ59,f²Û8”n³<&ÇVí'$Ù-‹†¨§\ì3ÁÚyBê…³]}æ"Ìy©5|ÿ¼lZT^@m­¢ž©”ÚêÕ/õwÏ„aÖS¤y÷gkÕªvÜS—ö>š=ÂMÊŠÙÉÐK°"ÂÊg——¼ˆÀ ”8G´ód0*lºkv¬*KA§ýj7?&>Ÿ.÷ü\Ä QcÙdº3Rp $LdU×_õ=ûL”ÓÞ¥ÅhK3_3·½¶l¢H§VÍ‘,ËÆiw¥Ò Õš€Kâß/�Û¼P >Ôu„£§ Á «ùÍ÷\dÊñlGDf óÎÚɲRx6éas üDRÄŒËCŒè|–¬»ÞÇÎëó³‹:ÉXd¿4Auïˆ$\ºÈKé›:FšôÇ1Ð#ߢϹF¬Ea{÷5Ù“‡J äÎR g¹öK¶Ø>fš RŽú!v²5bK�¯E¢¥è¡3ƒpߣѯ•ËèÅ Ò)ç ï¸V %óY“…È|†žÝ™¡éÂWÏÅ[Ðs¸$/»Á-àL>Ú¾&ÛÎÁ €EBâ×)é]¡œ ãM €¡š'Œ¦ (¦1 4ŽŽŽOs™Ø#¢¸”݀¦¯>½Ýz“Êñ)Z ˆCýeœðIÏ€è±Ï-l󸸡c9±h‹zèû¬Ož½·Ýy~£«Ù�Øùg”Œ-eþ…?lãvðÉÒKî˦ëz–Í=áò1(Ž„ñŠüÞÜ€‹Y)˜š[ò¢éT$%ÉLwÒK@(ñÙIaJ@›ÉN,`zPqòð?Z­,õUª˜%£ËŒz(;'°Í7ˆ®¹/¿ý¤¹¹‡›ãw™ÂtÇâ_ OâÞ©“�Ç4®üâ6XžÏÙ•—Ô—yðZÔ¬«wÊíêDò4\ç¬üOÀ¥sàq“ÏÚzÕÉÇulާ¸Ãeâ>…÷ÎàŽªß?çÆ ÆRV+×rs‚L ÿ–wšÓËÊœfIÄAÝðåÒ_Û›xžVàv»Ê+Ï%ÚzY›wžžd»Bb³}Ö@Ä$9¨¡B@#ö¾œ¨'œ% ̪í-WíÀdZnšp&5!¹N©))³‚ _ô‡­KYoAÞ‰.PáEa�Ïãܾ.›3Ç\"õ¾¨ÛÉ;?÷ò„*Œ0Cõ —Iä¥!Ò(äÂîI/‚úÁ©¦ÕoÄ#âÂ'õq¡j)‰ŠˆÙÊ×ÈØJRl;Ÿ`«(–9õIü .¯<Àà@òóGôÜGÍH×ÒJüý²4޳[„b¥GcI/×µ]A ”zLrŽZ’ZisÎ/œ¡8ë)›º:A¸ßk K~šÀex˜‚`ØÀz´„"©§µô–úê³Ø§$›äã/à£0Š¥”¤IÙ¬2¡m¢ýâ†Ö‹OJû÷-µ”$°ûT®½èßs̆œ¦ !îâN ª"¯E´©Ä¬À³V+?©Ì-l L‹´Ók”“˜™ü³Ùñ”µßŠX] M]p’Ëj—´B7δqóEÖµ •Õá*ƒÛ#$J#{ç¼^©¯oñn{!!÷£kîìçýØ$@Ìz~¢G=¨Ä©ÎíÇñËà§ Z|'&¡N Þ‚Ew3ÞûE‡‘`Êy— 1òûûßMQÏ8pÈÕˆ®&ä~-ƒZ» T/fK¦ÅÔZö*Cº-~%0z±8 ›i¤<Yá­«y™Ìq¤5?u Û3>æäjŽÂR®å¤íè²0Ëx­ÿ;Ïå(¤i$¿ÆÏØ€^°Œ©…Ú0¥Í)tíH£Yž4Œqò¨ü‚e‰.i}óÄ1ž£$Œ^ÿbjŽ7�aÅy*Ôܯ¯öï݆[PÇJ±‰;ËIøÂçK“|Mœþ¼•bHff˜±´cÆK2ÌŸít¿7)'ЦÀjT´Q€÷ª'aÊF"Ö0Òwœ>obDñ(ER RÐ’LdÍñ,�FÛÀQÁR-Í)0´“5"¬Èh®U'ŒKÃxO8F†x²âö*Y¢ðçCi×!‚'‰ûÂKSå,a>ƒ‚M&·L’ó¾Š�7a�Õt«ü Öâ,×Ü(€)iGNÍëÃbþ»“nãSÚ[.°œ¸Õ” ½·WÙ?k÷æÌ@ÝN©Žn"êEè~¸ü“Û!8ó3"Ó¨¸nÌñ[3þâž, 9Yü‚® Eiçæô%Äïjí­0ªï—ØÍGŒº—ýRm»·E¡­¦¼bÝÿe96vIB@ò+Ô¶HW|®N(O¥ÎƒU¸÷âc~¹€#]1Vw~ôÞãQìÍmY;0"Òe» rÆâÓ¢°¡’¥ÀpLã€Ò 4XµûR´2çÌUážþPãg.þb½¼ÛoNùž·òÄ2iŒ9lÿÅk"¬LÑ`©Qe˜nüÍ<“À\ô£'ß"|¬’ThK¼çåòâ/¤±-×@à|{&¹È®l¾=.ïµ”ßÏîR¡òu!´r{UdÙ83+}yëÝŠ‹”A™˜(ìÑ2¶— yœ ì�=mU·f5ÜÚûJ;[N óXÅn³SÏû‹J ÏÄbœÜÛÎ;<htºÄzsj±£ªöƇâÇz¥Êë‘|´XC`Ã:ðè-,uкÂL((éf€ASû¼}8óÆ{A†¼DwÞxòhÏšý30ÕX”N¯pMn°ZÁCv}nª÷TœÛ\Þ Ú”AKoÖ2Kü/’ñÅpÒ:‡ŸŽ:1nâA†-˜±š°\ ü%òš·@öŒ±½/×dÒJcUlŽÄþ©ðPŒ!ô0ÎäyoMÀmدi ÂÈñ¢šàÇòƒŒ¡ƒ]§òM°ÅhMpï?ç¨{ÕKsž Ñżöœ ïŸN^u#"’tR ŽM2pöë_`P×÷÷•Žn ³v À&bŠˆû¸!É[. êD¤@Ò-‡…©<Òõ'"Be9jfÏqgM'?‡·6àå—nª¦¬ÅZ¨¶i�ß[˜wüâo_~n!>û|PñR½‹‘ÖúêsÂ[rYäÔ‰)Ì‘ÑÃB(µ(#–%µ<¢tìºÚähLšc’m0µFÒQœV[>m•“=ø›*"©H®,2Óàþ2™qfsù qæò éÔÊE|”~Ûö‹HÍÚ£çþ}ˆ×ý6ü@Š5—l-pQYJ*t£‡s-ŸÙ¼¡÷‚Ìë;5Û±ìcAsl©Æ¡‰µš'mqê{_6²›‚õb<ûs ðè;ê4EOœœ`B„‰ 0± Œ©ÎDÊ�`½XØ@-M*Vr-.”q¸¤Ñ ƺJ_Õs/Å›7õ‰>“É"}~ñ–™†sîÞwí+i¾–J—>ÌÇbfì-~Í–`VT»7ôàl~8òq;ÅÕX{|*”µ[`›œj^CáBþ±»A° þÁ ò0€ gÂÓ’¤‡bå®G}¦“ƒªQc M ªº<(èv 9N§–ÚQmÚúR톤SÛK¿Š'TÚ†•(rá"zJyÚ¼ƒ¬žéÁ©)ý¤(©/lâÖEÀt åŸMÍ[_žCŸêWe5UZϺñ)äv+šnÛI$[HAKª‡`‘:.òTa2p½KªI õØÆ`Zjý7ò1{™òî’ÄXT6Px)‡ºpô !îõ€eÏ9{ð¥ÆOIuݳPùCŠ™øÑ¸Ús”ô(ܦ* †ùL»O‘ù8µwulJ§œÊ~î‡8v^üüm7CªBNsšxÔ‰<_�¬Æam l–k/ñÑ‚üîÒ:³\“ ëñÕš ´Àhnn^ÛG¼nM0û·1Lä­+æj£¡à'6Šü²J|—/T®¬½?Wþ=‹.?Ý:‡±JgKˆÆáiÏÄPç(2cÖX¤SígY(&á¼ôÙš ¬s=ÿ†-9âÀ²ãS=®;¼f"а†}ê%˶J¶G#S¥Oj?^§¿îú˜E’iJ¿"É“|=›ãjy¯Ps˜“à­ ÈGÞôLv³ÜN#� ý•ùû‹¨êõy¢ Éè˜ ï^×I`“/ØŽ‰¼áw¬÷¼Í|³™5Z}®Ž:^ŪÅöЧd±ñcT¾dú?kûÕÇRïS©‚ˆŽ>ÑÄÜþ ‘r-a5*óΫ *¿‡Ÿ—ö´ÉÌ5®plZF¬AX™-Ô)ö,ßÇFëÌ K_öœÒk$ÕÜ)‹}HëY®jP\­âˆp Õ˜$^ÍŸmã® žh¨U¬§*N#öo |‡ö×N—ªÒüQ\n&¨ºx¢ã"åF¶.ÀK¯ÿ̵üî2vä {1]HY¨¸çª–^)£’ÒF/dšý®Œ¼´ûß[vš=ñX½9’Â8‹qnÍÀ|öCLX·»sR /Q „ÿYæŸéut'¢vík±^µˆ™õ£ùØsb ó š"I¹yŒÒgX,æ.•Xg]mÏ„+t/¨ÔþKÏUˆýîÍkÝ…ϱ´zLK^WVã2ÊîNÑÆsYו5i(�R9tò°T`åRvÃ"˜rfßù†B{Ï !Ì(8ã­ ´ —`Á ;¡“}â¦rÚêM Y•$JÇ쎃æ÷7ðärr ©ýž¦Ñ ½FSÌ`;´è»‹º*ÙvÍçâ½cÆëK<ž~,{9§v·ú9&‘‚Ð{Ñ…îíçj¡¢c/Ƈ íŽ5råáj àÏÓâîº5;³ÚßH—ËoôñG:c[Ú vsÊ8Õ‰¾9™$uˆÔWqÖ |ìñ­ŠÁÖãˆ+³fÞJ0ÜJg¾HÇŽ††CÖÓAg^ìA?Ð}½µ7fÜÔcs˜ˆŽWÄð˜ë=?Ge e´šyê¡·= œ ·¤«·i%7žÈꙎi­Q½?šÙu](ã ̼ٛÉÜÚö-§iÅð|'¸ÍlŒY?pû‡ ;foNذé«Ò·ïºkˆÝ•{Än4 0˜ö\w¦›‹wÌ)xGggKíå«e.í8Gy±|79X"Ðbz'g±¹ušHe‡EOìÅùϽsÎ0úBšµZéèÙ«N&©]f:, >M%“¡² ˆ\õjór½.y£n&•éÈÎSn¿fR¯r'NÕK`·6‰°”A�®ºW¥kRéw»Û#~ûË´ì»—§¢‰â–Ë6Ü!…�½©9Œ™žßÁF¨=»bÇÕïg¶MA!¿¸¬Ó‹¸Q¦õröùÚDZ¶7JÎk¤lšlðËŒ 6RµÔ’(³‹+6ˤ­V\kpŽéözßõ<Mp7o IA¦h<ñj;fp7¸N‹÷°’^l–ö"äP‹y¨×:½ªcˆ’¬ôåTJNY«Ì4“\zµÆ¥b Ú|eÃÊòè«V‰¸å1€ÚEJWŸ=>Þˆ6+¨'pn99çZeQÀºC@Ñ¥Þb;-Ò‹x�FÑÛ>_\Íúž€Q˜ô|ç$Ó©¶c±{þsY½Ï~+ÕÖý©É"º ¹ƒB³/Œn»¼ËËé¦ÁEãDó3Yr^MÅ®¶cÚ •ÀJÚLÃîF%-¸“Qal3ïâkä”î,×ʾЭ›¹Ng­zCX?a¦¦^r¶cˆx*™,ÅœržÄ; °p“”ßG3_-Ï:P‡é%…œ:œ¤€ m!òó 6gBغZ“¾-À0·gæF ínN.ºÄeËÊN OYûV™ uƒ |9”{Úr#w 8ÐÍgƒÏa¢ù¾‚�-ÿîíNV«É„}ô¬î1^~ŠX(š¤1Œ¸pPYŒ5ÕD.A>O® w'v•B$ÅM:b n»8°·1Œck×`,L[Þbû°ñùLXƒ;'¡œtX7LûŒNbQÎz7¨˜GѱœÉw¿]жl;˜wVr¸ïäôÈÀiáSâdà1Xº>Af?f�ƒì–ö ?çð±;Øk|qï½èÔÓÓÆð]Ÿ™©Âyþš;¨¢i¯ÂyÓ¶¨°ß½µŠ¤&aÓ‚”Ù–s¥a· –è÷¾$ ÊT×ìËŸ]¯’±H·¯±ZO¡!&IßêI¦[Ã:)ø1·mSX•I©6i¸ƒhDDŽ—·Ã ñôiRØHï1ßamº³«„ñÏ­Ý4»µB*89¹Æ•RS %k°¹CB}W#èQlüÅäLnÑ×¹ý‹z…Yô×£Ž÷7XF€Çåð“ʶyóàƒL²:ò…Õ‘,È!Ž×‚‰·½up3ek&œR¶Ü åóƒÚžo½ÔñÆ5olI^L}c-=¥&él/ºdZôåãN/p ¢ä]jd¼(Ñ k;³lkˆ–ZU•Þ� ØGcê;W‚9^"¨m¿:‹qîî0‡•oäEüºx쿱-ø”µÜ®,)¢8oF/àNeånj·ŠŽ÷vÅ;“ü5–emHiŸWÈ 4„ ¶>q‰>„¢F°æÝ@ï—ŸFnùÙ.+Œ0(„ƒ•*Êëeªu½áqÝCàm‘Hަzû"ÁdeÅ%„>iè‹ ±¬ìäðMÆ£¼·‹&CÖë2—£$=YI Ž?¤~3àŠ©g 1`²úÑPNF(¨—Ì€ö¼ý(ÍcÈÆ£< øùy.­¿«÷Ò%H V}“}Ä$Bô›ñ¸P °¸û°Ž` k%¯@ñœÉÊd„©9,™áˆhÔhVÊ�T(ÉÆfÀݨBã`¾_Ƹ‘±rš^¤XƒZjü,Zƒ ‹jAŠ4âÀr1»ÎÃWÌeW˜~®ÿNcÎ  ‹»¢D—#ÜVb ’9@váǘ?ê¢ÜôxAH-ž ÛE­G¡ÄñŒ ›à8Ö«À4 ¸'A%dœ&3ÚéŸÛ¸!y­.Îé5>ŽSÞŸa˜þã0ñ5¦»a1ç÷¥ólpË/8ý L‰Äkö[6 ²ÕÏè0JK‹¤úå°0ƒë ¬’t"çsʹ*€µ9-o]E=ø£e&n…ü§¹øªýVJS764qÏn7Úœ€ÓN,ɵù+’ñÙš¥Õæñ&G$Ð…+î¼k î*£‰h`„|ÆMÜ8‘8A<ß„§Í ¶=|cC­2¾ ËÈùó&Ý–§Ñ>$±6¿à2,Üí•)Ÿ'õÃvýJµ²‘¯¾>2DàÉÇÁ:®'% ?/Óllj·¢fîþk:û3õú–õÜÍP»x,Ñ„XBT‹‡±ËZº°!K««ý”")öÒ‚#@ÖHoN%™}ï†gQ3xÇÏèž„äR¾„»å u*ãÒÎq.ÂÍ[…ñÔ“JŠMPÏ€ ÷Ø£l!ra7×›©ômB`·øÖBƒ`L§Â|8D•wÒJN±g•ŠÈ\!Õ^VPiw«‚X²)®Ã™J„þÓü¿B€%ðäj&‡<�‘*ùKºî‹ëqci}‘vz.;ÅB´ù×Jµ€5Í©:Ij½¥Å}1•‡|2õx¼-ê§®»@'„r9r =ZùBGr Îà�hØ)‡Lnð*é~©Ë²L±ÁÑÆŽ¬Òv´% îka”r+#š?€Ô÷š}y*,»¢' ŒMˆ2« ±Øµ;M™Sw$‘i/^*3s·¢5Q‘3fmăüF<,è|çy åÝóríÚ Z _A„)ñþ³EK‚E¡ÞûýEác&›ù°GÜÔ×p�%æ¾ø‘�œ&ãHÑCZ+sÀ…³�z}‰‰=Æ ']C«•Ñz«pï½5KAm§‹ÚØvQD¯0•wÞ­ÂI3¡Æ›‡±ÃP)wÜc¸¦úÀJñl\„ ŒÝî–dV œ :þ6ø$ÞŒo‡b2¾eÇ£ ÿÀM%?`F ¾0 ˆv®ó 0a:ß{Ë !”‹<juÌû¾›´:ì.±‘ò�›¯Þ í+ó2 àù± W1LÿtæÕ»™C ìwñš‚N4¸òÇŸJÁæ?Ž)-1‹oÔïÄ©G}xy ÿI¾3;:»ç r“âÙ,Fž$bÜaŒ£™(‡ªN Éé î/âàS2µøË;Añ6 8ŽÍVùÿ_.o°dñÔ5Ì&êh–YÂ`\RcbŽâTM-Ï»¿¥ ˆ X(Ý4…ŸÂ@ SK…òÊtiX2kJû©í)aŽîo>ýWiÂ/~h9ÈA›â³—fµÍU¡Y$ûû䢟ùö¹MKÈ;-Êx%µ³0WÑš³Œ°Ž<ÁXàSven0[µkÒÍh† r’CºÚÌ‚KÄaÕ÷%»EùôÉ‚z¿’]hÚ…äL€Ç˜.—AH¸k‡æŠ;O6í~<»LË×â°¥çGŃsý©õŸÒ¡Ž#Iç>¶JDâ&Á”ðãíâw²+“R¤È‚#˜?nŠwz9·^î*ìïÿpÉræá<ûEßBI¸iJÉuŸ<@Ædq© ‹6V„ÆĹØòB‰CçÆ�VÁ›–OF›c„ÜF!ÜsgŽC>î (€¹íoa9ï#ÄK…¯âKOüÇžå×ëñ‚D]Ò”K^œEøB¤,ufòRäfëçÞ‚YjsÉÅSpæ*™pnÿƒ´¬E€cÖÔ¹l˜WR|íbIˆ)ŠXµƒƒ1·ˆrþ^û(læˆÃŽ7 ¿€ZDÒ0(`Ê, F$Æ”×â)êi¯ü–Ú‘Ñi ­A¾¥+éF  0²³ l ùx$¥llµbáPÖ±IÂc›[ÐnÇÛ»Ÿo€£D ‚#I.'7ÓSrzÛ‹ºNCR„5DÂG(Zˆ µÅþ8Qîb€È3£Ñ…âF}!¿žÚÍ¡F0Ûµ™OÔ)I›bC™r<N¶)Ùñö¦Ú£À- ’VÍRã”­àKq×j)ZÖÕaû¾½ÑnF§JŽ‹$¦F2æ'åÃr Î\"·GÇ=ÝæN*qÀã…mÉE ”Á3p¦Y'° â;nÏÍ=aFån¹['ûÛtçfjÝãàÞ:ÒžrŽpÚâù=Í�ž±ðœ­Y1¨É\A8gGvÓüÓ{˜ßÃ37 3OÌÔIQAÉ@¬¿�†œÀ6ýç;¢É4Hkº H;/ÆÂeN#YªÂˆ®©CDË?ì6ªÑ>·¥Li7’ÐÈQ=¹c“ä‚”yçš©J¸A/¨¥› àß”‡ ÉAw€,ç0D¶!žIUw1»Ï¨i:àSpF>ƒ¡Ì½°½7›N0Õ ÇÆ=ÌG\¦Éè%'0ó–픸É<56­DÔ ëãá L-†ÅoÆê퇚̄V \FsGµ† c›o“àž®ù®íòu‰#ÊÕ4ä]|!Ôr.ke8‘D`zš+Ê[ÿrÔÝ×·*–E·«Fš%ê€kè^}n ¬\Ç¥Àª^APÙfw®ëX”o¥H’Éka… Üéñù"‰]¸ÄâRÂÒ…qÚ"ZûO_¤ 'äË”£üRØ–a¸ÊŠÀ™”â%š—PãÕ ^e™ÄdPÎÛ€$\Ð¥' ñmÈ ñ­²XNjåÊ&$µïr5k®|)«áˆ–¢r±µÈLQuÂ’w̽fU‚äF7c’°>Rx%{×­åäšÛµ˜!ˆÇ"Õ…¸ªÈèÒRh¤6£ ;\­©ÈiWS jâ@®¾‘$�2=CQìË…wÛ[e¥Ä–í“·h{IQ–âœâ“—Û/ïK’—9i¸{N>ð‰€‘À(j‹™x›8s±-ýšV»Ù{‹ìØ3ó•ÍV<ñ–²¾Š»c{óí§¿\ÉþÙ°@‹}ÈN:©`óÏ¿Z’៷OSÖ°–tR@~ åíbÖý6ÅÔòœBÓ¹6±ùR�×Ç„™Iê·ô‹1z°Žë*p'ÍG›_lP³’ƒº[/ˆ>džºð¢WVVzåÓI6äBÌ}Èe%‚qÐRÞM‰CŽo9"·¥£û*1ÌGNøÙ­ý%–`ÕYÀà]/ÿº2Ô§y [œDÅNŠÚ2\d7…¶ Yh±*pi;ת/ P**I>G«Q'üDO ޲“6­¼—EØjuvXà'Ɉ¹d1étÒèîTj7r]Æ,Ü»öòUªE´¸Ÿ €fn�"gŸTL7ÑÄ^›@È–üü:àĈ91qú—P ó€ñ�OP+Ü8é`�ö2FGœÛ¤_ËBìßÇÞ÷®ÏîaúÑÃï`&žÝO‹ìL?žîa²>îxö¬1@d© B¼ 6mën4–ís¼õÉÄSú& ÁÉ@<´yàÙ5káºgÞÅ%ß8Bz¸ïþ¶ÙÁÄ™må–Ò ŒãØ(£07dÉÀAQ_M/G6g!ns%Õøÿê¶Òû åÅá"ÑL>¹Þg \vMfG¡[ì4M?f¨v¼Î!žNAŸ ‚CvûÃÜ ÈV§b'ìÌ«2©ØS„2MÀŠžJ!ÎON�A)+rñRûÒ½’¤« LjEå­uui´ØNæI¥8Šw_î4½“%ÀYZx¯K ˆ-5snÙõÙÁ™tª2—«ì–F‰…Õ™oåÖ$%ÅŽ2aˆëk%ÅNyR[©¡ëb®Bk—,kECÄ›‘§¥È!™]£7_¦ÕijP¬W–ëÓN æØ¬ŠÑbeèfJ´](ʼ@ïð<Ùi7DÃa²I–R'¹cmfív“Z›aé{RDEâ­4S^ê6­}zÏZk°l¡Ò8?M=þé°(,*sÍÅ=X­Gw=Y>ÕK¾¤GµëLÑTV«I2Ô[¶H1aVÔ�ËXÉ…Å’6Dƒ$uác!ÚȽ֩×K±,ŽŒ%«x‡À›VZ]€¹ÞÚQH¢ž: p”!ýÒ¡ÐãnQ¹Éêl¯>j0Y[XöácgÛøÔ‡}ž)…kûIã œnSLKSõfš÷?ÈNŽ­]Ë|õ³B”a šº»;°Ï’ËÉÓœMrb‚ž.ð³{§æQ ¸Îz¾Á›Y-n ÌZ Šƒ_êâýèV|Ù¶P–ÏZKëŸdq(õ–Ñ^ß«¯[:•>ÚtIËüï¥ÕAVTtÔ¯Hoö*¼ÞÓõ�Qïí"Äš&'Æ.9Ážú+øÎ äÄ£(Tž™ZAV׉b/be'mˆÜ‹¬±¶Yfå¿1Z”¡ íEÎV>Âô,œŠG]àM¨¬Ê(-¿‚”¼³¿½°uÊYKMó8À5V€óCê™Ð‹Nn¼Ja ÐŽNF-ܹęßaûýò_ î²ØûL»Ö½hgåX<ž1ûdÂT‘d!©ƒpöŸÚ©sáˆkØ-7xÝý¬ûT–³¾¶YiqÒû ñC¾@‚5éªØúžSŽqG&ÃÈ6¼Ë’Çz¨±s{®“E›41ié°¾Þé=¿ûÔ1²3º×b >‰Î–Kð7uŠXˆšä)H§Äj©„†Éé•Ìù€ÊK<V©éçÃvS5ºQs‘×AËclì>ê5À?5p‘®fìê!£7`øu_*af€\t‡|æDVÍùÍs暬 ÂpºbËrô†‡K‚0Бտ$Œ``çŒ>Â@¡‰íØâ1Ü:f?­f‹Æ‚¤$¾˜ÖÓÀ+Ïhà÷ö+öŠ^ç“ßdƒÅøFŸR²qâ3ýl¦õ¥t3•z|^,xð¡%íVÂN9û„�ûT”)6ô8̕՞ƒ­–‡™ú\F;³Æ52ª–^§°kù—¿lbƒIDæØyxðh‰âxëj;¢²|³“­”þh/4€±MȔݫÆÜª:ñzg+«Ù $s:')ãr¿Gi™ ^*å¶l¨Gñ Ü ˜›oJÕÎÀu P–à´Ž€N¶–3�j¥˜1¢{ø9!t÷ߎÏd{•–HÛn¸êV^Ò(ü€Ic2ñáTYHÜÕôf‚�5]ó ©!ÉÖjwb È_tt•û&'Ùn Ú©ø»~®ÍéEMÛ0¯Ew¥- d…`zÒµkɹù&¾ÀvÌ€áeﵶΙk6HÈV«^«ï"`&³¨ÈiÔã˺‰µÒ5_ÖfÀ]L® µÀ–\VGƒA0£ Ój s}¹<àØ°‘YZzrå+lzC×¢UìÁ‹^Ê´—ŸÿfELîe–‰àµ¯² ©üÌ%×|(æ@|e ‡èžL—䔵ì‹B/=)[Ãuê–V¯%åSîìÁ\{.¥n(´jž¸«x€ær›qãG1ÇêÇTcSÎ×¼¨ìÉT{Údã!Ntœ«ÀL.;¨ûð`9 ék[ѧÄÃi¬âõþüÄÜN¡ë"B´Ú—6`¿P$OM°ó[ôâ±ÇCX 3ÙàzòòÖƒ^v? <©]8E$SËj RKÐJ”Á冸õèQ9ƒüÚ(.š¼óX1Ö<ù3éd£;œÔÊYoìž«Ì3‹¢ºj‘\d(²ØDs•ÊÂLL¡Åy%Ñi¡8Œà<é9„×X/å'I0å^v6v£ä9œô’"àSmÈÒÀÓm B'•å®=–åD²²Öá•{qê'Y² õW‡€èÄ;¸e?ÏÇ¢D{2}KAZâ#Øw`Y›¯dW>6Δ8P8è¦&éö Á• ³º<2Y¯L©KøPH(ó¿´p°Î;bq%GÉ´\W0{û¨,V {N‚Ҏјuüp¹Lqzœ¡Â† Ë ŽîAîMj{iõ”¤ä•Ý †LjˆKí‚r¼\Žׯ À'»Dñ磗CÁ/‹Pa9CÛÏ‹]×�3aÈ›Yw™ âB'¸: ½ti üí¥MtBSª÷€ ØV(ËÎÑ@fµ&¨ï{<‹/<™<<áÌ}N;q¯[0œÒè²Q5içÊÕY;Õô¬¥ÏÚvyjÝŠ³0^©¬'«~«Ï¥[½¼:ÌÆ!"RÓgŒ3cæ@çL•u¿Ñy³{€úM='ÓbÜ0út,£R˜^¿˜¿HÚóá £ƒµð°[kïYŸ•l¹f È‚¿>8¼¶¬›pCÜÐuŸi±Ç?ëþwpú–ÕœÑ;ɽéW ŽTÑÙ2fOÇeÕA§ÌÐðäë—ÜÃ?&å0Üyqê¯þ (ÓÜTápÖ›… Ofð„ëçìa8êvìðê©l~w•)yX‹_ûtþÕ8<ó’ú H²·Àê-S¶SXKâŸK€N-Û£HÏ-Üv7øjüeÕpW¤»*¤{ é›­[Š;ú‹ÂôËQаÆ7L^NE36…âÐä}È«®>ÃÌS¤Ô`Á’ÿ -$«¨©ãÊÝwìÓíšQlëÖ s“ÙÓn½ Ø’ h䯅qö„ÞA+4ÁzxŽM8chûɦ[óìÜóL„‡û[ìÝ0†ŒwLKç4µó(#Ðâ·W»‚d6(ÿ&¡=Àâ/;ùd#Ú!í ¼ä„9”f]R6š-:ʉmµ¡åÝ›¹nMTî`¨? T/Ëb–©æ¼Ha>¦è„’¨2Y.%ÂŒ¦ÉFR_½Â<`­I‰¦FZš²>#ˆ¡¦îøL‰^DC~£,»qªE 4î¼Éå–R`f0‰Èj &è¥îÝ-�ìzV –0¤Ž’I‚hÊjÂæºz_î.QÒË'xGù.l‡íày¾Ô%èò�HvÂáfP5ä~` ØýŒ–å›\Ãrº»�ÛbÔâŠ6’ƒEœòUýÔíbJ&D;EÕ¡»bê<Ì7çÓ¼âŸW˜ ….4óJp¹øóW”Uµ2k“=xõ‹Vü•E«y íÎßßÜ«¯:+¥åIØ„¤ýæ¾×j Uýš+,æ®LÒ®20PgC4í•Ø{)ÈÈö!8‰‡›.Bÿ²nGTëðZx5Z ¿ڵ¹RÍI.ÔûQÇ–Ãڛˌ)jÝõÌᅵžWº.­YN•fjîc.@r)ƒµ0°rá±¢-Pâ1w1ɹ'©eý¦&/l¹´Y©˜M^]u9•lI„Ò•ž�?‰@Ž-±8Ûy4œ™;VŠ ô˜‹üS+ƒßé¾{Ô±nŠëAòsçëùÊ FÒ7w›¤ÂÚ‚ŒŠ=«öåWãå#µ}¹-ž‰ ¾h4óÞ9{/Uz o—Á”“öà>‘4ï^ácUùr [°Z I¶ºÔ~‹bBí©ã‘ÊÌeßµû‰+ÐîX¬íªì±iÊÖCËÜ»º$+È0F¨Ò¬ä(Ǥíò“Å]á–™#õ1$(Õ«y‘²Üw(–K,ÙÒN¯Y_êR£gñK:ý>%V®âã¨óôXT¾ˆw8ÌÊhФõåßxÊevk1j»* O¼ÝC)¨PFº¶’ô|ÌY{ìäpeYH[•¢ÃyˆV¸#Ó"íÅJV ¼Þ_*¦d‡!í–-åÃÓdkˆ?M¾- FM¦03k0à«À%¨å6¢ç6ö΋ʠtUãÐoä)µUœF´S˜“;L”äâÊCl>n©^ŸºIe•ÝÐ$*Cƒj3UM¤e1V~—Ö–Î蚀½.?ò‚²"$`V0Œ ±-gq õ¯nÂÛ|øÜu–õ åøé8·ÌXbîÙô) A7Á4\n¸­õT´/¯–XjauÍ86¬ä�Ñ&k =,=áÔ©±Ž~|/ðÞbžÌpN“‚öÐrr¸!uaòÕñ‚M ZÏ+$¼³/".M§ ðL¾î›Ó‹h1GƒýÑþoЦav‚JoÂÄj8ÀëÐòÈ£ï¤�¹¿K­êB,î [šmcΔµ S°†ùr^íÒÄÜIÀ!ðJ~梈CÏû…ÇmÒæè|uÿ©ÀËW0ùÅãÖÚ sîö®qw{³_ûýÌßÿ‚k×Ìf‹—ïñµn•«+q?VxqžœºµÓÏoìÅn>w< ŒÏ�/=Ä׸/ 7¦ymWòþ¡ð`"i<M†<ÛC Ñ”÷ñˆHwÕ’Z'>WÞhŸj1Ž>ïg@à]¿«=~½Õ©í9ùÅ÷G;Œø ¡K[îk˜M=8±]{mRæKoÄýØŽ<‡iSÊ|×\ynoÇ=öˆc˜íáfoÇÀº1‰ònßG'oe-�´$lI÷PÓºJH/Q¾òjiC7 ôå]šÙZõ¸ù<ŠøJ =8<OØ¢ÒEcDõ\ÉWý<Ù§¹µ uµ�Ó<ñÁRRÁ³ñr¬‹Âì RkšIóF‰.ó:TÀ“Î ¢ˆ8éŠièmÂZêoöÿÔ_ïÁpÂ9ìS‚áä¢Ö¬ª 'Õt9HvZ÷’”`X—S¡B8Ä$µgû@$‹»,äekwB=Y/Á¾‚'Uþ• X€Ð"+°Ô\úK•†j]ý<Áw‹ÍM†o𪠋úiŽË)Î\HD8'~û¥# ‘šöG¦þN(ÔÙÙivʉ2˜`k²9>Ú¯]ôÂ@[j‚:¿L.,>ÔRÝîH¢‰·¼¥äNE½¡;^ж=iöz¿ e<\MtÆTäE+²’S†¶œQÐô&ƈ§]ÒÁ>ŒÃ5,Tå Ö`‹z¶•ãÀ•ÝIJé¶hPKˆæ"84f[½ÇrJ©ÖmµTw ‰(c6Ý}Ð$q/‹lMX~ûíÀɪu#ä×@Ì2m¡v”8½eŠ{ Xò0Ä(€½Ñ³v’ ÁÃÕȤþ'y¸Ëê¬ýét÷»­c‡ì´»‰² 1H,i®~xŠCÉ»mº¨‹A½òjÙBA ¤j-1&¡‹Ð2ö?'›U*‹21HaÞ`zk°¡ÛÈËaE­Ð(ó:“ŠÇc¥Êa£B7˜OPûÔ"�޼L/‚p-'"]í²ò,b÷ 4¶dYÌU²Ô#ç·œYU‡ë¹J*¦4g Y‹õð/¯?MŽ*9ùö¾Œ2‹eÕÐ϶àX u±ˆvGÕl öQjÑË•u†¿ÜIÊvÚ;È6æX ôæóÍö!ôÕ_À52ádøµS?Z ûólßËšû}ÊÙJò¯£¶T-ªo-:>áhÐQI6åè†Zh×òpQ™/Éqõâ¯_¨hªòM(‡bdq"øøp…‚„íÜhÞF:ém‚R¿q>ï~¥—¦IËÉnŸL*dÿ[1I}´Ðœ5IÒc·S+ÃØUf0;*ÛL!ì8gÍ_ãxÀÖ û÷5^@?D@tÉÙƒ»$ Òm«6.·½(ZÊ�],æLä’; †NF¹}0ü²˜µhÍË"Ó\/¶HIûêîðêëűc1wöz½M ¿»8ƒ/4²› "„&kqà wL"CPB ¾kàŸ§ü8Fñ¾ë5‰Éà´¥¢d×JkÖX-ÝYWÁx Ÿ�™q0;“ØfŒ¤/Ê ¶èš¼âwž»4ðV~*,ë*J®[?Ã.»+ºìš6”(b×’¸9h]K.QKr´ñ‹ÌPçã³ëÇYÁ"6ß³ùrë¹æÇ6¤mÉߢ«…V0}~ùðì(£lñìU‘ìûâÄ0¯´�С—WÓńخ]½^qÙ'ߎ"0ôHfvíYFˆßæ"t\“§5¿¸U®SLah•üªÝ<”i—Òäïù…óµBíÏÂqeîeS˜{±]Ž][n5”qÉ#ËÖ?— 9˜–Bn«œk¯]i눽Ÿ;6 J"Ú•:&Ͼ2D“"—¾z’´«n H´šØÖpiÜà ú½ ñjd$oL÷a•›Unšÿ<ô®2#yƒàM(Í¥ªJõÔ|Ïm–úØÔiõùRŒ¥è&|ð.¥AjÕ$¤Râ$$S#p–©ì¼(ç}bÍ5‰]è"d.E]Šá%Õãp‚së2ÂÀÃ2.b¶D1òöŸyç 4oB&íãÜvÀ¹”qú7 ™ÁŸH£ÃÚ䘌ÄèY ´Sèâ6í`AöóLÏåÏ]B\5ã1ãn½xv‚ÀÒSÉ®`N#ÊÞX˜ÚŸH._ú”bHÏ9Ø,£¹ó»Â`4&ªoz“ˆhÝP%Ä&­ßôˆ[cçÑMܰ·Z¨N†öÁ&¡Ù&}ç–d›�'~‚T`zãÁø“’RÄo~hÑö½ºã )ÑÅtjYÍ^‹ÑØpSŽa’~­×’¼Ø»·¼M³r"GVæ#ôÏØL ‹¸ó‰‘(IÑF7&G·ìs!Ê6õu±­ÞÍïßz<g"[r×dÑ{a~˜Ã^"L &žü~s&½q‹£#ˆƒkž‘2ž½üí§Ì€g_ø ï ~º­üÀ¾‚¤¹ÐR¼ƒìØöNá‡O_Œ§Äɉž×i¼G¢Î:/<82ц¥�Ïé;xe®L—Ãýíd˜nÝæ ³ˆtN3èÈr„>­£ý)­o¸¡ÄtÌP;³ûïrs.?Œù±TZÏ—Š–õð'jí»lPÞËñüÐôŸxm͸™pxé…>í}§Þs[D|l(ñYëƒ?|?ü.ûÉÏ-_’§Ë7>c^Nãkø¾!Å‹C~w/Óg|¹úþï·ûúþàžÇyd»~ð«òÅóÈgŽæ«,çw0Z¿þ"o?4ž|ðül$» ÑŸÍè››9Qz¥)ïlÕNWJâ]ŽðÓÇ8þKýË/u?#î÷�éo½p 7–ƒ'Žû}(õé§!=Tÿð—"LJë;Ä 5g!¼ò=ï?Gž·²àÕ™{ÎAœ„w¼øÈ{À×VÚyù\lËN¯K¾4ÙqL “­žÏÃgsºk:0œ‡Ô%/`\å: ø—¥Ì§•ÝÀ£ °Ä».ZMuâ ßZŽoç û ´ɘ­ö|§ÇŽÃ<?êÓV²¹SbIöŸ§Ë"n>nà6HÁ15Ô'8Õ-‚(ÛjóbpwêÑ'C”ÖÃŒ¥W–|Úa¦EíÞn–]³Ñ{Ï7—I‹î¼Š›Ø‚×KObÒeŽè3i~‰ýí=—páqsÀýF¬¯vtÊvœq’/;æ9ºr·+úã+Å…ÑÈC^eÌghF®ÓÛ`7Äëþ•]<T;) гx4ZåvÞ;U5ª©¿‚€NÎ|akiY‚É N†Š!øÓ+>.,ôJëW5Ë+t 0CòûawßAYÆu&™LIVñYîl¾›Lww“üØ3˜œÊý’8éÚ ÄœcxyÙØEgPOåëG(mEvÚ·»iòÓÉÁT nƒä¤>¾²N�1HÐù¡ú²z9Ì´N@ïÓ:_¼”]| SåvH…eÃÈR }qvXŽ| ű(qc°öÕ²¯úñdŽ‘8Œg ŠCC ‘œµïxx do#WŸØ—jq°aB¦%g¯¾}f?ÚºnNéµÅ^ÜÇÿ¨£ŽÄi:žÕAòo±Nõ$àá‹È ¡Pή.má.Õ¬×{Õû[ :Ä`9_éQÂd½"Ú®Ò27¿¨›Jß…–X¯¯¶ýbªÅ.Ï5’ÖÊ`,æp¯f{,-=2#ÝG3+¯š�(Ì=xÿ òø;ä¥r f¢®ÌbٔÇùXqSØŽÜsb™=¦6ßî?¡d¤ …_Hó”íA«Rö„z{!u1Ý6^,‡ÕmÕXz¨h.*«Ø1§< †’Ýœqz¾«ý^øI ,Æñ ðG]Qbòœs•¤8ß1:ò¦…™´ÔÉ.Ýø*«™ò?ÿó6l_¶ˆ: Üö‹òy8ÕJjñ®M³æmrJå]õÁO¹gòa›yeŽ2å#î¥GˆÍ!Ž@ð‰‚ 6›RJ*@ÓLØVlÙ‹ÝéÕúR¤éÌu™]þŠoŸxޮּ‚養ֲ‚+* c9k¶’ÒHyDWhpÛSKžëk?µ‚(È¢ y܃$úòñ›2ü{믖¦ô¾×NÝQ“ÒeH¢3€êY2V¾j¨5ÁC¡’e /2‹„?ñ�v,éiIØÉ¼Ü©Üv± jZn;ø!CÐú¾Ò,)è‘C!7ªyÉp¯”ß —à´Zœ½ûÒQf¯Šíå+¯ˆÿ~ÝVHýV£B»Â–&ØaogÄ«wŸ@SZˆ ”ZéŽ!à’§‘zôý¬‡“ïÇ­îĺZ˜”Éù‚´ym jæ¶—§œ¿€¤“ÈØå^¦b  ƒ­sOؽußÙŸ5°;-z¿kÛ|sÆ`¥”š$† ËÍä< òeÈ…7‡î’4:ivI¼³&‘F¤ä\§Ž]Þ¡<ó_ÿõÿ®W&mÓɲ?ÞÆ °#Vj溷;r°^’Î,“=‡l÷ÌÉöºr OÒVéÌŽÁý¬#ʙڦc‡qìtš°Ò Sh—RõYŒÅµË¥žSO%%ˆÝRté"Wà»Ö«[yÚjúcCáÁ4\öjÚ¾ §¿-Íz¨},°¤tk´=éBC}3YåŽî'iõq²9”Âqæ£äÐtW.Y0s‰SÁjE%R”Þ¶ÿù$ð¯ÿò¯£Ó"\Rw-;ºæ-aàа̎©…Y†ó±0cðŒ~¹`'Üœ@'(kòR~õÇ:ïLÅ–TŸ¦¾”úC€V湫/j®”Räzl'%™}œ„-„€¼vs€ËùlÆùó[ÖÌÖèn’\ TþòG4' Ì²ÚÈQ‚­ÅžòWl‘¤ûKãq@R“£}Ò‹¹1³ocÊ`b»fÏu5Ajªô®l/b²YE6RÑu‚Èù—ÆnÚe£†Œœ®).JúsyhÁZ9|(Çl„!ûsg8{ô 4ñˆQÐH­ðò´ 7ÖO-½Qb‰A™C‹•kPâAäì±Ç%I¶H­Ï´Û×À-¶) -é0ìY)BðªQ%&ÇžôÓ^tFÜ k:ôîÚŒéA|ã!Zâ³8`~ã.+�ªðH?Ñú"Ikî9o÷6œNÙÁ¥ž5$vâÒ?ÿó?£¥ct¤áÀ»@¤gæàªwS^œÛ3çž 6ädF‘κ +/Òr&Óý‡Ä|ç°µñ@^ð¥…û¤špY§ ÿn²ØÊÌÃT9ðl¡›Ž÷œC7a>þæ½³î“EHÈU9³¥!“ÓiQ»-ˆ´=É–dŽý ‹d°6{mD+!ÚR•œ]H˜Ùpb©û¬“©oÈqÇ“<í™ôNåÿþßÿ;;/Õ€ñž³|Oa½PØ<Y#ôÚ‘ÇÖXAí Û=†ÍíH'̘‚}ÿ踛ÓýùIÙY¼³i´¶Ÿ"4º¹a!Ü$ÿ…kv‡‘vúŒv­y÷­vÏI•“­.õ-�2ï:þíä9‘AÓyp9CÊ!ØÐD#TRÌxÂ’÷+ûèL Ô‘¶œÓ9çÉg —žlûvù¿þ×ÿÂØÂ๱PñŒqyðSÚË3’•Ô ë‘÷*«pÊ9†3ø–ã¹™-Ë4â™O­ÐÏuœf|Ú9‡9¨–Ué M´Hì¶ÛY•'t礃^ˆ8¥8²îN'pÍ]¢ïa€ó©ÒNnÓÏ×°M†¹/BhJ}œNÙ½=”©f!åðëeY _Ä^æz^ù?ÿéâ´,_î¯SM|ôNwÈ—ž¢/–Ïóæ]ë´ÊN N”Ï¡[‘·kxŽeOê½#«x)óÎöÚ7}‡GÆí[Ý û£fÞPg)ÁëSà xÝækÇ ‘s!óp‘˜JŠWwÐg²¯‚š¡{GIÎîæ?ýÓ?áÙÍ?_Q^}õo’‚F:ëG˜_F Ç‘.÷â”{ÿd<üîtàÈ÷ÜTVÍê釟{} eKß5n”£qF>u¾Oùì¾~Ô¸|ïT_“Ouþ7ùÿøxÏ ¼÷Û¦Cý³1ß/pþþÜc_¿Oûî_òNßy|*ÂþÄIþº5Á¹ÊøÈž÷ôŸ¸ý[ÏÑh‘×Ï÷·}4Òýßñ%_õ'?ásï‚Fñ9_yô{Â'ÞÇ{ï'ª›{¾‹,Å»‡èãÓE "…È 0\åSG&|ƒYÍïÃ`>i·Ÿá,sØm¸>0Q‡_q;¶Ä³O¾W#´~>ó0(§>yúácpZ%3¬’:ØÎßûìñž¯6{JÐ{¯?æ[ZÓ$úÐw¸çÄ`¿xžôó#ÆäÇ9N•lÞ…D3Ä{÷†~mòvµ@”K¨ûQþÃ?ü_P7à^ªi'²À8Ì$ší/ ûŸŒî•n§ÙüfûÔ¶~/9Ì¢=€»I§¿ãßàˆì¬´º¹RinÏ þRä´®ת”K{ÙM ’·Kw¿™Miñ[£+¨ÿâ+¯ÀM?°[?×¼¼`ˆpfdå ÈÓ·ë9]™_v»Í¸Û7æQmóGq7C4¼·}Ø÷ýÿç?�Ópؽ2r0¨¸}Ê[«5+þH‚�lgÊŠÛJj¯ðÏóC®¿J±(o Y(ˆŽ®Ù¼×eèé¥ Kzr<’‘µãPŽ`L/!ýnrÈ{ú§®ÝgiÉÐ{ŒáEM¡åÖÔžá³ãO&eßFΑ©jÚǪ?ý=ËâøB${N*KÑnu=:>€/~i6îºÈ§‹ñOÒ¤DãþÑÑ7%Ý6EÜò òïÿþï‘IÓBí”7î̺ÜX@£\\‡;Ûfçè»~ >¸wÃIºATR]£ÍôU˜Xy°%;ÛŠU¾§ =\Ï™æãž·í[E¤Ä,ƒ¿xºUšC/Þ>"É(%¨‚GhŸ R%“ç»›OéHÇ.#ÓBIx;®Gg@–½0—žÖ77‰¶Q„<\Õ P-m@²ûšÐªÒ§PRòñù+'_c¹Ê³"ùŒ¡²£ç–ðÓqv¿ŽÃ¹%ÿÇßÿŒùïÁ„‡ÒèÈÇoÿ»áøBàÐBs`“Äà¿cŽù€E0w€d´I‘I›.l ·Z‘ƒ˜i•ÈTgyŽê“R’ŽiI ®û%Lh$Ü1ÑK*"²{nJë=ñóóÕš–l)Ô¨¼«%}XšÝg]IP<$b :­ùlT:YX†eˆåAzÉÓ¶T0[2(71Bbã“ ñiôÀ!œC~.úœa[L JnRÏ‘JÞ,¹\Ñ3ÙqJnðñŽúéêz<ÿý¿ÿÈqØÝTQdUmk)Ýh5 â2GèßSï/aj¯Ô VòËA‰&:Ú‰(éh”…§˜ë` ±^|8à‡ØÇ]Ÿ›³¶†¤*I’vé]2$™V&L$—“J;EIh9¢:èt@ì³Æ )j¡H~É¢×ݪô£¨+ãlö`)§._ é3H ¹[l“>¯YUKßÑÏã]¼Òy£ð,Ž Ëzéj.’×¾¦ÞÛ©‚•­‚3åN}’“qè©õÚì¦:¸Œoó§à¿CP¤^’Þ%ê‚.LœÛš³\3ÔU6ìÿs�%sö`¡¤ xè8ºçþjr4³~­È`iÖ\/˜’Ô˜3ÛÒtý^æQާ~4Ú)ËÀ;¦ :÷Þjeÿ…8‹Ž^r˜&bªÓ]N¢þcIsH)æøRòÉs¯#9ðÝ)2;»´ ˜_Âþttº0§î¬ ć’Ýeǧ2$ÍíYæ£È†íDÕ{¦%Ü!C¨È5íÛ°CEþ×ÿößÎ~@˜EÚÀMZr8Í!c¦ÂÂ4üMGÝVÎ0'á{âüÙš`0ìhí²¼¥mtéE“)±¾ëÖË’ Î¼ŒÕÆW·;kû𳾬Ƥ-¸aRª‚ÐÌU²$Ú9Øow­¼Î+6ЏQ Ãcónÿ}¯d%N¸œŸî¤UdáqÏ￱&.YéÇ^ûKqfÓ¼C}3~^�þëlaUÜ,šÃÂ6fß‘3Q¬ ªÝ›í.åÅqŠ+ȉ˜w�Ä+Oó|aOYh]Ývϰ{2Ïxö'íÔ9Ñ"&zæ}LÇA(tg¼|¿'¥x2¶ïâWt×ì q3+OÔéÏà÷d܈æbß¿NùÎÿò_þ îYfߊLwÿ Ó{ôžlÀ'­û¯¼Ûnø×Ó‡Ã/Ãü¾úÊÓÜÌ>mÏ ´ÛOøìGñÎÏ{ùîþóþÏx태¨Óûá'²A'Ì ¨¡I¡ÔIo!Þ²Öú÷qd‰`g½‹)½ßÆ/hd‰ÜfÒÇ}5’qÇëxm6§ ÌÆÉïÛ³÷ÔÕ'ÂñçÐ…CÌ|I†žN#Äc¬\ù–Ãô›®uæµt`3#:QkxLCã*´±4ÑÇøýÑA»9þŰ"˜‚Öú»¿û;è AiýÖ È?ˆêýr;ªˆ/ X±·}Ÿï9±Ú¤,”Ô"ñwK-EΡÅáµk]æ)†È{ó”i¯/\ŸÄž/íïLÉŸXcI¨Wëàp»0¼sBvÖìëgåÜH aþÂpÔJN Úäv©%{¶F»ÂL`‰618pTAbÌdq'<€¯«Ý_´¼ î€øFÒZ¸æHÌÜé݇¯HF §føKÁ†:Ãõ¶Iš6þî?ý@ä‘òþ úPp’˜$n¼v8µ''SW[7ܶŽn4;n²>Þsc—ÑF(Bz(ÃÐ@ÒJ#eFüþÜ`’JÍ‘ÕWã4 ÎÀ®ˆ`c Ó­Ý(„é­ëáÒ¢óÖ£æèì2>p°U…¸süåënò†LÊü‹òóPË2YÉÐ%ý:©ÿÁ®Wý„á8(à)B¡6oäìŠï4Ý“ŒOCºOiÀ;x‘ß~‚)-5žûE¶rZyè½\]©ÿôŸþše‘ŠNr+îà¦�9²AzélBñ3wêÔ¶Êf›í¦"1ZG)ÐÖ¼"¢C¼ÈŽÆÎøs.}Ùœb":·!Ù«®3÷ÚjÑP,¹'¹MF‹_ºŽÆ°ež)™e›”>Ø^›ŸÈt5l¦ 6WåÝ.»Qª;NE ö¡7Ön•ãú\Ä>Œ˜¨Ôÿo.Ûdkw+,îæ@Õ»#шdÝkðŰîIþíßþ-ž†ïÉO~%xÛìIóE £;Î*EtÍÆ,›Ã†oðM¼‰œžÌ/áüüÆï=,c/Rr�µwCgöÜ]y²Æ8CŸ[¼àëýTEÿžï¹KµzÚ˜8µx0žWï(}nNöqÇ\JÔ@tîåßüÍß|CØØ—ø�lz彤UŽI®üyòù÷Hk'°ô™Æùô³…cÌmghuâ‰Öí™Öé0ôs}ÝAtúò½DÝ}öYÎt# ~¥ðÊ,bÝËëm«×Çü¬ð‹üë¿þt=? jbD“Ñ6TÝ�½ å=BåÞ´G(Êž°z‘X`˜(Ñ4~§'ßT^\?£Kqz<B#“9 ¿Ñ4ZÔzdµgmÑ)S½£š ä©°ˆñ (ßiÆ µçIå%pÀZÓˆ´—×c•¿`;OVé2T`ÓÔ”aûѱåýÊCÑñŒâ9þ0§„NÍðÛ_ýÕ_?~ßü¸›6ˆƒ\\¦Õ;#ÂRCQ¬qБüÒK/©çDŒÄhi€4×\€DŽÂ 9 ~x9dð”º&L¯†/K\ÝÁ³çULiÕÝFùSç¼g5Zl:Ú‘ØÇK©±AÊ<;´N³m×Ä­WuAHYÄCϤ16a—€„й”œS759b ³*q˜¥Òâ Š-c æ€ûÀª^ …áp° ÎNìÿŸû×I‰E¦n–'ñû௠¡ŒÈ’À'b#xV4³Ð³ÿÜ"9†–‹åºïÀšE51ïròúõ2`(=ß̆¬=ós«“ÁÎ1Æ®Œ<Õ+™Ub‹n|ÕÌnåΠW-|.áåŽJjVý Žh·Aúú`1Z·¢UÌü 1Eg òµô8¹“ãD[o™G©=¨å÷,À1ž) —épˆˆP%�FOÚþîhWÆ:†ÑþÓ÷æ_þå_âÝ Ô{0_â³öî“¿'SÐ÷]Ëûô„çÜT I¿|ÍS~ãñ£µÌ§ŒØóŸ|J%~îÿUÓé]/@ˆ_;Õûò{Ÿ?0ÿâ/þbðVym4îgth¤ØÙ]‡ò¬› ¤IF›MÂLŒ27¡¤¢ ÄaïõÞ@äaÂP³˘1›îÐ3Qîàä+�³³"l"5K�­œzÞgà3·ÎÈ}lµ4•ór{0G³—VKg«‚ Jq‚Ñe²óî±®xÁ‹QÊY¼›m$â^Cóçþh‘`€–qNà ý¹ºÈh?é–é õ&4L­ŠËåF/aÊ¥±Ê„(d„±Hy"̀Σi8CøëD?ß’‘@¸^‹hÌ7~¡+ž^?å`°Œ#ÔÜ5,"•­•¥»Šù@ÉRÎqF#Y|£ ]¾!ô9C™)Ä(®Á*OxA¸ÓvÍC¢ÉôöF00M“¼Œ¬$u~[”î¶6[n¹ &©7\Æü …™+YFãŸÿùŸãŽSÁ‘ìšç ›HŒ?¸´°«oC'¢)¸”ÒyŽ—¸ìk²ŒjCu¾ÉcÝfßïdš–¥ˆbºÏìBss¬Œ˜òúX% ‹%§7˜^ãZêMK8&uèI †Û¸ž¾Å²_Àè70QCêêé……†j =t#®µôž©øvf$¿·‡NËwœ3z46=™Ã‚x)›s}+ ¥OgZâòüÿñ9ðU¥÷û„®A¥:êÆêk•Õ‹¸ÅM`G㥓y_ɺ{yE{üágð™•÷“ŸT¤ñs¾ó£pÇ×þ“ñçÁªy\¸Æùó¢4ü³Q°üÿá?Hq'mì-«{ÒD jÁg5xwAµœ,ÎöÝ›ÊÙëMš6÷jýè:^"f‹è;â…¶Û& µKqCA§Ø;ŸúéXIsëᦎôŒÃ7¸…õbÂ<ÛèQ¦.wH‚©�çžöPçŸæâøUÏ1‰Q-:`KϸP]­÷‚“ÖÄKÉ!†þt{ZB¥íµ�€Ôy-þšL$¥BrI# Ã+iQÒÎ#¸õ8ËõyR)j?‘ GŽšæ¯Çd”¤•ª¶JòÝ#2n¹±+BøÍ“Š*.E¸U¶‘lT®=zM)ºP%ž�†Az¶èê>†˜ä¦¬×ˆî ™´F Xô”—Ĺ×CYP°Þ9Üø)x`¿FowZžD¦9ë\ °6*Ýi'EhÅþƒ1ØÀ‹ L* U²EÝ6FSB;ú‘?|üØ—ñ÷ßÿgÿÇŸ!-ï¸ež7k¢|¹uÁˆ[Î÷b‰¥„‰<ôÃDÕF  Òk KÈ «N€Ú¶ÙâŒ{Ÿñxòï»wåy˜z,Y'¼<9 ‚ 䉧âoþþýK3y¦ö°r~)NŸm†«ƒ (‡ù7tÜûX»ÛÎq.ÅfÃZB¬¹"žÕò'Έϗ1ã÷\Å‹lsS`&êŸýÙŸáY/¡… à.¤`ûx5í¥d?iA•ƒ…3R­©_Éö8`ù÷×f‡â8”KÁޏ4#š|ã[+µÑàŸëŽåH¼ëö_ìO¢!œÇG?rò_Ð6ÜÅ·½ô&Š|Ęàs`½cð”8?£g×7gjÚ«ùgú§˜<â÷ÑH<óÁ…-+£‚Ÿ[qdoÍGóB«CVTP»hv4KïŒ |ðPZ§à´ ’MEQUN\µ{jPN€x˼ðSªÈ ðü.˜Uº®v(I¸¡eªí¹òi§££ŒéÃ^ |<Q/}öã¡ÚnOJsîšo­E4zr2|¨ç3:{9&ÊvÔn‚¦[Eº…¹š»c11Ø(Å̳Ñi¡+H6.­µê-".ÿô÷ ÀK4%D PWST¼‚gåì‰&5£!|ýLŒ?èšju2²Û³.ÃáÔ' .Ý×?t\žäq4Ý"4_X4Y58šåCGb—rÝ:[ÛU³f¾UGOZvýv‡Ò2»/ÄÌÜÃ?ך>ƣϟíK]©6ÝCóî‹Ñå³=דº¿†T3 ÷J*­uÝ<"~ÿŸÿïÿ7gÊq?¡âϳTgÀóà 6㔉úü´vï¿÷úïGL̼þaŠþ"5ÌË¥Ó¹ø¤º|ù„;X­½F¢7êËÓœ9ø F<óžŒãéiÊ#¼îWü'Ÿ’(_©å^œA¯²'ßS©ý~ø�Îòƒ%Œ:ª>uîIf˜iÒ~²Å,›qeŠ…Ô¹{`GH:)õµ:ÿåyt†¢rYà/kZMÆ¥)_(kŽv“ ¢o¸t¤2÷‚ÔhÉü Yd;ÚÅöQ5&Ä%;1À=ÍfƒØÞm¬¿² S:yç ©3ω0òùã»4±gÂJ.Éà©Ò§Œ=CÛa#)ÈÓÚÀVxÙIÓˆIÑY§šn”3Rhsðçÿþ“?ùLPþ½¬q²„]!vŒÐxâdGö .€„aäÐÎ|-<%ý@~G&B«o'wŽéFô8›h]—Y(4¹Ïx<Nï ÜÓ˜IŽã±ôŽã SùäÈ>Ÿ»yºçq žnÞ¸n©5Í¥Wèe·&B6áŽh>î»HýÍÁÀu|¹š‰üã?ùc$Latƒ£)sÎ$‹êÄ'¬­\rö÷æ81=zÎ/žýu¢Ïì×(¡âŽ;ù`†ŽÊ´’Es¹Bî>b2Ád“Íx›˜Š§Éx§âê °Ê”¹˜PÈÛ2_°úáüÀ‰[Ø/ïÝqÚü‰_ãÔ! º¤&—!»)Ë¡¸j‹U÷ޱÀИL+'ümú^‹¬ÿwÿî‘òªÜäöbŒ®'šidžªYNêŒtNÚSSŽ«ßB@7IM+„aŒf~b¶Yž5Çm@…HÓ²b*óê¶©P…+”ì¿©üš`3aŠMwß�OÕ pn�Á<‘ȤDò‘¼I›e êîæ0;0SN ˆê¤Úöqz9úBJcÿÄHõŠD•À5_˜èFNL€”}úÎ0‘©ŸÎŒ•÷ ƒiS?9Kv&›™ú»G潿_�þÞÏ/~ñ7¾'ùþg_Ó§ÞÛW~ØW_Ë÷ö ]›ßÂäxÑÐö{ù“_¾|40¨-Áv`Õë'›%f[ŠPõÞüùx7áUÏ„1ûɹãÙ {gtØû»¡V^¸#1 \}±sKq­}ØÆKl­˜@ÄÒf‘uZ´ºõWSÚD]Nl5L'îÔY`8òx+yÄóÈdÕ$ðyd¥K†7ËT^nžv|œç¸rõ/ÆØ2ËßÚ¡TrMCš5zwJÈ5›:îáûµVž ,aÝ™A}+ly™—V–ÿî÷ @;ÂŒâEæŠøQ¶z±#$rB-zzB¹ð4 ¸[Øô”™ìí£—6/‚<�8€\P3‰îøžLËçZÇ!]¤ÁÎ"Jé#[†÷€0âp\µ+»1Î=Hœc¬o@Z¾‡?þ|žD7ëŽÝNÍI`>Æô\,J\6I."<,WHZ³§=—;l°*PtÞÑ¡2ò ¶)¨cò»/¿;Øðœ<noºã-ïØ£ƒÛîà‡Ã+ùk<„ÛRÀ¤¶Òâ¾é-'¯nŒùÖ,*kBæo©¢&©!¯©ðx<¸Íæ»SD*q¦q+=¡¶ž¢\Ýb®8ƒÎrêˆFHkë¶˃'ø5ƯÐo{rÕÀ? Ó ¦Ì¿“û1ͧž­?ýZþîwÙµ Æ·êöig ;¶k­ÛvgžÒè-¼AÍE#•yaœº¡/×~\žN(dTIÿže¾ÙrÞ»ÕssHn Íçc£× â²2SÅGÄsÈ´ ;+Ødi6 €LñBà£F Óf ~OEÊQ‰Æ"%¦ìØ)AÅÆLßBÕxÓF”FC¦…€Ý¡ˆ”qó—Â(§ÞÔÓ0BŒmjl™ÆÂUIÊÓ’k¼Ul¬ì䮘Ÿ¦ÿ¹ôG„qó¿Ûø>ÂIz&vx¶jšýtܺÞ³«ŽáãNújûó}T¬÷f>¼zo󿽑2MÚƒ¯F–N÷5!KÛ½ñÚ]÷“åp×ï$m~}ü÷û8~·mæøägóÓ<Ì?JU¨o{åž�Ì ‚‚F ’Uo°¿±ÐÒ9Éѳá10ŸDÀ@ǵ ¼ r6[sñƒ†Mr[0¤ý™yÐñŒ|ÞÄ“ Ä×=Èë[zlµU›³2Ý«h}‹Áæ”`>%MVZ T…©˜pãa$ͺ\zuäÁÀ'ã=(Á�4ƒ¬—&6\¡sQªG%ª¡ûD´±Ò«N Úç —ýBèvê™RL0j­i嬱Äû÷ŸÚÒ>y]ú®¾í{ÿó‘MñsÇü³¶Ñoôïú•o9·¾y{ÿ$3Ñ y rp5!µ[¬º-´š:@=At ׎Pf¾üd™VïÀ\RY‰©fiÍd€p­É욤îJÁ-<’çà@̵¯ÛZ9ÔŒ7!ã/¼ÓÇHa®]ѫ˒Ȫ†Ùy˜241™¤¤îp(HÚé«¢ÅìhŸÚê,Éo×#‘ƹùÄ~%©³0R%æ ÂÖ gŠ›ÖlnƒÁÝWeîhc Ÿ" z�HJwb¸&«2€[ë??þüÛ>M?Þÿ~üù±�üøóãÏ??€~üùñçÇðãÏ??þü›X�~ÿø÷ÿôøÏÿ÷»ˆÿ7~ÿ‰ƒúéÿùŒhü.ÖïÿûÿùM ê—7Bp|þ¾ÅjõúÏ/>8ÿ6õ·´·þ&þó囉”ÿ O€üÍLŽßÖ»ôcúüAýM�~KëôocP#‹|»à72¢ßlP¿nøèõ~G/ù·òƒúùƒú>¢¿Ê ¾oø×û åg ù·Y�~#ƒš¿þ þáMÓo1¨ßbøŒû Œò{¿î£“ås€_bP?qŽÆ¯?¨ #úõ}‹Áóà£ßõÑ·óÔ^�’×»�¿Ä æÔ þŒèw7¨÷ @¼s©}ï½|Ò"ðÞ‡õÞÉñ‘¡ý1¨Ÿ?¨¿ñý.õ¼�ÄFôÙõ¾g<>aH_æÞÞó]çÇ ~ö ~͈Ư;¢ï\b~¹A€ø„‘~u„?eùè×~tãåࣃ?õ°�|ô㾃ýÀ‹ÿµƒúµ àG_üÓ==|ÿ¾ú±ùÃû¹ à{¿í½ƒPƒúÑïdPã“@À¾øÓÿÿƾöòÞ7”_~«AÍÏÐ_qPß;‚¿ýÕµ/�ñÁyû‘üÄÑýè×Ü]þG‡%¿ê·ÅA}ϯþ ƒúNâàw2M¿ïA}½ /þ»W¯ý#ãñ_{Ïe|ô–?ÞøÎõ#+ê«oÙGWÒwv¾ãý.õcTàøÀ?ÇþùƒGýïG^ôÏ£gƒúðЈ~7ƒúZð=ÿŸðÏ¿àú?Ö0ý@þÔÓðkŽè·A§~½AÕ ¾rIýÈHÝ™ê]õÊ0~tMŸ�þ@5¿ý ~#úñ…áûÔQß3ªÏFú#šï¾øà%~¤÷ÿuTàßø Æ·ÔïeD¿î¥ÿ¾õýD »ëxï}}.Âòôãï.ç½ås‰@?õ³‰@Ñ÷ÞòÇË„ïcP?¦xõ»>2’ïÑW~ý•¯Ï0~;-À{¯êßÞ þ#šŸ?¢ßõ ¾ øÑÑ̯‡‡÷=ÿìvò?óuLÀ¯¹Š[ƒú=Œè׃ßß ~Ž%X|Âÿ~Œõ3þ÷׳û1¨Ÿå”Ÿ|ùHƒú¼ ø-ÿ÷øóKÜÊûÕ€?õ#ƒúKè/ûç×Ô÷Q¿fôßsÏŸ8|ŸyÈú6Tàƒú*pü‚#ú¹ D~—ƒZ ÀG‘”"*ŸRôUøèm½Þþ1¨Ÿ=¨}ÑÝÍÿŸ½»]®$¹Ê0š Ž�÷‡Æ|0؃SŒ=�KU¹3wVeÖY+B3j©¥Öy[zZ:Uƒ¥;jî­�#··o[é}W½7°Dg6jþ¨.špÍÿÜQÛ¯lýó[V½á‡­w±ˆ}³µù¨u½Q÷ÿ4]oÔö;µÜÅ*²ôw»$>¨ |x½wŽÝháQK¨5wÔÈ£�_t™QcwŽ<_ÏOþ. åùìÇZm5j4jÉuÆ£�ç}šî1jü`=Ï—¼ç3ßå¬/þø!Áµ<<dã¨3V¼aÑ¥GxæQn|äêÈAAâG.ïµÜ3j<ÂK.šôQäŒÚþpàRbÇY9&`ò-V#jÿ½2Ž_cÔì#„`ìÚÿŒCå»°tD¡tü:ñª•–_^ÔñsuäfÀÌC®Þ´hpÄy£Î;*p üžÁ•G¦¼ú=÷¸5ñx�­‹vŒZ:.ÑŒ£_-—y’†ïœzŽª^>üØÉ(2Oa‘=jÙrÔÍMµL5~G Yg¯J¾¾êêe½'^šsG »G­[Ž:ãV,Ú1à¼Qcw* —Ž—Oþqµ ~¨½§^4jþ¨‘ë�_´ÄN:r>ÉÞ;•Ž…#k–2tºðÞs¹GN°\ºo\)Ũù£n¸è„QKê¨×·´,Ü’ÜÖµ¹my­JËÅi¥½õËF­y£nºèÒ£¶ß°íªï¾µ“D- é#3ÔÔ÷¶ù¨%oÔ ¼ç{Gl䫦 F0ùMg\Ôþû|ȨulÔÍ †àžQÇ X’.KâU+³?ÔùÇ|騃³Üµh™¿è2£ætÖßB²ZFÍ~ª³ê}—4€5/�Ũ7ü`Ðèý�fÇi³–FÿŒœ+sµ>7êK}ð³ô«G–òÜ®f¼ã¯¡”«‡¿hÔòܨ/Yô¡Q¿~Ûþë�f\¯1x…õŒ«^úfÔìQ7_tÉQÛ Þs߃‘ÛO’o²ù¶12q)‘Â/:j]wÔ}?M{¾E¿gÔœ;E/Gëåø ¹ãÇwzhÔòÀ¨IWn¸hÇ|î¨ñãD×lY¹cÝž7ýðç`ñQkâ¨eÝpÑåGí;1HïšWw\šÔÒÑ­Ýszð…G-‰£”õ%‹.5jìÑ€­vëejÙ¥vÿ¶´GXGãPCoaÔȨ«.Úþ…¾Ö¨? z WÆáÁJ™zCkÆ1Vú¾õÏ8 ˆQ¿ú=+/Z·5r@Ö3®6éðueàÃî9êšQóGÝ|ÑÅF-¥ï~�gï7òq&­yW‘³÷P`}÷0jöcîXtÞÿ}£öŸ¬õÌ ='–˜0qÏáì#ç¡Ë95˜Q3n¸kÑú‚QÏ Ü»ê½§Y¹œ8ãLñS5{Ô.úø¨}w.eì,‹‹œðìù‘óöÝø¥£Ö¼Q7Zt›QsNZW¿©§£iþÉA_2jbY_´è2£ÆïвêW_ë¢ WXgÍXJÿ-FÍuóE—õúä g/+Á—å/š· |èñÛš:<jàìÀ-ºÔ¨ñ3µ,ý]Z¯²X»åÍz?”ÈEÏ93Q³œ½h[tùQÏïTK·¦õ¡‡÷~˜=÷<«Ã9FÜhæ¢÷œü¹QcW–àb#oÛùMUÏÿGßvìJ@£¶Žú‚E—uÞQ7²ÏQ7sÒÅÿÜOÓy£¶ßð®XÝÜÖÿú·ßð…£–y£îÿ¯ÿz£öŸ4ãcn½^dà·Ž~˜=?ÿ÷ŸÔ¨g¿'{ÑzÏ¢Kz~WàžÛZZn_)S²þãz.Bü¨ÀFÍõE‹.3jÿ=[ŒÞR5áØ=RÆ#­š?êf‹n1jû!ÁÊàâW—iB[[fŒÞU4÷`™£–×ú²E—5vXðÈ®£«vF!ó�PÏaÁ³F­¯uãE—õúˆ@™ÏÏKihúY±ýˆ@/µÞ;êË}dÔœGFÒœ—ÕPÍg?ò:÷Ñ€ŒZîuóE—uìfÀ–'²p௘9:a)ý×6ß Ø3jùˆQ7\tùQã=èZ üº³­-™=GX‹ý”uç¨õ#F}Á¢Ëzþpà–_÷,š¿jó´s±Úòpà¬QËÇú’EuôÔ`%aá–U;Ï 8r”õ¸¸¹§ëµ~ܨ³-s0jµ ^ 9%ËÕå[5ôæÑyï½#У–íGµhÍý”¼aÔ’6jû]Ï–, ///ŸpƒJtÊœ´\`…Q÷?ùâ‹Ö{µ¦ŒÚvf ÈÉHÏÖlùÂO:|]ë¼­gŽ^¯ÿŠQëZ£n¾h¨#g ξ°uå«¥“¾#ˆœe½/Â}7.6jYkÔ—,:0jµt\ Øú£ltéÈâ!hýc#cîéÁ³F-¯õE‹.3jÛ­�‘ï,JàòL6ò¡Nñܨõµ£¾tÑGG,óãzÀèÅœsH0£flóEo5/²Î1š}LÀû.ì£Î;(è„£7ÖžŒšÿ´ÁšÉÿŒÌÊûà-Q]êG€—:)�O_œF½¾ #j/ùn4ò~ŒÚy:oxᢷŒúýJâz®=ãJ¢¶;œ5{ÔÑE˺‹>6jì¨À3nX­s§ŒÎ×{­qÿQš}TàÞ»Éܼè£^Ÿ8ë®Uóï^5|¿£‘[TK‰œب=£¾dÑ¥Fí? Hä®É‘Ë•|uVï_|ï=ÎÆbÔì‚,¶èr£¶ß0úò–Ë”´nä]>¬¢õ.£æºù¢%ö°£{F=?,x$0­wëeOž´õ/~t‚ëÂþ%¾xÔÎÂo°hà=Ü;jßý�FŽW1ù¬ ³Ž½¿Þµçèõ>j)i÷XkѺì¨ínýŸu0¶Æ¹Jàí¹8¹ì³FÝtÑŽ/ôûFí;$Xdõ2ðëÁI[=rQó ùõ¤õ‹.7jìˆ@‘ã,—†×]­›pûȇÓ÷/ýèfZ_3ꆋ.?jì¨ÀWß­ôœŠeâÖ%8aÏÅ?*°Q³ ¼è¢‰™;jߣ#ËÍ;ÏRøs3ú|ôºÕ±G5û~� /š<pæ£#1)çoX7zÆ×÷ú®ÀFí&rJðõ­“Gíû è?9htÉÞ³#ÞÀÒ{öÞO¶±“ƒ5ûä ‹,Ú…ù£þ€Öë¬JpõÖuƒ/«Ÿ³g/kýäi?"­Q³GÝhÑ-FŸ¬õciY|ò«¥ãÃ:»ˆ‘ëZš?ê‹]fÔøƒZ–Ž\¾«Y[Þ¼çÉ\ôœ5ûJÀ…íµÞ2jìáÀ­kŽ~¢t¶4ãíÿ‚ï}8pæ¨åÕ£n¾hòŸœ3êùfþÿFw\¤ö;½dÜF}ù¢Œ:~TàÅVžùE}ßQš}Tàõb°Æ¨ý×ôþ#Ù$ùM¢SŽ}£eÔìQ7^tò·ûý£^?0úçõ^Ÿ¼î¤÷çµÞ?zU‹QóG]uѼ+�Ëí£ÆÐ{[Ë ·±ÔƉ³oP™s<�£f`Ö¢uãQÛŽ \K–Ž— ~Îfܵ¢/êøQ_>ê„û®l¾è’£¶Ÿ¼^]õÆÇ­ôÜÛºïþç>jÉõ®EËüE—5çÑ€3iñÍóï¦÷bÜûhÀÙ£–íF½kÑœ´î1êõAZŸüœ)ãQ«ÑÙ×µn7ꊋæ~jß?jü;€ïí9ÂÂM\í™p´­FÍ5ãX� ,š8êøwç‡9¸Ú¼c,þÖÈÙs¥öŸîš=êøÝ³[´c¸øˆûG;*pÏáWk™þ#Á臓óy;ó¶Ÿ9ê˨iÞ¨í·´¬›qLå ·X}÷ë‘£«çÜ ÐzsQKÝ~ÑÀ¨õ¶QãÇ( /‹¬štìŠì‹‘wPБ?kÔÍ|ë{Fm{8ðwI®yõòäo¨¢Fæ©ÂæŽZ?rÔ—,ºÔ¨yg9ûbǯαZ‚Ñ-§‹]µê¨eÛQ7\tùQÛî Üúg¶®9¶hóì'bn9�s¹ ÀJ£ÖmG}á¢?3Pôc‰¬\µæmù"/÷Ì@0juÓE—õüfÀÈw²½k~gÐó®{§ŽµÖ¨áa/~߯‹.;jÛ­�‘•£Ëô¾]Ò»é½Hã·Ìµ¼rÔ,ºÜ¨ñãd¼“¯xâ"ÕE>‚·úÂEoúW5ûÑ€~a?9ÿ}Ç4jö17_tÚ° �€Oÿâ÷#ÀkØä;Õ‡øôoÿ] øÚ+'ŒZžõ‹>ÿ‘£opûÊ;o,FM¾ðáE—ÕZšñ]Ágºé¢Kê®À™ßqWàÏSw~ݨ üäÙÿÁ@5¯¦ Ô»è2£z8ðÅEYóáÀ ŽZçú’E—ÕA:_öìAµÌõŽEKÞ¢[Œê`S–î�|ð¨ulÔ;­ó]rTø¢/¥çfÀu°¬w/Zæ.ºÄ¨ þůû¯øsXð™£Þ½hnÖÕ‰A:.–ƒ<3êK]jT§ Lý®Sƒí7ê^‹Ö-FurÐÎ/ðýOºß¨-:ð…]oÕéÁ.îüÓƒ£ÖW-Úðžïµí®Àß-Øó¹ÜI7®ÔÁÏÝÈÜíwŽŒZZ·_tÉQãÇøîegÏÙe™t}UdÒ³‹Òû –QóG}É¢Kz}?€–5KÃëJÃëk·¼Yäo¹h-Ó´ÝÀ¨=£Þ¹hÉYtùQãêY¼55žÙ‘w?ò ”û` £f?htÑš»è²£Ž°$þ?ñ›«Œÿ?wL@£fp±E—õü~�3ÿ£;.Rûý�6µ>7ê{?MŸµíáÀYI\æÄùF§î¹âéµ£–çF½h™»è’£ö_кòèåŸpõJ Nyßu�F; ²h³èÒ£ÆÐs¥ä=·­„æ‹~Ès`Ô–Q_´è2£þ€\´õÞ¥áe%þ²ž7í¹•ud£Îut½ÝbÔ¶ZͺpÍéhtÚÞûWõý`ÔìG–Î0ô.š÷/þs£žß¸gÑŒGX$Lœù‹¾ßkÔŽPtÝø©Eë FÍy4`I|þÆÏ׫çŸ}4à‡Œš|%àÌEs­1jìJÀïyvÂ5-µs挋7~% Q³¯œµèxÖ5~f Ò‘ÙÞã*Õñ)#Nß±ÿ2Î dÔì3-²èò£Æ¯Œy± üz ­µcêÑö_ ø¢Që¼Q_°èr£Žøì;‘Ñc/ל)³>ÔûŽ ¼ù¨eÞ¨+.š÷Eÿ̨ñã´®Yð¦û¬ôÌ=Qrßñ�>pÔÉǸkѺù¨ç‡oý‡¬÷L ç_Šžd©¿È£\ܨ¡±K¹<,ø‹.;jÛ­�¥ãåg+Ÿ­—x…õŒS/¶~7`ÔüQ7_tÉQóÎ|µòÕÒÉ×WµþåFÎ'ûÆÞ¨Ù£¾`ÑåF=¸åÏ,}õ=VÇ´-LÏ×K‰^=kÔò±£¾dÑ¥Fm;*pMø˜zœ7ò!D.VÎQGþôÏõe‹.1ê÷wŠ_í=öñO’ñ¡Fî¬C×õ»·yñ¢z}bÞ?ó™»§Îü×äúÄ Fí™ãýeÔ¾û|¨¹÷0jöý�ž½P{Œ:~TàŸ6ù0Ž lÔ]?Ôñ½ï}Ê Àþ+??�FÍ À»þí"�£ÏŸ‡ÇR?5óG€½~„¸gÔö{– ŸÏ7Ïx$NžsO@£FF}ç¢õÑQÛO>ãþ�Vn™±eò–‰ÇOnÔȨ/Ztà‹=wÔö‡gÝ#ðê²Nš3:aKCp�žµ¼fÔ,ºÜ¨±#µ®Ù²râÂ-s3ŸM™vQëkFÝ|Ñ%Gm¿+pé\³7“:{5åqñãnë´FÍuïE¿ûâvÔ¾C‚µ>غuáï¾›.2ç˜ñhœÈ¨ù£n¼hpèûFŸ¬4¼,ºpçº-Ÿ§‘9“Î^ÿ‹?rj0£¶Œºé¢£Ö[F=8p ®]87§_NÚó9Ú2åÕ¯š?êKmu¤®í¿î? ÈٯϞ´ndÒ³9c_äW‡3jæ¨/Xt`Ä9£öß Øz^‚\»qé«ëSÏ&<›ójêÖ×5Ô  ŽÚ†ÜQûOÚsî¥Içb:û\lýœ½šºí‹~ôä up¬wºù¢KŽz}?€Ìçó~ˆš½u¶èóç(7 üÞQ_¾è#£ž¼7µ­ÉLÈkK+[oì üOŸ?JËaÁÚ;êÆ‹6uÜ>jûcZÿQkYzòw­óÖ/^6gdn£æú²EE7jÿu�g/+Á—•ØË"÷S9‚Ÿ»=sÇ`ÔÞQ7[t‹QcG>Ëkdñ–•›Ú2ówó]5µ4½Î¨Ù£¾hÑeF»°ÓÚ²d`í³ Ï¦léêÑý…?z3 Q¿{ݦ‹.=jû]£ÿï}ÛĦ¶Îu ¼m À¨#£¾dÑ¥FwPÐMŒ~õÀ¨=ÿÿÐ5§Ž»0šÈóÚÛÇÞ·€Q££f/Zï_t¹QÏï4òÖÈzƒ\L^:'¼þ=FÍuãE—5þ` Ö«X£ÿŽ\R:ºûbïýÀ¨‘Q7\tùQ¯ÏÜúYäö•9GWݭ⸘­eæó—5{Ô;-ó]jÔØÍ€Ñ%Gïw™<gKs¯f¾š÷ü;�£ŽŒzÇ¢sÓºÞ¨9ly}ôs6¡­-Ó–à¤GóE3jö¨/Zt™Qûn]oàùÈl#Ï5cìÃ5jö¨-ºÍ¨çw>ûQ¶4>_R»æ/ ü¾Ú5–Q¯F}á¢;(hdÝÈ“®¯j™³ NúýE1jö¨/Yt©Qã?\­]xpåèaëJpÞö/ø‘ŒÚòáo¼è²£¶è«_÷,š¿jxÚè¼åbâ£9�FuóE—µÿ¨À‘Å[Wžô“ÕWSEç;ÿbïýÀ¨‘Q_¸èã£þ€X²^Y¹´¿,r˜…˜÷lâÒ8óÿ}™Q³GÝhÑ-Fí;=øÙêÑ•Ï^ÞÑÒœ÷ìåßMwöòï¿ø::êÓ‹æ^ ¸Æ¨ñSƒµœ{¹eå–Ea_:§<ûަ‹cÔìQŸ^´/ kÚ~OÀÒðú«•[×nLíÕ´å›ÎöLyö V<�FíuÅEû~Î_gÔØaÁKpåÞ5'<rõlâ–)[>¬?ýùߨ™£®¸hÝ|Ôþ#]­×sø•ÎÜÖ‹ÉZ¿ ޱ/›/î jÔÌQ7_tÉQÿôáÀ½K׎-’ÑT§Jø7²á.£fú’E—õû;EÓ¹èÙ2ÿ¨Ø7eFÍõÅ‹>6jìG€¿ë§Q³¯š°hî¨óŽ ¼àßÌýE7ªE×u<�Yƒ7LwÜúW`ÔìQ_´è2£ŽÿµüÀʵcº–JžûÀ¨/\tÉQsîY~ÂÏ…=7ªS×”OW£FGÝxÑeG½~,@ ,™y÷ª:>éÈ}¬Î>„¶yš=ꦋ.=jÿÉAK‰Ý ëlåŽu[î\9r/ë–ùŽÓѨ٣n¸èò£¶äjÑ–5¯’œxÕÊÑ1eËC.b·0jö¨/Zt™QÛP—nIçCç°8ënۿa5êè¨/Yt©QÏ <r˜•¬C¯t»¢ç¸*_½,~ï†0ê訛-ºÅ¨×h]«e½žƒ¯uô4zdµ–ßSÃ}5jö¨›/ºä¨±�Dþ"ëMüq52yôŠ9Ÿ®FýÀE—5ïÄ %ðº«5“n²î9ÂzëÔ×35{Ô]vÔïÏܳøWËÜxú•è9VÎ^×2ßùï3jö¨/Yt©QÛ0ú|É{>óÌjgÓ3—P�Œu£E·õ:�½«Þ“Ò”ÎΙ֨٣¾tÑGGý:�=k—àëKÞâßMV3¶žsõ웫óOW£ŽŽºù¢KŽÚ€’°ôÙË&5õ»ÉZf>{YüV£ŽŽúÂEµ¿øÅѵâèßBÏëþßÕ"Çÿ{þŽ×µ¿½Q³GÝlÑ-F­Çßþí^ñ©ß;8Ž¿×¨Ù¿w³E·µ¿üå1¼Dïÿ£o¸ˆ=³ôþÿë×5{ÔÍÝbÔzüÝß·¬˜ñÿ&Êû¿Q³ÿ¿Ù¢[ŒZ¿ÿû#åßñ>/VÆ4ÏÀ¨Ù¸yÑ-F­Ç?üѺÜÌß30Aö”ã0jô÷n¶è£ÖãÿñèZ g•Ñ÷¸hÑ×e¾¯#u8£^`ÑE·µ¿úÕ1tÃè/ëœç™—5ûe›-ºÅ¨õø§:šïÙóúÌ÷Ùx±F_Ÿó>šý>7\tùQëñÏÿ|tß9ºg©‘÷1xq3&Ë€Q³°Ð¢ËZù—cÊáæ<Äjø"ß÷¼Q³ŸßpÑåG­Ç¯}t]Â'Þæ›‹ÑsÑç¿Q³ßfÃE—µÿú¯G×O¼®ñ"®ñ:£f¿nÓE—µÿöoG÷%ýõàAØŽÎÖfÿúë×5{ÔM]zÔzüæ7GÊÑïxÁ‹ž1_ÿû0jöûØtÑ¥G­Ço{t]êÞµòV힥w¾ØÛ5{Ô]vÔzüðÃ1|Z”šü²ÏÕóö½½Q³ßçÆ‹.;j=þýßð¥{êå ÓÞ÷r£f¿|óE—µ¿ûÝÑ}ðó»_×1ís¯3jöë^°èr£Öã?þãH9 úïc`ÚÖß“÷>Œšý>^²èR£Öã?ÿóh¾D‘K>ã}&Où}ñ÷iÔì÷ùÂEµÿõ_G÷¥»ûí&OœûvFÍ~»—/úȨõøýï)—ôþõnn^�Œš€,:mÔzü÷­°Ñ_•QwÀ§Z>Sõõ�� �Àg ÿû´‹ž<yú¤§Ÿß�ÀÇ��@�����@�����@�����@�����@�����@�����@�����@�����@����@�@�����@�����@�����@�����@�����@�����@�����@�����@����������@�����@�����@�����@�����@�����@�����@�����@�����@�@�Œ��� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �À™z ��� �ÀgàWÖâÉ“§Ï{r+�|0����@�����@�����@�����@�����@�����@�����@�����@�����@�@����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@�����@����À �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€����� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€����� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€����� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���œ©Ç¡� �€���|D�Ê®¬Å“'OŸ÷ô3ÿþÃç��@�����@�����@�����@�����@�����@�����@�����@�����@����@�@�����@�����@�����@�����@�����@�����@�����@�����@������€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� � �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� � �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� � �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� � �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€����p¦‡€����ð(? Ož<}Þ“[àƒ �� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€��� � �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€����€ @�����@�����@�����@�����@�����@�����@�����@�����@������@�����@�����@�����@�����@�����@�����@�����@�����@������@�����@�����@�����@�����@�����@�����@�`_¿ÿíåÏþs€Oôg?ÿ«²Òל�€����@�����@�����@�����@�����@�����@�����@�����@����������@�����@�����@�����@�����@�����@�����@�����@�����@�@�l��� �€��¯VC@����ø„�”£õÏxòäéÓž~V|�K�@�����@�����@�����@�����@�����`‡�¿.¥þñà#PÿúÇÿüðãÓ_>óG€¿øÃ·×��� �€���� �€���� �€���� �€���� �€���� �€����€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� � ���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���@�����@�����@�����@�����@�����@�����@�����@�����@������@�����@�����@�����@�����@�����@�����@�����@�����@������@�����@�����@�����@�����@�����@�����@�����@�����@������@�����@�����@�����@����xV=����àP~,@ýã3ž<yú´'·À��@�����@�����@�����@�����@�����@�����@�����@�����@����@�@�����@�����@�����@�����@�����@�����@�����@�����@����������@�����@�����@�����@�����@�����@�����@�����@�����@�@�Œ��� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �€�€���� �€���� �€���� �€���� �€���� �€���� �€���� �€���� �À™ÿ`�Ê(r2‘#Î����IEND®B`‚�������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/preview-opacity.png����������������������������0000664�0000000�0000000�00000000207�14136337723�0026331�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��� ��� ���PXê���tEXtSoftware�Adobe ImageReadyqÉe<���)IDATxÚb<sæ 066Fæ21à4•füÿÿ?2ÿìÙ³ƒÅi��±9tà&¿����IEND®B`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/tab_list.gif�����������������������������������0000664�0000000�0000000�00000001522�14136337723�0024765�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷|�€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###������������������������������������������������������������������������������������������&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¤�,�������/�I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/tab_preview.gif��������������������������������0000664�0000000�0000000�00000001541�14136337723�0025474�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ �������������������������������������������������������  !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��D�,�������>�‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/tab_tree.gif�����������������������������������0000664�0000000�0000000�00000001542�14136337723�0024753�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ ����������������������������������������������������������������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¥�,�������?�K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-bg_glass_55_fbf9ee_1x400.png����������������0000664�0000000�0000000�00000000517�14136337723�0027767�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��������°ªAÏ���bKGDÿÿÿÿÿÿ X÷Ü��� pHYs���H���H�FÉk>���IDATHÇíÏ! A€ážblƒˆ°£A1{ëV«Y0iÝûxÁƒx…v‹ãÁâDÃK_øÓO¾é¦9 �†aßÕ”êšÜ}öî^ðJaÈŒ­0bîvBAä$,ÝQ˜°¢"_44ñÓÈ=´SqcìyE½¶IðW <kAèÐÿ‹iÃ0Œò<a$Sˆìy.���%tEXtdate:create�2018-04-23T17:39:52+00:00Rå°���%tEXtdate:modify�2018-04-23T17:39:52+00:00ü] ����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-bg_glass_65_ffffff_1x400.png����������������0000664�0000000�0000000�00000000317�14136337723�0030051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������G#7v���bKGD�ÝŠ¤��� pHYs���H���H�FÉk>���IDAT(Ïch`…£pâ€�•hÈÓ4±i���%tEXtdate:create�2018-04-23T17:39:52+00:00Rå°���%tEXtdate:modify�2018-04-23T17:39:52+00:00ü] ����IEND®B`‚�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-bg_glass_75_dadada_1x400.png����������������0000664�0000000�0000000�00000000406�14136337723�0030024�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������£‰D���bKGDÿÿ«1Í��� pHYs���H���H�FÉk>���HIDAT8ËcxúŸa"ª£[·n{1Üqc¸Ëpo"Ãý? 3}`xRÎðô1Ãs?†ó^^bxu–áu)Ã뉣hƒ�¾W£%R±|���%tEXtdate:create�2018-04-23T17:39:52+00:00Rå°���%tEXtdate:modify�2018-04-23T17:39:52+00:00ü] ����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-bg_glass_75_e6e6e6_1x400.png����������������0000664�0000000�0000000�00000000406�14136337723�0027626�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������£‰D���bKGDÿÿ«1Í��� pHYs���H���H�FÉk>���HIDAT8Ëcx—Ç0ŠFÕѳg Ïžßax1“áe&ë8†×! obÞ¦2¼‹fxÀðÁ˜á#3Ãǵ Ÿä>Ž¢QD �@ö$�.5o���%tEXtdate:create�2018-04-23T17:39:52+00:00Rå°���%tEXtdate:modify�2018-04-23T17:39:52+00:00ü] ����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-bg_glass_95_fef1ec_1x400.png����������������0000664�0000000�0000000�00000000514�14136337723�0027761�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��������°ªAÏ���bKGDÿÿÿÿÿÿ X÷Ü��� pHYs���H���H�FÉk>���ŠIDATHÇíϱ a‡ñçÿç\!VÖJ#XÀ�–ÐЋD}€ .fø>ɉî>±P¼Õ¯xª‡´xÌî�ÇqçÛжuÉšqœ’²f+Òð6º®[\¥Â‡‚£’Ñ×›W£T4rí¹™6:]V:æ, (üÅ´ã8ÎyG-(dšŸ H���%tEXtdate:create�2018-04-23T17:39:52+00:00Rå°���%tEXtdate:modify�2018-04-23T17:39:52+00:00ü] ����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-bg_highlight-soft_75_cccccc_1x100.png�������0000664�0000000�0000000�00000000430�14136337723�0031630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������d����2×Ùÿ���bKGDÿÿ«1Í��� pHYs���H���H�FÉk>���ZIDATÓcx|Nhã÷ ôæ2<hc¸_Áp/‹án,à †[_nîg¸ÑÍp=œášÕ㠗w2\je¸XÎpaÃù&†sÎÞb8ëÀpæÌ�"�±–žê•Y{���%tEXtdate:create�2018-04-23T17:39:52+00:00Rå°���%tEXtdate:modify�2018-04-23T17:39:52+00:00ü] ����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-colorpicker.png�����������������������������0000664�0000000�0000000�00000000756�14136337723�0026142�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���������óÿa���tEXtSoftware�Adobe ImageReadyqÉe<��IDATxÚœS=OA|Ë-䔯 Ô˜~5­‰ÿÀ„ÂBk¢É5p—ИÐ" …šŽ@…1*&žzß¸ a“Éeóf&óÞÛcžçÑ!ívxÇG½^ïnu§Ó¹âI’P–eT¯×/·Ïf³´<Š"–¦)•J%šL&¢önðR…D V_Þl6O -Hƒr¹ /ðdˆC¬±/¸Ò�Z$ \lÛ†A(ð¹Ad"W% †¡LP(t_ÑΛj)R¦8{àB­œ†¡ ^V/J˜m˜_.4r:A>ŸGñ»U30Wf@ î:A¦Á3‹ÅBªªÕ*>Öp8<Ïçí¦  ý›�½Óx<–D±. ].—•n·;SÿÙ¯™@>ÎõÞ™î]¼ CM©ßï¯ ÇùNàû>ÃK´,‹\×½@‘1ök�¨Ójµh0P»Ý–whY­V»žN§·f¼ÿ¤j47¬X,žçr¹ã]~&1‡{dÅ8P«Úæ òêK€�ÖA÷^FÔìt����IEND®B`‚������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-icons_222222_256x240.png��������������������0000664�0000000�0000000�00000015412�14136337723�0026561�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ð���Ežr@���bKGD�"íbÖ��� pHYs���H���H�FÉk>��'IDATxÚí{heÇ}Ç?g½¯¼¶{•´1)Þ©û ì]K&qqñUÛ4kbiKšR(H¶‘BíÄP(IÁvJè_±ÝÓ®IVÛ@nB¤5i²N’±iGòjqë& ~A#QšöªîrX'§œ×Ì9ó:çÜ«{¥3ßE{ï=¿yÏo~3g~¿ùMp&ãÀ  à1Xxh8<È#dlÐ…ØMx1Æ&°Ù$è5 ~üŒV޹ Œ£c$åÁ×±‡À,�ÃôŸ ¶ñ£ƹiÃØòN:±Z ¢îߊYÀ”ò>’"ôB�Ž×H!‰›ŒÃò¨¶€-CÊuê8tÒ}€¤ŠÉ8Ð!„BóˆˆÒ *ÅOF™.[ÞaͲ»¦l«ãB&ÌЦ1hŸ>¢ÜM]hN¥ÞØ4MAbÊõäÌ!(½hE¦1˜5jÕ±cOÁ<6Íe7ËÀ,e›œÙS(Ï�f„oš16+3˜y JR|{ˆ^3À^Ç›û©{í88è ¶öÇÒÎ~'°áð Ðpxh8<4žÏ� ‡g€†ÃÛäãºü»Œ2ö�n6e̘ÑÀœƒ½{êØØÕáQÙ÷“”³pÓ€™›PßAãšï®iۺߖúfîSŸú¾±(ÚDÐï†'¡Lú6=ÝÛÅÀT:sîöøf„qÚÉç¾€l ú.cËI ¨ÃØÇ§‹=€iü¹•MÏ>¡ÕÚ LN{U´&…ë°Û˜˜Ë&’š{u°ƒoœºö�ƒ.ÿ.ÃÛ4~#¨áð Ðpxh8<4žÏ� ‡g€†Ã›…çp—¿þ^iéò¬½/0È„ÖTWÙc æò‚Q×ïâ ¬@)‹ªyØÊu}`LÅÎUc»ÕÀ%T‰¸¤�¶êÐÇÈ¥ ¡AÙãR¾À@“?Ëå‘Pì-`®¡™BKl° b©üâàZ}µŽ½‘‚øÐ¨‰´Í¢uJ¦±%UÌ]•K2¼ôe tsÚYíÌÃ@,e�e¡Ãè±…ráÎjcÜ­s‡ÔMä’nÕ0 A—´ímP —y ÌDœK(5Í,ílNÃ&bÝD´mÙrwYDV…Åít©e$€›è¬·Ê ¥L¿Ê¬[ºC˜ª0OÓæ P÷ &Ðà0èìåü+Äõ; ‡g€†Ã3@Ãá áð Ðpxh8<4òáÐÄYêà`÷ÞO¸´€‹F´Z<ÛÙh×\J!c€ä`”‹»÷j Ð;TKËVr·0¹šÍ´qc¥cGzÊ䟾c•[ Ì•P5átÑh)žõŽti¹¹†Ð—ß­tyŒåŽ×Ž•ŠÕÀ&êM/Е†¹¸S·ÁÖu³¤±—@—ŽÝ…»½änéÕƒb×9ºí`yÖ9ªó‰¡”²Ya¬SXÅ0eÀ½‚qÝJ`nB—üígûõùÛbÛÀÞæ´3€™4 Pî- k€**‹@HCz(}šò¯‚¬ÜUצÜÇcj2ƒ«=˜òObª×�¶”3ß ¦óÍùR–´05€¼€1Uß\8SMiˆU³›}©ºÀ΀¦låHl•NÁ ¦îÝJ¯½q+%e§�7sªÐê"Â< Ö‰íÖ¼êz¸ÍÁõMÚLéT¿ÔƾPÂû1f½1ißÁ ѸÛüVpãá áð Ðpxh8<4žzAª³+ o`ƒI_åRõ±šúî~£~éËf÷Õ½h`‚Icî²K˜hìÆ˜êQ÷p•ùxx`=þjï`]|SêB¶(Ëîí·¸Ù(¬vû·ëF3˜4v¶Ø6œøT§í4 ¨î5ݨ×�:£³¾*›ª-D#Çn6¥÷aâªë J<Uå«Êß~²y(‘1€¬(,|tÁzÒ}åãdº¼j¨³0u]PTË×-D}@Æ�¢¢° Ûn°+[ëÎŽ AÔBþT…èÍ(Vå K¡‘â©BT<𑹗[F{�m¿Ý=„™-€Ú¤ÂÜôÙ$¤÷.’„ JRÅU júµ:X·Œe©nØ e«›ÕbÕ…¦Ë"C öàe2Þ@ÆÐˆæÝ‚ß ”Ѱî÷ Ðxxh8<4žÏ� Çð1@kX6I›<¸é²M*›Ð‰ª Ñ¢»+¯bƒöƒ04(ç.ÞM3Z£<]&iÃUuYŸaÝ�^2˜w©Í»ÝɨnÑU²@˜n”ªÏîE¢4 ÑÕÄO¾Usª.JŸòË}ˆŒdwïEdúpËô€ îþme^fщþmF gg“ÜÕùËùTÜÜG4ÉѰ¬É̯mš¬¤û«ÏãÛN®œÕ§ÿõNÕc¶Œ¾®€¯ƒ„’¦5™Lxi‚õ¯DÑÉ9÷|䋊%Ü”òhØP=²Ã¡b“éŒØo½p½VBGX ,¬#E°Ú+¿\ž^¹•o�ʼdM¬³É³]Éd¢¦Ô.ä@ 䮚ˆÌöD²ûeÞÌFU6'g6ßÛ)Õå52p|–Àf°ÖX¸_a›"zó xößÃæ ÂwÒ.cøt» Ï� ‡g€†Ã3@ñŸ`"Ýi˜èKú9ÿ¶¥s D 07Ü Ó•Sú”EÓoCÈYÉZ l'N°–~_SÆž¨Åy‹›Øa‡›xKÉÖÒ©ºÃzº-&|(÷ÏœCÚKÑÁ¸´Xg¯dÓéó–5Igçê8k8YTL=Â,/ ]sœ—w-~’õt¹„ªÒçeé÷ ^‘~æ&6vhó}ÞÔ¶€:gÒú›?m—bG!²–·Õ1Ý:O8ù�«š]¸%ƒ¬2… šŒ¤ßv ´Ež@5"Ç6 Y“rXcRbÉÝŽ—…ÒE%ÌÇß`„#ÀD̺r¤‚âZš:—Ï›!²xšRÂ�ñ§h†!ùð}vŒÛ´‡ãϳÚ‡ ±çx‘y}FrA1#É*€uT£?>·Ø!‡x#ý~½² G¸ž€k ¥¼Ó@3K@³:>P¤RŽÁ“îÿMþA|œÍe]Kßg§F.BÄ�£†Ôtãl�žOY d†ç!(v„Vî³XºŒ%mó#î�¾I[RR—`2–T“… «ßHºÿw‘YÀu=«êþb‚YPEcçU%Í&@ÓýĹ£]äÈ}æq˜×ão7*¨G¸L›  ÍeÞQXä5©U™Ú½-Äïó峨û8| ™ÀÝ_‹ÝŸ¯à5\Ã5ŒpVH^ÍÕ\ ¨FØ¢¥ûaŒç™a†ç5æœl1Í4[×ù#übüo¤P¾1ÞEÈ´is€wMJ'5TøÓá06ØB|Iñ,bú³¼¿`ŠÕˆPý¶XÅkœïBÚ$À[ý-EóOHt ü|î3ßDÑ(i­ˆd9ñN6@x/Ø m°(ª#àwj†PÛt¼×/ZŸ¥Ýob�q%[:Åîÿ3^”~a‰æ5À¤â5¯ à¹Ï|E닃¬^³E²ø$¿L³-òà«Â_s, ß«…Ð㕔Ņî&À¯ ¿_Ô,¤ú‹ÝßËÔ# Fí}œ—åî&ðö“.À£<4žÏ� ‡g€ý…Oóérdh9ÌÖÃåæM7L(5ê“‚.»ø–?M(ý›ÎÑçstÕ¦“¨-?Þ:ÀŸ[Ú§C§r»]Ç'ø×YBÍ2ËlòC| lÑeXSØæ¯pG¼õ0KcI¡±~‚uÎ L0/ÑËyÐLtûrøI¾?R»%·õéÜ-ÄwÕÇ·hã§÷ô$L�ÌJö�V¥ ŒÒÍ¿¯Ó¢ ,ðóœåù‰g¹ xŽ_7´îl¼™4Ç*¯‰ u¤M+²@Èxî<}ÙÛãó„åq>Êã<À#šš`i– :=ñè§*—ëÛ¿Í{¹Ä)þ‰_Óø8hs™€“…¾Œè¯p…CWÒ“æŸK¶`B]HÕí"}¾ „_Pî¬N³ÄËtƒQœl§®1YÉQ‹h+ ÖÞÊ&?àßx5:Á Ö˜aY«Ò­ƒ¿ç=\¤ÍEn嵡¢½ô¶‘.ïYʸ¢°JŒ¾E%uTj5å…ÚÚâF‡'�÷£ñôØb;[œ•vÓט4˜uè°Í6]ºlkwý3¿Ã·˜åë, : éþ%&ú² ü[|•Ó|ƒÓ|Yi¸q`:™Ð®ÒÒqXcø2+u|~/¿wrz²[j-ðI>#ýþ Ÿ,„9ÊQ:À#,2Çù¨—Ä5@ñ@%ÀíS@@6Ã…Jú{Ùä6¾Ã{øï)h­“îW~q]µ¦ˆÌtƒ”<ý+|ˆ'ù0Oòa¾Æ ‰6 šÃ3úUüÄHWÇÏæÞÏæl;¬¤µŠê'¯Z9©Z\˜oÏØO¢åµú‘×e†eŽÆ¢[o¨ÃdaŽ“ÀÜýrEm&ÛʧÌîãîãþ”3mœÆß6âÏ=¥gÝ^SæÕx Hj–ïàmiŠ(v €ç€ÛˆÅ{.ÿhî_•£å%€8ŠónF¢7y{˜¨âúîOÞ¨ÞFS5Å:˜‰ÉÌþ/ÆÒÕ¡„†îW•PåH+bÕÀû¸ÈGx˜ç/9ÍßIÔYy€.‹ù¸™M«tà‚TeÛ•,¦Ñ¿Æ- ÜRÐÿŸàeºdËÏ ºü;›Ó˜:ô9k÷ÃTî5°ˆmÅó¸Âïñ�ž ËEˆG€¹|\WuðÉøõÇ£ßè@^L÷³�Eôö� ‡×4žÏ� ‡g€†£y ©; J'UåÞäŽN×·Ç<‹ p2m€“•Ó«î .Z„œ‹¿ŸÓZ5<ë V ,ð¬p†3¼›wó=~©3jǿěŽ#œâ„ÜÊ­„|€S…øf÷yk†¼=C‘n 1]ÈC¦'I_O²Á*,ÒJÕžÅD\\IöÇê}–EÚ\æ$ŠM•(çEîæ\¼ß®ß?Æ«w ¤ßßâÇŠ½ÐEžb‰6—ãtä½z»:<Ñïu•ŠdóÞk¨Ðvs!‚ÔPfMáÊ7dTˆ‘ª³3 °Á*S,óAZl+N ‹À³l R¨&{íI÷«T®GãOµ*úM~Ì;ü˜·”ô§XFSþj霠›^‰Q”‰”N†n3ëZÕúÖ0Ne´Rø]Œ3Î8ÿ•<È$@È Ëœc.æt³=‹.{eä€î†'¶TI¨s‚Šu‘» ô¼>-?B²ÁpŒ— ¹?ÊÇ�X¥J $žxÜQJ�}þ!#±ÅÕˆ2…Ht!VɽV¸\'‘�ÀY¥3ï6€ŸéÑ6YuÿÝJOAaî[5e®ù]p9=7§œ î†tô«»_´yÈïµ?ÉOSýÀË<Vˆÿq.¬Ô»ú‡”;ð®8’~þøYEˆ°Ä KSÈ€ìXjq@M�ÿ ü”ü/ðpôX”�Û´â¦[¡SÁä c7ƒ'S6 ðEþ ýž·‹“»_Õ'¹_øõ)^3ä®b°hŒþ€+Z  ó"rLzòZAˆò#Òí•[Ü ü'�?ÌZ7{mZlóÓ¬ÐQ˜De+^µÏoñ©*Dûg¦ªr؈;/û."éþHFÜÆ³5éþ)F ”ã÷2Ÿc.þWì~Ø`‘€‡‰VEl³Íÿñ6®RžàŸ´8ظ–ky•k¹.þß ÕÙ`ÛàFp7pps"›"ÿÑKR{(usñ[À%6 uÿsÜÍ»¹È,BDÔý«†ô/±È·_Pt?ÀYåVyŒ.s ‰YÖ3–ã…óÇ3ñáúìÿ™\ˆV*#’ßyˆf2j“…g„²ÚÀA¾šÑ¢› þg¹-§5ÌÝì¶FhË-1·9Æv¼œ<s ÷𯳥m¥ =/_fæWX‹Mò&ùלié´Â†RvÙ—Qtè§ô_àÕÁ"ÞÁÃÀƒšQ<Ë(‹1[µø_~¦Àb"T z3ì‡Ýsxh8š§ ðà áð Ðpä`Zë/üNΧš¤óF—¨{ò"p‰i`¹ð ÄgsOîãsƒ.¼G}ˆàt<ú§9 ugÚýÙÝg•R`Ðà&ñÕX‚t¬å²‡Ø}¬ ÚôÝöõÛ7ˆ °�Œ2JñXÇe\ÕÓ 08j=®XJÕQlÀlÜø³Úx¶6z(\5QìâIÍ÷=l 8Í7ÉŽ†ÝÁE©a4± Oì;-ÅÁMÉ1IyãvVò’y^Ïb–ENó ·sQ“‚›Cw[ ÷2 úV¼Ç¼  o»ywÁ7J¿‹úäK'ýTu¿là¡>_™iŒÆîTôÓ<Í›<ÍiM ÀpìÏíèÄó7ÖYMWœ…ÿ=þÓ¡ l(™‰Ð×u¿+–ÙÖ^jÏä>3¸Ø2N�묳}º–j�H¦�Q RT‰È¢¯Ž ŒÎðnçžfÝ®ï~»+æ˜c™iQ ðÓ< Àû¹¨Ma=íÜ|ñ*ªõý² ˆ$@'ýÝÔŒÙÓÇ•qUO;–5~@ °eIî2þ9Íwùé"ÝÔ O‘~‘÷s˜÷sÑàk{‰²Ï$€m‘÷>¾¥ þvî z–’^2èÕÉváow²` a£‡¬³¯Ö4c¼êM CŠˆÔ÷ì‰bî>Ÿ£ÞËq:¬ço“=-îp`_2€ ng:6K„ÇXV,¤šÆ2€Ç¾„×6žÏ� ‡g€†Ã3@Ãá ŽÅ›ÿs�aƒÈ�¡R ¢WWB g-N°;F[…ŽÕ’aÏA–�V¬L FÆ<-m VbMC‡• Éì7¯ ÏK)©X°àÿ¢P‚yæ õsï~«¦=¼¯à«<¬Ü’Õ{¥x!ù=ý¨ñ Ãƒqã™R˜çl] ‹/×Àìà 0Ðl)'Ô}²#¨^tX±Þå­‹—t´8FCá©YÂ$)èPUBE¥(~«›Òž‡šV™2^å¬Ã*SL‘H€l„ÂS³º'IA[üÝÁ¾ûŠ °Z±‘“x-V˜"È¥°JÀ+´ é»å\µ|²5uÊW¤†nLJÈk�ÝÜŸ…Ðß(0ü0Ïò²µJyêž„×æÑaÅÐÅfê„g€†Ãï6žÏ� ‡g€†Ã3@Ñg�ÓÙ[}ˆŒZ±«Ô¹Qãk?Ò³=¤¡zìI$ Т›:‡9FWÙÉm¦xŒé:\(‘W—Ìç®+˜ßeº‡ÉFÐ9æø,÷ò*Ý!Gh±DÇêL¶èª8ÿ[v”Øoº‡´è²Á)àAža•K´5·S/ò)^c…ŽæÓ(œÊWõHìNýW8Tð§r=op½àp]MCëO?¢íÄ*ý D΢O��b/òhs¢0‚Úœb‘9Ž1C—9-•ÓÛÓoêÛ¿¯ÿÔ—ÏÃuñßÛQëã¯Fcú¨ï|Wä%@µHB®2Å9æ´îÕà—¥ß/DxéD`›U:ÌÆ‡¦gi³ª¹‘"`†%Žò”ᄽ ¼”û½¾«t ’E`tƸ‹6ê2k€)P¨EÅÑ¿O,æö?ÄkãŠ_—yh(/Œðè¼=@Ãáu ‡g€†Ã3@Ãá áÈÀv@]úí<šÒåö]§÷»~ƒ¦WDò`» .Ýæf®ßô~×oÐôʈàNþVAû�߈¿Õ¥ÛMö›Þïú š^ÑyþMQ|‘§ß›^-{oŽ~—>Чw©’×Ѓ ñÏ(ã«êg«¿Xþòñ×¥ƒiºø&ºX u¯”DÞU¬Ú´Í•læ öà Ò“Þ¥ïßž¾Ê¶kü�õ³°ÄïPH¥HÿC�þJÛ~ÉÓS¼@O©‰ ë׋°Ñ“y7›Õ ¬k {ú25×°§of€úí¤Ï«Ñoæ¡û{Â�ë'!à'ÂÿåZ%‚âqô*)Âg•ø¡C\›šì#ÚÍ\’º¿'èõ0 œ§úP_ÄëËWL¡š7¥ï&AlJ—ÿÍ\’º¿ ZÚîp£ß,²éâ Y¨xúj£c¤£¤Ëå O—(6zÕöIêV¦¿ u¿:×’ˆà‚T€ßDäéŸOðó9úׄôQ<ýš*y =¬ÿ‚2¾ª~¶ú‹å/?J,„¿ºWJâªQ€Wø>˜£ÜËWÓïué?à¸#G¿/í½ßõ4½"€K¬²Í{ã§ñ',Iáêҟ综E;þõ×|RèžÝ ÷»~ƒ¦W†7i8¼6°áð Ðpxh8<4žÏ� ‡¨ r¿<}8é kGÒo;ÊÐuéC‡âP¯ëv¬)Ô¹Aí<$äÀÖ;ìé‰{l¨óå ¬¨ë÷Ð Ï�#`ìÀFŒôÈC‡!fƒ Ó…/`7¨ð(‰â0R!9¶9…zãׯ@%!/mó]ºÇÐAd�›hvºGø †Ã3@Ãá áð Ðpxh8<4{—Æü†P/ 3@ý}¶ B&ú^î16ï{. €Ì�ãñß aÝQ÷o º˜û2lƃ…mtûîï!\%@ÈXá¯ÂÂ?5¢îÕ³aÒý~ ÐÈÊ M65wkÿÊaÒ)TÒýãFú–_ô 2˜$ÀxÚ5É_9!¼VxRd¢1!}‹ÉÝï'`˜$€ïþÀUÔ‡ý‡rÝ?¦ çQ ®`7`’.ªî÷k€ × _V»‰ÐÏzÔ„÷Ðpì]]€GOðÿLXCk 3Î���%tEXtdate:create�2016-07-13T10:21:59+00:00‰‹���%tEXtdate:modify�2016-07-13T09:26:54+00:00óÍ ���tEXtSoftware�Adobe ImageReadyqÉe<����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-icons_2e83ff_256x240.png��������������������0000664�0000000�0000000�00000010705�14136337723�0027023�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ð���ØIJù��PLTE.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ.ƒÿ¼êo���YtRNS�3P¿‚™/"Uq@f`2Ì !<BHK Z#'1S,…4‡€ÃjÈÏÆ8E¼¸¾|«µ¥Œª¨­²)ýžQ$ï ¢b”J ¯mßœGc?o‘hù@^ñ���bKGD�ˆH��� pHYs���H���H�FÉk>��dIDATxÚí] cÛ¶ÉHªé˜’]¹K§±ÖdÎæ%٫뺮Úlmº¤éw]ïÿÿ‘|áp‡‡XÊmã“-ëÀ}<€w�( 1$ìº ;ÖFÎ@ïæ%à×?Á ¨ÌÃB,Lh{Œt•šà#�¬ðT@Î/?jÔ9 m‘N¯ #€žÎ+`™“`í·«àIç ’Û_º-sâÍ´U0 æM¤˜[ˆ÷ s ð4`x °“šè#€ ÌD<¥~ Ø€K½ Ð.4ü]`ç¸éŽPDDDDDDĈqéžàŽý „Ek@÷„žA³~Â*ðͰ !Yú ”XÀ`hv3\LX”�Ot©J2bí··Ø“l™QI<§‹À ” 6À-XØlÖˆÖ6˜HÌÒ|=j×`Eâiqÿù�ÞCv:„qÝï»C?Ç?èšËïxô,�ør*tÈÝ»}|;�kP 4ðáê‘dàYÌÓÁ•f¯ÀÛ�Kª¿~[ >‚X:+ŒiÀ«’ŽÄ†QV9\‰ÔÏÃeÀ'€À¯AøtOSÁ:7™³2³Ó½üYsxMÈÛ„ÍBã–Óý&®¡‹zÁ>nÙCþô@‰är@ð‚*�a­Óºë»À%Ÿ¾MFDDDDDDÜTôß–ÚÓÍH,»ÑÝEÚüÐàRU ún ب<ÏÖV- @é/NmàÕ©Ìîà¬Ëû¼‘¬Hwý–ø–*à+¬ñ#ðò$o­e³{â% °7\XÍÌÇ€—¿Ä2ݘ~0ÂÙ&n°µsbA,¶Dãì‘ ±Aì©V†Iéô|‹ ¸Og°ðæ™é´‹… °7Ày 7Jf³›�ëÚ:_¡w^�ÖH v{/Oœ9ÃÞÍ<ÅÀ„Y€`+ôÈ HRÙ°šÁ¡õ[®‘?ÙÞ ›ï à™Ç=°ëçc""""""F˽‹sG…<*k9c»ŽE¸8è–½£þÀàèÏzfm£õr¢1Í N‘­ìø¾ºØnqÓw¬Ö&=O‡\}K` #úôö2ûà~¾»Lò|?€m>Ã\¯fíõ͹à:}ë4ᦋ€Äó¦{â)žn[’ þ̰E K Y¸ ØDÁÛ‡-¥Ñ ïž+´Kl=¼ÓƒššL`Ñ™ù|¿%¶n aü ÞæŒ‹NÉ#è5´ (4ÿàŸ?º†¸îúEDDDD\o¤WüFfq;À·\E½á_¢ÿ˜–¬Ë,¦÷•W!%…zE!Fµ¶. ¯(USHQ0dÆw)T ó ë8#p,ÝxôB·×KýèÌ �*Œx–ŠX߯E€eù”™€ÿ K솎%mKØÀX~sÇFEÃè~…†îÑèÏtdc�Éa¡Iµ•Ð1À²Af4æ¯ÛdHøcÈGùS»B`ù¤0àwev`€ÓÑí"Ñ{ É è‹.úGDDDDÜ,dÊOÈ6Ïk"qk¨ÖMeãfS_Ž÷žìU®’KÅŒ&g~>n‰ ·HèŒ})î ‡LÅíä„F%8(Š)röÊÏ!¥[4统qQk¸0ôm[Le¶²µ_§7­žä0™@>1 X0A÷ÚZ…êÀÜVc¤E‘V „Ì  Lt¢kÜ3EJ´®44àZﮊÓN`rtô>`–Ë¥ÿ ö A©ŽHBLHÕ@“ðc—ÀÐUq=�j ÑâãòôcMÀÑû¿2¸sçÛï–ÉJ€ÒÿCL€iR õNQЦýàŽ‚Ó•ê0=Ôó�Yiÿ-ª|4ÅV§ ”]àî]Ü–B^ùÞž•¯_H€Òÿö½Ý$ä€<’$‡ aàääÄ=À¡d@ê (ZÊAp_}ÿ~sਈ:èN�{DC>ÂóóÅmù^¸ ƒ¨ÂÓÓSÐ&Ê, ;œNå›î¥ì&à´B} Éáƒ<_AŽŸB]HøuùÂúN(B�0×ú{h‹û¸1¹IK�µ€ì°Ds‰˜ jŒ‚Ñ'ó¼½ äMý¹Ó8¡.€Ó«1°h3·df}mq•�ï ˆ„nƒU{ææL¦oÝÀ z \=?@ ((Äöe‹|=ơ麄³C¯i¥ý­ê1r<|èOOÁ;¯ `ÛúHép÷Qy›zÔˆu°ÝÆØóZž·çV®ÉþƲ¿!í)¼÷5m“Cò¶õÏ2ÍÀLy‘gù;²Éó½Ö‘³R‘éãjW¼a@ž¬@VšLÏ&W®àÆru=Z åÌ¥í½=UÜÎñ5} ð˜è¯¥­¿òÍÛè7±;b(œ‡ßÊ×nP&¯s†òkƒ4¶¿çâ÷8¾Í¥²0åãÉ1’Uû W¡vök¹18dq²±‹T»ŽÕŒE]qH8 âÉý§ÏîÝGÓF™´ï ·ÇKÀàòõ'¬ rý‰ŒƒOrêû¶rí̧öú6"fp°TÂ^3c³ç" ÀŸá¡nÔMÙ…-à/âñW=¥tJ,à”XÀ)±€…{ÈP Rm|Kêû´’>mXó8v�5hýÂ<¹ÿÑù²ë_{ꘀÊY§Fþ|&_G;&Œ>^Ê綾ýW⃀&ºKûæ(“©81âEB@F&ú·;"Lüù'wfwþñE-6Åío&/Ì«'X¨e,>~¬eeûí|§•�A ö¥Â=) d’ûQÝ`}P[Œ„«K¨îNŠóË‚èÏøë/ž~)‡¿ù—O[dÿO=ç3Eçl5'YÙ$?ñè´7‘mß�ã“TzÕ¦.\®Ü.Úó•` WE‡�ßð"""""v€)ž˜V®œ²<ÏõÇKÞZX.Exï~Ч)¬åûßšÏ�¹šÂW_}ý5|šs ô/!?¬îÁ“'poÕ¤“ýÍtC3ßÐÊô@¼Q¿)‡ÙtúÂ`Àÿåb!,dY9Š6A2°¦Þø‰ö¼þ©ð/튮§²€ nÚt²TK>ÔÁ«Î#]ÇL;zq°JÐÁ•rŒ×ð²[ö \-t†Ò½ü5 @ðÍ·ÏŸûnÏT@±À+;”�cË”“QhÃC*ª©ŠTûÚ™šA<Sku¸ÂµbÝE� /¹º$½ZÝÓµ.e­jæ‡ÒÖ÷ÛÓ_ʤrWaB6d˜ç—ë (¨ÀSÆs[À|Ž÷«ç«• /5R¦À(ã4X°‹ÄÄÛö76€ô¯®`3|ûð²ÍPÆùpì'àH~<R?M²2°)œ Ñë³g‡ÏVpÖøBµn¶=¨|WÊͬ\­¿V0_—81OׄÉKz||lP_ÙêωÄçò‡lxX;Ç€ÕJu�<¾˜Ng[Éð]=Ô (ý #]©öžèÓ×p†P¡a¯™¼iôûøãú‡ˆs ˜f«Õ V˜zÜö]ౚ˜Õí¡¡Ûz>×Vr”?©f�Œ?ÍÇýæ�½ –QÂ1ÀT`»†} HËkÿ¸ñ,{ÍVZË‹T”Ï›Ô?I̯uå¨QK“LMée͆î~ÀîqôêÕŠ«ôyËm0Û9Ñ S¼;úõ÷jˆùþõ®5 Þ�¼i…šQ÷‡]7k0ÜUêÞ­…×ÕG½kXŸð‹3#¶·ólYò¿ì_Цx£¨ÆÞjÞ¶9ˆÛ`ó# M [z ¨ KuO_zË¿DÜ­¾‹*§®kOJÚ(7•ünòÎ\eÕ I€TýƨÜlÃ/ŒUúëåÅÂÔß¶uw‘.°~ïäÛ;#Ãr‡Íõ.ܤ˜§8 ëo# 5L¦Üh>1Âiƒ€ –Ëåpž®VØM�?é/u7ÅÞ0ì X@õÐL©Ã+MÀ+”©ð€Ó{ÃFktÐ{ªÅ§89‰0`ðÓû. Ä€CàR+\µà¢/°Žt ÀR±ýÝç; ÖTÓ²ðòÇ]¶aL³—Œ|âefÄ‘Ùè ‰>ØÛ£úƒG¼|€P`P¦¥8C1KÕ›‘A…Ì<¯2¹ÃÛ‚øÎK†r…l@L Lª´¶Íåå‘êÑ 8@ƒE>`nÆ„�¼˜PNÔ,ÿÌp›ë ˜€™E§°Æ†¸Íÿ°ZÀF lÃŽ;¾ ðùŽßF€Ýú7þçÈ®;Òÿ øés´wSz)g7è{rÕs¤ðSžgÈ‹—–(ß„~ÿAWytXÃÿ$íNV¬ÌôÉR½_¿›<6¤p.ÄO…8ÇO[¯OdDk>_«™OäO»}ŽÍýìJSž¨×d¤îmVï›?ÓW(_€Úmà  üj´ä°ù~=H IÔF>T/ýý{*]IGJ@içøŠ«qamìNF|Q¡5ñŽòè0+ï ´çE£S8™:¸vƒ`p~vއýj:B‡¤°åÿp96äoäõys%Ÿšˆˆˆˆè ú|@H¦›¨ºÊ]ëë+‡@ŸÉt]W¹k}}åàõ‡¯7‘éFÊ®r×úúÊAÐçÞêùBù†µ\m¥-Ó_µ2PY8Óßêô·ÎúxÓÕŽN’.hû~ÞÁÐ@+7…ˆz5øâ¯‡òót–_/‘ÛÒñê™ý/í?ÿü³0ÛS>‘¼)Æ‹¬zïi0nË/˜Bþü„€`{DóëW•þÛ#`¾ƒÎB€ío…‚õ[,ÄgêÛFVЀpPß¾ÕÅÄC]Bz»” ù©,Xµùƒ ÏXµfÔƒ¤€ÊîAÕ:HÒúé k¦7ü¸dÕZ9ˆ¡oc}o£]å0†vdú:R]å0†veûºÒ]刈ˆˆˆˆjÇáÒäуüÿÀ°| �?å +(üúOÇê+ Á#‚ ysÉäßßÑnüpÓïÛFru<à.HȺotMÈÿ3hëÐë}•ô߆P}¯”þ¦”ÛÛË—ƒ€víÍÔ×àP}mÇ€¬©?¾â•þWÇúZ@•ÿêêß×®¼þ}ïý¯í€ÖÿêØ@к@éÝüFDŒÿ´ÀŠš‚l»���%tEXtdate:create�2016-07-13T10:21:59+00:00‰‹���%tEXtdate:modify�2016-07-13T09:26:54+00:00óÍ ���tEXtSoftware�Adobe ImageReadyqÉe<����IEND®B`‚�����������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-icons_454545_256x240.png��������������������0000664�0000000�0000000�00000015520�14136337723�0026600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ð���Ežr@���bKGD�E¬;–-��� pHYs���H���H�FÉk>��mIDATxÚí{leG}Ç?g³KÖÙ$½†–ÈUö!š>TíÝØˆ¤J•ë¶i6A"öV”ªR%;‰ì"Ô�‘*UP) õ/’µÁz‹RJïFú°QP ÁÎz•–BQHÅVUÚ릔Àéç5sμÎ9÷ú^ß3ß•÷Þ{~óþýæ7sæ7ó›à<šŒƒ.€Ç`á áð c‚‰Ab/á@Ä[ÀV“D ×0øþ3AX9æ0‰N’”_ÇB�³ Ó&Øú>~ç>¡ cË;abµDìߎEÀ”òéQ�z¡�'k¤ÄMúayÔ‰ ÛÀ6!å:u:é:@RŤèB¡yDDé•â'½L—¿-ï°fÙ]S¶Õq!Ó�fè S´Qî&šS©×7MC˜r==3dJ¯š{‘©fZµïØS0÷MsÙÍ:0KÙ¦göÊ¿öé›&HÿU…=…mcÏ4çi?UÄ”G†ýU4Àhc‚­Qb¯]€!ÃöhLíÜáW/� ‡€†Ã @Ãá áðÐpxh8ü~€|ÜA—Qf?€ÛŽ�›1f¸Àœƒ=uöØÍáQÙGJHÊíp³€™›PÏ IÍw×´mì·¥¾•ûÔ§>2»Šû"èWÓP&{›žn‹í²ÀT:sîöøf„qÚÉçH@Þ ú.cÛI ¨ÃØû§Ë~�Sÿs+›^|Bënƒ29í dHÿô°‹€®‰]Ôóv¼-ËŒ-mìªe‹hò§>õ²öÚ¼q&ت¬žg î½9xð#cƒnãŒÁ~!¨ñðÐpxh8¼�4^�/� ‡€†Ão Ï#àZ@ý³S¥Ë°^ô¾4 KZKPÝd9€šËC@F[¿‹€°¥,ªæa+ÄúÀ˜Š]8ªÆv«K¨qHlÕw9×§84KBƒ¹×¥|&–Ë#¡Ø[À\C³�…–Ø`ëÄRùÅ!ÀµúºÝ:öF z àC£µß6ŠÖ)A˜Æ”T1wU.I÷Ò—!4ÐÍigµ3w±””†½ÇÊE:«õq7æ©›ä’nÕ0uA—´ímP —y ÌTœK(5ͬílNæbÝT´­Ùrw™DV…]Äít©e4€›ê¬7Ë µL¿Ê¬[ºC˜ª0ÓæP÷ &Ðà0èìçü+Äõ+ ‡€†Ã @Ãá áðÐpxh8¼�4òáÐÄYêà`÷ÞO¸´€‹E´Z<ÛÙh×\J!€ääž‹»÷j Ð;TKËVr·0¹šÍ¬q¥cˇóôu˜¨Üa®”€úp¨ù Ÿ‹E{Bñ¬w" KËÍ5„¾ün- Ëc"w¼v¢Tì¬6 Tïhzီ|6Ðźí¶Î™²ÛN{ téØ]¸ÛKîæ^m1(²6ÈÑmË3æ¨Î'†RÊfƒ±Î`Ôê« _Å>¤ñ«j‚,®*ÿ-E)ôe¨›{ùU÷,–® \u°“ŠoV”€: `oþ„m¦Ke²tªå_Wô¹OÆÔdW3Á”Z Õ”rv|Ý~^˜g”Û`j�ycª¾¹p¦*šÒ«fßö¥b]�M5ØÎ9Ø.‚LìÝN¯½q+%åÀ½çÛ¯Œ0ÎvcˆcÕJ×ÃE�M5È—–kkª#IÙ<›ÀÜx_€ˆ ëI#0D„wáÑ4xh8¼�4^�/� ‡€^cæì Èï°Ád¯r©úDM{w¿Q¿te±{Èê^Ü`‚Ébîr./±ØM:0Õ£îá*óñðÀzüÕÎ`]|SêB¶(Ëe)·hÍŽ/V»ýÛíÜ®É"aO!Œoÿ ,±uæ^ÓáÑЉê^Ó=z Ût`¶WeCC•M Qϱo›Òû0qµõ%žªòUåo?Ù<”È@6–·HG/ë÷ØÙòª ÎÂÔuAQ-_·u||ô™�ˆÖ´*2l³ÆÙ­uGÇ@Ð j !ªBô¦«rµÇÐè qÈL!*)øh»—ÛÆý�.ÆV»{3²½�ê-æ¦Ï!½w‘$dP’*†¨º¡¦/P[· t1–ªÂl3éhlµy×p›èéâ×ñ0bÞÕg¿LÆ} Ù3¨ ü$É%\/Œ­.)TwQá"uK7dð+2ö! ëÁ @Ãá áðÐpxh8¼�4Ã'�­aY$mòàfË6™lB'ª.D‹îž¼Š ÚÂРœ»x7SÌxòtI„¤e WÕe}†º¼d0¯R›W»“^Ý¢«0](UŸÝ‹Tÿx¢«‰Ÿ|«æTÝ|‚¹È@v÷^Df×¹Lböï(ó2«öHõï0n8;›ä®Î_ÞQOÅÍ}DãØ²&3{¼¶Y²öWÇwœÌ5*ö‹eË—?ÙÌ–ÑGè ø:H iZÓ–)/MP£þ•(:ý!çž/ƒ|B±„[i¨¤”:ªGf ›Lï`Ä~ë…ëµ:z$aa‘‚Õ^ùåòôÊ­|Pæ- kbÝž<Û•L&úxJíAABîªÈ¼ŸHvá‘¢Ì[€yS•ÍÉ™ÍwÇNJuy Ÿ%pwÑ0¸_a"zó xößÃæ Â3i1|¶�=…€†Ã @Ãá á%˜JW¦ú’þAÇÿ†mê\‘�ÌÆ ·Êl唵Xúm9+í(ËÄ)ÖÓïëÊØSµÄã or»ìro*E`ÊZúã1õ¸&=ÝÞ—ûgÎ!åRt<<äA.-V„ÀÙ+Ùlú|Ž š¤³suKœÕ,&‹È‡˜ç%…°Ày©q×sá§Ù(A—K¨*Ýq^–~Ÿàé÷anb“1`—6ßåGÚPçaó&.‡ œ)bˆ¬åmuL—ÎI¾ ÀšfnE! kÌ Ã’¦�cé·Ým™§ÐcȱD„-BÖ¥Ö™–D`:G·ãe¡tQ óñ7ã0 ‚®œ0­ ¸Ÿ«ê×áYQÄӔ،?Åmb‘/ße׸L{8þ<« qÈ{—X4Ðç$s’®ØD@Õûóçs‹ 9Äëé÷ë•e8Âõ\c(åÝšYšÍñ"•rž°ÿ7ùñq6–u- |—ÝB¹‘�ŒRÓõ°i�x!9^P„HD Èþ­Üg±t7KÚæ‡Ü|™¶2þ¤"¤.Át¬©¦ V¿‘°ÿw“EÀu>«b±Á¬¨¢¾óª’fÓ�‰ a?qîh'y'rŸyæûñ·Ô#\¡Í&Ðæ o+Ìò–Ôª�ìŠÞâ÷ù|áYÄþ%Ž�_Hp÷×À"ûó¼†k¸†1®Ñ*É«¹š«U[¶°&x9æxA³sŠmf™e»â<Œ_ŒÿÊ7Á;y6mòã–Òi ó :Æ[ˆÏ)žEB–·ð7�̰ª¿Ñ«8fóCH›˜`⾿­hþ)‰®ŸÏ}æ›(ê%m¢‘¬'ÞÎ&ï›´ ;Šê(øÝš!Ô{:^‰ëÍÏRö›@œÉ•N‘ýÆKÒ¯"Ì*Ñ<˜V¼æ•¡¼=÷™o¢h~qõÂ+`6IŸä§i¶I<#ü±À²ð½Z=^IE\`ÿ0]1üªðû%ÍDª¿AÁþ^¦a0fïã¼,³˜Àc %[€Gxh8¼�4^�/�£…óñrdh9ÌÖÃåæM7L)-êÓ‚-»ø–?K(ý›ÍÑstÕ¢“h-?Þ:ÀŸ[Ú§C§r»]ÇGù(×YBÍ3Ï|òC| lÑeXWìÍ_å®xêV8ÆŠÂbýœ–˜bQ¢—»ó7±íËá§ùVü4Jí]¹¥ŸÈžàl!¾«=¾ D ?½§'a`^Úï�Ða•qºÀ8Ýüû:-ºÀO±ÈYPžŸxžÛ€¯óë†Ö“Xã5Q�"öGÖ´¢„±£W}óÙÖ £ó„äI>È“<ÈcššbƒYV 6=ñè§*—ëÛ¿Á-\æÿįi|´¹BHÀÉÂJ_F ôWxƒCWÒ“æ_�–K¶`B]JÍí"}±`„_R®¬Î²Âè&nDsp²œºÎt%G-â^µåðV¶øÿÆ÷yIcœb9.hMºuð÷¼›K´¹Ä­ü£6T´–Þ6Òå5Ko(ö %Hzß²’:.µšnç…z·ÅO�>ŒÇÃc‹lpVZM_gÚ°­C‡vèÒeG{¸ëŸù¾Ê<_d©°¡ö¯0Õ—eàßâNó%Nóy寛�ÓùÈ„p•–~ˆÃš/óãókù˜ýÉéÉn©¹ÀÇø„ôû|¬æ(Gé�±Ìç#.‰s€â9€JÛ‡€€l„ •ô[Øâ6¾É»ù&ï.X­ö«{¿¸Ž®šSDfºÂ†”<ý ¼§y?Oó~žåŒÆ…DPáý*~b¤«ãgco„çs{;¬¦µŠê'ÏZ9­Zœ˜.ôÅO¢å­úž×eŽ U·~? Ó…1N�3ûåŠÚ¶Dì(Ÿþ1Gx€x€køSÎH´I~ÛŒ?Oô”ž±ÿ¼¦ÌkñÔ,Ïàiˆ(²¿À×ÛˆÕ{.ÿhì_“£å5€Ø‹ónF¢7ùý0QÅõìOÞ¨ÞÆS5Å:˜'‰ÉÈþ/ÆÒÕ¡„ö«J¨r¤‰€ê à.ñžùKNówuže¤Ër>n¦Ä-‰U¸$U`IÆv%‹©÷¯ó.AÞU°ÿŸàeºdÓÏ ºü;›Ó˜:ô+ûa&÷XÄŽ ây¼Áïñ�ž¢ËŠ ù¸®æà“ñëG¿Ñ¼šî æŠ"è÷4ÞÐpxh8¼�4^�Žæ @d6î((Ô”{“C::[ß>óH, ÀÉ´NVN¯º€ºhr.þ~N»«ááØ±Zß`•3œá¼“ïðK…˜Që|$þ%Þtáï!äVn%ä=œ*Ä7»¯ÈïfÈïg(Òm!f yÈô¤"ékàI6Yã/€eZ©Ù³˜ˆ‹+ÉþìzŸg™6W8ɦbQ%Êy™{9¯·ë×Ãñ*Å•Â#é÷7ù±b-t™çX¡Í•8y­ÞnOì{]¥!Ù¼ö*¬ƒÝ\ˆ Ý(³®på2.ÄHÍÙ™Ød.ð^Zì(N ËÀ&ól¢2¨&kí ûU&×£ñ§Úý#~Ì.»ü˜7•ôç¸�Œ§6ýµÒ58A7½£¨’}P:ºÃBlkUÛ[Ã8•)Ðjáw0É$“üWò Ó�!s\à ±¤›÷³è²QFèn(qRK•†:'˜X—¹·@ÏÛÓò=$ë Çx¹ûã|€5: Ô@â‰Ç]¥Ðç2ï¸S¦i€.Ä&¹× —ë$` 8«tæÒæ�ðS =Ú&[#öß«ôæ¾U3öèšßWÒ³q Êê^H{¿šý➇üZûÓü4µ¼Ì…øá"ÉÜA½ªH¹ïŠ#éçŸU„ø0�+̱Â1…ÉŽ¥;ÔðßÀO9ÀÏñ"DE °C+nºU:¶|a á¶áÉ”ƒM|–?H¿ç÷ÅÉìW1ð$~=Êk†ÜUõÑŸ�ð†Vè¼…“ž‡¼VÐ�¢þˆl{åæ�7ÿ À²ÖÍÔ^›;<Ç,«t[¢²¯Úç·øT"Èý3SU9lÆÌ˾‹HØéˆÛx^¢&ìŸaœ@Ù¯ð)âEöÃ&Ë<<B4Ó(b‡þ·p•òÿ´ÅÁƵ\Ë«\Ëuñÿf¨ÎÛæ�7r€¸€›“Ùù¿ˆ^’ÚCiû[ˆß.³©h€ˆý_ç^ÞÉmDÛ"DDì_3¤™e¾ü‚‚ý�ŸeÇXã º,€B @¤fUض±/œ?ž‹×gÿÏåB´R‘üÎCÜ&£Þ2£ðŒPÖ8È×@3ZtSÅÿ<·å¬æÑv7û^#´å¦˜;c'žNȹ„ûø6ßg[ÛJ!Az^ ?Í<̯°oÉ›æ_s[Kg{(e—}ùE‡~JÿÞ,âm<<¤éÅ󌳋U‹ÿåg "&B%�¢7Ã~ì{®�/� Gól¼�4^�޼�Ìjý…ßÍùÔ’tÞèÕcAž®0 \(¼ƒÂñÉÜ“øÔ  ïQ¢8÷þYNçBݲ?[¡û¤R ¬Ü$¾k޵\ö{uÁš¾×¾~ûQ�–€qÆ)ë8£Œ«z:G­GãÏUK©:Š 07þ¼6ž-„ WMY<­ù¾¯‘ §ù2ÙѰ»¸$5Œ&vá‰}%°¥8¸)#9&)/ÜÎK^2Ï+âÙB̳Ìi¾Æí\Ò¤àæÐÝVÃ}…LD½¾¯1/iÂÛnÞ]2ÄÒï¢>ùÒI?Uì—7x¨Ï×GÛ4Æc÷ *úi¾Âø §5)�ñ>·wH ÿÝØf5[qþ÷øO‡.°©˜d&J_Ç~W\`G{© |-÷™Áe/ã°ÁЧk©€dÍ E“ˆ¬úê(Âè ïNîiÆv=ûí®˜C` ̲ŒZŸæ+�ÜÉ%m )só!Ä«¨6Fei€Nú»%˜³§O*㪞v,sü€@±—%¹ÈÔû4ßå§ËtS/<Eú%îä0wrÉàk{ʉ2bÀ6É»ƒ¯*¨¿;ƒž¥¤× zs²]ùÛ,ØBØè!,ų€uM¯zÈ"�õ={¢š»Oç¨÷óEœ«ÆñÛ´ŸÀw80’à‚Û™·%Â\PL¤šÆ €ÇHÂ[/� ‡€†Ã @Ãá áðGÇâÍŸ9€°A€Pi…G Ñ«+!…³'Øã^…Žu'þƒ¬:¬Z…@LxZÚ:¬Æ–†«’ÅoQA_”RR‰`ÁÿE¡‹,êçÎ~—]Mûy_ÁÖxD¹$«÷&JñBòkúQã@‡‡âÆ3¥°ÈÙ=ºA_®Ù‡A` ÙRN¨#²"¨žtXµÞå­‹—0Z죡ðÔ¬a’t¨ª¡¢R¿ÕMißC-�k̯rÖafH4@ÖCá©ÙÜ“¤ ƒ-þÞ`$ú~„¢�¬Ulä$^‹Ufr)¬0Ã*-Cún9W-Ÿìƒ@M1Æ©a…†ò@7ög!ô7 ?Ì£|„l®Ržº/á­ytX5°ØL݇ðÐpø•À†Ã @Ãá áðÐpxh8ò`:{ë1‚È »J½‘5¾ö#;ÛêǾD"�-º©s˜ct•Ln3Ã<D×áB‰¼¹d1w]ÁâÓ=4H‚αÀ'ù!ó¡Òr„+t¬Îd‹®Šó¿eG‰ý¦{h @‹.›œâk¬q™¶ævêeå5Véh.0©|UÅîÔñ‡ þ´C®çu®®«é¯kýéG´ÝøOå±ßCÈYô à"@ìEþ"mNzP›S,³À1æè²Àã¥rzkúM}û÷µñŸúòy¸.þ{+j{üµÀxL÷ÌwE^DPk€$ä3œcAëY­~Yúýí‚ ï/ÝCƒHì°F‡ùøÐô<mÖ47ṞÂQž3œ°Wa‰oç~oì)ÝCƒd݇±ÉEî¡úÆ€l7À (Ì¢bï‘s£ñÚ¸‡ãÁ <<”Fxô~?@Ãám ‡€†Ã @Ãá áÈÀv@]úí<žÒçö=§÷»~ƒ¦WDò`» .Ýæf®ßô~×oÐôʈànþVA{_Š¿Õ¥ÛMö›Þïú š^ÑyþMQ|‘§ßŸ^-{Ž~>Ч÷¨’×Ѓ ñÏ(ã«êg«¿Xþòñ7¤ƒiºø&ºX 5WJ"ï*Ví ÚæJ6s{ðéIïÒw‰oO_åÛ5~€ú€YXâw(¤R¤ÿ!�¥m¿äé)^¤'‡ÔDíëÅØèɸ›ÇêÖ5=ý@™š+ìé› ~ûéójô›yQ`Oà`ý$üDø¿<B«F0C<Ž^%…@ø¬?tˆk3“}À@»™Ëû{‚^óÀyªõU¼¾|Ū©pSúnĦ¡tùßÌe‰ý=Ð�Ñ$Ðv€ý>`™åø›H_ÈBÅÓÏT#%].Xxú¤D±Ñ«¶OR¿°2ýE‰ýê\K"€‹R\T|‘§:mÀOçèÏ é£xú¬*y =¬ÿ¢2¾ª~¶ú‹å/?J,”¿š+%qÕ €WøÞ›£ÜÏ3é÷ºôïñ?Ü•£?ÀçöŒÞïú š^‘�ÀeÖØá–øéü +R¸ºôøoÒŽý5سô~×oÐôÊðBo l8¼�4^�/� ‡€†Ã @Ã!ƒÜ/ONºGÈÖÀ±ôÛ®2t]ºÇС8ÔcÝ®5…z=7¨‚‡„¼�ظˮ‘ž¸gÐÁÆ@/ïaE[¿‡y#Ç3Ò#z„˜7L˜.|û† ’(cR‘c›S¨×mäQò$Ð6þ×¥{ D°©Öa§{T€_j8¼�4^�/� ‡€†Ã @ñ`Â/õ²�Ô_g ™"dªïåž`‹É¾çÒ�È0ÿ ¶Þ±{ÐÅȰÿ ¶ÞíÙßC¸j€‰Â_9„…jDìÕ‹aÂ~?è dcÐ[𻵋å0í*aÿ¤‘¾íç�½‚,�& 0™²&ù+§„× OŠB4!¤¯1™ý~è†Ixö�® >ì8”cÿ„&œG)¸j€½€I»¨Øïç�=@¯5@¿ví&J?ÿéQ²�lÇÇ@óéQû×àÑü?÷²^ª×Ƽ���%tEXtdate:create�2016-07-13T10:21:59+00:00‰‹���%tEXtdate:modify�2016-07-13T09:26:54+00:00óÍ ���tEXtSoftware�Adobe ImageReadyqÉe<����IEND®B`‚��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-icons_888888_256x240.png��������������������0000664�0000000�0000000�00000015527�14136337723�0026634�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ð���Ežr@���bKGD�ˆIî( ��� pHYs���H���H�FÉk>��tIDATxÚí{leÅ}Ç?gÙ kèuÒÙJÅ>DéCÕ^°Q ¢âºMš…HÁÞ*MU©’ hÝ(*$H•ª¤R€*jþ ÐD¨]”¬·‘)Å»(M6éÃF 6!6ë- xI­ªiï-ýà HNÿ8¯™sæuι×÷Úg¾Öõ¹÷üfæÌÌï7¿™3¿™ßŸÆ£ÉØ7ì x ^�/�2&™v&v^�DL° l6Iú-�Ão?„•cn“èD Iyøeì#d0+À0ý3ÁÖ~ôñÃøéÚ0¶g'L¬V‚ˆý[±˜RÞC:B€~(ÀÉ)$q“vXuâB@À°E@`H¹NG™�Ø`TA%=]ûqAw’­J)¸Äu)…9å:e9d`V€®0µA{÷=ÝÌBS*õÚ¦© S®§gF Aé™À -(DÏÀ¬RË·@×"æ†øúg'ŒUë‘,eSwʿب¾j‚ô¯*ì)l[¦ùÙæ.HLyϰö÷9½êÌí¶jäa‹I6µìMR~ûˆ~ ÀnGñÙ•ð3 ‡€†Ã @Ãá áðÐpxh8¼�4~=@>î°ó¿Ã(³ÀmE€Í3a\`~‚=uÖØÍáQÞ÷””[àf3W¡žA“šï®iÛØoK}3wÕ§¾gVט‹·å,j˜”¥n2¶˜*ß•ýêÔm¦¦MÍ÷] y=€½xn" coŸ.ëL"à–7]ê¶ÎECí:dHzØE@WÅ.­f+^–eƦ6vÕ¼E4ùªO½áæ`³ÅÌ´ .ì)lÅ :ªÄ7ƒ³’ï){¡_Я¸»~"¨áðÐpxh8¼�4^�/� ‡€†Ã/ Ï#â\@ý½S¥ó¿¿^ôTÂ0sZs1©Jí1‡Pr¹ ÁhëwñV ”EÕgØòÆS½¦TìÂQ5¶[ \B•ˆ»O `+¾Ë¾>}üÀ¡‚\Š6ºä/0Ðäk¹g„éÖ1[ ˜Kh ÐlXʿظ_·ZÇ^IA¼‰ö^´NÂ4v ¤ŠOW=%i^ú<„º9í¬tæf æ2€²ƒÀСõØB¹Hgµ6îÆÜÀ!uƒ\Ò­Z¦&è’¶½ ô2¯™Šs ¥¦™U ]‚ÍiØT¬›Š¶µ ÛÓ]‘Uaq;]ÊA à¦:ërG-3¨<Fë–nà¦*ÌÝ´¹TÆÝ¯ 4< ;»ùùâú™À†Ã @Ãá áðÐpxh8¼�4^�yshâ,ux°û$\jÀÅ"Z-žmo´ëSJ¡¸9ÔÅÝ{µ 誥e˹[ ˜\ÍfÖ¸‰Ò±åÍyú2LT®0—K@½9Ô¼‡ÏÅ¢=¡¸×?Ð¥åæBŸ·Ð=c"·½v¢Tì¬6 Tokzaƒ®¼9T¼–­�s&ç¸6èÖÕ¸ú°¯v¬Æ }3¦':¦˜[˜5)å,„xU!ŸËÒƒ@}Èý—©øUÅ ‹kc€® ꈡüôò³îY,]¸ê`&߬('�u*À^ýv ®¾OÎwuÐ?}2¦&úCÍÓóÍÈ–r¶}ݾ^g”[`ª�y�c*¾9s¦"šÒ‹f_ö¥b‹ uuT?¸Mò¶íëfÿ  eÀ½åÛŒ0eÎvbˆcÑJ—ÃE�M%È6—›˜Po”¤lî„M`n ü~EsÕ¹d²j|óþüz±í)miO q/{Ú©û”JqýÆÞA„GÓà áðÐpxh8¼�4^�úaš³+ ¿À“½Ê¥è5í݃FýÜ–Éî+»ÊY´&{•˾¼äøÕI‡ ¦zÔÝ\eÞX·¿Ú¬‹oJ}HȯiW‹¹)~€nÂÅm߮ɞh¯ÚÐÈàl*7TP3kˆ™ÁXJ7R" ˜¯ù"NXâ›U°}Ù”Þ‡Aˆ«­/(qWõ\µ€Øv6$2 …å-ÒÑÁ˶E zd¶¼j¨³0u]PT{®[ˆ:>>€L�DkZ¶YãìÆÖºª14ˆZCÈWUˆþ´bÕdí12zB첞Y½$i".š~A‚i=€‹±ÕîÂŒÀØ Ûª>ë„ôÞE’AIªb¤\Ϋ­›†º–  c6¶ÊOÒSB\”¬É…J#" ËREÊȰ_'�åI.áúaluI¡úš¨›»ƒŸ ”± YX^�/� ‡€†Ã @Ãá á=hÊ$i3�7[¶Éd:Qu!ZtwäUlØ~FåÜÅ»™bÆkä§K"$-c¸ª.ë3ì¡Àë@�ó,µy¶;iÕ-ºJÓ‰RõÞ½Hõ§!ºšøÉ·jNÕÍ;˜ˆL�dwïEdöpËô€ fOù,³jTqÃÞÙäéêçË+ ò©¸¹h[@Vef×6KVÂþêýxÏÉ\£b¿˜·|þ“Ål}_‰�$U+þW!¤®?o[ï­ÓòÓóyB(æp3 •är_™5P¬2Ýš¶la”˱ *¸x³§GXG$†`µW~9?ýr+ß�”y °-k´Éd¢§Ô.ô@ <]Õ™×Éî#<R”y 0/ª²99³ùîè¥T—×ÈÀñ^w÷ ƒû¶.¢?0ê {ÿ]0j"<“v£g ðØQxh8¼�4^�޽$�SéLÃÔ@ÒßÏÁøoÔ†Î5 Àl\q+ÌVNé!‹¥ß†ÓÒj²Lœb-ý¾¦Œ=UK<öó׳Í6×ó–R¦¬¹?Sjž¡§ÛbÂsæ'¤\ >Uþý\Z, ³W²Ùôþç4Igûê9­™L‘1Ïs a³Rå®åÂO³^‚.çP•»£¼(ý>ÆKÒïƒ\ÏcÀ6m^àum ¨ŸQl¦¢gŠ"«y[Ó©óD’/°ª™…[VÈ*3è°¨ÉÀXúm»@[âqôX#r,a“5é kLK"0£Ûñ¢»(‡ùøŒq˜ŠA—O˜VPÜ÷U jó¬(âiJ‰�lÄWq†˜å‹À l§iÆ×ÓÚ ±xŽSúœ T!s’®XD@Õúóûs‹ 9Àké÷«•y8ÄÕ\aÈåšYšÍñ"•rž°ÿ·ùñvÖ—u- ¼Àv!Œœ…H�Æ ©éÚ Ø4�<“Š@ÈÏ(B$"Pd„VîZÌÝ5Æœ¶ù ·ߦ­Œ¿©©s0kªéB‡5h$ìÿ=ÆdpϪØ_¬@0+ª¨í¼¬¤Ù4@"hØOüt´ƒ¼c¹ky5þv­‚zˆK´Ù�Ú\â…1@Þ’ZÕ€]ÑÛBü_.܋ؿÈ!à›�IîþXd¾€WpW0ÆZ%y9—s9 jaKöÃÏ0ÇÏh–sN±Å,³lUçñËñßX!¼‹×hÓf!ï2.)Ö0ÿ°ðÑá 6ØB|Iq/úÓ¼¯0ÃjD¨þF[,â˜5Î !m`‚-ˆÛþ–¢ú§$ºJ~1wÍWQÔJÚD#"YO¼“ Þ 6hVÕQðÛ5C¨×t¼—/Ÿ¥ì7 €8’-*"ûÿœç¤_E˜U¢y 0­xÍ+Cxg¢h|±ŸµÂ+`6Hïä‡i¶A|]ø±À’ð½Z=^JE\`20 ˜~]øýœf 5X„ `?S0³÷Q^”Ù?Jà1ì%[€Gxh8¼�4^�/�{ ŸâSå"ÈÐrؘ­‡ËÉ›n˜RZÔ§[vñ-–Pú›ÍÑOåèªI'ÑZ~t�t€¿°ÔO‡Nåz»Šóq®²„šgžù䇸Ø¢Ë4°¦X›¿Âíñ Ôƒ,s„e…ÅúqÖ9 ,2Å)‰^îÌßĶ/‡ŸæñÝ(µ›rS?‘=<ÁéB|W{|ˆ&~úOOÂÀ¼´Þ Ã ãtqºù÷uZtEç§A¹â)nžæ7 µ;O&-°Ê+¢�Dì¬iEcG¯úê³ÍFû ?Âc|„ǸŸ‡54Å:³,lzâÖOÕl  ø7s‘ø'~Cãã Í%BŽfú2:` ¿Ä›਒žTÿ°T²êbjné§ FøEåÌê,Ë,pŽn²àF4'Ó©kLWrÔ"®P[oa“ño¼Ês›àkÌqNkÒ­ƒ¿çÝ\ Ínᵡ¢¹ô¶‘.ÏYÊxS±V(AÒú–”Ôq©Öt+/Ô«-®u¸p0w-zÙà´4›¾Æ´aY‡=ztéÒÓnîúg~—ï2Ï7Y,,耄ýËL dø=||‹|Y¹pãzÀ´?2¡\¦¥à fáË¼Äøü\~'f²{²[j,ð >#ýþ Ÿ(„9Ìa:ÀÃ,±ÀÙˆKâ „x  Ràö. ëáB%ýf6¹•ïón¾Ï» Vë„ýêÖ/Σ«Æ‘ƒ™®° %Oÿä+|ˆ¯ð!¾ÁI ‰6 êÃ3úeüÔHWÇÏúÞOåÖ vXIK•O´rZµ8»¢gâg8=CËë2Ç9Ǫ[¿P‡éB' €™ýrAmK"zÊ»Â!îåîå þŒ“m’Çß6âë±¾Ò3öŸÕäy5î’’åÜ“ºˆ"û[�< ÜJ¬ÞsÏúþU9Z^ˆ­8_éfD!Zqõ—_\Ïþä- ê-`<uQS,ƒy˜ôìÿbÌ]z@h`¿*‡*GZ‘¨Þ�ÞË>ÌãÀ)þŠüDg‰ûé²”›i�qIb.JXT†±ÉbjýkÜ$ˆÀMûÿ1^¤K6ü<¦ Ë¿ó°9©C_°²fr¯EôÏãM~Ÿ¯ð8]ÞT„xXÈÇu5_<äÕt_0PA¿ á𶀆à @Ãá áðÐp4O�"³qGA餦ÜëÒÑÙúv™GbQ�ާp¼rzÕýÔE‹3ñ÷3ÚU Ä6ˆ•‚ü+œä$×q?äW 1£ÚùXüK<é8 ¼Ÿ[¸…÷sC!¾Ù}E~5C~=C‘n 1[x†LO ’¾gƒUþX¢•š=‹‰¸¸’̪÷y–hs‰ãl(&U¢'/qgâùvý|ø^¦8Sx(ýþo(æB—x‚eÚ\ŠÓ‘çêíæðľ×U’Ís¯¡Â:ØÍ…Ò…2k W¾!ãBŒÔœi€ V™á EO±føX6˜g•A5™kOد2¹ޝjSôë¼Á6Û¼Á[JúœÆS›þj飛‰QÔÉ:(í±ÛZÕöÖ0Ne ´Zø]L2É$ÿ•ÜÈ4@Èç8ÃB,éæõ,ºÇ‹(£t'ˆ8.ˆ¥JCL¬KÜU çíiù’5†#¼Xxú#|€U: Ô@âŽÇm¥Ð??d,^q5¦L!Ò�]ˆMr¯×I4ÀpZéÌ;¤Í>àg@ºµM¶Fì¿Ké)(Ì}«fìÑU¿ .¥{ã”Ô]¶~5ûÅ5ù¹ö¯ð³Ô>ð"âŒó$cõ¬þå ¼+¥×Ÿ�?¯ñQ�–™c™# ’mK-6¨)࿟±_àYŒn‹ G+®º:–|a á¶àÉô›ø"˜~ϯ‹“Ù¯bàqî~=Ä+†§«,j£?àM­Ðy 9"Ýy¥ DýÙöÊnþ€gµ›©½6-z<Á,+tK¢²¯Úç·xW"Èý™©ª'lÄÌ˾‹HØéˆ[yJ¢&ìŸaœ@Ù~/ñ9â¿"ûaƒ%î$iÑ£Çÿñ6.SîàŸ¶8ظ’+y™+¹*þo†jo°m p-û¸†k¸¸1 ‘u‘ÿ‹è%©=’¶¿…ø-à"Š ˆØÿ4wq·-‹±ÕþE–øðK ö|‘Uf•Gé²� -�‘šUa]XÆr´°ÿx.Þ\ŸýŸË…h¥:"ù‡¸LF½dFᡬ5p˜¯f´è¦Šÿ)nÍYÍ£ånöµFhó 1{¡'÷å\ÂÀÝ<Ï«lik)$H÷ 䇙ù5Öâ%yÓüknié¬b ¥ì²/¢èÐOé¿À›ƒE¼ƒOjZñ<ã,ÅbÕâù¹‚ˆ‰P €èÍpëž+À @ÃÑ<[€‡/� ‡€†#/�³Záwp6µ$5ºDõØEËÌç ï ðÇ|6wç^>7ìÌ{Ô‡¨NÄ­–¹Pw¤ìÏfè>«Ôk„7‰/ǤcÍ—=ÄÎcM°¦ï´¯ßA€E`œqŠÛ:N*ãªîNÁQëáøºbÉUG±`æãÊŸ×Æ³…°ÑCᨉ"‹§5ßw5².àß&Ûv;¤ŠÑÄ.ܱ϶7e$Û$å‰ÛyÉKæYE<[ˆy–8Á“ÜÆM nÝm%ÜUÈ4@Ôê[ñó¢&¼íäÝECÜ(ý.ê/ôªb¿¼ÀC½¿>Z¦1»_PÑOð^ç;œÐ¤�ŒÆüÜÎ!€NÜÿwc›ÕlÅ^øßã]`C1ÈL”¾Žý®8GO{¨ <™»fpYË8¬³Î: èXª! €¤WÎZ¸­ŸVc•Àʺ™Âb†ˆí+µÙ³´ _Ý–»fp9Uü4‘±u *¸ÏQDÐI·3cv÷1e\ÕÝŽeŒ(Ö²$ç™Ø¿ ù.ß]¢›zá)Ò/ð>ò>.|mO9QöŒHN ÓPãë{ù®‚ú;¹=èYJú¶¤7'Û[¿ÝÉ‚-„²Îb< XÓŒô«ž2¢ˆ@}ÎÞºPwóùõ¾ ˆÓaŨÀMë lqG{R�\p³ñ²Dx”sŠT3ÐXðØ“ðÖÀ†Ã @Ãá áðÐpxh8¼�äѱxóße l TZá‘BôëHˆaá´e¿c´t*ZHF²è°b52áiiSè°[:¬DH¿S ú))%•ü_rpŠS†ò¹³ßeUÓ®@± ¨*I¼3¬*¨CÈ 3ô é»=¹º&Æ&5“CBûóÔ`¯èõ ÃŠõ,o]¼¢Ù~±†Â]3ó’t¨Îü¢‡ƒêØ­ jXeÆx”³«Ì0CTA3œy Ü5›{’t°Åßì!k@Q�V+Vr¯Å 3…e!«̰B˾ۓ«æOöA ¦ÎãŠÔ°Â‰ # ù¼€U4V­éDчùD´³*OÝ•ðÖÀ<:¬Xl¦îBxh8üL`Ãá áðÐpxh8¼�4y0í½õ؃È »J½–k5¾ö#;۪ǮD"�-ºéžº#t•Ln3ã|’®ÃysÉ©Üq§v˜î¡A2t†>Ë}„<Àƒ„JwÈZ,Ó±:“-º*Îÿ–%šî¡A$�-ºlpðIžd•‹´5§S/ñ¯°BGs€iNå«z,v§~€79Pð§r5¯qµàp]MMëO?¢mÇ•Ç~"gÑÇ€ó�±ùó´9VhAmn`‰Ž0G—)õ¤·§ßÔ§_Ô‡ÏÃUñçí¨íñWã1}Ü3ßy A­’«Ìp†­;dµøUé÷ó>Xº‡‘è±J‡ùxÓô<mV5'ṞÌaž0ì°Wa‘çs¿×w”î¡A2ŒÎÃØà<wÒF}b@¶`fQ±õï±=´{É—hó�³´s< ãÒ5PÒÅÇ.€_Ðpx[@Ãá áðÐpxh82°P—~¤ôG®Mtù†M¯ˆä-Àv@]ºÍÍÜ éƒ.ß°é• Àü­‚ö~¾«K·9š4}Ðå6½¢. óü/n›:©ø&"O¿'"º'G¿SHÅÝ;UÉkèA…ø'•ñU峕_ÌùøëÒÆ4]|]Ì…š+%‘w~ÉtUFD±w_îô/}—øöôÅeã¨7˜…%~‡B*Eúð×ÚúKîÞÀ³ôe¾U�Ù¾^Ì€žô»Y¬®`]ÙÓ”©¹2Àž¾Y�ê×OÞ¯F¿‘gö÷E�ö×OBÀO…ÿåZ5‚âvô*)ˆ¶Ž*ñC‡¸63Ù‡ ´¹(±¿/èw0œ¥zP_ÅëóWL¡š 7¥ï¦AlJ÷ü¹(±¿ ÚÎp£ß ,±éâ Y¨¸ûj£c¤£¤Ëù w“(6zÕúIÊV¦?+±_ýÔ’ˆ༔çßDäéŸO+ðó9ú7„ôQÜý†*y =¬ÿ¼2¾ª|¶ò‹ù/?J,”¿š+%qÙ{�^â?ø@Žr_O¿×¥ÿˆÿáöý^¾´côA—oØôˆ�.²J›ã»ò§,KáêÒŸá¼E;þõ7|B`ÏNÐ]¾aÓ+Ã/i8¼5°áðÐpxh8¼�4^�/� ‡h r?<}4é [ÇÒoÛÊÐué#‡bPuÛÖêµ\¿í¬ÏÈ €Ûlé‰{l ´ãV´õ{h€102pŒ1#=òСGˆyÁ„éÀ°/¨ð(‰b0V!9¶9…zí×&@%!mý]ºÇÈA�›juºGø‰ †Ã @Ãá áðÐpxh8¼�4»W�&ü„P? @ýy¶)B¦žï 6™øS�Y�&ãϰakÝû·†Í½�Y�6ãÏpakÝžý}„«™(|Ê!,ü©±W/† ûý /A›ljÎÖ®ë xÚ)TÂþI#}ËúY�L`2eMò)§„× wŠB4!¤¯1™ý¾èFIxö® >ì8”cÿ„&œG)¸j€€I»¨ØïÇ�}@¿5À Ví&J?õ¨ Y�¶âÏè!Ð\=jb÷Ú<ú‚ÿ”çh•j o���%tEXtdate:create�2016-07-13T10:21:59+00:00‰‹���%tEXtdate:modify�2016-07-13T09:26:54+00:00óÍ ���tEXtSoftware�Adobe ImageReadyqÉe<����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/images/ui-icons_cd0a0a_256x240.png��������������������0000664�0000000�0000000�00000010705�14136337723�0027056�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������ð���ØIJù��PLTEÍ Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í Í 4Ívë���YtRNS�3P¿‚™/"Uq@f`2Ì !<BHK Z#'1S,…4‡€ÃjÈÏÆ8E¼¸¾|«µ¥Œª¨­²)ýžQ$ï ¢b”J ¯mßœGc?o‘hù@^ñ���bKGD�ˆH��� pHYs���H���H�FÉk>��dIDATxÚí] cÛ¶ÉHªé˜’]¹K§±ÖdÎæ%٫뺮Úlmº¤éw]ïÿÿ‘|áp‡‡XÊmã“-ëÀ}<€w�( 1$ìº ;ÖFÎ@ïæ%à×?Á ¨ÌÃB,Lh{Œt•šà#�¬ðT@Î/?jÔ9 m‘N¯ #€žÎ+`™“`í·«àIç ’Û_º-sâÍ´U0 æM¤˜[ˆ÷ s ð4`x °“šè#€ ÌD<¥~ Ø€K½ Ð.4ü]`ç¸éŽPDDDDDDĈqéžàŽý „Ek@÷„žA³~Â*ðͰ !Yú ”XÀ`hv3\LX”�Ot©J2bí··Ø“l™QI<§‹À ” 6À-XØlÖˆÖ6˜HÌÒ|=j×`Eâiqÿù�ÞCv:„qÝï»C?Ç?èšËïxô,�ør*tÈÝ»}|;�kP 4ðáê‘dàYÌÓÁ•f¯ÀÛ�Kª¿~[ >‚X:+ŒiÀ«’ŽÄ†QV9\‰ÔÏÃeÀ'€À¯AøtOSÁ:7™³2³Ó½üYsxMÈÛ„ÍBã–Óý&®¡‹zÁ>nÙCþô@‰är@ð‚*�a­Óºë»À%Ÿ¾MFDDDDDDÜTôß–ÚÓÍH,»ÑÝEÚüÐàRU ún ب<ÏÖV- @é/NmàÕ©Ìîà¬Ëû¼‘¬Hwý–ø–*à+¬ñ#ðò$o­e³{â% °7\XÍÌÇ€—¿Ä2ݘ~0ÂÙ&n°µsbA,¶Dãì‘ ±Aì©V†Iéô|‹ ¸Og°ðæ™é´‹… °7Ày 7Jf³›�ëÚ:_¡w^�ÖH v{/Oœ9ÃÞÍ<ÅÀ„Y€`+ôÈ HRÙ°šÁ¡õ[®‘?ÙÞ ›ï à™Ç=°ëçc""""""F˽‹sG…<*k9c»ŽE¸8è–½£þÀàèÏzfm£õr¢1Í N‘­ìø¾ºØnqÓw¬Ö&=O‡\}K` #úôö2ûà~¾»Lò|?€m>Ã\¯fíõ͹à:}ë4ᦋ€Äó¦{â)žn[’ þ̰E K Y¸ ØDÁÛ‡-¥Ñ ïž+´Kl=¼ÓƒššL`Ñ™ù|¿%¶n aü ÞæŒ‹NÉ#è5´ (4ÿàŸ?º†¸îúEDDDD\o¤WüFfq;À·\E½á_¢ÿ˜–¬Ë,¦÷•W!%…zE!Fµ¶. ¯(USHQ0dÆw)T ó ë8#p,ÝxôB·×KýèÌ �*Œx–ŠX߯E€eù”™€ÿ K솎%mKØÀX~sÇFEÃè~…†îÑèÏtdc�Éa¡Iµ•Ð1À²Af4æ¯ÛdHøcÈGùS»B`ù¤0àwev`€ÓÑí"Ñ{ É è‹.úGDDDDÜ,dÊOÈ6Ïk"qk¨ÖMeãfS_Ž÷žìU®’KÅŒ&g~>n‰ ·HèŒ})î ‡LÅíä„F%8(Š)röÊÏ!¥[4统qQk¸0ôm[Le¶²µ_§7­žä0™@>1 X0A÷ÚZ…êÀÜVc¤E‘V „Ì  Lt¢kÜ3EJ´®44àZﮊÓN`rtô>`–Ë¥ÿ ö A©ŽHBLHÕ@“ðc—ÀÐUq=�j ÑâãòôcMÀÑû¿2¸sçÛï–ÉJ€ÒÿCL€iR õNQЦýàŽ‚Ó•ê0=Ôó�Yiÿ-ª|4ÅV§ ”]àî]Ü–B^ùÞž•¯_H€Òÿö½Ý$ä€<’$‡ aàääÄ=À¡d@ê (ZÊAp_}ÿ~sਈ:èN�{DC>ÂóóÅmù^¸ ƒ¨ÂÓÓSÐ&Ê, ;œNå›î¥ì&à´B} Éáƒ<_AŽŸB]HøuùÂúN(B�0×ú{h‹û¸1¹IK�µ€ì°Ds‰˜ jŒ‚Ñ'ó¼½ äMý¹Ó8¡.€Ó«1°h3·df}mq•�ï ˆ„nƒU{ææL¦oÝÀ z \=?@ ((Äöe‹|=ơ麄³C¯i¥ý­ê1r<|èOOÁ;¯ `ÛúHép÷Qy›zÔˆu°ÝÆØóZž·çV®ÉþƲ¿!í)¼÷5m“Cò¶õÏ2ÍÀLy‘gù;²Éó½Ö‘³R‘éãjW¼a@ž¬@VšLÏ&W®àÆru=Z åÌ¥í½=UÜÎñ5} ð˜è¯¥­¿òÍÛè7±;b(œ‡ßÊ×nP&¯s†òkƒ4¶¿çâ÷8¾Í¥²0åãÉ1’Uû W¡vök¹18dq²±‹T»ŽÕŒE]qH8 âÉý§ÏîÝGÓF™´ï ·ÇKÀàòõ'¬ rý‰ŒƒOrêû¶rí̧öú6"fp°TÂ^3c³ç" ÀŸá¡nÔMÙ…-à/âñW=¥tJ,à”XÀ)±€…{ÈP Rm|Kêû´’>mXó8v�5hýÂ<¹ÿÑù²ë_{ꘀÊY§Fþ|&_G;&Œ>^Ê綾ýW⃀&ºKûæ(“©81âEB@F&ú·;"Lüù'wfwþñE-6Åío&/Ì«'X¨e,>~¬eeûí|§•�A ö¥Â=) d’ûQÝ`}P[Œ„«K¨îNŠóË‚èÏøë/ž~)‡¿ù—O[dÿO=ç3Eçl5'YÙ$?ñè´7‘mß�ã“TzÕ¦.\®Ü.Úó•` WE‡�ßð"""""v€)ž˜V®œ²<ÏõÇKÞZX.Exï~Ч)¬åûßšÏ�¹šÂW_}ý5|šs ô/!?¬îÁ“'poÕ¤“ýÍtC3ßÐÊô@¼Q¿)‡ÙtúÂ`Àÿåb!,dY9Š6A2°¦Þø‰ö¼þ©ð/튮§²€ nÚt²TK>ÔÁ«Î#]ÇL;zq°JÐÁ•rŒ×ð²[ö \-t†Ò½ü5 @ðÍ·ÏŸûnÏT@±À+;”�cË”“QhÃC*ª©ŠTûÚ™šA<Sku¸ÂµbÝE� /¹º$½ZÝÓµ.e­jæ‡ÒÖ÷ÛÓ_ʤrWaB6d˜ç—ë (¨ÀSÆs[À|Ž÷«ç«• /5R¦À(ã4X°‹ÄÄÛö76€ô¯®`3|ûð²ÍPÆùpì'àH~<R?M²2°)œ Ñë³g‡ÏVpÖøBµn¶=¨|WÊͬ\­¿V0_—81OׄÉKz||lP_ÙêωÄçò‡lxX;Ç€ÕJu�<¾˜Ng[Éð]=Ô (ý #]©öžèÓ×p†P¡a¯™¼iôûøãú‡ˆs ˜f«Õ V˜zÜö]ౚ˜Õí¡¡Ûz>×Vr”?©f�Œ?ÍÇýæ�½ –QÂ1ÀT`»†} HËkÿ¸ñ,{ÍVZË‹T”Ï›Ô?I̯uå¨QK“LMée͆î~ÀîqôêÕŠ«ôyËm0Û9Ñ S¼;úõ÷jˆùþõ®5 Þ�¼i…šQ÷‡]7k0ÜUêÞ­…×ÕG½kXŸð‹3#¶·ólYò¿ì_Цx£¨ÆÞjÞ¶9ˆÛ`ó# M [z ¨ KuO_zË¿DÜ­¾‹*§®kOJÚ(7•ünòÎ\eÕ I€TýƨÜlÃ/ŒUúëåÅÂÔß¶uw‘.°~ïäÛ;#Ãr‡Íõ.ܤ˜§8 ëo# 5L¦Üh>1Âiƒ€ –Ëåpž®VØM�?é/u7ÅÞ0ì X@õÐL©Ã+MÀ+”©ð€Ó{ÃFktÐ{ªÅ§89‰0`ðÓû. Ä€CàR+\µà¢/°Žt ÀR±ýÝç; ÖTÓ²ðòÇ]¶aL³—Œ|âefÄ‘Ùè ‰>ØÛ£úƒG¼|€P`P¦¥8C1KÕ›‘A…Ì<¯2¹ÃÛ‚øÎK†r…l@L Lª´¶Íåå‘êÑ 8@ƒE>`nÆ„�¼˜PNÔ,ÿÌp›ë ˜€™E§°Æ†¸Íÿ°ZÀF lÃŽ;¾ ðùŽßF€Ýú7þçÈ®;Òÿ øés´wSz)g7è{rÕs¤ðSžgÈ‹—–(ß„~ÿAWytXÃÿ$íNV¬ÌôÉR½_¿›<6¤p.ÄO…8ÇO[¯OdDk>_«™OäO»}ŽÍýìJSž¨×d¤îmVï›?ÓW(_€Úmà  üj´ä°ù~=H IÔF>T/ýý{*]IGJ@içøŠ«qamìNF|Q¡5ñŽòè0+ï ´çE£S8™:¸vƒ`p~vއýj:B‡¤°åÿp96äoäõys%Ÿšˆˆˆˆè ú|@H¦›¨ºÊ]ëë+‡@ŸÉt]W¹k}}åàõ‡¯7‘éFÊ®r×úúÊAÐçÞêùBù†µ\m¥-Ó_µ2PY8Óßêô·ÎúxÓÕŽN’.hû~ÞÁÐ@+7…ˆz5øâ¯‡òót–_/‘ÛÒñê™ý/í?ÿü³0ÛS>‘¼)Æ‹¬zïi0nË/˜Bþü„€`{DóëW•þÛ#`¾ƒÎB€ío…‚õ[,ÄgêÛFVЀpPß¾ÕÅÄC]Bz»” ù©,Xµùƒ ÏXµfÔƒ¤€ÊîAÕ:HÒúé k¦7ü¸dÕZ9ˆ¡oc}o£]å0†vdú:R]å0†veûºÒ]刈ˆˆˆˆjÇáÒäуüÿÀ°| �?å +(üúOÇê+ Á#‚ ysÉäßßÑnüpÓïÛFru<à.HȺotMÈÿ3hëÐë}•ô߆P}¯”þ¦”ÛÛË—ƒ€víÍÔ×àP}mÇ€¬©?¾â•þWÇúZ@•ÿêêß×®¼þ}ïý¯í€ÖÿêØ@к@éÝüFDŒÿ´ÀŠš‚l»���%tEXtdate:create�2016-07-13T10:21:59+00:00‰‹���%tEXtdate:modify�2016-07-13T09:26:54+00:00óÍ ���tEXtSoftware�Adobe ImageReadyqÉe<����IEND®B`‚�����������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/index.php���������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023043�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/jquery-ui.css�����������������������������������������0000664�0000000�0000000�00000107272�14136337723�0023705�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! jQuery UI - v1.12.1 - 2018-05-10 * http://jqueryui.com * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=smoothness&bgImgOpacityHeader=75&bgImgOpacityContent=75&bgImgOpacityDefault=75&bgImgOpacityHover=75&bgImgOpacityActive=65&bgImgOpacityHighlight=55&bgImgOpacityError=95&cornerRadiusShadow=4px&offsetLeftShadow=4px&offsetTopShadow=4px&thicknessShadow=4px&opacityShadow=40&bgImgOpacityShadow=40&bgTextureShadow=flat&bgColorShadow=%232c2626&opacityOverlay=30&bgImgOpacityOverlay=0&bgTextureOverlay=flat&bgColorOverlay=%23aaaaaa&iconColorError=%23cd0a0a&fcError=%23cd0a0a&borderColorError=%23cd0a0a&bgTextureError=glass&bgColorError=%23fef1ec&iconColorHighlight=%232e83ff&fcHighlight=%23363636&borderColorHighlight=%23fcefa1&bgTextureHighlight=glass&bgColorHighlight=%23fbf9ee&iconColorActive=%23454545&fcActive=%23212121&borderColorActive=%23aaaaaa&bgTextureActive=glass&bgColorActive=%23ffffff&iconColorHover=%23454545&fcHover=%23212121&borderColorHover=%23999999&bgTextureHover=glass&bgColorHover=%23dadada&iconColorDefault=%23888888&fcDefault=%23555555&borderColorDefault=%23d3d3d3&bgTextureDefault=glass&bgColorDefault=%23e6e6e6&iconColorContent=%23222222&fcContent=%23222222&borderColorContent=%23aaaaaa&bgTextureContent=flat&bgColorContent=%23ffffff&iconColorHeader=%23222222&fcHeader=%23222222&borderColorHeader=%23aaaaaa&bgTextureHeader=highlight_soft&bgColorHeader=%23cccccc&cornerRadius=4px&fwDefault=normal&fsDefault=1.1em&ffDefault=Verdana%2CArial%2Csans-serif * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-draggable-handle { -ms-touch-action: none; touch-action: none; } /* Layout helpers ----------------------------------*/ .ui-helper-hidden { display: none; } .ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; border-collapse: collapse; } .ui-helper-clearfix:after { clear: both; } .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); /* support: IE8 */ } .ui-front { z-index: 100; } /* Interaction Cues ----------------------------------*/ .ui-state-disabled { cursor: default !important; pointer-events: none; } /* Icons ----------------------------------*/ .ui-icon { display: inline-block; vertical-align: middle; margin-top: -.25em; position: relative; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } .ui-widget-icon-block { left: 50%; margin-left: -8px; display: block; } /* Misc visuals ----------------------------------*/ /* Overlays */ .ui-widget-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; } .ui-resizable { position: relative; } .ui-resizable-handle { position: absolute; font-size: 0.1px; display: block; -ms-touch-action: none; touch-action: none; } .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px; } .ui-selectable { -ms-touch-action: none; touch-action: none; } .ui-selectable-helper { position: absolute; z-index: 100; border: 1px dotted black; } .ui-sortable-handle { -ms-touch-action: none; touch-action: none; } .ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin: 2px 0 0 0; padding: .5em .5em .5em .7em; font-size: 100%; } .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; } .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; } .ui-menu { list-style: none; padding: 0; margin: 0; display: block; outline: 0; } .ui-menu .ui-menu { position: absolute; } .ui-menu .ui-menu-item { margin: 0; cursor: pointer; /* support: IE10, see #8844 */ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); } .ui-menu .ui-menu-item-wrapper { position: relative; padding: 3px 1em 3px .4em; } .ui-menu .ui-menu-divider { margin: 5px 0; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { margin: -1px; } /* icon support */ .ui-menu-icons { position: relative; } .ui-menu-icons .ui-menu-item-wrapper { padding-left: 2em; } /* left-aligned */ .ui-menu .ui-icon { position: absolute; top: 0; bottom: 0; left: .2em; margin: auto 0; } /* right-aligned */ .ui-menu .ui-menu-icon { left: auto; right: 0; } .ui-button { padding: .4em 1em; display: inline-block; position: relative; line-height: normal; margin-right: .1em; cursor: pointer; vertical-align: middle; text-align: center; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Support: IE <= 11 */ overflow: visible; } .ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; } /* to make room for the icon, a width needs to be set here */ .ui-button-icon-only { width: 2em; box-sizing: border-box; text-indent: -9999px; white-space: nowrap; } /* no icon support for input elements */ input.ui-button.ui-button-icon-only { text-indent: 0; } /* button icon element(s) */ .ui-button-icon-only .ui-icon { position: absolute; top: 50%; left: 50%; margin-top: -8px; margin-left: -8px; } .ui-button.ui-icon-notext .ui-icon { padding: 0; width: 2.1em; height: 2.1em; text-indent: -9999px; white-space: nowrap; } input.ui-button.ui-icon-notext .ui-icon { width: auto; height: auto; text-indent: 0; white-space: normal; padding: .4em 1em; } /* workarounds */ /* Support: Firefox 5 - 40 */ input.ui-button::-moz-focus-inner, button.ui-button::-moz-focus-inner { border: 0; padding: 0; } .ui-controlgroup { vertical-align: middle; display: inline-block; } .ui-controlgroup > .ui-controlgroup-item { float: left; margin-left: 0; margin-right: 0; } .ui-controlgroup > .ui-controlgroup-item:focus, .ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { z-index: 9999; } .ui-controlgroup-vertical > .ui-controlgroup-item { display: block; float: none; width: 100%; margin-top: 0; margin-bottom: 0; text-align: left; } .ui-controlgroup-vertical .ui-controlgroup-item { box-sizing: border-box; } .ui-controlgroup .ui-controlgroup-label { padding: .4em 1em; } .ui-controlgroup .ui-controlgroup-label span { font-size: 80%; } .ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { border-left: none; } .ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { border-top: none; } .ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { border-right: none; } .ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { border-bottom: none; } /* Spinner specific style fixes */ .ui-controlgroup-vertical .ui-spinner-input { /* Support: IE8 only, Android < 4.4 only */ width: 75%; width: calc( 100% - 2.4em ); } .ui-controlgroup-vertical .ui-spinner .ui-spinner-up { border-top-style: solid; } .ui-checkboxradio-label .ui-icon-background { box-shadow: inset 1px 1px 1px #ccc; border-radius: .12em; border: none; } .ui-checkboxradio-radio-label .ui-icon-background { width: 16px; height: 16px; border-radius: 1em; overflow: visible; border: none; } .ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, .ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { background-image: none; width: 8px; height: 8px; border-width: 4px; border-style: solid; } .ui-checkboxradio-disabled { pointer-events: none; } .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } .ui-datepicker .ui-datepicker-header { position: relative; padding: .2em 0; } .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position: absolute; top: 2px; width: 1.8em; height: 1.8em; } .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } .ui-datepicker .ui-datepicker-prev { left: 2px; } .ui-datepicker .ui-datepicker-next { right: 2px; } .ui-datepicker .ui-datepicker-prev-hover { left: 1px; } .ui-datepicker .ui-datepicker-next-hover { right: 1px; } .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } .ui-datepicker .ui-datepicker-title select { font-size: 1em; margin: 1px 0; } .ui-datepicker select.ui-datepicker-month, .ui-datepicker select.ui-datepicker-year { width: 45%; } .ui-datepicker table { width: 100%; font-size: .9em; border-collapse: collapse; margin: 0 0 .4em; } .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } .ui-datepicker td { border: 0; padding: 1px; } .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding: 0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width: auto; overflow: visible; } .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float: left; } /* with multiple calendars */ .ui-datepicker.ui-datepicker-multi { width: auto; } .ui-datepicker-multi .ui-datepicker-group { float: left; } .ui-datepicker-multi .ui-datepicker-group table { width: 95%; margin: 0 auto .4em; } .ui-datepicker-multi-2 .ui-datepicker-group { width: 50%; } .ui-datepicker-multi-3 .ui-datepicker-group { width: 33.3%; } .ui-datepicker-multi-4 .ui-datepicker-group { width: 25%; } .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width: 0; } .ui-datepicker-multi .ui-datepicker-buttonpane { clear: left; } .ui-datepicker-row-break { clear: both; width: 100%; font-size: 0; } /* RTL support */ .ui-datepicker-rtl { direction: rtl; } .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } .ui-datepicker-rtl .ui-datepicker-buttonpane { clear: right; } .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, .ui-datepicker-rtl .ui-datepicker-group { float: right; } .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width: 0; border-left-width: 1px; } /* Icons */ .ui-datepicker .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; left: .5em; top: .3em; } .ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; outline: 0; } .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } .ui-dialog .ui-dialog-title { float: left; margin: .1em 0; white-space: nowrap; width: 90%; overflow: hidden; text-overflow: ellipsis; } .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 20px; margin: -10px 0 0 0; padding: 1px; height: 20px; } .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; } .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin-top: .5em; padding: .3em 1em .5em .4em; } .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } .ui-dialog .ui-resizable-n { height: 2px; top: 0; } .ui-dialog .ui-resizable-e { width: 2px; right: 0; } .ui-dialog .ui-resizable-s { height: 2px; bottom: 0; } .ui-dialog .ui-resizable-w { width: 2px; left: 0; } .ui-dialog .ui-resizable-se, .ui-dialog .ui-resizable-sw, .ui-dialog .ui-resizable-ne, .ui-dialog .ui-resizable-nw { width: 7px; height: 7px; } .ui-dialog .ui-resizable-se { right: 0; bottom: 0; } .ui-dialog .ui-resizable-sw { left: 0; bottom: 0; } .ui-dialog .ui-resizable-ne { right: 0; top: 0; } .ui-dialog .ui-resizable-nw { left: 0; top: 0; } .ui-draggable .ui-dialog-titlebar { cursor: move; } .ui-progressbar { height: 2em; text-align: left; overflow: hidden; } .ui-progressbar .ui-progressbar-value { margin: -1px; height: 100%; } .ui-progressbar .ui-progressbar-overlay { background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); height: 100%; filter: alpha(opacity=25); /* support: IE8 */ opacity: 0.25; } .ui-progressbar-indeterminate .ui-progressbar-value { background-image: none; } .ui-selectmenu-menu { padding: 0; margin: 0; position: absolute; top: 0; left: 0; display: none; } .ui-selectmenu-menu .ui-menu { overflow: auto; overflow-x: hidden; padding-bottom: 1px; } .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { font-size: 1em; font-weight: bold; line-height: 1.5; padding: 2px 0.4em; margin: 0.5em 0 0 0; height: auto; border: 0; } .ui-selectmenu-open { display: block; } .ui-selectmenu-text { display: block; margin-right: 20px; overflow: hidden; text-overflow: ellipsis; } .ui-selectmenu-button.ui-button { text-align: left; white-space: nowrap; width: 14em; } .ui-selectmenu-icon.ui-icon { float: right; margin-top: 0; } .ui-slider { position: relative; text-align: left; } .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; -ms-touch-action: none; touch-action: none; } .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } /* support: IE8 - See #6727 */ .ui-slider.ui-state-disabled .ui-slider-handle, .ui-slider.ui-state-disabled .ui-slider-range { filter: inherit; } .ui-slider-horizontal { height: .8em; } .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } .ui-slider-horizontal .ui-slider-range-min { left: 0; } .ui-slider-horizontal .ui-slider-range-max { right: 0; } .ui-slider-vertical { width: .8em; height: 100px; } .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } .ui-slider-vertical .ui-slider-range-min { bottom: 0; } .ui-slider-vertical .ui-slider-range-max { top: 0; } .ui-spinner { position: relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; } .ui-spinner-input { border: none; background: none; color: inherit; padding: .222em 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 2em; } .ui-spinner-button { width: 1.6em; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; } /* more specificity required here to override default borders */ .ui-spinner a.ui-spinner-button { border-top-style: none; border-bottom-style: none; border-right-style: none; } .ui-spinner-up { top: 0; } .ui-spinner-down { bottom: 0; } .ui-tabs { position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ padding: .2em; } .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom-width: 0; padding: 0; white-space: nowrap; } .ui-tabs .ui-tabs-nav .ui-tabs-anchor { float: left; padding: .5em 1em; text-decoration: none; } .ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; } .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { cursor: text; } .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { cursor: pointer; } .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } .ui-tooltip { padding: 8px; position: absolute; z-index: 9999; max-width: 300px; } body .ui-tooltip { border-width: 2px; } /* Component containers ----------------------------------*/ .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } .ui-widget .ui-widget { font-size: 1em; } .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } .ui-widget.ui-widget-content { border: 1px solid #d3d3d3; } .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff; color: #222222; } .ui-widget-content a { color: #222222; } .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x; color: #222222; font-weight: bold; } .ui-widget-header a { color: #222222; } /* Interaction states ----------------------------------*/ .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, /* We use html here because we need a greater specificity to make sure disabled works properly when clicked or hovered */ html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { border: 1px solid #d3d3d3; background: #e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #555555; } .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited, a.ui-button, a:link.ui-button, a:visited.ui-button, .ui-button { color: #555555; text-decoration: none; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { border: 1px solid #999999; background: #dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x; font-weight: normal; color: #212121; } .ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited, .ui-state-focus a, .ui-state-focus a:hover, .ui-state-focus a:link, .ui-state-focus a:visited, a.ui-button:hover, a.ui-button:focus { color: #212121; text-decoration: none; } .ui-visual-focus { box-shadow: 0 0 3px 1px rgb(94, 158, 214); } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { font-weight: normal; color: #93CEFF; } .ui-icon-background, .ui-state-active .ui-icon-background { border: #aaaaaa; background-color: #212121; } .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } /* Interaction Cues ----------------------------------*/ .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight { border: 1px solid #fcefa1; background: #fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x; color: #363636; } .ui-state-checked { border: 1px solid #fcefa1; background: #fbf9ee; } .ui-state-highlight a, .ui-widget-content .ui-state-highlight a, .ui-widget-header .ui-state-highlight a { color: #363636; } .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error { border: 1px solid #cd0a0a; background: #fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x; color: #cd0a0a; } .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); /* support: IE8 */ font-weight: normal; } .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); /* support: IE8 */ background-image: none; } .ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ } /* Icons ----------------------------------*/ /* states and images */ .ui-icon { width: 16px; height: 16px; } .ui-icon, .ui-widget-content .ui-icon { background-image: url("images/ui-icons_222222_256x240.png"); } .ui-widget-header .ui-icon { background-image: url("images/ui-icons_222222_256x240.png"); } .ui-state-hover .ui-icon, .ui-state-focus .ui-icon, .ui-button:hover .ui-icon, .ui-button:focus .ui-icon { background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-active .ui-icon, .ui-button:active .ui-icon { background-image: url("images/ui-icons_454545_256x240.png"); } .ui-state-highlight .ui-icon, .ui-button .ui-state-highlight.ui-icon { background-image: url("images/ui-icons_2e83ff_256x240.png"); } .ui-state-error .ui-icon, .ui-state-error-text .ui-icon { background-image: url("images/ui-icons_cd0a0a_256x240.png"); } .ui-button .ui-icon { background-image: url("images/ui-icons_888888_256x240.png"); } /* positioning */ .ui-icon-blank { background-position: 16px 16px; } .ui-icon-caret-1-n { background-position: 0 0; } .ui-icon-caret-1-ne { background-position: -16px 0; } .ui-icon-caret-1-e { background-position: -32px 0; } .ui-icon-caret-1-se { background-position: -48px 0; } .ui-icon-caret-1-s { background-position: -65px 0; } .ui-icon-caret-1-sw { background-position: -80px 0; } .ui-icon-caret-1-w { background-position: -96px 0; } .ui-icon-caret-1-nw { background-position: -112px 0; } .ui-icon-caret-2-n-s { background-position: -128px 0; } .ui-icon-caret-2-e-w { background-position: -144px 0; } .ui-icon-triangle-1-n { background-position: 0 -16px; } .ui-icon-triangle-1-ne { background-position: -16px -16px; } .ui-icon-triangle-1-e { background-position: -32px -16px; } .ui-icon-triangle-1-se { background-position: -48px -16px; } .ui-icon-triangle-1-s { background-position: -65px -16px; } .ui-icon-triangle-1-sw { background-position: -80px -16px; } .ui-icon-triangle-1-w { background-position: -96px -16px; } .ui-icon-triangle-1-nw { background-position: -112px -16px; } .ui-icon-triangle-2-n-s { background-position: -128px -16px; } .ui-icon-triangle-2-e-w { background-position: -144px -16px; } .ui-icon-arrow-1-n { background-position: 0 -32px; } .ui-icon-arrow-1-ne { background-position: -16px -32px; } .ui-icon-arrow-1-e { background-position: -32px -32px; } .ui-icon-arrow-1-se { background-position: -48px -32px; } .ui-icon-arrow-1-s { background-position: -65px -32px; } .ui-icon-arrow-1-sw { background-position: -80px -32px; } .ui-icon-arrow-1-w { background-position: -96px -32px; } .ui-icon-arrow-1-nw { background-position: -112px -32px; } .ui-icon-arrow-2-n-s { background-position: -128px -32px; } .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } .ui-icon-arrow-2-e-w { background-position: -160px -32px; } .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } .ui-icon-arrowstop-1-n { background-position: -192px -32px; } .ui-icon-arrowstop-1-e { background-position: -208px -32px; } .ui-icon-arrowstop-1-s { background-position: -224px -32px; } .ui-icon-arrowstop-1-w { background-position: -240px -32px; } .ui-icon-arrowthick-1-n { background-position: 1px -48px; } .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } .ui-icon-arrowthick-1-e { background-position: -32px -48px; } .ui-icon-arrowthick-1-se { background-position: -48px -48px; } .ui-icon-arrowthick-1-s { background-position: -64px -48px; } .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } .ui-icon-arrowthick-1-w { background-position: -96px -48px; } .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } .ui-icon-arrow-4 { background-position: 0 -80px; } .ui-icon-arrow-4-diag { background-position: -16px -80px; } .ui-icon-extlink { background-position: -32px -80px; } .ui-icon-newwin { background-position: -48px -80px; } .ui-icon-refresh { background-position: -64px -80px; } .ui-icon-shuffle { background-position: -80px -80px; } .ui-icon-transfer-e-w { background-position: -96px -80px; } .ui-icon-transferthick-e-w { background-position: -112px -80px; } .ui-icon-folder-collapsed { background-position: 0 -96px; } .ui-icon-folder-open { background-position: -16px -96px; } .ui-icon-document { background-position: -32px -96px; } .ui-icon-document-b { background-position: -48px -96px; } .ui-icon-note { background-position: -64px -96px; } .ui-icon-mail-closed { background-position: -80px -96px; } .ui-icon-mail-open { background-position: -96px -96px; } .ui-icon-suitcase { background-position: -112px -96px; } .ui-icon-comment { background-position: -128px -96px; } .ui-icon-person { background-position: -144px -96px; } .ui-icon-print { background-position: -160px -96px; } .ui-icon-trash { background-position: -176px -96px; } .ui-icon-locked { background-position: -192px -96px; } .ui-icon-unlocked { background-position: -208px -96px; } .ui-icon-bookmark { background-position: -224px -96px; } .ui-icon-tag { background-position: -240px -96px; } .ui-icon-home { background-position: 0 -112px; } .ui-icon-flag { background-position: -16px -112px; } .ui-icon-calendar { background-position: -32px -112px; } .ui-icon-cart { background-position: -48px -112px; } .ui-icon-pencil { background-position: -64px -112px; } .ui-icon-clock { background-position: -80px -112px; } .ui-icon-disk { background-position: -96px -112px; } .ui-icon-calculator { background-position: -112px -112px; } .ui-icon-zoomin { background-position: -128px -112px; } .ui-icon-zoomout { background-position: -144px -112px; } .ui-icon-search { background-position: -160px -112px; } .ui-icon-wrench { background-position: -176px -112px; } .ui-icon-gear { background-position: -192px -112px; } .ui-icon-heart { background-position: -208px -112px; } .ui-icon-star { background-position: -224px -112px; } .ui-icon-link { background-position: -240px -112px; } .ui-icon-cancel { background-position: 0 -128px; } .ui-icon-plus { background-position: -16px -128px; } .ui-icon-plusthick { background-position: -32px -128px; } .ui-icon-minus { background-position: -48px -128px; } .ui-icon-minusthick { background-position: -64px -128px; } .ui-icon-close { background-position: -80px -128px; } .ui-icon-closethick { background-position: -96px -128px; } .ui-icon-key { background-position: -112px -128px; } .ui-icon-lightbulb { background-position: -128px -128px; } .ui-icon-scissors { background-position: -144px -128px; } .ui-icon-clipboard { background-position: -160px -128px; } .ui-icon-copy { background-position: -176px -128px; } .ui-icon-contact { background-position: -192px -128px; } .ui-icon-image { background-position: -208px -128px; } .ui-icon-video { background-position: -224px -128px; } .ui-icon-script { background-position: -240px -128px; } .ui-icon-alert { background-position: 0 -144px; } .ui-icon-info { background-position: -16px -144px; } .ui-icon-notice { background-position: -32px -144px; } .ui-icon-help { background-position: -48px -144px; } .ui-icon-check { background-position: -64px -144px; } .ui-icon-bullet { background-position: -80px -144px; } .ui-icon-radio-on { background-position: -96px -144px; } .ui-icon-radio-off { background-position: -112px -144px; } .ui-icon-pin-w { background-position: -128px -144px; } .ui-icon-pin-s { background-position: -144px -144px; } .ui-icon-play { background-position: 0 -160px; } .ui-icon-pause { background-position: -16px -160px; } .ui-icon-seek-next { background-position: -32px -160px; } .ui-icon-seek-prev { background-position: -48px -160px; } .ui-icon-seek-end { background-position: -64px -160px; } .ui-icon-seek-start { background-position: -80px -160px; } /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ .ui-icon-seek-first { background-position: -80px -160px; } .ui-icon-stop { background-position: -96px -160px; } .ui-icon-eject { background-position: -112px -160px; } .ui-icon-volume-off { background-position: -128px -160px; } .ui-icon-volume-on { background-position: -144px -160px; } .ui-icon-power { background-position: 0 -176px; } .ui-icon-signal-diag { background-position: -16px -176px; } .ui-icon-signal { background-position: -32px -176px; } .ui-icon-battery-0 { background-position: -48px -176px; } .ui-icon-battery-1 { background-position: -64px -176px; } .ui-icon-battery-2 { background-position: -80px -176px; } .ui-icon-battery-3 { background-position: -96px -176px; } .ui-icon-circle-plus { background-position: 0 -192px; } .ui-icon-circle-minus { background-position: -16px -192px; } .ui-icon-circle-close { background-position: -32px -192px; } .ui-icon-circle-triangle-e { background-position: -48px -192px; } .ui-icon-circle-triangle-s { background-position: -64px -192px; } .ui-icon-circle-triangle-w { background-position: -80px -192px; } .ui-icon-circle-triangle-n { background-position: -96px -192px; } .ui-icon-circle-arrow-e { background-position: -112px -192px; } .ui-icon-circle-arrow-s { background-position: -128px -192px; } .ui-icon-circle-arrow-w { background-position: -144px -192px; } .ui-icon-circle-arrow-n { background-position: -160px -192px; } .ui-icon-circle-zoomin { background-position: -176px -192px; } .ui-icon-circle-zoomout { background-position: -192px -192px; } .ui-icon-circle-check { background-position: -208px -192px; } .ui-icon-circlesmall-plus { background-position: 0 -208px; } .ui-icon-circlesmall-minus { background-position: -16px -208px; } .ui-icon-circlesmall-close { background-position: -32px -208px; } .ui-icon-squaresmall-plus { background-position: -48px -208px; } .ui-icon-squaresmall-minus { background-position: -64px -208px; } .ui-icon-squaresmall-close { background-position: -80px -208px; } .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } .ui-icon-grip-solid-vertical { background-position: -32px -224px; } .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } .ui-icon-grip-diagonal-se { background-position: -80px -224px; } /* Misc visuals ----------------------------------*/ /* Corner radius */ .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { border-top-left-radius: 4px; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { border-top-right-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { border-bottom-left-radius: 4px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { border-bottom-right-radius: 4px; } /* Overlays */ .ui-widget-overlay { background: #aaaaaa; opacity: .3; filter: Alpha(Opacity=30); /* support: IE8 */ } .ui-widget-shadow { -webkit-box-shadow: 4px 4px 4px #2c2626; box-shadow: 4px 4px 4px #2c2626; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/jquery.colorpicker.css��������������������������������0000664�0000000�0000000�00000011157�14136337723�0025601�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-colorpicker, .ui-dialog.ui-colorpicker { width: auto; white-space: nowrap; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -ms-user-select: none; user-select: none; } .ui-colorpicker-inline { position: static; } .ui-colorpicker-buttonset { float: left; margin-left: .4em; } .ui-colorpicker-buttonset .ui-button { margin: .5em 0 .5em 0; cursor: pointer; } .ui-colorpicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding: 0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } .ui-colorpicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width: auto; overflow: visible; } .ui-colorpicker-buttonpane button.ui-colorpicker-current { float: left; } .ui-colorpicker table { width: 100%; font-size: 100%; /* Reset browser table font-size */ margin: 0; } .ui-colorpicker table td { vertical-align: top; } .ui-colorpicker-padding-left { padding-left: 10px; } .ui-colorpicker-padding-top { padding-top: 10px; } .ui-colorpicker-border { border: 1px inset; display: inline-block; } /* Bar & map */ .ui-colorpicker-map > *, .ui-colorpicker-bar > * { position: absolute; cursor: crosshair; } .ui-colorpicker-map-pointer, .ui-colorpicker-bar-pointer { position: absolute; left: 0; } /* Map */ .ui-colorpicker-map, .ui-colorpicker-map > * { display: block; width: 256px; height: 256px; overflow: hidden; } .ui-colorpicker-map-layer-1, .ui-colorpicker-map-layer-2 { background: url(images/map.png) no-repeat; } .ui-colorpicker-map-128, .ui-colorpicker-map-128 > * { width: 128px; height: 128px; } .ui-colorpicker-map-128 .ui-colorpicker-map-layer-1, .ui-colorpicker-map-128 .ui-colorpicker-map-layer-2 { background: url(images/128/map.png) no-repeat; } .ui-colorpicker-map-layer-alpha { background: url(images/map-opacity.png); } .ui-colorpicker-map-pointer { display: inline-block; width: 15px; height: 15px; background: url(images/map-pointer.png) no-repeat; } /* Bar */ .ui-colorpicker-bar, .ui-colorpicker-bar > * { display: block; width: 20px; height: 256px; overflow: hidden; background-repeat: repeat-x; } .ui-colorpicker-bar-128, .ui-colorpicker-bar-128 > * { height: 128px; } .ui-colorpicker-bar-layer-1, .ui-colorpicker-bar-layer-2, .ui-colorpicker-bar-layer-3, .ui-colorpicker-bar-layer-4 { background: url(images/bar.png) repeat-x; } .ui-colorpicker-bar-128 .ui-colorpicker-bar-layer-1, .ui-colorpicker-bar-128 .ui-colorpicker-bar-layer-2, .ui-colorpicker-bar-128 .ui-colorpicker-bar-layer-3, .ui-colorpicker-bar-128 .ui-colorpicker-bar-layer-4 { background: url(images/128/bar.png) repeat-x; } .ui-colorpicker-bar-layer-alpha { background: url(images/bar-opacity.png); } .ui-colorpicker-bar-layer-alphabar { background: url(images/bar-alpha.png); } .ui-colorpicker-bar-128 .ui-colorpicker-bar-layer-alphabar { background: url(images/128/bar-alpha.png); } .ui-colorpicker-bar-pointer { display: inline-block; width: 20px; height: 7px; background: url(images/bar-pointer.png) no-repeat; } /* Preview */ .ui-colorpicker-preview { text-align: center; height: 20px; } .ui-colorpicker-preview-initial { cursor: pointer; } .ui-colorpicker-preview-initial, .ui-colorpicker-preview-current { width: 50px; height: 20px; display: inline-block; } .ui-colorpicker-preview-initial-alpha, .ui-colorpicker-preview-current-alpha { width: 50px; height: 20px; display: inline-block; background: url(images/preview-opacity.png) repeat; } /* Inputs */ .ui-colorpicker-rgb label, .ui-colorpicker-hsv label, .ui-colorpicker-hsl label, .ui-colorpicker-lab label, .ui-colorpicker-cmyk label, .ui-colorpicker-alpha label { width: 1.5em; display: inline-block; } .ui-colorpicker-number { margin: .1em; width: 4em; } /* Hex */ .ui-colorpicker-hex { text-align: center; } /* Swatches */ .ui-colorpicker-swatches { height: 256px; overflow: auto; background-color: #f8f8f8; } .ui-colorpicker-swatch { cursor: pointer; float: left; width: 11px; height: 11px; border-right: 1px solid black; border-bottom: 1px solid black; } .ui-colorpicker-disabled { opacity: .5; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter: alpha(opacity=50); pointer-events: none; } .ui-colorpicker-disabled * { cursor: default !important; }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/jquery.multiselect.css��������������������������������0000664�0000000�0000000�00000005277�14136337723�0025625�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/jquery.multiselect.filter.css�������������������������0000664�0000000�0000000�00000000622�14136337723�0027076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/jquery.timepicker.css���������������������������������0000664�0000000�0000000�00000003631�14136337723�0025417�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } .ui-timepicker-div dl { text-align: left; } .ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; } .ui-timepicker-div dl dd { margin: 0 10px 10px 40%; } .ui-timepicker-div td { font-size: 90%; } .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } .ui-timepicker-div .ui_tpicker_unit_hide{ display: none; } .ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input { background: none; color: inherit; border: none; outline: none; border-bottom: solid 1px #555; width: 95%; } .ui-timepicker-div .ui_tpicker_time .ui_tpicker_time_input:focus { border-bottom-color: #aaa; } .ui-timepicker-rtl{ direction: rtl; } .ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; } .ui-timepicker-rtl dl dt{ float: right; clear: right; } .ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; } /* Shortened version style */ .ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; } .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time, .ui-timepicker-div.ui-timepicker-oneLine dt { display: none; } .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; } .ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; } .ui-timepicker-div.ui-timepicker-oneLine dl dd, .ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; } .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before, .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; } .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before, .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; } .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide, .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; }�������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/jquery.zoom.css���������������������������������������0000664�0000000�0000000�00000012630�14136337723�0024246�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������@import "colors.css"; #zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; background-color: #242635; height:0; position:absolute; z-index:auto; filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity:0.5; opacity:0.5; overflow:hidden; border:0; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; background-color: #242635; height:0; position:absolute; z-index:auto; filter:alpha(opacity=5); -moz-opacity:0.5; -khtml-opacity:0.5; opacity:0.5; overflow:hidden; border:0; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #9d9d9d; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid #57a9da; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid #57a9da; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; color: #969BA3; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #141621; padding: 0.25em 0.75em; border: 1px solid #494949; border-radius: 4px; } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #494949; } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #141621; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #494949; } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #141621; z-index: auto; } .zoom-menu { position:absolute; background: #141621; display:none; z-index:auto; border: 1px solid #494949; } .zoom-menu .first_li span { width:150px; display:block; padding: 4px 15px; cursor:pointer; text-align: left; } .zoom-menu .inner_li { display:none; margin-left:150px; position:absolute; margin-top:-28px; background:#141621; border: 1px solid #494949; } .zoom-menu .sep_li { border-top: 1px solid #323339; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float:left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { display: none; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } div.zoom-menu-hover, div.inner_li>span.zoom-menu-hover{ cursor: pointer; background: #0d0e15; color: #f2f2f3; } .zoom-menu-highlight { border-top: 0; border-right: 0; border-bottom: 0; border-left-width: 2px; background: #0d0e15; color: #f2f2f3; } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } ��������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/main.css����������������������������������������������0000664�0000000�0000000�00000140647�14136337723�0022702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������@import "colors.css"; /* main styles */ ::-webkit-scrollbar { width: 12px; } /* Track */ ::-webkit-scrollbar-track { background: var(--background-content); } /* Handle */ ::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb); border: 4px solid var(--background-content); border-radius: 8px; } * { scrollbar-color: var(--scrollbar-thumb) var(--background-content); scrollbar-width: thin !important; } body { font-family: Roboto,Helvetica Neue,Arial,sans-serif; font-size: 0.75em; margin: 0; background-color: var(--background); color: var(--text-color-normal); overflow: hidden; } /* elements */ img { border: none; } i { padding-right: 3px; } fieldset { border:none; font-size: 11px; } /* main Layout */ .cactiPageHead { height: 3em; font-size: 1.5em; border-bottom: 1px solid #323339; background-color: var(--background-highlight); } .cactiPageHead div { height: 100%; } .breadCrumbBar, .cactiPageBottom { display: none; } #main { display: block !important; z-index: 0; padding-right: 5px; margin-top: 10px; margin-bottom: 10px; width: 100%; overflow-y: hidden !important; } /* icons fontawesome */ .fa, .fas, .far, .fal, .fad, .fab { color: #7e818f; } .fa:hover, .fas:hover, .far:hover, .fal:hover, .fad:hover, .fab:hover{ color: #f2f2f3; } /* navigation menu */ .menu_parent i { color: #f2f2f3; vertical-align: middle; } ul#nav, ul.nav { list-style: none; padding: 0; margin: 0; } /* hyperlinks */ a, a:active, a:visited { color: #57a9da; text-decoration: none; } a:hover { color: #f2f2f3; } /* pseudo classes */ .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right; } .left { text-align: left; } .center { text-align: center; } /* input fields & elements */ input[type="text"] { padding: 0.2em; box-sizing: border-box; width: 100%; } input[type="checkbox"]:not([name^="multiselect"]), input[type="radio"]:not([name^="reindex"]) { opacity: 0; top: -50px; position: fixed; } input[type="checkbox"]:focus + label:before { outline: -webkit-focus-ring-color auto 1px !important; outline-color: -webkit-focus-ring-color; outline-style: auto; outline-width: 1px; } input[type="checkbox"] + label:before { border: 1px solid #5d5d5d; content: "\00a0"; display: inline-block; font: 12px/1em sans-serif; height: 1em; margin: 0.25em 0.45em; width: 1em; background: transparent; } input[type="checkbox"]:checked + label:before { background-color: #1c1e2d; color: #f2f2f3; content: "\2713"; text-align: center; font-weight: bold; } input[type="checkbox"]:checked + label, input[type="radio"]:not([name^="reindex"]):checked + label { color: #f2f2f3; } /* New Checkbox Stuff */ .checkboxSwitch { position: relative; display: inline-block; width: 28px; height: 12px; margin-left: 5px; margin-right: 15px; vertical-align: middle; } .checkboxSwitch input { display: none; } #navigation_right { overflow-y: auto !important; padding: 0 5px 0 5px; background-color: var(--background-content); } /* Cacti Table */ .cactiTable table { border-collapse: separate; border-spacing: 0; border: none; text-align: left; outline-style: none; } /* links */ th .fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } pre { color: #f7f7f7; } input, select { padding: 0.4em 0.4em 0.4em 0.4em; background: transparent; } label { cursor: pointer; white-space: nowrap; } .glyph_tab-console:before { content: "\f0c9"; margin-left: 1.5em; font-size: 1.1em; } .text_tab-console { display: none; } label { white-space: nowrap; } label > span { border: none; color: #969BA3; } label.ui-state-active > span { color: #f2f2f3; } label.ui-state-active { border-width: 1px; border-style: solid; border-color: rgb(50,116,217); border-image: initial; border-radius: 2px; background: rgb(50,116,217); } label.ui-state-hover > span { color: #f2f2f3; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; font-weight: bold; cursor: pointer; } .filter { position: relative; left: -20px; margin-right: -10px; font-size: 13px !important; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: green; font-size: 1.5em !important; vertical-align: bottom; } .associated { color: green; font-weight: bold; } .notAssociated { color: red; font-weight: bold; } .disabled_row span, .disabled_row td, .disabled_row a { background-color: #181a28; color: grey; } .disabled { color: grey; font-weight: bold; } .idle { color: green; font-weight: bold; } .running { color: red; font-weight: bold; } .newObject { color: blue; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: green; } .failed { color: red; } .accessGranted { color: green; font-weight: bold; } .accessGrantedItem { color: green; } .accessRestricted { color: red; font-weight: bold; } .accessRestrictedItem { color: red; } .graphDrillDown { vertical-align: top; align-self: left; z-index: 4; padding: 3px; height: 100%; width: 22px; min-width: 22px; } .iconWrapper { display: none; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .drillDown { cursor: pointer; } .monoSpace { font-size: 9px; font-family: monospace; color: #7e818f; } .utilityPick { width: 200px; } .itemlist { max-height: 200px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { display: block; width: 100%; } .deviceUp { color: #009d00 !important; } .deviceDown { color: #ff0000 !important; } .deviceUnknown { color: #0000ff !important; } .deviceDisabled { color: #a1a1a1 !important; } .deviceRecovering { color: yellow !important; } .deviceError { color: #ffaa00 !important; } .deviceDownMuted { color: #ffe333 !important; } .deviceThreshold { color: #ffa833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #aa7807 !important; } .deviceAlert { color: #660000 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff0000; } .deviceUnknownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #0000ff; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #a1a1a1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff8f1e; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffe333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffa833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #aa7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: green; } .notBeingGraphed { color: #484848; } .submenuoptions { background: #141621; border: 1px solid #494949; position: absolute; top: 3em; height: 100%; list-style: none; text-align: left; margin: 0; padding: 10px 0 10px 0; font-size: 1.5em; z-index: 850; } .menuoptions li a, .submenuoptions li a { display: block; padding: 0.5em; color: #7e818f; text-decoration: none; text-align: center; } .menuoptions li a:hover, .submenuoptions li a:hover { display: block; color: #f2f2f3; background: #0d0e15; } .menuoptions { background: #141621; border: 1px solid #494949; display: block; float: right; position: absolute; right: 0; top: 3em; height: 100%; list-style: none; text-align: right; margin: 0; padding: 10px 0 10px 0; font-size: 1.5em; z-index: 850; } .import_label { opacity: 1; } .import_button { display: none; opacity: 0; } .import_text { opacity: 1; } .color-icon { background-image: none !important; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0 5px 0 0; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: #32CD32; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: orange; } .deletequery { cursor: pointer; padding: 2px; vertical-align: middle; color: red !important; } .deletequery:hover { color: red !important; text-decoration: none; padding: 2px; vertical-align: middle; } .odd { border: none; } .odd.tableRow { color: #7e818f; } .even { border: none; } .even.tableRow { color: #7e818f; } .even-alternate { #background: none repeat scroll 0 0 #E7E9F2; #background-color: #E7E9F2; #box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .even-alternate.tableRow { color: #7e818f; #background: none repeat scroll 0 0 #FFFFFF; } .tableRow { padding: 4px 5px !important; } .tableRowGraph td { padding: 3px; vertical-align: top; } .saveRow { border-color: rgba(255,255,255,0.2); text-align: right; padding: 4px; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid #006400; vertical-align: top; } .linkMarker { display: none; } .filteredValue { color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438c; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { font-size: 10px; font-weight: normal; font-family: monospace; } .hostDown { color: #ff0000; font-size: 10px; font-weight: normal; font-family: monospace; } .cactiPageHead div { left: 0; top: 0; } .cactiPageHead #tabs { overflow-x: auto; overflow-y: hidden; } .cactiGraphPageHeadBackdrop { padding-bottom: 0; float: right; position: fixed; } .cactiConsolePageHeadBackdrop { padding-bottom: 0; float: right; position: fixed; } .navigation { overflow: hidden; } .debug td { padding: 3px; margin: 0; } ul#breadcrumbs { list-style: none; margin: 5px; padding-left: 5px; } #breadcrumbs { border-width: 1px; white-space: nowrap; overflow: hidden; width: 100%; float: left; } #breadcrumbs li { float: left; } #breadcrumbs a { padding: .2em 1em .2em 2em; float: left; text-decoration: none; color: #7e818f; position: relative; font-size: 10px; background-color: transparent; } #breadcrumbs li:first-child a { padding-left: 1em; border-radius: 5px 0 0 5px; } #breadcrumbs a:hover { background: white; } #breadcrumbs a::after, #breadcrumbs a::before { content: ""; position: absolute; top: 50%; margin-top: -1.5em; border-top: 1.5em solid transparent; border-bottom: 1.5em solid transparent; border-left: 1.1em solid; right: -1em; } #breadcrumbs a::after { z-index: 4; border-left-color: #242635; } #breadcrumbs a::before { border-left-color: #7e818f; right: -1.1em; z-index: 3; } #breadcrumbs a:hover::after { border-left-color: #fff; } #breadcrumbs .current, #breadcrumbs .current:hover { background: none; } #breadcrumbs .current::after, #breadcrumbs .current::before { content: normal; } .cactiContent { clear: both; width: 100%; vertical-align: top; background: var(--background-navigation); } .cactiTreeNavigationArea { overflow-y: auto; overflow-x: hidden; margin-left: 0; margin-right: 0; height: 100%; float: left; display: none; color: #7e818f; } .cactiTreeNavigationArea a { padding-right: 18px !important; } .cactiTreeNavigationArea div:first-child { padding-left: 5px; } .cactiTreeSearch { padding-top: 5px; } .cactiTreeSearch hr { border: 1px solid #323339; } .jstree { position: relative; display: block; } .cactiLogo { background: transparent url('./images/cacti_logo.svg') no-repeat 30px; display:none; cursor: pointer; padding-bottom: 140px; margin-bottom: 60px; width: 156px; margin-top: -6px; margin-left: 2px; margin-right: 2px; } .loginLeft, .logoutLeft { display: none; } .loginCenter, .logoutCenter { position: absolute; background-color: transparent; width: 300px; height: 200px; top: 45%; left: 50%; padding: 10px 15px; margin: -100px 0 0 -150px; } .cactiLoginLogo, .cactiLogoutLogo { display: block; } .loginArea, .logoutArea { color: #7e818f; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .loginErrors, .logoutErrors { color: red; min-height: 15px; } legend { color: #57a9da; font-size: 22px; font-weight: bold; } .loginRight, .logoutRight { display: none; width: 33%; float: right; } .loginBody, .logoutBody { height: 100% !important; width: 100% !important; } .loginBody input, .logoutBody input { background-color: transparent; color: #969BA3; border: 1px solid rgba(255,255,255,0.2); } .versionInfo { position: fixed; left: 5px; bottom: 5px; color: rgba(255,255,255,0.2); } .actionsDropdown { vertical-align: middle; padding: 3px; width: 100%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdownButton { vertical-align: top; float: right; margin-top: 0; margin-left: 3px; margin-right: 6px; display: table-cell; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .cactiTooltipHint { cursor: pointer; padding: 5px; font-size: 12px !important; } .spikekillParent { padding: 0 !important; } .spikekillData, .spikekillData td { #border: 1px solid #999; } .spikekillNote { #padding: 1px; } .spikekillMenu { color: #57a9da; background: #100000; border: 1px solid #3a3b3c; ; margin: 0; padding: 10px 0 10px 0 !important; line-height: 1.5em; } .spikekillMenu li { vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .loginPanel { padding: 4px 0; } .treeTable { width: 100%; } .treeTable td { color: #f2f2f3; } .treeArea { vertical-align: top; } .graphWrapper { position: relative; box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.37); } .cactiGraphContentArea { height: 100vh; overflow-y: auto !important; overflow-x: hidden !important; } .cactiGraphContentArea span[align="center"] { color: #7e818f; } .cactiGraphContentArea .tableHeader > td { color: #FFAA00; text-align: left; padding: 0.5em; width: 100%; font-size: 1em; text-transform: none; background-image: linear-gradient(to right, rgb(36,38,53), rgb(28,30,45)); background-repeat: repeat-x; } .cactiGraphContentAreaPreview { height: 100vh; overflow-y: auto !important; } .cactiGraphContentAreaPreview span[align="center"] { color: #7e818f; } .cactiGraphContentAreaPreview .cactiTable { background: none !important; } .cactiConsoleContentArea { height: 100vh; overflow-y: auto !important; overflow-x: hidden !important; } #graph_view_preview2 table.cactiTable { background: none !important; } #graph_view_tree_content2 table.cactiTable { background: none !important; } #graph_view_preview2 .tableRow { background: none !important; } #graph_view_tree_content2 .tableRow { background: none !important; } .hyperLink { color: #57a9da; padding: 3px; cursor: pointer; text-decoration: none; } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: #57a9da; text-decoration: none; font-size: 12px; padding: 3px; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: #f2f2f3; white-space: nowrap; text-decoration: none; } .linkOverDark, .linkOverDark:visited, .linkOverDark:active { color: #57a9da; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: #f2f2f3; text-decoration: none; } .linkCopyDark, .linkCopyDark:visited, .linkCopyDark:active { color: #57a9da; font-weight: normal; text-decoration: none; cursor: pointer; } .linkCopyDark:hover { color: #f2f2f3; text-decoration: none; } /* text styles */ .textError { font-size: 12px; color: #FFAA00; } .textWarning { font-size: 12px; color: #ee7600 !important; } .textHeader { font-size: 12px; font-weight: normal; color: #f2f2f3; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: #04335B; border: 1px solid #04335B; position: relative; z-index: 4; } .textHeaderDark { #font-size: 12px; #font-weight: bold; #color: #f2f2f3; } .templateHeader { background: rgba(0,0,0,0.55); } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { font-size: 11px; outline-style: none; margin: 2px 0 3px 5px; } .cactiBorderWall { border-width: 1px; border-color: rgba(255,255,255,0.2); border-style: solid; } .cactiTable { color: #7e818f; width: 100%; margin-left: auto; margin-right: auto; border-color: rgba(255,255,255,0.2); padding: 0.5em 0; } table.cactiTable { } .cactiInstallLoaderSpinnerTheme { border-top-color: rgba(255,255,255,0.2) !important; } .cactiInstallLoaderSpinner{ border: 16px solid #242635 !important; border-top: 16px solid #151725 !important; } .cactiTableTitleRow { float: left; text-align: left; padding: 3px 0; display: table-column; width: 100%; background-color: #242635; } .cactiTableTitle { color: #f2f2f3; float: left; text-align: left; padding: 3px 0 3px 0; display: table-column; width: 70%; font-size: 14px; border-color: rgba(255,255,255,0.2); } .cactiTableButton { float: right; padding: 3px 0; display: table-column; text-align: right; font-size: 13px; width: 30%; border-color: rgba(255,255,255,0.2); white-space: nowrap; } .cactiTableButton.debug { background: transparent; height: 1em; } .cactiTableButton span, .cactiTableTitle span { padding: 0; white-space: nowrap; overflow: hidden; vertical-align: middle; } .cactiTableButton i { padding: 0 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0 8px !important; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { display: table; width: 100%; line-height: 30px; margin-bottom: 2px; overflow: hidden; } .formColumn { float: left; display: table-column; } .formColumnLeft { padding-bottom: 32768px; float: left; display: table-column; width: 55%; text-align: left; background-color: var(--background); margin-bottom: -32768px; } .formColumnRight { padding-bottom: 32768px; float: left; display: table-column; width: 45%; text-align: left; background-color: var(--background); margin-bottom: -32768px; } .formData { display: inline-block; vertical-align: middle; float: left; padding-top: 5px; padding-left: 15px; padding-right: 40px; padding-bottom: 15px; } .formFieldName { color: #cbccd2; display: inline-block; float: left; text-align: left; padding-left: 15px; padding-right: 40px; padding-bottom: 15px; } .formFieldDescription { color: #7e818f; float: left; text-align: left; font-weight: normal; line-height: 14px; padding-left: 1px; word-break-wrap: auto; } .formTooltip { display: inline-block; } .formHeader { cursor: pointer; float: left; width: 100%; text-align: left; line-height: 25px; text-transform: none; color: var(--text-color-normal); font-size: 13px; padding-left: 5px; margin-top: 10px; } .formHeader:hover { color: #f2f2f3; } .formHeader.collapsible { } .formHeader.collapsed { } .formHeaderAnchor { float: right; padding-right: 8px; } .hostInfoHeader { width: 100%; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-row; } .formColumnLeft { float: left; display: table-row; width: 100%; } .formColumnRight { float: left; display: table-row; width: 100%; } .formFieldName { text-align: left; padding-left: 3px; padding-right: 3px; } .formData { float: left; padding-left: 3px; padding-right: 3px; } .hostInfoHeader { overflow: hidden; } .breadCrumbBar, .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } /* switch to horizontal scrolling */ .tabs { overflow-y: hidden; overflow-x: scroll; white-space: nowrap; } .tabs ul { display: inline-flex; } /* dropdown menus */ .menuoptions, .submenuoptions { width: 100%; left: 0 !important; border-left: none !important; border-right: none !important; } } .graphItem { background: rgba(255,255,255,0.05); } .graphItemAlternate { background: rgba(255,255,255,0.05); } .break { height: 0; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { border-bottom: 1px solid rgba(0,0,0,0.5); } .cactiNavBarBottom { background-color: #00438c; } .tableHeader { display: table-row; #color: #7e818f; #font-weight: 700; background-color: #242635; } .tableHeader th.sortable { cursor: pointer !important; line-height: 10px; } .tableHeader th { font-weight: 600; vertical-align: middle; font-size: 11px; text-transform: none; border: 1px solid #3d3d3d; } .tableHeader th div { display: block; padding-right: 8px; font-size: 11px; } .tableHeaderColumnSelected { color: #f2f2f3 !important; background-color: #292a2d; border-top: 0; border-right: 0; border-bottom: 1px; border-left-width: 0; } .tableHeaderColumnHover { background-color: #545454; color: #f2f2f3 !important; } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { cursor: pointer; text-align: left; padding: 3px; outline-style: none; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .tablesorter-headerRow { } .tablesorter-headerRow th { border-bottom: 1px solid rgba(255,255,255,0.1); } .tablesorter-headerDesc, .tablesorter-headerAsc { color: #f2f2f3 !important; background: none !important; border-bottom: 3px solid #151725 !important; } .tablesorter-header-inner { padding: 2px; } .tablesorter-headerUnSorted div.textSubHeaderDark { color: #7e818f; } .graphSubHeaderColumn { color: #white; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { max-width: 20px; width: 20px; border-right: 1px solid #3d3d3d; } .image_table { width: 100%; } .tableConfirmation { width: 100%; text-align: center; background-color: #f5f5f5; border: 1px solid #aaaaaa; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { color: #7e818f; width: 100%; text-align: center; display: table; } .navBarNavigation a { color: #7e818f; } .navBarNavigation a:hover { color: #f2f2f3; } .navBarNavigationPrevious { text-align: left; cursor: pointer; font-weight: bold; white-space: nowrap; display: block; width: 10%; vertical-align: middle; } .navBarNavigationCenter { text-align: center; display: table-cell; white-space: nowrap; width: 80%; margin-top: auto; } .navBarNavigationCenter span { vertical-align: middle; } .navBarNavigationNext { text-align: right; cursor: pointer; font-weight: bold; white-space: nowrap; display: table-cell; width: 10%; height: 20px; vertical-align: middle; } .navBarNavigationNone { text-align: center; display: block; float: left; white-space: nowrap; width: 100%; padding: 2px 0; margin-top: auto; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 12px; } .textArea a { font-size: 1.1em; } .popupBox { #z-index: 2; position: absolute; padding: 0; display: none; overflow: auto; color: #f2f2f3; background-color: #e5e5e5; border: 1px solid #e5e5e5; } .installArea { background-color: #f2f2f3; padding: 10px; } .textAreaNotes { font-size: 12px; } .textEditTitle { font-weight: bold; } .textMenuHeader { color: #f2f2f3; background-color: #9C9C9C; font-size: 10px; font-weight: bold; } .textMenuItem { background-color: #efefef; font-size: 10px; } .textMenuSubItem { background-color: #f2f2f3; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-size: 10px; } .txtErrorTextBox { border: 2px solid #ff0000 !important; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: bold; } /* tabs */ .tabSpacer { width: 0; padding-right: 2px; padding-left: 0; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #dfdfdf; white-space: nowrap; width: 1%; } .deleteMarker { color: red; vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .deleteMarkerDisabled { color: #7e818f !important; } .moveArrow { color: #00438C !important; height: 14px !important; font-size: 14px !important; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { padding-left: 8.75; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } td.tab { border-top: 1px solid #999; border-right: 1px solid #666; border-left: 1px solid #999; padding-left: 3px; padding-right: 3px; min-width: 0; border-bottom: none; border-top-left-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; } td.nowrap { border-left: 1px solid #3d3d3d; padding: 0 0.5em; } .cactiGraphHeaderBackground { display: none; } div#gtabs { padding-bottom: 0; vertical-align: bottom; display: none !important; position: fixed; right: 5px; top: 5px; height: 30px; } .ellipsis { width: 25px !important; display: none; } .usertabs { float: right !important; width: 150px !important; overflow: hidden; padding-right: 0.5em; } .usertabs ul { float: right; } .maintabs { float: left; overflow: hidden; } .maintabs a { color: var(--text-color-normal); float: left !important; padding: 0.5em 0.5em; text-decoration: none; outline-style: none; line-height: 2em; } html[data-theme-color='light'] .maintabs a { color: var(--text-color-lighter); } .usertabs nav ul { float: right; padding-right: 5px; } .maintabs a:hover, .maintabs a:hover span { color: #f2f2f3; background: none; } .maintabs a.selected:not(#tab-console) { color: #f2f2f3; background: rgba(0,0,0,0.25); } .maintabs nav { white-space: nowrap; } .maintabs li { bottom: -1px; float: left; } .maintabs:not(.usertabs) li:first-child { width: 50px; } .maintabs:not(.usertabs) li:first-child a:first-child{ width: 100%; padding: 0.5em 0; } .maintabs-submenu { display: none; } #menu-tab-graphs.maintabs-submenu, .maintabs-submenu-ellipsis a { display: block; } .maintabs-submenu a { padding: 5px 8px 5px 0; } div.submenu { display: none; position: absolute; border: 2px solid #2d4ca8; top: 0; left: 0; z-index: 200; } div.submenu span { display: block; } .tabs { float: left; width: 100%; line-height: 20px; border-color: rgba(255,255,255,0.2); background: transparent; } .tabs a { color: #57a9da; float: left !important; padding: 5px 8px; font-size: 13px; vertical-align: bottom; text-decoration: none; outline-style: none; border-bottom: 3px solid transparent; } .tabs a:hover { color: #f2f2f3; } .tabs nav a.selected { color: #f2f2f3; background: none; background-color: #1c1e2d; border-bottom: 3px solid #151725; } .tabs li { float: left; margin: 0 3px 0 0; position: relative; } .tabs li.current a, .maintabs li.current a { background: #fff; border-bottom: 1px solid #fff; } .tabs li.current a:hover, .maintabs li.current a:hover { background: #fff; border-bottom: 1px solid #fff; } .tabs nav { border-bottom: 1px solid #333543; } .tabs nav:after, .maintabs nav:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } .tabs ul, .maintabs ul { list-style: none; margin: 0; padding: 0; } /* Navigation Area */ #nav li a, .nav li a { display: block; padding: 2px 4px 2px 0.75em; color: #7e818f; text-decoration: none; } #nav li a.active, .nav li a.active { } #nav li a.active:not(.selected), .nav li a.active:not(.selected) { color: #7e818f!important; } #nav li a.active, #nav li a.active:hover, .nav li a.active, .nav li a.active:hover { color: #f2f2f3 !important; } #nav li span, .nav li span { margin-left: 1em; } tr.selected { background: #242635 !important; box-shadow: 0 0 0 1px #333543; color: #bababa !important; } tr.selected a.linkEditMain:visited { color: #f2f2f3; } tr:not(.selectable) a.linkEditMain:hover { color: orange; } tr.selectable { border-left: 3px solid white; line-height: 22px; } tr.selectable td:first-child { border-left: 1px solid #3d3d3d; } tr.selectable td:last-child { border-right: 1px solid #3d3d3d; } tr.selectable:last-child td { border-bottom: 1px solid #3d3d3d; } tr.selectable:hover:not(.selected) { box-shadow: 0 0 0 1px #333543; background-color: #151725; } tr.selected a { color: #f2f2f3; } tr:last-child { border-bottom: 1px solid #3d3d3d; } td:last-child.checkbox { border-left: 1px solid #3d3d3d; border-right: 1px solid #3d3d3d; } #nav li ul li a.selected, .nav li ul li a.selected { color: #f2f2f3; } #nav li ul, .nav li ul { display: none; padding: 0; border-left: 2px solid #151725; } #nav li ul li a, .nav li ul li a { padding: 2px 4px 2px 3.5em; outline-style: none; } #nav li ul li a:hover, .nav li ul li a:hover { color: #f2f2f3; } #nav li ul li, .nav li ul li { list-style: none; padding: 0; } .clogError { color: #FF3932; } .clogWarning { color: #EACC00; } .clogSQL { color: #6DC8FE; } .clogDebug { color: #C4FD3D; } .clogStats { color: #96E78A; } .clogLimit { color: #EACC00; } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } .ui-tooltip { max-width: none !important; } .ui-tooltip-content div.header { color: #57a9da; } .ui-tooltip-content div.content { font-size: 10px; color: #7e818f; } .ui-tooltip-content { max-width: 500px !important; overflow: auto !important; opacity: 0.95; border: transparent; } div.preformatted { font-family: monospace; white-space: pre; } ul.pagination { display: inline-block; padding: 0; margin: 0; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { color: #7e818f; float: left; padding: 0 2px 2px 2px; text-decoration: none; margin: 0 1px; } ul.pagination li span { float: left; padding: 0; text-decoration: none; margin: 0 1px; } ul.pagination li a.active { color: #f2f2f3; background: none; background-color: #1c1e2d; border-bottom: 1px solid #151725; } ul.pagination li a:hover:not(.active) { color: #f2f2f3; } tr#realtime td:first-child { height: 68px; } .logEmergency { background-color: rgba(255, 6, 6, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logCritical { background-color: rgba(242, 23, 33, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logAlert { background-color: rgba(242, 25, 36, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logWarning { background-color: rgba(255, 122, 48, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logError { background-color: rgba(251, 74, 20, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logNotice { background-color: rgba(250, 253, 158, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logInfo { background-color: rgba(204, 255, 204, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logDebug { background-color: rgba(205, 207, 196, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .darkblue { background: #2d4ca8; /* Old browsers */; } .ui-corner-all { border-radius: 0 !important; -moz-border-radius-bottomright: 0 !important; -moz-border-radius-bottomleft: 0 !important; -moz-border-radius-topright: 0 !important; -moz-border-radius-topleft: 0 !important; } .menuitem { white-space: nowrap; padding: 0.7em 0.5em; } .menuitem a { white-space: normal; } .menu_glyph { vertical-align: 30%; text-align: left; width: 20px; } .submenu_glyph { width: 20px; vertical-align: 10%; } hr.menu { border: 0; height: 1px; background: #323339; } .hostInfoHeader { background-color: var(--background); padding: 8px; box-shadow: 0 1px 3px 0 rgba(0,0,0,.25); border-radius: 3px; margin: 15px 0 15px 0; } .ui-widget-header { border: 1px solid transparent; background: transparent; color: #57a9da; font-weight: bold; } .ui-multiselect-header span { color: #57a9da; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { background: transparent; color: rgb(150, 155, 163); } .ui-widget-header .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-icon, .ui-widget-content .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-multiselect-filter { font-weight: normal; } .ui-multiselect-all, .ui-multiselect-none { font-weight: normal; } .ui-multiselect-all:hover, .ui-multiselect-none:hover { text-decoration: none; } .ui-multiselect-header { margin-bottom: 1px; } .ui-multiselect-header ul li { padding-top: 4px; } .ui-multiselect-filter input { border: 1px solid rgba(255,255,255,0.2); padding-left: 3px; margin-left: 3px; } .ui-multiselect-checkboxes label { color: #57a9da; } .ui-multiselect-checkboxes .ui-state-hover { background: #151725; } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter { margin-bottom: 4px; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; color: #969BA3; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { border: 1px solid var(--border-color); background: transparent; font-weight: normal; color: #555555; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { border: 1px solid var(--border-color); background: transparent; font-weight: normal; color: #57a9da; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { background: transparent; color: #57a9da; } .ui-autocomplete { height: 300px; overflow-y: auto; overflow-x: hidden; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect { padding: 0.4em 1em; text-align: left; line-height: initial; } .ui-multiselect .ui-icon { margin-top: 0; } .ui-widget { font-size: unset; background: transparent; color: #CECECE; } .ui-checkboxradio-icon { display: none; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid var(--border-color); background: transparent; font-weight: normal; color: #969BA3; } .ui-widget-content { border: 1px solid #414141; background: #151725; color: #f2f2f3; } .ui-widget-content a, .ui-widget-content i { color: #57a9da; } .ui-widget.ui-widget-content { border: 1px solid rgba(255,255,255,0.2); } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { background: #151725; color: #f2f2f3; margin: -1px; } .ui-menu .ui-menu-item { background-color: #141621; position: relative; margin: 0; cursor: pointer; min-height: 0; list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); color: #7e818f; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { border-top-right-radius: 0; } .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { border-top-left-radius: 0; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { border-bottom-right-radius: 0; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { border-bottom-left-radius: 0; } .cactiInstallArea { background-color: #1c1e2d; } .cactiInstallSqlResults { color: #fff; } .cactiInstallSectionTitle { color: #fff; background-repeat: repeat-y; overflow: hidden; } .checkboxSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #555; -webkit-transition: .4s; transition: .4s; } .checkboxSlider:before { position: absolute; content: ""; height: 16px; width: 16px; left: -4px; top: -2px; background-color: #cbccd2; background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; -webkit-box-shadow: 0 0 3px #000; box-shadow: 0 0 3px #000; } input:checked + .checkboxSlider { background: rgb(50,116,217); } input:focus + .checkboxSlider { box-shadow: 0 0 1px #2196F3; } input:disabled + .checkboxSlider { cursor: not-allowed; } input:checked + .checkboxSlider:before { -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } /* Rounded.checkboxSliders */ .checkboxSlider.checkboxRound { border-radius: 24px; } .checkboxSlider.checkboxRound:before { border-radius: 50%; } .radioSwitch { position: relative; display: inline-block; margin-left: 5px; margin-right: 5px; height: 24px; width: 24px; vertical-align: middle; } .radioSwitch input { display: none; } .radioSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; width: 20px; height: 20px; background-color: #555; -webkit-transition: .4s; transition: .4s; } .radioSlider:before { display: none; position: absolute; content: ""; height: 12px; width: 12px; left: 4px; bottom: 4px; background-color: #cbccd2; -webkit-transition: .4s; transition: .4s; -webkit-box-shadow: 0 0 3px #000; box-shadow: 0 0 3px #000; } input:checked + .radioSlider { background: rgb(50,116,217); } input:focus + .radioSlider { box-shadow: 0 0 1px #2196F3; } input:disabled + .radioSlider { cursor: not-allowed; } input:checked + .radioSlider:before { display: block; } /* Rounded.radioSliders */ .radioSlider.radioRound { border-radius: 24px; } .radioSlider.radioRound:before { border-radius: 50%; } .radioLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; line-height: 20px; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } .ui-tabs-active .ui-tabs-anchor { color: #f2f2f3 !important; } .sticky { position: sticky; top: 0; z-index: 100; background-color: var(--background-filter); min-height: 40px; margin: 0 -3em; padding: 0 3em; } .sticky + .cactiFormStart { #padding-top: 260px; } .cactiFormStart { box-shadow: 0 1px 3px 0 rgba(0,0,0,.25); } .compact { display: none; } @media only screen and (max-width: 600px) { .cactiConsoleNavigationArea { position: absolute; top: 3em; background: #141621; border-top: 1px solid #494949; width: 100%; height: 100%; list-style: none; text-align: left; margin: 0; padding: 10px 0 10px 0; font-size: 1.5em; overflow-y: auto; z-index: 850; } } @media only screen and (min-width: 600px) { /* For tablets: */ .cactiPageHead { height: 3em; font-size: 1em; } .menuoptions, .submenuoptions { height: auto !important; top: 3em; font-size: 1em; } .menuoptions li a, .submenuoptions li a { font-size: 1em; padding: 4px 15px; text-align: unset; } #compact_tab_menu { width: 100%; padding: 0.75em 0; background: var(--background-highlight); } #compact_user_menu { width: 100%; position: absolute; bottom: 2em; padding-top: 2em; } #compact_user_menu .menuitem ul { top: auto !important; bottom: 36px !important; } .cactiConsoleNavigationArea { width: 180px; float: left; background-color: var(--background-navigation); } html[data-theme-mode='compact'] .cactiPageHead, html[data-theme-mode='compact'] .cactiPageBottom { display: none; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea { overflow-y: visible !important; width: 60px !important; position: relative; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .compact{ display: block; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea #nav li ul li a, html[data-theme-mode='compact'] .cactiConsoleNavigationArea .nav li ul li a { padding: 2px 4px 2px 2em; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea #menu { margin-bottom: 40px; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menu_glyph { color: var(--text-color-lighter); font-size: 1.2em; padding-left: 8px; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menu_parent:not(.active) { #color: #3d3d3d; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menuitem { position: relative; overflow: hidden; z-index: 850; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menuitem:hover { overflow: visible; z-index: 900; background-color: #0d0e15; box-shadow: inset 5px 0 0 0 var(--background-highlight); width: 230px; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menuitem span{ display: none !important; width: 155px; left: 50px; background-color: #0d0e15; position: absolute; margin-left: 3em !important; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menuitem:hover span { display: inline-block !important; animation: dropdown-anim .15s ease-in-out .1s forwards; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menuitem ul { display: none !important; width: 180px; left: 62px; background-color: #141621; position: absolute; border-left: none !important; top: 36px; animation: dropdown-anim .15s ease-in-out .1s forwards; } html[data-theme-mode='compact'] .cactiConsoleNavigationArea .menuitem:hover ul { display: inline-block !important; } html[data-theme-mode='compact'] .cactiConsoleContentArea #filterTableOnTop { padding-top: 0.6em; } } @media only screen and (min-width: 1280px) { /* For desktops: */ .cactiPageHead { } .cactiPageHead > div { height: 3em; } .breadCrumbBar { } .cactiPageBottom { display: block; height: 24px; bottom: 0; border-top: 1px solid #323339; } .cactiPageBottom { width: 100%; float: left; line-height: 2.2em; } .cactiVersion { padding-left: 10px; color: rgba(255,255,255,0.2); float: left; } #navigation_right { overflow-y: auto !important; padding: 0 15px 0 25px; } } @media only screen and (min-width: 2048px) { /* For large desktops: */ } @media print { .noprint { display: none; } } .bb-chart { } .bb-chart-arc path { fill: #A8A8A8; } .bb-tooltip { } .bb-legend-item { fill: #A8A8A8; } .bb-grid { fill: #A8A8A8; } .bb-axis { fill: #A8A8A8; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #161616; empty-cells: show; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; opacity: 0.9; } .bb-tooltip tr { border: 1px solid #050505; } .bb-tooltip th { background-color: #161616; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFFFFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #050505; border-left: 1px dotted #999; } .bb-tooltip td > span { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip td.value { text-align: right; } /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: transparent; } .bb path, .bb line { fill: none; stroke: #E0E0E0; } .bb text { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused { opacity: 0.3 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #E0E0E0; stroke: none; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } .bb-chart-arc .bb-gauge-value { fill: #000; /* font-size: 28px !important;*/ } circle { stroke: #7e818f; stroke-width: 1px; fill: transparent !important; } [id*='_edit'] .tableRowGraph:hover { background-color: rgba(200, 0, 200, .1) !important; border-left: 2px solid yellow !important; border-right: 2px solid yellow !important; } .tableRowGraph { border: 2px solid rgba(0,0,0,0); } �����������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/main.js�����������������������������������������������0000664�0000000�0000000�00000055700�14136337723�0022521�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { /* load default values */ initStorageItem('midWinter_GUI_Mode', 'standard'); initStorageItem('midWinter_Color_Mode', 'light'); initStorageItem('midWinter_Color_Mode_Auto', 'on'); setupTheme(); setupDefaultElements(); setThemeColor(); setMenuVisibility(); ajaxAnchors(); } function setupTheme() { let storage = Storages.localStorage; let midWinter_Color_Mode = storage.get('midWinter_Color_Mode'); let midWinter_Color_Mode_Auto = storage.get('midWinter_Color_Mode_Auto'); // -- standard mode -- add user tabs to CactiPageHeader if ($('.usertabs').length === 0) { $('.infoBar, .menuHr, #userDocumentation, #userCommunity').remove(); $('.loggedInAs').show(); let user_tab_content = '<ul>' + '<li><a id="menu-user-help" class="usertabs-submenu" href="#"><i class="far fa-comment-alt"></i></a></li>' + '<li class="action-icon-user"><a class="pic" href="#"><i class="far fa-user"></i></a></li>' + '</ul>'; $('<div class="maintabs usertabs">' + user_tab_content + '</div>').insertAfter('.maintabs'); let submenu_user_help_content = '<li><a href="https://www.cacti.net" target="_blank" rel="noopener">'+cactiHome+'</></a></li>' +'<li><a href="https://github.com/cacti" target="_blank" rel="noopener">'+cactiProjectPage+'</a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://forums.cacti.net/" target="_blank" rel="noopener">'+cactiCommunityForum+'</a></li>' +'<li><a href="https://github.com/Cacti/documentation/blob/develop/README.md" target="_blank" rel="noopener">'+cactiDocumentation+'</a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://github.com/Cacti/cacti/issues/new" target="_blank" rel="noopener">'+reportABug+'</a></li>' +'<li><a href="'+urlPath+'about.php">'+aboutCacti+'</a></li>'; $('<div class="dropdownMenu">' + '<ul id="submenu-user-help" class="submenuoptions right" style="display:none;">' + submenu_user_help_content + '</ul>' +'</div>' ).appendTo('body'); let theme_switches = '<li><hr class="menu"></li>' +'<li><a href="#" class="toggleGuiMode">'+compactGraphicalUserInterface+'</a></li>' +'<li><a href="#" class="toggleColorMode">'+(midWinter_Color_Mode === 'light' ? darkColorMode : lightColorMode)+'</a></li>' +'<li><a href="#" class="toggleColorModeAuto">'+(midWinter_Color_Mode_Auto === 'on' ? ignorePreferredColorTheme : usePreferredColorTheme)+'</a></li>' +'<li><hr class="menu"></li>'; $('.menuoptions').find('li').eq(2).after(theme_switches); } // -- standard & new mode -- redesign navigation tabs let compact_tab_menu_content = '<ul class="nav">' + '<li class="menuitem" id="menu_tab_dashboard">' + '<a class="menu_parent active" href="#">' + '<i class="menu_glyph fas fa-th"></i>' + '<span>Dashboards</span>' + '</a>' + '<ul>'; $('.maintabs nav ul li a.lefttab').each( function() { let id = $(this).attr('id'); let title = id.replace('tab-', ''); if (id === 'tab-graphs' && $(this).parent().hasClass('maintabs-has-submenu') === false) { $(this).parent().addClass('maintabs-has-submenu'); let submenu_tab_graphs_content = '<ul id="submenu-tab-graphs" class="submenuoptions" style="display:none;">' + '<li><a id="tab-graphs-tree-view" href="'+urlPath+'graph_view.php?action=tree"><span>'+treeView+'</span></a></li>' + '<li><a id="tab-graphs-list-view" href="'+urlPath+'graph_view.php?action=list"><span>'+listView+'</span></a></li>' + '<li><a id="tab-graphs-pre-view" href="'+urlPath+'graph_view.php?action=preview"><span>'+previewView+'</span></a></li>' +'</ul>'; $('<div class="dropdownMenu">'+ submenu_tab_graphs_content +'</div>').appendTo('body'); compact_tab_menu_content += '<li><hr class="menu"></li>' +'<li><a class="hyperLink" id="tab-graphs-tree-view" href="'+urlPath+'graph_view.php?action=tree">'+treeView+'</a></li>' +'<li><a class="hyperLink" id="tab-graphs-list-view" href="'+urlPath+'graph_view.php?action=list">'+listView+'</a></li>' +'<li><a class="hyperLink" id="tab-graphs-pre-view" href="'+urlPath+'graph_view.php?action=preview">'+previewView+'</a></li>' +'<li><hr class="menu"></li>'; }else { compact_tab_menu_content += '<li><a class="hyperLink" href="'+ $(this).attr('href') +'">'+ $('.text_'+id).text() +'</a></li>'; } }); compact_tab_menu_content += '</ul></li></ul>'; // -- compact mode -- redesign console navigation area if($('.cactiConsoleNavigationArea').length !== 0) { if($('#compact_tab_menu').length === 0 && $('#compact_user_menu').length === 0) { // -- split the navigation area into 3 parts to separate tabs, settings and user menus let menu = $('#menu').detach(); $('.cactiConsoleNavigationArea').empty().prepend( '<div class="compact" id="compact_tab_menu"></div>' +'<div class="compact" id="compact_user_menu"></div>' ); $(menu).insertAfter('#compact_tab_menu'); // -- duplicate the console tab items and add them to the console navigation area for compact mode if ($.trim($('compact_tab_menu').html()) === '') { $(compact_tab_menu_content).appendTo('#compact_tab_menu'); } // -- compact mode -- /* user menus are close to the button, so we have write the items the other way around */ let compact_user_menu_content = '<ul class="nav">' + '<li class="menuitem" id="menu_user_help">' + '<a class="menu_parent active" href="#">' + '<i class="menu_glyph far fa-comment-alt"></i>' + '<span>'+help+'</span>' + '</a>' + '<ul>' + '<li><a class="hyperLink" href="'+urlPath+'about.php">'+aboutCacti+'</a></li>' + '<li><a href="https://github.com/Cacti/cacti/issues/new" target="_blank" rel="noopener">'+reportABug+'</a></li>' + '<li><hr class="menu"></li>' + '<li><a href="https://github.com/Cacti/documentation/blob/develop/README.md" target="_blank" rel="noopener">'+cactiDocumentation+'</a></li>' + '<li><a href="https://forums.cacti.net/" target="_blank" rel="noopener">'+cactiCommunityForum+'</a></li>' + '<li><hr class="menu"></li>' + '<li><a href="https://github.com/cacti" target="_blank" rel="noopener">'+cactiProjectPage+'</a></li>' + '<li><a href="https://www.cacti.net" target="_blank" rel="noopener">'+cactiHome+'</></a></li>' + '</ul>' + '</li>' + '<li class="menuitem" id="menu_user_action">' + '<a class="menu_parent active" href="#">' + '<i class="menu_glyph far fa-user"></i>' + '<span>'+ $('.loggedInAs').text() +'</span>' + '</a>' + '<ul>' + '<li><a href="/cacti/cacti/logout.php">'+logout+'</a></li>' + '<li><hr class="menu"></li>' + '<li><a href="#" class="toggleGuiMode">'+standardGraphicalUserInterface+'</a></li>' + '<li><a href="#" class="toggleColorMode">'+(midWinter_Color_Mode === 'light' ? darkColorMode : lightColorMode)+'</a></li>' + '<li><a href="#" class="toggleColorModeAuto">'+(midWinter_Color_Mode_Auto === 'on' ? ignorePreferredColorTheme : usePreferredColorTheme)+'</a></li>' + '<li><hr class="menu"></li>' + '<li><a href="/cacti/cacti/auth_changepassword.php" style="">'+changePassword+'</a></li>' + '<li><a class="hyperLink" href="/cacti/cacti/auth_profile.php?action=edit">'+editProfile+'</a></li>' + '</ul>' + '</li>' +'</ul>'; $(compact_user_menu_content).appendTo('#compact_user_menu'); } } /* User Menu */ $('.menuoptions').parent().appendTo('body'); $('.action-icon-user').unbind().click(function(event) { event.preventDefault(); if ($('.menuoptions').is(':visible') === false) { $('.submenuoptions').stop().slideUp(120); $('.menuoptions').stop().slideDown(120); } else { $('.menuoptions').stop().slideUp(120); } return false; }); $('.submenuoptions, .menuoptions').on('click', function() { if ($(window).width() < 640) { $(this).stop().delay(100).slideUp(0); }else { $(this).stop().slideUp(120); } }) $('.toggleGuiMode').unbind().click(toggleGuiMode); $('.toggleColorMode').unbind().click(toggleColorMode); $('.toggleColorModeAuto').unbind().click(toggleColorModeAuto); } function setupDefaultElements() { var pageName = basename($(location).attr('pathname')); var hostTimer = false; var clickTimeout = false; var hostOpen = false; // ensure that filter table and 1st navBar will stay on top if($('#filterTableOnTop').length !== 0 ) $('#filterTableOnTop').remove(); if($(".filterTable").length !== 0) { $('<div id="filterTableOnTop">').prependTo('#navigation_right'); $(".filterTable:first").closest('div').detach().prependTo('#filterTableOnTop'); $(".break:first").detach().appendTo('#filterTableOnTop'); $(".navBarNavigation:first").detach().appendTo('#filterTableOnTop'); $( "#filterTableOnTop").addClass('sticky'); } // Add nice search filter to filters if ($('input[id="filter"]').length > 0 && $('input[id="filter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="filterd"]').length > 0 && $('input[id="filterd"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filterd"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="rfilter"]').length > 0 && $('input[id="rfilter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="rfilter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchRFilter).parent('td').css('white-space', 'nowrap'); } $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); /* Highlight sortable table columns */ $('.tableHeader th').has('i.fa-sort').removeClass('tableHeaderColumnHover tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-up').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-down').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort').hover( function() { $(this).addClass("tableHeaderColumnHover"); }, function() { $(this).removeClass("tableHeaderColumnHover"); } ); $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); // Turn file buttons into jQueryUI buttons $('.import_label').button(); $('.import_button').change(function() { text=this.value; setImportFile(text); }); setImportFile(noFileSelected); function setImportFile(fileText) { $('.import_text').text(fileText); } $('select.colordropdown').dropcolor(); $('select').not('.colordropdown').each(function() { if ($(this).prop('multiple') != true) { $(this).each(function() { id = $(this).attr('id'); $(this).selectmenu({ open: function(event, ui) { var instance = $(this).selectmenu('instance'); instance.menuInstance.focus(null, instance._getSelectedItem()); }, change: function(event, ui) { $(this).val(ui.item.value).change(); }, position: { my: "left top", at: "left bottom", collision: "flip" }, width: false }); $('#'+id+'-menu').css('max-height', '250px'); }); } else { $(this).addClass('ui-state-default ui-corner-all'); } }); $('#host').unbind().autocomplete({ source: pageName+'?action=ajax_hosts', autoFocus: true, minLength: 0, select: function(event,ui) { $('#host_id').val(ui.item.id); callBack = $('#call_back').val(); if (callBack != 'undefined') { if (callBack.indexOf('applyFilter') >= 0) { applyFilter(); } else if (callBack.indexOf('applyGraphFilter') >= 0) { applyGraphFilter(); } } else if (typeof applyGraphFilter === 'function') { applyGraphFilter(); } else { applyFilter(); } } }).addClass('ui-state-default ui-selectmenu-text').css('border', 'none').css('background-color', 'transparent'); $('#host_click').css('z-index', '4'); $('#host_wrapper').unbind().dblclick(function() { hostOpen = false; clearTimeout(hostTimer); clearTimeout(clickTimeout); $('#host').autocomplete('close').select(); }).click(function() { if (hostOpen) { $('#host').autocomplete('close'); clearTimeout(hostTimer); hostOpen = false; } else { clickTimeout = setTimeout(function() { $('#host').autocomplete('search', ''); clearTimeout(hostTimer); hostOpen = true; }, 200); } $('#host').select(); }).on('mouseenter', function() { $(this).addClass('ui-state-hover'); $('input#host').addClass('ui-state-hover'); }).on('mouseleave', function() { $(this).removeClass('ui-state-hover'); $('#host').removeClass('ui-state-hover'); hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); hostOpen = false; }); var hostPrefix = ''; $('#host').autocomplete('widget').each(function() { hostPrefix=$(this).attr('id'); if (hostPrefix != '') { $('ul[id="'+hostPrefix+'"]').on('mouseenter', function() { clearTimeout(hostTimer); }).on('mouseleave', function() { hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); $(this).removeClass('ui-state-hover'); $('input#host').removeClass('ui-state-hover'); }); } }); // Hide the graph icons until you hover $('.graphDrillDown').hover( function() { element = $(this); // hide the previously shown element if (element.attr('id').replace('dd', '') != graphMenuElement && graphMenuElement > 0) { $('#dd'+graphMenuElement).find('.iconWrapper:first').hide(300); } clearTimeout(graphMenuTimer); graphMenuTimer = setTimeout(function() { showGraphMenu(element); }, 400); }, function() { element = $(this); clearTimeout(graphMenuTimer); graphMenuTimer = setTimeout(function() { hideGraphMenu(element); }, 400); }); function showGraphMenu(element) { element.find('.spikekillMenu').menu('disable'); element.find('.iconWrapper').show(300, function() { graphMenuElement = element.attr('id').replace('dd', ''); $(this).find('.spikekillMenu').menu('enable'); }); } function hideGraphMenu(element) { element.find('.spikekillMenu').menu('disable'); element.find('.iconWrapper').hide(300, function() { $(this).find('.spikekillMenu').menu('enable'); }); } setNavigationScroll(); } function initStorageItem(name, default_value) { let storage = Storages.localStorage; if (storage.isSet(name) === false) { storage.set(name, default_value); } return storage.get(name); } function setDocumentAttribute(name, value) { document.documentElement.setAttribute('data-'+name, value); } function toggleGuiMode() { let storage = Storages.localStorage; let midWinter_GUI_Mode = storage.get('midWinter_GUI_Mode'); midWinter_GUI_Mode = (midWinter_GUI_Mode === 'standard') ? 'compact' : 'standard'; storage.set('midWinter_GUI_Mode', midWinter_GUI_Mode); setDocumentAttribute('theme-mode', midWinter_GUI_Mode); $(window).trigger('resize'); } function toggleColorMode() { let storage = Storages.localStorage; let midWinter_Color_Mode = storage.get('midWinter_Color_Mode'); let midWinter_Color_Mode_Auto = storage.get('midWinter_Color_Mode_Auto'); if(midWinter_Color_Mode_Auto !== 'on') { midWinter_Color_Mode = (midWinter_Color_Mode === 'dark') ? 'light' : 'dark'; storage.set('midWinter_Color_Mode', midWinter_Color_Mode); $('.toggleColorMode').text(midWinter_Color_Mode === 'dark' ? lightColorMode : darkColorMode); document.documentElement.classList.add('color-theme-in-transition') setDocumentAttribute('theme-color', midWinter_Color_Mode) window.setTimeout(function () { document.documentElement.classList.remove('color-theme-in-transition') }, 1000) } } function toggleColorModeAuto() { let storage = Storages.localStorage; let midWinter_Color_Mode = storage.get('midWinter_Color_Mode'); let midWinter_Color_Mode_Auto = storage.get('midWinter_Color_Mode_Auto'); midWinter_Color_Mode_Auto = (midWinter_Color_Mode_Auto === 'on') ? 'off' : 'on'; storage.set('midWinter_Color_Mode_Auto', midWinter_Color_Mode_Auto); $('.toggleColorModeAuto').text( midWinter_Color_Mode_Auto === 'on' ? ignorePreferredColorTheme : usePreferredColorTheme ); setThemeColor(); } function setThemeColor() { let storage = Storages.localStorage; if(storage.get('midWinter_Color_Mode_Auto') === 'on') { $('.toggleColorMode').hide(0); detectSystemColorSetup(); }else { $('.toggleColorMode').show(0); setDocumentAttribute('theme-color', storage.get('midWinter_Color_Mode')); } setDocumentAttribute('theme-mode', storage.get('midWinter_GUI_Mode')); } function detectSystemColorSetup() { const systemColorMode = window.matchMedia("(prefers-color-scheme: dark)"); try { systemColorMode.addEventListener('change', (e) => { checkThemeColorSetup((e.matches) ? 'dark' : 'light') }); } catch (e1) { try { systemColorMode.addListener((e) => { checkThemeColorSetup((e.matches) ? 'dark' : 'light') }); } catch (e2) { console.error(e2); } } checkThemeColorSetup(systemColorMode.matches === true ? 'dark' : 'light'); } function checkThemeColorSetup(color_mode) { let document_color_mode = document.documentElement.getAttribute('data-theme-color'); console.log('document: ' + document_color_mode + ', requested: ' + color_mode); if (document_color_mode !== color_mode) { document.documentElement.classList.add('color-theme-in-transition') setDocumentAttribute('theme-color', color_mode) window.setTimeout(function() { document.documentElement.classList.remove('color-theme-in-transition') }, 1000) } } function setMenuVisibility() { storage=Storages.localStorage; // Initialize the navigation settings // This will setup the initial visibility of the menu $('li.menuitem').each(function() { var id = $(this).attr('id'); if (storage.isSet(id)) { var active = storage.get(id); } else { var active = null; } if (active != null && active === 'active') { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); } else { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); } if ($(this).find('a.selected').length == 0) { //console.log('hiding1:'+$(this).closest('.menuitem').attr('id')); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); storage.set($(this).closest('.menuitem').attr('id'), 'collapsed'); } else { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); storage.set($(this).closest('.menuitem').attr('id'), 'active'); } }); // Functon to give life to the Navigation pane $('#nav li:has(ul) a.active').unbind().click(function(event) { event.preventDefault(); id = $(this).closest('.menuitem').attr('id'); if ($(this).next().is(':visible')) { $(this).next('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).next().slideUp( { duration: 200, easing: 'swing' } ); storage.set(id, 'collapsed'); } else { $(this).next('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true'); $(this).next().slideToggle( { duration: 200, easing: 'swing' } ); if ($(this).next().is(':visible')) { storage.set($(this).closest('.menuitem').attr('id'), 'active'); } else { storage.set(id, 'collapsed'); } } $('li.menuitem').not('#'+id).each(function() { text = $(this).attr('id'); id = $(this).attr('id'); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).find('ul').slideUp( { duration: 200, easing: 'swing' } ); storage.set($(this).attr('id'), 'collapsed'); }); }); } ����������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/pace.css����������������������������������������������0000664�0000000�0000000�00000004142�14136337723�0022653�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������@import "colors.css"; .pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: var(--background-progress); position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 1px; } .pace .pace-progress-inner { display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 2000; } .pace .pace-activity { display: block; position: fixed; z-index: 2000; left: 50%; top: 50%; width: 100px; height: 100px; margin: -50px 0 0 -50px; border-radius: 50%; border: 3px solid transparent; border-top-color: #3498db; -webkit-animation: pace-spinner 2s linear infinite; animation: pace-spinner 2s linear infinite; } .pace .pace-activity:before { content: ""; position: absolute; top: 5px; left: 5px; right: 5px; bottom: 5px; border-radius: 50%; border: 3px solid transparent; border-top-color: #e74c3c; -webkit-animation: pace-spinner 3s linear infinite; animation: pace-spinner 3s linear infinite; } .pace .pace-activity:after { content: ""; position: absolute; top: 15px; left: 15px; right: 15px; bottom: 15px; border-radius: 50%; border: 3px solid transparent; border-top-color: #f9c922; -webkit-animation: pace-spinner 1.5s linear infinite; animation: pace-spinner 1.5s linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); -ms-transform: rotate(360deg); transform: rotate(360deg); } }������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/midwinter/rrdtheme.php������������������������������������������0000664�0000000�0000000�00000001510�14136337723�0023550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $rrdcolors['back'] = '242639'; $rrdcolors['canvas'] = '242639'; $rrdcolors['shadea'] = '0B0B0B'; $rrdcolors['shadeb'] = '292929'; $rrdcolors['grid'] = '21212400'; $rrdcolors['mgrid'] = '6A6C6C'; $rrdcolors['font'] = 'c7d0d9'; $rrdcolors['axis'] = '2C4D43'; $rrdcolors['arrow'] = '2C4D43'; $rrdcolors['frame'] = '141414'; # RRDtool graph fonts in RRDtool 1.2+ $rrdfonts['title']['font'] = 'Roboto'; $rrdfonts['title']['size'] = '11'; $rrdfonts['axis']['font'] = 'Roboto'; $rrdfonts['axis']['size'] = '8'; $rrdfonts['legend']['font'] = 'Roboto Mono'; $rrdfonts['legend']['size'] = '8'; $rrdfonts['unit']['font'] = 'Roboto'; $rrdfonts['unit']['size'] = '8'; $rrdfonts['watermark']['font'] = 'Roboto'; $rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 0; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/���������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0020512�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/billboard.css��������������������������������������������0000664�0000000�0000000�00000010367�14136337723�0023165�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/default/�������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022136�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/default/index.php����������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/��������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021757�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/128/����������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022271�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/128/bar-alpha.png���������������������������������0000664�0000000�0000000�00000003034�14136337723�0024626�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/128/bar.png���������������������������������������0000664�0000000�0000000�00000002064�14136337723�0023545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/128/map.png���������������������������������������0000664�0000000�0000000�00000110316�14136337723�0023556�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/cacti_logo.gif������������������������������������0000664�0000000�0000000�00000013011�14136337723�0024545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/cacti_logo.svg������������������������������������0000664�0000000�0000000�00000041220�14136337723�0024602�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/favicon.ico���������������������������������������0000664�0000000�0000000�00000002576�14136337723�0024112�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/favicon.png���������������������������������������0000664�0000000�0000000�00000014233�14136337723�0024115�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/index.php�����������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023572�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/logotype-a.png������������������������������������0000664�0000000�0000000�00000030026�14136337723�0024546�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/logotype-b.png������������������������������������0000664�0000000�0000000�00000041221�14136337723�0024546�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/tab_list.gif��������������������������������������0000664�0000000�0000000�00000001522�14136337723�0024247�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷|�€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###������������������������������������������������������������������������������������������&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¤�,�������/�I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/tab_preview.gif�����������������������������������0000664�0000000�0000000�00000001541�14136337723�0024756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ �������������������������������������������������������  !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��D�,�������>�‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/images/tab_tree.gif��������������������������������������0000664�0000000�0000000�00000001542�14136337723�0024235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ ����������������������������������������������������������������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¥�,�������?�K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/index.php������������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0022325�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/jquery.multiselect.css�����������������������������������0000664�0000000�0000000�00000005277�14136337723�0025107�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/jquery.multiselect.filter.css����������������������������0000664�0000000�0000000�00000000622�14136337723�0026360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/jquery.zoom.css������������������������������������������0000664�0000000�0000000�00000014070�14136337723�0023530�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; background-color:ForestGreen; height:0; position:absolute; z-index:auto; filter:alpha(opacity=40); -moz-opacity:0.4; -khtml-opacity:0.4; opacity:0.4; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; height:0; position:absolute; z-index:auto; filter:alpha(opacity=30); -moz-opacity:0.3; -khtml-opacity:0.3; opacity:0.3; overflow:hidden; padding:0; margin:0; background: rgba(0, 0, 0, 0.5); box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #191970; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid red; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid red; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #FFE87C; padding-left: 3px; padding-right: 3px; border: 1px solid rgba(0,0,0,0.75); } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #111111; } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #FFE87C; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #111111; } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #FFE87C; z-index: auto; } .zoom-menu { border:1px solid #aaa; color: black; position:absolute; background:#fff; display:none; font-size: 1em; z-index:auto; } .zoom-menu .first_li span { width:150px; display:block; padding:5px 10px; cursor:pointer } .zoom-menu .inner_li { display:none; color: black; margin-left:150px; position:absolute; border:1px solid #aaa; border-left:1px solid #ccc; margin-top:-28px; background:#fff; } .zoom-menu .sep_li { border-top: 1px solid #c5c5c5; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float: left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { float: right; margin-left: 0.4em; margin-right:0.2em; margin-top: 2px; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } .zoom-menu-hover { color: white; cursor: pointer; vertical-align: middle; background: rgba(138,179,105,1); background: -moz-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -webkit-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -o-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -ms-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); } .zoom-menu-highlight { color: white; vertical-align: middle; background: rgba(138,179,105,1); background: -moz-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -webkit-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -o-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -ms-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/main.css�������������������������������������������������0000664�0000000�0000000�00000146513�14136337723�0022162�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main styles */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(22,22,6,0.7); border-radius: 6px; } ::-webkit-scrollbar-thumb { border-radius: 6px; background: rgba(49,68,43,0.8); -webkit-box-shadow: inset 0 0 4px rgba(49,68,43,0.5); } html, body { height: 100%; width: 100%; margin: 0px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; overflow: hidden; } body, table, tr, td, textarea { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -ms-overflow-style: scrollbar; color: #000000; } textarea { padding: 5px; width: 400px; height: 100px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } body { background-color: snow; background-repeat: repeat-y; } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: left; } td, th { padding: 0px; margin: 0px; } th { white-space: nowrap; user-select: none; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; } p { padding: 3px 5px; margin: 3px; } img { border: none; vertical-align: middle; } i.fa, i.fas, i.fab, i.far, i.fal { padding: 0px 3px; font-size: 13px; vertical-align: middle; } .menu_parent i.fa, .menu_parent i.fas, .menu_parent i.fab, .menu_parent i.far, .menu_parent i.fal { color: snow; } div { display: block; } fieldset { border: none; padding: 0px; margin: 0px; } hr.menu { border: 0; height: 1px; background: #333; background-image: linear-gradient(to right, #ccc, #333, #ccc); } .reindex_methods span { font-size: 9px; } .checkbox { text-align: center; } .checkboxLabel { display: none; color: #000000; } .realms .checkboxLabel { display: inline !important; } /* links */ a, a:active, a:visited { color: #006400; text-decoration: none; font-size: 12px; } a:hover { text-decoration: none; color: #333333; } th i.fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } #main { display: none; width: 100%; position: relative; z-index: 3; margin-bottom: 10px; } input { padding: 0.4em; font-size: 12px; max-width: 400px; } select { padding: 0.5em 0.5em 0.5em 0.5em; font-size: 12px; } *:focus { outline: none; } label { white-space: nowrap; } .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right !important; } .left { text-align: left; } .center { text-align: center !important; margin-left: auto; margin-right: auto; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; cursor: pointer; } .filter { position: relative; left: -20px; margin-right: -10px; font-size: 12px !important; } .badpassword_message { padding: 2px; color: red; font-size: 1.0em !important; vertical-align: bottom; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: green; font-size: 1.5em !important; vertical-align: bottom; } .associated { color: green; font-weight: normal; } .notAssociated { color: red; font-weight: normal; } .disabled_row span, .disabled_row td, .disabled_row a { color: grey !important; } .disabled { color: grey; font-weight: normal; } .idle { color: green; font-weight: normal; } .running { color: orange; } .errored { color: red; } .newObject { color: blue; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: green; } .failed { color: red; } .accessGranted { color: green; } .accessGrantedItem { color: green; } .accessRestricted { color: red; } .accessRestrictedItem { color: red; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .graphDrillDown { vertical-align: top; align-self: left; z-index: 4; padding: 3px; height: 100%; width: 20px; } .drillDown { cursor: pointer; } .monoSpace { font-size: 9px; font-family: monospace; } .utilityPick { width: 200px; } .itemlist { max-height: 200px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { padding-left: 0.5em !important; display: block; } .deviceUp { color: rgba(40, 180, 40, 1.0) !important; } .deviceDown { color: #ff0000 !important; } .deviceUnknown { color: #0000ff !important; } .deviceDisabled { color: #a1a1a1 !important; } .deviceRecovering { color: #ff8f1e !important; } .deviceError { color: #750F7D !important; } .deviceDownMuted { color: #ffe333 !important; } .deviceThreshold { color: #ffa833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #ea9827 !important; } .deviceAlert { color: #ea5f27 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff0000; } .deviceUnknownBg { font-size: 10pt; font-weight: bold; background-color: #0000ff; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #a1a1a1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff8f1e; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffe333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffa833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #aa7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: green; } .notBeingGraphed { color: #484848; } .menuoptions { background: none repeat scroll 0 0 #eee; border-color: #f5f5f5 #e5e5e5 #ccc; border-style: solid; border-width: 0px 1px 1px 1px; z-index: 5; display: block; position: absolute; float: right; right: 26px; top: 22px; list-style: none; text-align: right; margin: 0px; padding: 0px; } .menuoptions li a { font-weight: normal; display: block; padding: 2px; height: 16px; z-index: 5; } .menuoptions li a:hover { background: linear-gradient(to bottom, rgba(242, 246, 248, 1) 0%, rgba(216, 225, 231, 1) 50%, rgba(181, 198, 208, 1) 51%, rgba(224, 239, 249, 1) 100%) repeat scroll 0 0 rgba(0, 0, 0, 0); } .import_label { opacity: 1; } .import_button { opacity: 0; display: none; } .import_text { opacity: 1; color: #000000; } .color-icon { background-image: none !important; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0px 5px 0px 0px; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: lime; font-size: 14px; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: rgba(255, 204, 0, 0.8); font-size: 14px; } .deletequery { color: red !important; cursor: pointer; padding: 2px; vertical-align: middle; font-size: 14px; } .deletequery:hover { text-decoration: none; padding: 2px; vertical-align: middle; } .odd { background: none repeat scroll 0 0 #F5F5F5; border: none; box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .odd td, .even td, .even-alternate td, .selectable td { padding: 3px; } .even { background: none repeat scroll 0 0 #E5E5E5; border: none; box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .even-alternate { background: none repeat scroll 0 0 #E7E9F2; border: none; box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .saveRow { background-color: #EAEAEA; text-align: right; padding: 4px; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid #006400; vertical-align: top; } .linkMarker { color: #c16921; } .filteredValue { background-color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438c; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { color: #000000; font-size: 10px; font-family: monospace; } .hostDown { color: #ff0000; font-size: 10px; font-family: monospace; } .cactiPageHead { background-color: #a9a9a9; height: 30px; position: fixed; display: table-row; width: 100%; padding-top: 5px; top: 0px; left: 0px; z-index: 4; } .cactiPageHead #tabs { overflow-x: auto; overflow-y: hidden; } .cactiPageHead div:first-child { top: 0; left: 0; display: table-cell; } .cactiGraphPageHeadBackdrop { background: transparent url("./images/cacti_logo.svg") no-repeat scroll left 40% / 380px auto; padding-bottom: 0px; float: right; width: 400px; height: 35px; top: 0px; position: fixed; right: 0px; z-index: -1; } .cactiConsolePageHeadBackdrop { background: transparent url("./images/cacti_logo.svg") no-repeat scroll left 40% / 380px auto; padding-bottom: 0px; float: right; width: 400px; height: 35px; top: 0px; position: fixed; right: 0px; z-index: -1; } .navigation { } .debug td { padding: 3px; margin: 0px; } .breadCrumbBar { height: 18px; width: 100%; position: fixed; padding: 4px; top: 30px; left: 0px; z-index: 5; background: rgba(167,217,134,1); background: -moz-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,1)), color-stop(100%, rgba(148,179,107,1))); background: -webkit-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -o-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: linear-gradient(to bottom, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); } ul#breadcrumbs { font-size: 8px; margin: 0; padding: 0; list-style: none; } .infoBar { background: #eee; border-width: 1px; border-style: solid; padding: 0.5px 8px 0.5px 5px; white-space: nowrap; border-color: #f5f5f5 #e5e5e5 #ccc; border-radius: 5px; box-shadow: 0 0 2px rgba(0,0,0,.2); overflow: hidden; display: block; min-width: 15%; max-width: 40%; margin-right: 10px; float: right; text-align: right; } #breadcrumbs { background: #eee; border-width: 1px; border-style: solid; border-color: #f5f5f5 #e5e5e5 #ccc; border-radius: 5px; white-space: nowrap; max-width: 100%; box-shadow: 0 0 2px rgba(0,0,0,.2); overflow: hidden; max-width: 60%; min-width: 30%; float: left; } #breadcrumbs li { float: left; } #breadcrumbs a { padding: .2em 1em .2em 2em; float: left; text-decoration: none; color: #444; position: relative; font-size: 10px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); background-color: #ddd; background-image: linear-gradient(to right, #f5f5f5, #ddd); } #breadcrumbs li:first-child a { padding-left: 1em; border-radius: 5px 0 0 5px; } #breadcrumbs a:hover { background: #fff; } #breadcrumbs a::after, #breadcrumbs a::before { content: ""; position: absolute; top: 50%; margin-top: -1.5em; border-top: 1.5em solid transparent; border-bottom: 1.5em solid transparent; border-left: 1.1em solid; right: -1em; } #breadcrumbs a::after { z-index: 4; border-left-color: #ddd; } #breadcrumbs a::before { border-left-color: #ccc; right: -1.1em; z-index: 3; } #breadcrumbs a:hover::after { border-left-color: #fff; } #breadcrumbs .current, #breadcrumbs .current:hover { background: none; } #breadcrumbs .current::after, #breadcrumbs .current::before { content: normal; } .cactiContent { clear: both; width: 100%; vertical-align: top; padding-top: 56px; } .cactiTreeNavigationArea { border-right: #aaaaaa 1px solid; margin-left: 5px; margin-right: 5px; padding-top: 10px; padding-bottom: 20px; display: none; vertical-align: top; position: fixed; left: 0px; top: 56px; z-index: 2; overflow-x: hidden; overflow-y: hidden; } .cactiTreeNavigationArea a { padding-right: 18px !important; } .jstree { position: relative; display: block; } .cactiConsoleNavigationArea { border-right: #aaaaaa 1px solid; padding-left: 0px; padding-right: 0px; padding-top: 5px; vertical-align: top; left: 0px; top: 56px; overflow-y: hidden; overflow-x: hidden; width: 170px; float: left; background-color: #efefef; } .cactiConsoleNavigationArea table { width: 165px; } .cactiLogo { background: #efefef url('./images/cacti_logo.svg') no-repeat 30px; display: block; cursor: pointer; padding-bottom: 160px; margin-bottom: 60px; width: 156px; margin-top: 10px; margin-left: 2px; margin-right: 2px; } .loginLeft, .logoutLeft { width: 33%; float: left; } .loginCenter, .logoutCenter { -moz-border-radius: 10px; border-radius: 10px; position: relative; padding: 30px 0px 5px 20px; background-color: snow; top: 30%; max-width: 360px; max-height: 300px; margin-left: auto; margin-right: auto; background: rgba(255,255,255,1); background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255,255,255,1)), color-stop(47%, rgba(246,246,246,1)), color-stop(100%, rgba(237,237,237,1))); background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: -o-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: linear-gradient(to bottom, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); text-shadow: 1px 1px 1px rgba(9, 61, 16, 0.66); } .cactiLoginLogo, .cactiLogoutLogo { position: relative; float: right; background: transparent url('./images/cacti_logo.svg') no-repeat center; width: 120px; height: 148px; z-index: 2; margin-top: -95px; margin-left: 240px; margin-bottom: -20px; } .loginArea, .logoutArea { -moz-border-radius: 10px; border-radius: 10px; position: relative; min-height: 200px; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .loginErrors, .logoutErrors { color: red; min-height: 15px; } legend { font-size: 22px; } .loginRight, .logoutRight { width: 33%; float: right; } .loginBody, .logoutBody { background: rgba(12,31,16,1); background: -moz-linear-gradient(top, rgba(12,31,16,1) 0%, rgba(13,61,28,1) 56%, rgba(9,59,6,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(12,31,16,1)), color-stop(56%, rgba(13,61,28,1)), color-stop(100%, rgba(9,59,6,1))); background: -webkit-linear-gradient(top, rgba(12,31,16,1) 0%, rgba(13,61,28,1) 56%, rgba(9,59,6,1) 100%); background: -o-linear-gradient(top, rgba(12,31,16,1) 0%, rgba(13,61,28,1) 56%, rgba(9,59,6,1) 100%); background: -ms-linear-gradient(top, rgba(12,31,16,1) 0%, rgba(13,61,28,1) 56%, rgba(9,59,6,1) 100%); background: linear-gradient(to bottom, rgba(12,31,16,1) 0%, rgba(13,61,28,1) 56%, rgba(9,59,6,1) 100%); } .versionInfo { padding-top: 5px; float: right; margin-top: 10px; color: snow; } .actionsDropdown { vertical-align: middle; padding: 3px; width: 99.5%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdownButton { vertical-align: top; float: right; margin-left: 3px; display: table-cell; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .cactiTooltipHint { cursor: pointer; color: #627D4D; } .spikekillData, .spikekillData td { border: 1px solid #999; } .spikekillNote { padding: 1px; } .spikekillMenu { background: #f5f5f5 none repeat scroll 0 0; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; margin: 0; padding: 2px; line-height: 1.5em; } .spikekillMenu li { vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .loginPanel { padding: 4px 0px; } .treeTable { width: 100%; } .treeArea { vertical-align: top; } .cactiShadow { width: 100%; background: #ECECEC url('./../../../images/shadow_gray.gif') repeat-x center top; height: 8px; display: table; position: fixed; top: 55px; left: 0px; z-index: 4; } .cactiGraphContentArea { height: 100vh; padding-top: 10px; padding-right: 5px; padding-left: 5px; display: none; vertical-align: top; overflow-y: auto !important; overflow-x: hidden !important; } .cactiGraphContentAreaPreview { height: 100vh; padding-top: 10px; padding-right: 5px; padding-left: 5px; display: none; vertical-align: top; overflow-y: auto !important; overflow-x: hidden !important; } .cactiConsoleContentArea { padding-top: 10px; padding-right: 5px; padding-left: 5px; vertical-align: top; overflow-y: auto !important; overflow-x: hidden; height: 100vh; } .hyperLink, .hyperLink:hover, .hyperLink:visited { color: #006400 !important; cursor: pointer; text-decoration: none; } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .noLinkEditMain { color: rgba(44,130,29,1); text-decoration: none; font-size: 12px; font-weight: normal; padding: 3px; white-space: nowrap; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: rgba(44,130,29,1); text-decoration: none; font-size: 12px; font-weight: normal; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: rgba(31,59,8,1); white-space: nowrap; text-decoration: none; } .linkOverDark, .linkOverDark:visited, .linkOverDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: white; text-decoration: none; } .linkCopyDark, .linkCopyDark:visited, .linkCopyDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; margin-top: -3px; } .linkCopyDark:hover { color: white; text-decoration: none; } .linkOverLight { color: #161616; text-decoration: none; font-weight: normal; text-align: center; } .linkOverLight:hover { color: #464646; text-decoration: none; font-weight: normal; } /* text styles */ .textError { font-size: 12px; font-weight: normal; color: red !important; } .textWarning { font-size: 12px; font-weight: normal; color: #FF4500 !important; } .textInfo { font-size: 12px; font-weight: normal; color: black; } .textHeader { font-size: 12px; font-weight: bold; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; display: none; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: snow; border: 1px solid #BBBBBB; position: relative; z-index: 4; } .textHeaderDark { font-size: 12px; font-weight: normal; color: snow; background-color: transparent; } .templateHeader { background: rgba(76,76,76,1); background: -moz-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(76,76,76,1)), color-stop(12%, rgba(89,89,89,1)), color-stop(25%, rgba(102,102,102,1)), color-stop(39%, rgba(71,71,71,1)), color-stop(50%, rgba(44,44,44,1)), color-stop(51%, rgba(0,0,0,1)), color-stop(60%, rgba(17,17,17,1)), color-stop(76%, rgba(43,43,43,1)), color-stop(91%, rgba(28,28,28,1)), color-stop(100%, rgba(19,19,19,1))); background: -webkit-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -o-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: -ms-linear-gradient(top, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); background: linear-gradient(to bottom, rgba(76,76,76,1) 0%, rgba(89,89,89,1) 12%, rgba(102,102,102,1) 25%, rgba(71,71,71,1) 39%, rgba(44,44,44,1) 50%, rgba(0,0,0,1) 51%, rgba(17,17,17,1) 60%, rgba(43,43,43,1) 76%, rgba(28,28,28,1) 91%, rgba(19,19,19,1) 100%); } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { font-size: 11px; color: snow; font-weight: normal; padding: 0px; white-space: nowrap; } .cactiBorderWall { border-width: 1px; border-color: rgba(98,125,77,1); border-style: solid; } .cactiTable { display: table; width: 100%; margin-left: auto; margin-right: auto; display: table; line-height: 16px; color: rgb(68, 68, 68); } .cactiInstallLoaderSpinnerTheme { border-top-color: rgba(98,125,77,1) !important; } .cactiTableTitleRow { float: left; text-align: left; padding-left: 5px; height: 25px; line-height: 25px; display: block; width: 100%; background: rgba(98,125,77,1); background: -moz-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(98,125,77,1)), color-stop(100%, rgba(31,59,8,1))); background: -webkit-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -o-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -ms-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); color: snow; } .cactiTableTitle { float: left; text-align: left; padding-left: 5px; height: 25px; line-height: 25px; display: block; width: 70%; background: rgba(98,125,77,1); background: -moz-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(98,125,77,1)), color-stop(100%, rgba(31,59,8,1))); background: -webkit-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -o-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -ms-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); color: snow; } .cactiTableButton { float: right; padding: 0px; height: 25px; line-height: 25px; display: block; text-align: right; width: calc(30% - 5px); background: rgba(98,125,77,1); background: -moz-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(98,125,77,1)), color-stop(100%, rgba(31,59,8,1))); background: -webkit-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -o-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -ms-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); color: snow; white-space: nowrap; } .cactiTableButton.debug { background: transparent; float: right; height: 13px; line-height: 10px; } .cactiTableButton span, .cactiTableTitle span { padding: 0px; white-space: nowrap; overflow: hidden; } .cactiTableButton i { padding: 0px 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0px 8px !important; } .cactiTableButton span a, .cactiTableTitle span a { color: snow; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-column; text-align: left; } .formColumnLeft { float: left; display: table-column; width: 44%; text-align: left; padding-left: 3px; } .formColumnRight { float: left; display: table-column; width: 45%; text-align: left; } .formColumnRight em { color: #000000; } .formData { display: inline-block; float: left; text-align: left; } .formData em { color: #555555; } .formRadio { line-height: 22px; } .formSubCheckbox { line-height: 20px; float: left; } .formSubCheckbox input { margin: 0px; vertical-align: -10%; } .formSubCheckbox label { } .formCheckboxLabel { color: #444; vertical-align: 5%; } .formCheckbox { vertical-align: -15%; } .formFieldName { display: inline-block; color: #444; float: left; text-align: left; vertical-align: top; padding-left: 0px; } .formFieldDescription { float: left; text-align: left; font-weight: normal; line-height: 14px; } .formTooltip { display: inline-block; padding-left: 4px; } .formHeader { float: left; width: 100%; text-align: left; line-height: 20px; background: rgba(138,179,105,1); background: -moz-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -webkit-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -o-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -ms-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); } .formHeaderText { padding-left: 3px; color: snow; } .formHeaderAnchor { float: right; padding-right: 8px; } .hostInfoHeader { width: 100%; } .queryAdd, .templateAdd { padding: 3px; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 35px; } .formColumn { float: left; display: table-row; } .formColumnLeft { float: left; display: table-row; width: 90%; text-align: left; } .formColumnRight { float: left; display: table-row; width: 100%; text-align: left; } .formFieldName { color: #444; float: left; text-align: left; white-space: nowrap; padding-left: 3px; } .formData { float: left; } .hostInfoHeader { overflow: hidden; } .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } .ui-button-text-only .ui-button-text { padding: 0.4em; } /* dropdown menus */ .menuoptions, .submenuoptions { width: 100%; left: 0 !important; border-left: none !important; border-right: none !important; } .menuoptions li a, .submenuoptions li a { padding-right: 25px; } } .graphItem { background-color: #D5D5D5; } .graphItemAlternate { background-color: #D2D6E7; } .break { height: 4px; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { background: rgba(98,125,77,1); background: -moz-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(98,125,77,1)), color-stop(100%, rgba(31,59,8,1))); background: -webkit-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -o-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -ms-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: linear-gradient(to bottom, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); } .cactiNavBarBottom { background-color: #00438c; } .tableHeader { display: table-row; background: rgba(138,179,105,1); background: -moz-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -webkit-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -o-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -ms-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); height: 24px; } .tableHeader th.sortable { cursor: pointer !important; } .tableHeader th.primarySort, th.tablesorter-headerDesc, th.tablesorter-headerAsc { background: rgba(138,155,107,1); background: linear-gradient(to bottom, rgba(138,155,107,1) 0%, rgba(51,79,28,1) 100%); } .tableHeader th.secondarySort { background: rgba(158,175,127,1); background: linear-gradient(to bottom, rgba(158,175,127,1) 0%, rgba(71,99,48,1) 100%); } .tableHeader th, .tableHeader td { color: snow; vertical-align: middle; text-align: left; font-size: 11px; font-weight: normal; padding: 2px; } .tableHeader th div { display: block; padding-right: 8px; font-size: 11px; } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { color: snow; vertical-align: middle; text-align: left; cursor: pointer; padding: 3px; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .graphSubHeaderColumn { color: snow; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { max-width: 20px; width: 20px; background: -moz-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(138,179,105,1)), color-stop(100%, rgba(63,117,15,1))); background: -webkit-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -o-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -ms-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: linear-gradient(to bottom, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); } .tableRow { line-height: 20px; } .tableRowGraph td { padding: 3px 0px; vertical-align: top; } .image_table { width: 100%; } .tableConfirmation { width: 100%; text-align: center; background-color: #f5f5f5; border: 1px solid #aaaaaa; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { color: white; width: 100%; text-align: center; vertical-align: middle; display: table; background: rgba(98,125,77,1); background: -moz-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(98,125,77,1)), color-stop(100%, rgba(31,59,8,1))); background: -webkit-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -o-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -ms-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); } .navBarNavigation a, navBarNavigation a:hover, navBarNavigation a:visited { color: white; font-weight: normal !important; } .navBarNavigationPrevious { text-align: left; white-space: nowrap; display: block; width: 10%; vertical-align: middle; } .navBarNavigationCenter { text-align: center; display: table-cell; white-space: nowrap; width: 80%; margin-top: auto; } .navBarNavigationCenter span { vertical-align: middle; display: table-cell; } .navBarNavigationNext { text-align: right; white-space: nowrap; display: table-cell; width: 10%; vertical-align: middle; } .navBarNavigationNone { text-align: center; display: table-cell; white-space: nowrap; width: 100%; height: 20px; margin-top: auto; padding-top: 4px; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 11px; background-color: #f5f5f5; color: #000000; } .textArea a { font-size: 1.1em; } .popupBox { z-index: 2; position: absolute; padding: 0px; display: none; overflow: auto; color: snow; background-color: #e5e5e5; border: 1px solid #e5e5e5; } .installArea { background-color: snow; padding: 5px 10px 5px 10px; } .textAreaNotes { font-size: 11px; font-family: Verdana, Arial, Helvetica, sans-serif; } .textEditTitle { font-weight: normal; } .textMenuHeader { color: snow; background-color: #9C9C9C; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: normal; } .textMenuItem { background-color: #efefef; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuSubItem { background-color: snow; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .txtErrorTextBox { border: 2px solid #ff0000 !important; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: normal; } /* tabs */ .tabSpacer { width: 0px; padding-right: 2px; padding-left: 0px; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #dfdfdf; white-space: nowrap; width: 1%; } .deleteMarker { color: red !important; height: 14px !important; vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .deleteMarkerDisabled { color: grey !important; height: 14px !important; vertical-align: middle; text-decoration: none !important; } .deleteMarkerDisabled:hover { text-decoration: none !important; } .moveArrow { color: #00438C !important; height: 14px !important; display: inline-block; width: 11.75px; font-size: 14px !important; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { display: inline-block; width: 11.75px; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } td.tab { border-top: 1px solid #999; border-right: 1px solid #666; border-left: 1px solid #999; padding-left: 3px; padding-right: 3px; min-width: 0%; border-bottom: none; border-top-left-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; } td#tabs { padding: 0px !important; } .cactiGraphHeaderBackground { background: transparent url("./images/cacti_logo.svg") no-repeat scroll left 10% / 380px auto; height: 35px; width: 400px; float: right; position: fixed; top: 0px; right: 0px; z-index: -1; } div#gtabs { padding-bottom: 0px; vertical-align: bottom; position: fixed; right: 5px; top: 5px; height: 30px; } .ellipsis { width: 25px !important; float: left; display: none; } .maintabs { float: left; overflow: hidden; height: 25px; } .maintabs-submenu { display: none; } .maintabs-submenu-ellipsis a { display: block; } .maintabs-submenu a { padding: 5px 8px 5px 0px; } .maintabs-submenu i { font-size: 18px; } div.submenu { display: none; position: absolute; border: 2px solid #2d4ca8; top: 0; left: 0; z-index: 200; } div.submenu span { display: block; } .submenuoptions { border-width: 0px 1px 1px 1px; border-color: #eee #ccc #ccc #eee; color: #333; border-style: solid; position: absolute; top: 30px; list-style: none; text-align: left; margin: 0px; padding: 10px 0px 10px 0px; background: snow; z-index: 200; } .submenuoptions li a { display: block; padding: 4px 15px; font-size: 12px; font-weight: 500; color: #333; text-decoration: none; } .submenuoptions li a:hover { display: block; color: #333; background: rgba(242,246,248,1); background: -moz-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(242,246,248,1)), color-stop(50%, rgba(216,225,231,1)), color-stop(51%, rgba(181,198,208,1)), color-stop(100%, rgba(224,239,249,1))); background: -webkit-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -o-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -ms-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: linear-gradient(to bottom, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f6f8', endColorstr='#e0eff9', GradientType=0 ); } .tabs { border: 0px; margin: 0px; } .tabs a, .maintabs a { -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; background-color: #ddd; background-image: -moz-linear-gradient(#f0f0f0,#ddd); background-image: -ms-linear-gradient(#f0f0f0,#ddd); background-image: -webkit-linear-gradient(#f0f0f0,#ddd); background-image: linear-gradient(#f0f0f0,#ddd); background-repeat: repeat-x; border: 1px solid #555; border-color: #eee #ccc #ccc #eee; color: #333; float: left !important; padding: 5px; text-decoration: none; font-size: 11px; vertical-align: bottom; } .tabs a:hover, .maintabs a:hover { background-color: #ddd; background-image: -moz-linear-gradient(#e0e0e0,#ccc); background-image: -ms-linear-gradient(#e0e0e0,#ccc); background-image: -webkit-linear-gradient(#e0e0e0,#ccc); background-image: linear-gradient(#e0e0e0,#ccc); background-repeat: repeat-x; } .tabs a.selected, .maintabs a.selected { background: rgba(242,246,248,1); background: -moz-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(242,246,248,1)), color-stop(50%, rgba(216,225,231,1)), color-stop(51%, rgba(181,198,208,1)), color-stop(100%, rgba(224,239,249,1))); background: -webkit-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -o-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -ms-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: linear-gradient(to bottom, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f2f6f8', endColorstr='#e0eff9', GradientType=0 ); } .tabs li, .maintabs li { float: left; margin: 0 3px 0 0; position: relative; } .tabs li.current a, .maintabs li.current a { background: #fff; border-bottom: 1px solid #fff; } .tabs li.current a:hover, .maintabs li.current a:hover { background: #fff; border-bottom: 1px solid #fff; } .tabs nav, .maintabs nav { border-bottom: 1px solid #ccc; padding: 0 0 0 4px; height: 25px; } .tabs nav:after, .maintabs nav:after { clear: both; content: "."; visibility: hidden; } .tabs ul, .maintabs ul { list-style: none; margin: 0; padding: 0; display: block; } /* Navigation Area */ #nav { float: left; width: 150px; border-top: 0px solid #999; border-right: 0px solid #999; border-left: 0px solid #999; font-size: 12px; margin: 0px 0; } #nav li a { display: block; padding: 2px 4px; background: #ccc; border-top: 1px solid #eee; border-bottom: 1px solid #999; text-decoration: none; color: #000; } #nav li a.active { color: snow; background: -moz-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(138,179,105,1)), color-stop(100%, rgba(63,117,15,1))); background: -webkit-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -o-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: -ms-linear-gradient(top, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); background: linear-gradient(to bottom, rgba(138,179,105,1) 0%, rgba(63,117,15,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8ab369', endColorstr='#3f750f', GradientType=0 ); } th { border-right: 1px groove snow; } th:last-child { border-right: none !important; } tr.selected { background: rgba(167,217,134,1); background: -moz-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,1)), color-stop(100%, rgba(148,179,107,1))); background: -webkit-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -o-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); background: linear-gradient(to bottom, rgba(167,217,134,1) 0%, rgba(148,179,107,1) 100%); } tr.selectable:hover:not(.selected) { background: rgba(167,217,134,0.4); background: -moz-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,0.4)), color-stop(100%, rgba(148,179,107,0.2))); background: -webkit-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -o-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: linear-gradient(to bottom, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a7d986', endColorstr='#94b36b', GradientType=0 ); } tr.selectable:hover:not(.selected) a { color: black; } tr.selected a { color: black; } #nav li a.pic:hover, #nav li ul li a.selected { background: -moz-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(242,246,248,1)), color-stop(50%, rgba(216,225,231,1)), color-stop(51%, rgba(181,198,208,1)), color-stop(100%, rgba(224,239,249,1))); background: -webkit-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -o-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: -ms-linear-gradient(top, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); background: linear-gradient(to bottom, rgba(242,246,248,1) 0%, rgba(216,225,231,1) 50%, rgba(181,198,208,1) 51%, rgba(224,239,249,1) 100%); } #nav li ul { display: none; padding: 0; } #nav li ul li a { padding: 2px 4px; background: #ececec; border-bottom: 1px dotted #ccc; } #nav li ul li { list-style: none; padding: 0; } ul#nav { list-style: none; padding: 0; padding-top: 4px; width: 100%; } .clogError { background-color: #FF3932; } .clogWarning { background-color: #EACC00; } .clogSQL { background-color: #6DC8FE; } .clogDebug { background-color: #C4FD3D; } .clogStats { background-color: #96E78A; } .clogLimit { background-color: #EACC00; } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } @media print { .noprint { display: none; } } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-filter, .ui-widget-header { font-weight: normal !important; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter { margin-bottom: 4px; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; } .ui-tooltip { max-width: 500px; word-break: break-word; } .ui-tooltip-content div.header { color: #006400; } .ui-tooltip-content div.content { font-size: 10px; color: #333333; } .ui-tooltip-content { overflow: auto !important; opacity: 0.95; border-radius: 5px !important; border: transparent; } div.preformatted { font-family: monospace; white-space: pre; } ul.pagination { display: inline-block; padding: 1px; margin: 2px; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { color: snow; float: left; padding: 0px 2px 2px 2px; text-decoration: none; margin: 0px 1px; vertical-align: -40%; } ul.pagination li span { color: show; float: left; padding: 0px 0px; text-decoration: none; margin: 0px 1px; } ul.pagination li a.active { background: rgba(0, 0, 0, 0) linear-gradient(to bottom, rgba(167, 217, 134, 1) 0%, rgba(148, 179, 107, 1) 100%) repeat scroll 0 0; color: black; } ul.pagination li a:hover:not(.active) { background: rgba(167,217,134,0.4); background: -moz-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(167,217,134,0.4)), color-stop(100%, rgba(148,179,107,0.2))); background: -webkit-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -o-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: -ms-linear-gradient(top, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); background: linear-gradient(to bottom, rgba(167,217,134,0.4) 0%, rgba(148,179,107,0.4) 100%); } tr#realtime td:first-child { height: 68px; } .logEmergency { background-color: rgba(255, 6, 6, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logCritical { background-color: rgba(242, 23, 33, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logAlert { background-color: rgba(242, 25, 36, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logWarning { background-color: rgba(255, 122, 48, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logError { background-color: rgba(251, 74, 20, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logNotice { background-color: rgba(250, 253, 158, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logInfo { background-color: rgba(204, 255, 204, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .logDebug { background-color: rgba(205, 207, 196, 0.8); text-align: center; width: 12.5%; padding: 3px; color: #0A0A0A; } .menuitem { white-space: nowrap; } .menu_glyph { font-size: 18px; vertical-align: middle; text-align: left; width: 20px; } .menuitem span { vertical-align: middle; line-height: 20px; } .ui-autocomplete { height: 300px; overflow-y: scroll; overflow-x: hidden; } .graphWrapper { position: relative; } .code { font-family: Consolas, Courier New; font-size: 0.8em; padding: 5px 15px 5px 15px; background: #dfdfdf; } .note { font-size: 0.7em; } .note a:link, .note a:active, .note a:visited { font-size: 1em; text-decoration: none; color: blue; } .note a:hover { text-decoration: underline; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect { padding: 0.4em 1em; text-align: left; line-height: initial; } .ui-multiselect .ui-icon { margin-top: 0px; } .ui-widget { font-size: unset; } .ui-checkboxradio-icon { display: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { background: rgba(98,125,77,1); background: -moz-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(98,125,77,1)), color-stop(100%, rgba(31,59,8,1))); background: -webkit-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -o-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); background: -ms-linear-gradient(top, rgba(98,125,77,1) 0%, rgba(31,59,8,1) 100%); color: snow; } /* New Checkbox Stuff */ .checkboxSwitch { position: relative; display: inline-block; width: 45px; height: 24px; margin-right: 5px; vertical-align: middle; } .checkboxSwitch input { display: none; } .checkboxSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(200,200,200,1); -webkit-transition: .4s; transition: .4s; } .checkboxSlider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .checkboxSlider { background-color: rgba(167,217,134,1); } input:disabled + .checkboxSlider { cursor: not-allowed; } input:focus + .checkboxSlider { box-shadow: 0 0 1px #2196F3; } input:checked + .checkboxSlider:before { -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } /* Rounded.checkboxSliders */ .checkboxSlider.checkboxRound { border-radius: 24px; } .checkboxSlider.checkboxRound:before { border-radius: 50%; } .checkboxLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; } .right { text-align: right; } .radioSwitch { position: relative; display: inline-block; margin-left: 5px; margin-right: 5px; vertical-align: middle; height: 24px; width: 24px; } .radioSwitch input { display: none; } .radioSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; height: 24px; width: 24px; background-color: rgba(200,200,200,1); -webkit-transition: .4s; transition: .4s; } .radioSlider:before { display: none; position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .radioSlider { background-color: rgba(167,217,134,1); } input:checked + .radioSlider:before { display: inline-block; } input:disabled + .radioSlider { cursor: not-allowed; } input:focus + .radioSlider { box-shadow: 0 0 1px #2196F3; } input:checked + .radioSlider:before { display: block; } /* Rounded.radioSliders */ .radioSlider.radioRound { border-radius: 24px; } .radioSlider.radioRound:before { border-radius: 50%; } .radioLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; -moz-box-shadow: 5px 5px 4px -4px #666666; -webkit-box-shadow: 2px 2px 2px #999999; box-shadow: 2px 2px 2px #999999; z-index: 99; } [id*='_edit'] .tableRowGraph:hover { background-color: rgba(0, 200, 0, .1) !important; border-left: 2px solid yellow !important; border-right: 2px solid yellow !important; } .tableRowGraph { border: 2px solid rgba(0,0,0,0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/main.js��������������������������������������������������0000664�0000000�0000000�00000016021�14136337723�0021774�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { var hostTimer = false; var clickTimeout = false; var hostOpen = false; $('body').css('height', $(window).height()); $('#navigation').css('height', ($(window).height()-40)+'px'); $('#navigation_right').css('height', ($(window).height()-40)+'px'); keepWindowSize(); // Setup the navigation menu setMenuVisibility(); // Add nice search filter to filters if ($('input[id="filter"]').length > 0 && $('input[id="filter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="filterd"]').length > 0 && $('input[id="filterd"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filterd"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="rfilter"]').length > 0 && $('input[id="rfilter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="rfilter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchRFilter).parent('td').css('white-space', 'nowrap'); } $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); $('.checkboxgroup').children('br').remove(); $('.checkboxgroup').buttonset(); // Turn file buttons into jQueryUI buttons $('.import_label').button(); $('.import_button').change(function() { text=this.value; setImportFile(text); }); setImportFile(noFileSelected); function setImportFile(fileText) { $('.import_text').text(fileText); } maxWidth = 480; $('select.colordropdown').dropcolor(); $('select').not('.colordropdown').each(function() { if ($(this).prop('multiple') != true) { $(this).each(function() { id = $(this).attr('id'); $(this).selectmenu({ open: function(event, ui) { var instance = $(this).selectmenu('instance'); instance.menuInstance.focus(null, instance._getSelectedItem()); }, change: function(event, ui) { $(this).val(ui.item.value).change(); }, position: { my: "left top", at: "left bottom", collision: "flip" }, width: 'auto' }); $('#'+id+'-menu').css('max-height', '250px'); }); } else { $(this).addClass('ui-state-default ui-corner-all'); } }); $('#drp_action').change(function() { if ($(this).val() != '0') { $('#submit').button('enable'); } else { $('#submit').button('disable'); } }); $('#graph_type_id').change(function() { switch($(this).val()) { case '4': case '5': case '6': case '7': case '8': $('#alpha').selectmenu('enable'); } }); $('#host').unbind().autocomplete({ source: pageName+'?action=ajax_hosts', autoFocus: true, minLength: 0, select: function(event,ui) { $('#host_id').val(ui.item.id); callBack = $('#call_back').val(); if (callBack != 'undefined') { if (callBack.indexOf('applyFilter') >= 0) { applyFilter(); } else if (callBack.indexOf('applyGraphFilter') >= 0) { applyGraphFilter(); } } else if (typeof applyGraphFilter === 'function') { applyGraphFilter(); } else { applyFilter(); } } }).addClass('ui-state-default ui-selectmenu-text').css('border', 'none').css('background-color', 'transparent'); $('#host_click').css('z-index', '4'); $('#host_wrapper').unbind().dblclick(function() { hostOpen = false; clearTimeout(hostTimer); clearTimeout(clickTimeout); $('#host').autocomplete('close').select(); }).click(function() { if (hostOpen) { $('#host').autocomplete('close'); clearTimeout(hostTimer); hostOpen = false; } else { clickTimeout = setTimeout(function() { $('#host').autocomplete('search', ''); clearTimeout(hostTimer); hostOpen = true; }, 200); } $('#host').select(); }).on('mouseenter', function() { $(this).addClass('ui-state-hover'); $('input#host').addClass('ui-state-hover'); }).on('mouseleave', function() { $(this).removeClass('ui-state-hover'); $('#host').removeClass('ui-state-hover'); hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); hostOpen = false; }); var hostPrefix = ''; $('#host').autocomplete('widget').each(function() { hostPrefix=$(this).attr('id'); if (hostPrefix != '') { $('ul[id="'+hostPrefix+'"]').on('mouseenter', function() { clearTimeout(hostTimer); }).on('mouseleave', function() { hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); $(this).removeClass('ui-state-hover'); $('input#host').removeClass('ui-state-hover'); }); } }); setNavigationScroll(); } function setMenuVisibility() { storage=Storages.localStorage; // Initialize the navigation settings // This will setup the initial visibility of the menu $('li.menuitem').each(function() { var id = $(this).attr('id'); if (storage.isSet(id)) { var active = storage.get(id); } else { var active = null; } if (active != null && active == 'active') { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); } else { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); } if ($(this).find('a.selected').length == 0) { //console.log('hiding1:'+$(this).closest('.menuitem').attr('id')); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); storage.set($(this).closest('.menuitem').attr('id'), 'collapsed'); } else { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); storage.set($(this).closest('.menuitem').attr('id'), 'active'); } }); // Functon to give life to the Navigation pane $('#nav li:has(ul) a.active').unbind().click(function(event) { event.preventDefault(); id = $(this).closest('.menuitem').attr('id'); if ($(this).next().is(':visible')) { $(this).next('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).next().slideUp( { duration: 200, easing: 'swing' } ); storage.set(id, 'collapsed'); } else { $(this).next('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true'); $(this).next().slideToggle( { duration: 200, easing: 'swing' } ); if ($(this).next().is(':visible')) { storage.set($(this).closest('.menuitem').attr('id'), 'active'); } else { storage.set(id, 'collapsed'); } } $('li.menuitem').not('#'+id).each(function() { text = $(this).attr('id'); id = $(this).attr('id'); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).find('ul').slideUp( { duration: 200, easing: 'swing' } ); storage.set($(this).attr('id'), 'collapsed'); }); }); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/pace.css�������������������������������������������������0000664�0000000�0000000�00000004066�14136337723�0022142�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: rgba(98,125,77,1); position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 2px; } .pace .pace-progress-inner { display: block; position: absolute; right: 0px; width: 100px; height: 100%; box-shadow: 0 0 18px rgba(98,125,77,1), 0 0 5px rgba(98,125,77,1); opacity: 1.0; -webkit-transform: rotate(3deg) translate(0px, -4px); -moz-transform: rotate(3deg) translate(0px, -4px); -ms-transform: rotate(3deg) translate(0px, -4px); -o-transform: rotate(3deg) translate(0px, -4px); transform: rotate(3deg) translate(0px, -4px); } .pace .pace-activity { display: block; position: fixed; z-index: 2000; top: 25%; right: 50%; width: 25px; height: 25px; border: solid 4px transparent; border-top-color: rgba(98,125,77,1); border-left-color: rgba(98,125,77,1); border-radius: 18px; -webkit-animation: pace-spinner 400ms linear infinite; -moz-animation: pace-spinner 400ms linear infinite; -ms-animation: pace-spinner 400ms linear infinite; -o-animation: pace-spinner 400ms linear infinite; animation: pace-spinner 400ms linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-moz-keyframes pace-spinner { 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes pace-spinner { 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes pace-spinner { 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/modern/rrdtheme.php���������������������������������������������0000664�0000000�0000000�00000001476�14136337723�0023045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $rrdcolors['back'] = 'F3F3F3'; $rrdcolors['canvas'] = 'FDFDFD'; $rrdcolors['shadea'] = 'CBCBCB'; $rrdcolors['shadeb'] = '999999'; #$rrdcolors['grid'] = 'C4C4C4'; #$rrdcolors['mgrid'] = '1A1C1C'; $rrdcolors['font'] = '000000'; $rrdcolors['axis'] = '2C4D43'; $rrdcolors['arrow'] = '2C4D43'; $rrdcolors['frame'] = '2C4D43'; # RRDtool graph fonts in RRDtool 1.2+ $rrdfonts['title']['font'] = 'Arial'; $rrdfonts['title']['size'] = '11'; $rrdfonts['axis']['font'] = 'Arial'; $rrdfonts['axis']['size'] = '8'; $rrdfonts['legend']['font'] = 'Courier'; $rrdfonts['legend']['size'] = '8'; $rrdfonts['unit']['font'] = 'Arial'; $rrdfonts['unit']['size'] = '8'; $rrdfonts['watermark']['font'] = 'Arial'; $rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 1; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/����������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021432�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/billboard.css���������������������������������������0000664�0000000�0000000�00000010367�14136337723�0024105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/default/��������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0023056�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/default/index.php�����������������������������������0000664�0000000�0000000�00000000050�14136337723�0024671�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/���������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022677�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/128/�����������������������������������������0000775�0000000�0000000�00000000000�14136337723�0023211�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/128/bar-alpha.png����������������������������0000664�0000000�0000000�00000003034�14136337723�0025546�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/128/bar.png����������������������������������0000664�0000000�0000000�00000002064�14136337723�0024465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/128/map.png����������������������������������0000664�0000000�0000000�00000110316�14136337723�0024476�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/cacti_logo.gif�������������������������������0000664�0000000�0000000�00000013011�14136337723�0025465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/cacti_logo.svg�������������������������������0000664�0000000�0000000�00000041220�14136337723�0025522�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/favicon.ico����������������������������������0000664�0000000�0000000�00000002576�14136337723�0025032�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/favicon.png����������������������������������0000664�0000000�0000000�00000014233�14136337723�0025035�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/index.php������������������������������������0000664�0000000�0000000�00000000050�14136337723�0024512�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/logotype-a.png�������������������������������0000664�0000000�0000000�00000030026�14136337723�0025466�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/logotype-b.png�������������������������������0000664�0000000�0000000�00000041221�14136337723�0025466�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/tab_list.gif���������������������������������0000664�0000000�0000000�00000001522�14136337723�0025167�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷|�€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###������������������������������������������������������������������������������������������&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¤�,�������/�I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/tab_preview.gif������������������������������0000664�0000000�0000000�00000001541�14136337723�0025676�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ �������������������������������������������������������  !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��D�,�������>�‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/images/tab_tree.gif���������������������������������0000664�0000000�0000000�00000001542�14136337723�0025155�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ ����������������������������������������������������������������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¥�,�������?�K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/index.php�������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023245�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/jquery.multiselect.css������������������������������0000664�0000000�0000000�00000005277�14136337723�0026027�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/jquery.multiselect.filter.css�����������������������0000664�0000000�0000000�00000000622�14136337723�0027300�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/jquery.zoom.css�������������������������������������0000664�0000000�0000000�00000012706�14136337723�0024454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; background-color: #3f75a2; height:0; position:absolute; z-index:auto; filter:alpha(opacity=40); -moz-opacity:0.4; -khtml-opacity:0.4; opacity:0.4; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; background-color: #064072; height:0; position:absolute; z-index:auto; filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity:0.5; opacity:0.5; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #9d9d9d; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid #93CEFF; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid #93CEFF; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; color: #9d9d9d; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #222222; padding-left: 3px; padding-right: 3px; border: 1px solid rgba(204,204,204,0.4); } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid rgba(204,204,204,0.4); } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #222222; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid rgba(204,204,204,0.4); } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #222222; z-index: auto; } .zoom-menu { border:1px solid #222; position:absolute; background:#F7F7F7; display:none; font-family: Verdana,Arial,sans-serif; font-size: 12px; font-weight: lighter; z-index:auto; color: #000000; } .zoom-menu .first_li span { width:150px; display:block; padding: 4px 15px; cursor:pointer } .zoom-menu .inner_li { display:none; margin-left:150px; position:absolute; border:1px solid #aaa; border-left:1px solid #ccc; margin-top:-28px; background:#F7F7F7; } .zoom-menu .sep_li { border-top: 1px solid #c5c5c5; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float:left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { float: right; margin-left: 0.4em; margin-right:0.2em; margin-top: 2px; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } .zoom-menu-hover { background: #5CB85C; cursor: pointer; } .zoom-menu-hover>span { color: #FFFFFF; } .zoom-menu span:hover{ color: #FFFFFF; } .zoom-menu-highlight { #background: #E0EDFE; } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } ����������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/main.css��������������������������������������������0000664�0000000�0000000�00000124235�14136337723�0023077�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main styles */ html { height: 100%; width: 100%; background: #1D1F21; background-image: linear-gradient(#1D1F21,#000000); } body, table, tr, td, textarea { font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', 'Helvetica Neue', 'BBAlpha Sans', 'S60 Sans', Arial, sans-serif; font-size: 12px; /* fix those ever present IE issues */ -ms-overflow-style: scrollbar; } body { margin: 0px; background-color: white; background-repeat: repeat-y; overflow: hidden; background: #1D1F21; background-image: linear-gradient(#1D1F21,#000000); } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: left; outline-style: none; } td, th { padding: 2px 2px; margin: 0px; } th { white-space: nowrap; user-select: none; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; } .tableRowGraph td span { color: #FFF; } img { border: none; vertical-align: middle; } i.fa, i.fas, i.fab, i.far, i.fal { padding: 0px 3px; font-size: 13px; } .menu_parent i.fa, .menu_parent i.fas, .menu_parent i.fab, .menu_parent i.far, .menu_parent i.fal { color: lightgrey; } fieldset { border: none; padding: 0px; margin: 0px; } hr.menu { border: 0; height: 1px; background: #333; background-image: linear-gradient(to right, #ccc, #333, #ccc); } .reindex_methods span { font-size: 9px; } .checkboxLabel { display: none; } .realms .checkboxLabel { display: inline !important; } /* links */ a, a:active, a:visited { color: #2d4ca8; text-decoration: none; font-size: 12px; } a:hover { text-decoration: none; color: #333333; } th .fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } pre { } form#tree_edit>div { background: #F7F7F7; } #main { display: none; width: 100%; position: relative; z-index: 0; } #main > br { display: none; } #main > table { width: 100%; } input, select { padding: 0.4em 0.4em 0.4em 0.4em; } label { white-space: nowrap; } .glyph_tab-console:before { content: "\f1d8"; padding: 0px 5px 0px 5px; } .text_tab-console { display: none; } .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right !important; } .left { text-align: left; } .center { text-align: center !important; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; font-weight: bold; cursor: pointer; } .filter { position: relative; left: -20px; margin-right: -10px; font-size: 13px !important; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: green; font-size: 1.5em !important; vertical-align: bottom; } .associated { color: green; font-weight: bold; } .notAssociated { color: red; font-weight: bold; } .disabled_row span, .disabled_row td, .disabled_row a { color: grey; } .disabled { color: grey; font-weight: bold; } .idle { color: green; font-weight: bold; } .running { color: red; font-weight: bold; } .newObject { color: blue; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: green; } .failed { color: red; } .accessGranted { color: green; font-weight: bold; } .accessGrantedItem { color: green; } .accessRestricted { color: red; font-weight: bold; } .accessRestrictedItem { color: red; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .drillDown { cursor: pointer; } .monoSpace { font-size: 9px; font-family: monospace; } .utilityPick { width: 200px; } .itemlist { max-height: 200px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { display: block; width: 100%:; } .deviceUp { color: rgba(148, 179, 107, 0.8) !important; } .deviceDown { color: #ff0000 !important; } .deviceUnknown { color: #0000ff !important; } .deviceDisabled { color: #a1a1a1 !important; } .deviceRecovering { color: #ff8f1e !important; } .deviceError { color: #750F7D !important; } .deviceDownMuted { color: #ffe333 !important; } .deviceThreshold { color: #ffa833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #aa7807 !important; } .deviceAlert { color: #660000 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff0000; } .deviceUnknownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #0000ff; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #a1a1a1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff8f1e; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffe333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffa833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #aa7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: green; } .notBeingGraphed { color: #484848; } .submenuoptions { border-width: 1px 2px 2px 2px; border-color: #000000; border-style: solid; position: absolute; top: 45px; list-style: none; text-align: left; margin: 0px; padding: 10px 0px 10px 0px; background: #FFFFFF; } .submenuoptions li a { display: block; padding: 4px 15px; font-size: 12px; font-weight: light; color: #000000; text-decoration: none; } .submenuoptions li a:hover { display: block; color: white; background: #5CB85C; } .menuoptions { background: #F7F7F7; border-width: 1px 2px 2px 2px; border-color: #000000; border-style: solid; display: block; float: right; position: absolute; right: 0px; top: 45px; list-style: none; text-align: right; margin: 0px; padding: 10px 0px 10px 0px; } .menuoptions li a { display: block; padding: 4px 15px; font-family: Verdana,Arial,sans-serif; font-size: 12px; font-weight: light; color: #000000; text-decoration: none; } .menuoptions li a:hover { display: block; color: white; background: #5CB85C; } .import_label { opacity: 1; } .import_button { display: none; opacity: 0; } .import_text { opacity: 1; } .color-icon { background-image: none !important; } #dbghide { color: orange !important; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0px 5px 0px 0px; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: #32CD32; font-weight: bold; font-size: 14px; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: orange; font-size: 14px; } .deletequery { cursor: pointer; padding: 2px; vertical-align: middle; color: #174163 !important; font-weight: bold; font-size: 14px; } .deletequery:hover { color: #174163 !important; text-decoration: none; padding: 2px; vertical-align: middle; } .tableRow { background: none repeat scroll 0 0 #EBEDEF; line-height: 20px; } .odd { border: none; background: none repeat scroll 0 0 #EBEDEF; } .odd.tableRow { color: #000000; background: none repeat scroll 0 0 #EBEDEF; } .tableRowGraph td { padding: 3px; vertical-align: top; background: none repeat scroll 0 0 #FFFFFF; } .even { border: none; background: none repeat scroll 0 0 #FFFFFF; } .even.tableRow { color: #000000; background: none repeat scroll 0 0 #FFFFFF; } .even-alternate { background: none repeat scroll 0 0 #FFFFFF; } .even-alternate.tableRow { color: #000000; background: none repeat scroll 0 0 #FFFFFF; } .tableRow { padding: 4px 5px !important; } .saveRow { border-color: #222; text-align: right; padding: 4px; } .saveRow > input.ui-button { border: 1px solid #93CEFF; color: #93CEFF; background: transparent; outline-style: none; } .saveRow > input.ui-button:hover { color: #FFFFFF; border: 1px solid #FFFFFF; background: #5CB85C; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid #006400; vertical-align: top; } .linkMarker { color: #c16921; } .filteredValue { background-color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438c; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { color: #000000; font-size: 10px; font-weight: normal; font-family: monospace; } .hostDown { color: #ff0000; font-size: 10px; font-weight: normal; font-family: monospace; } .cactiPageHead { z-index: 10; height: 45px; width: 100%; padding: 0px; border-color: #222; */ box-shadow: inset 0 1px 0 rgba(255,255,255,.09); */ background-color: #100000; */ background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3a3b3c), to(#100000)); background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .cactiPageHead div { left: 0; top: 0; } .cactiPageHead #tabs { overflow-x: auto; overflow-y: hidden; } .cactiGraphPageHeadBackdrop { padding-bottom: 0px; float: right; position: fixed; } .cactiPageBottom { height: 25px; line-height: 25px; width: 100%; border-color: #222; */ box-shadow: inset 0 1px 0 rgba(255,255,255,.09); */ background-color: #100000; */ background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3a3b3c), to(#100000)); background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; text-align: right; position: fixed; bottom: 0px; left: 0px; } .cactiPageBottom a { color: #9d9d9d; padding: 0px 8px; text-decoration: none; font-size: 16px; outline-style: none; } .cactiConsolePageHeadBackdrop { padding-bottom: 0px; float: right; position: fixed; } .navigation { overflow: hidden; } .debug td { padding: 3px; margin: 0px; } .breadCrumbBar { display: none !important; } .cactiContent { clear: both; width: 100%; vertical-align: top; background: #1D1F21; background-image: linear-gradient(#1D1F21,#000000); } .cactiTreeNavigationArea { overflow-y: auto; overflow-x: hidden; margin-left: 0px; margin-right: 0px; height: 100%; float: left; display: none; color: #9d9d9d; } .cactiTreeNavigationArea a { padding-right: 18px !important; } .cactiTreeNavigationArea div:first-child { padding-left: 5px; } .cactiTreeSearch { padding-top: 5px; } .jstree { position: relative; display: block; } .cactiContentNavigationArea { overflow: hidden; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: top; left: 0px; } .cactiConsoleNavigationArea { overflow-y: auto !important; overflow-x: hidden; width: 170px; height: 100%; float: left; } .cactiLogo { background: transparent url('./images/cacti_logo.svg') no-repeat 30px; display: none; cursor: pointer; padding-bottom: 140px; margin-bottom: 60px; width: 156px; margin-top: -6px; margin-left: 2px; margin-right: 2px; } .loginLeft, .logoutLeft { display: none; } .loginCenter, .logoutCenter { position: absolute; background-color: transparent; width: 300px; height: 200px; top: 45%; left: 50%; padding: 10px 15px; margin: -100px 0 0 -150px; } .cactiLoginLogo, .cactiLogoutLogo { display: none; } .loginArea, .logoutArea { color: #9d9d9d; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .cactiLoginTable input.ui-button { border: 1px solid #93CEFF; color: #93CEFF; background: transparent; outline-style: none; } .cactiLoginTable input.ui-button:hover { color: #FFFFFF; border: 1px solid #FFFFFF; background: #5CB85C; } .loginErrors, .logoutErrors { color: red; min-height: 15px; } legend { color: #93CEFF; font-size: 22px; font-weight: bold; } .loginRight, .logoutRight { display: none; width: 33%; float: right; } .loginBody, .logoutBody { height: 100% !important; width: 100% !important; background: #1D1F21; background-image: linear-gradient(#1D1F21,#000000); } .versionInfo { position: fixed; right: 5px; bottom: 5px; color: #5CB85C; } .actionsDropdown { vertical-align: middle; padding: 3px; width: 100%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdown > div > span.ui-selectmenu-button { background: transparent; outline-style: none; color: #93CEFF; border: 1px solid #93CEFF; } .actionsDropdown > div > span.ui-selectmenu-button:hover, .actionsDropdown > div > span.ui-selectmenu-button[aria-expanded="true"] { outline-style: none; color: #FFFFFF; border: 1px solid #FFFFFF; background: #5CB85C; } .actionsDropdownButton { vertical-align: top; float: right; margin-left: 3px; margin-right: 6px; display: table-cell; } .actionsDropdownButton > input.ui-button { border: 1px solid #93CEFF; color: #93CEFF; background: transparent; outline-style: none; padding: 4px; } .actionsDropdownButton > input.ui-button:hover { color: #FFFFFF; border: 1px solid #FFFFFF; background: #5CB85C; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .cactiTooltipHint { cursor: pointer; padding: 5px; font-size: 14px !important; } .spikekillData, .spikekillData td { border: 1px solid #999; } .spikekillNote { padding: 1px; } .spikekillMenu { background: #f5f5f5 none repeat scroll 0 0; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; margin: 0; padding: 2px; line-height: 1.5em; } .spikekillMenu li { vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .loginPanel { padding: 4px 0px; } .treeTable { width: 100%; } .treeArea { vertical-align: top; } .graphWrapper { position: relative; } .cactiGraphContentArea { height: 100vh; display: none; overflow-y: auto !important; overflow-x: hidden !important; border-left: 1px solid #000000; } .cactiGraphContentArea span[align="center"] { color: #9d9d9d; } .cactiGraphContentArea .tableHeader > td { color: white; text-align: left; padding: 3px 5px; width: 100%; font-size: 13px; font-weight: 600; text-transform: none; border-color: #222; background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .cactiGraphContentAreaPreview { height: 100vh; overflow-y: auto !important; } .cactiGraphContentAreaPreview span[align="center"] { color: #9d9d9d; } .cactiGraphContentAreaPreview .cactitable { background: none !important; } .cactiConsoleContentArea { overflow-y: auto !important; overflow-x: hidden; border-left: 1px solid #000000; height: 95vh; } #graph_view_preview2 table.cactiTable { background: none !important; } #graph_view_tree_content2 table.cactiTable { background: none !important; } #graph_view_preview2 .tableRow { background: none !important; } #graph_view_tree_content2 .tableRow { background: none !important; } .hyperLink { color: #2d4ca8; padding: 3px; cursor: pointer; text-decoration: none; } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: #2d4ca8; text-decoration: none; font-size: 12px; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: yellow; white-space: nowrap; text-decoration: none; } .linkOverDark, .linkOverDark:visited, .linkOverDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: white; text-decoration: none; } .linkCopyDark, .linkCopyDark:visited, .linkCopyDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkCopyDark:hover { color: white; text-decoration: none; } /* text styles */ .textError { font-size: 12px; font-weight: bold; color: red; } .textWarning { font-size: 12px; font-weight: normal; color: #ee7600 !important; } .textInfo { font-size: 12px; color: #9d9d9d; } .textInfo.left { color: #000000; } tr>td.textInfo.left { background: #F7F7F7; color: #000000; } tr>td.textInfo.right { background: #F7F7F7; color: #000000; } .textHeader { font-size: 12px; font-weight: bold; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: white; border: 1px solid #BBBBBB; position: relative; z-index: 4; } .textHeaderDark { font-size: 12px; font-weight: bold; color: white; } .templateHeader { background: rgba(0,0,0,0.55); } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { outline-style: none; } .cactiBorderWall { border-width: 1px; border-color: #222222; border-style: solid; } .cactiTable { width: 100%; margin-left: auto; margin-right: auto; border-color: #222; } .cactiInstallLoaderSpinnerTheme { border-top-color: #3a3b3c !important; } .cactiTableTitleRow { color: white; float: left; text-align: left; padding-left: 3px; display: block; width: 100%; height: 28px; line-height: 28px; font-size: 13px; font-weight: 600; border-color: #222; background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .cactiTableTitle { color: white; float: left; text-align: left; padding-left: 3px; vertical-align: middle; display: block; width: 70%; height: 28px; line-height: 28px; font-size: 13px; font-weight: 600; border-color: #222; background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .cactiTableButton { float: right; padding: 0px; display: block; text-align: right; vertical-align: middle; font-size: 13px; color: #FFF; width: calc(30% - 3px); height: 28px; line-height: 28px; border-color: #222; background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; white-space: nowrap; } .cactiTableButton.debug { background: transparent; float: right; padding: 0px; padding-bottom: 3px; margin-right: -5px; } .cactiTableButton span, .cactiTableTitle span { padding: 0px; white-space: nowrap; overflow: hidden; } .cactiTableButton i { padding: 0px 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0px 8px !important; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { display: table; width: 100%; line-height: 35px; } .checkboxgroup { line-height: 25px; } .formColumn { float: left; display: table-column; } .formColumnLeft { float: left; display: table-column; width: 45%; text-align: left; color: #000; } .formColumnRight { float: left; display: table-column; width: 45%; text-align: left; color: #000; } .formData { display: inline-block; float: left; } .formFieldName { display: inline-block; color: #000; float: left; text-align: left; padding-left: 3px; } .formFieldDescription { float: left; text-align: left; font-weight: normal; line-height: 14px; } .formTooltip { display: inline-block; } .formHeader { float: left; width: 100%; text-align: left; font-size: 13px; line-height: 25px; text-transform: none; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; border-bottom: 1px solid #000; } .formHeaderAnchor { float: right; padding-right: 8px; } .formHeaderText { padding-left: 3px; color: #FFF; } .hostInfoHeader { width: 100%; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-row; } .formColumnLeft { float: left; display: table-row; width: 90%; } .formColumnRight { float: left; display: table-row; width: 100%; } .formFieldName { color: snow; color: #000000; float: left; text-align: left; white-space: nowrap; padding-left: 3px; } .formData { float: left; } .hostInfoHeader { overflow: hidden; } .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } } .graphItem { background-color: #D5D5D5; } .graphItemAlternate { background-color: #D2D6E7; } .break { height: 0px; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { border-bottom: 1px solid rgba(0,0,0,0.5); } .cactiNavBarBottom { background-color: #00438c; } .tableHeader { display: table-row; color: #000000; font-weight: 700; text-transform: uppercase; border-bottom: 1px solid rgba(0,0,0,0.1); } .tableHeader th.sortable { cursor: pointer !important; line-height: 10px; } .tableHeader th, .tableHeader td { color: #9d9d9d; font-weight: 600; vertical-align: middle; text-align: left; text-transform: none; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .tableHeader th div { display: block; padding-right: 8px; } .tableHeaderColumnSelected { color: white !important; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 3px solid #5CB85C !important; } .tableHeaderColumnHover { color: white !important; } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { cursor: pointer; text-align: left; padding: 3px; outline-style: none; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .tablesorter-headerRow { background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; border-bottom: 1px solid #000; } .tablesorter-headerDesc, .tablesorter-headerAsc { color: white !important; background: none !important; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5) !important; border-bottom: 3px solid #5CB85C !important; } .tablesorter-header-inner { padding: 2px; } .tablesorter-headerUnSorted div.textSubHeaderDark { color: #9d9d9d; } .graphSubHeaderColumn { color: #white; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { max-width: 20px; width: 20px; background: #3F75A2; } .image_table { width: 100%; } .tableConfirmation { width: 100%; text-align: center; background-color: #f5f5f5; border: 1px solid #aaaaaa; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { border-color: #222; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; color: #9D9D9D; width: 100%; text-align: center; line-height: 25px; height: 25px; margin-left: auto; margin-right: auto; } .navBarNavigation a { color: #9D9D9D; } .navBarNavigation a:hover { color: #FFFFFF; } .navBarNavigationPrevious { text-align: left; cursor: pointer; font-weight: bold; float: left; white-space: nowrap; display: block; width: 10%; height: 25px; vertical-align: middle; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .navBarNavigationCenter { text-align: center; display: block; float: left; white-space: nowrap; width: 80%; height: 25px; margin-top: auto; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .navBarNavigationCenter span { vertical-align: middle; } .navBarNavigationNext { text-align: right; cursor: pointer; font-weight: bold; float: right; white-space: nowrap; display: block; width: 10%; height: 25px; vertical-align: middle; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .navBarNavigationNone { text-align: center; display: block; float: left; white-space: nowrap; width: 100%; height: 25px; margin-top: auto; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 12px; background-color: #f5f5f5; } .textArea a { font-size: 1.1em; } .popupBox { position: absolute; padding: 0px; display: none; overflow: auto; color: white; background-color: #e5e5e5; border: 1px solid #e5e5e5; } .installArea { background-color: white; padding: 10px; } .cactiInstallArea { background-color: #e5e5e5; } .textAreaNotes { font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; } .textEditTitle { font-weight: bold; } .textMenuHeader { color: white; background-color: #9C9C9C; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; } .textMenuItem { background-color: #efefef; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuSubItem { background-color: white; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .txtErrorTextBox { border: 2px solid #ff0000 !important; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: bold; } /* tabs */ .tabSpacer { width: 0px; padding-right: 2px; padding-left: 0px; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #dfdfdf; white-space: nowrap; width: 1%; } .deleteMarker { color: rgba(0,0,0,0.6); vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .moveArrow { color: #00438C !important; height: 14px !important; display: inline-block; width: 11.75px; font-size: 14px !important; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { display: inline-block; width: 11.75px; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } td.tab { border-top: 1px solid #999; border-right: 1px solid #666; border-left: 1px solid #999; padding-left: 3px; padding-right: 3px; min-width: 0%; border-bottom: none; border-top-left-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; } .cactiGraphHeaderBackground { display: none; } div#gtabs { padding-bottom: 0px; vertical-align: bottom; display: none !important; position: fixed; right: 5px; top: 5px; height: 30px; } .ellipsis { width: 25px !important; display: none; } .usertabs { float: right !important; width: 78px !important; white-space: nowrap; overflow: hidden; right: 0; } .maintabs { line-height: 30px; float: left; overflow: hidden; height: 32px; } .maintabs a.lefttab, .usertabs a { color: #9d9d9d; float: left !important; padding: 5px 8px; text-decoration: none; font-size: 18px; vertical-align: bottom; outline-style: none; border-bottom: 3px solid transparent; } .usertabs { float: right !important; } .usertabs nav ul { float: right; padding-right: 5px; } .usertabs a { padding: 5px 6px; display: block; } .maintabs-has-submenu a { padding: 5px 4px 5px 9px; } .maintabs a.lefttab:hover, .maintabs a:hover { color: white; background: none; } .maintabs a.selected { color: white !important; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 3px solid #5CB85C; } .maintabs nav { display: block; } .maintabs li { bottom: -1px; float: left; } .maintabs-submenu { display: none; } #menu-tab-graphs.maintabs-submenu, .maintabs-submenu-ellipsis a { padding: 5px 5px 5px 0px; color: #9d9d9d; float: left !important; text-decoration: none; font-size: 18px; vertical-align: bottom; outline-style: none; border-bottom: 3px solid transparent; display: block; } .maintabs-submenu i, .maintabs-submenu-ellipsis i { font-size: 18px; } .maintabs-submenu i:hover, .maintabs-submenu-ellipsis i:hover { color: #fff; } div.submenu { display: none; position: absolute; border: 2px solid #2d4ca8; top: 0; left: 0; z-index: 200; } div.submenu span { display: block; } .tabs { float: left; width: 100%; line-height: 20px; border-color: #222; background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #100000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } .tabs a { color: #9d9d9d; float: left !important; padding: 5px 8px; font-size: 14px; vertical-align: bottom; text-decoration: none; outline-style: none; border-bottom: 3px solid transparent; } .tabs a:hover { color: white; } .tabs nav a.selected { color: white; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 3px solid #5CB85C; } .tabs li { bottom: -1px; float: left; margin: 0 3px 0 0; position: relative; } .tabs li.current a, .maintabs li.current a { background: #fff; border-bottom: 1px solid #fff; } .tabs li.current a:hover, .maintabs li.current a:hover { background: #fff; border-bottom: 1px solid #fff; } .tabs nav { border-bottom: 1px solid #000; } .tabs nav:after, .maintabs nav:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } .tabs ul, .maintabs ul { list-style: none; margin: 0; padding: 0; } /* Navigation Area */ #nav { float: left; font-size: 12px; margin: 0px 0; } #nav li a { display: block; padding: 2px 4px 2px 7px; color: #93CEFF; text-decoration: none; } #nav li a.active { font-weight: 600; font-size: 14px; color: #93CEFF; } #nav li a.active:hover { color: white; } th { border-right: 1px groove #9d9d9d; height: 18px; } th:last-child { border-right: none !important; } tr.selected { background: #AAAAAA !important; color: #000000; } tr.selected td:first-child { border-left: 10px solid #5CB85C !important; } tr.selected a.linkEditMain:visited { color: #00008B; } tr:not(.selectable) a.linkEditMain:hover { color: orange; } tr.selectable { border-left: 10px solid transparent !important; white-space: nowrap; } tr.selectable a.linkEditMain:hover { color: blue; } tr.selectable:hover:not(.selected) { background: #AAAAAA; color: #000000; } tr.selected a { color: #0000CD; } #nav li a.pic:hover:not(.selected) { } #nav li a.selected { color: white; } #nav li ul { display: none; padding: 0; border-left: 5px solid #5CB85C; } #nav li ul li a { padding: 2px 4px 2px 35px; outline-style: none; } #nav li ul li a:hover { color: white; } #nav li ul li { list-style: none; padding: 0; } ul#nav { list-style: none; padding: 0; width: 100%; } .clogError { background-color: #FF3932; } .clogWarning { background-color: #EACC00; } .clogSQL { background-color: #6DC8FE; } .clogDebug { background-color: #C4FD3D; } .clogStats { background-color: #96E78A; } .clogLimit { background-color: #EACC00; } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } @media print { .noprint { display: none; } } .ui-tooltip { max-width: 500px; word-break: break-word; } .ui-tooltip-content div.header { color: #3f75a2; } .ui-tooltip-content div.content { font-size: 10px; color: #333333; } .ui-tooltip-content { overflow: auto !important; opacity: 0.95; border: transparent; } div.preformatted { font-family: monospace; white-space: pre; } ul.pagination { display: inline-block; padding: 0; margin: 0; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { color: #9D9D9D; float: left; padding: 0px 2px 2px 2px; text-decoration: none; margin: 0px 1px; } ul.pagination li span { float: left; padding: 0px 0px; text-decoration: none; margin: 0px 1px; } ul.pagination li a.active { color: white; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 1px solid #5CB85C; } ul.pagination li a:hover:not(.active) { color: #FFFFFF; } tr#realtime td:first-child { height: 68px; } .logEmergency { background-color: rgba(255, 6, 6, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logCritical { background-color: rgba(242, 23, 33, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logAlert { background-color: rgba(242, 25, 36, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logWarning { background-color: rgba(255, 122, 48, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logError { background-color: rgba(251, 74, 20, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logNotice { background-color: rgba(250, 253, 158, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logInfo { background-color: rgba(204, 255, 204, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logDebug { background-color: rgba(205, 207, 196, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .darkblue { background: #2d4ca8; } .ui-corner-all { border-radius: 0px !important; -moz-border-radius-bottomright: 0px !important; -moz-border-radius-bottomleft: 0px !important; -moz-border-radius-topright: 0px !important; -moz-border-radius-topleft: 0px !important; } .menuitem { white-space: nowrap; } .menu_glyph { font-size: 12px; vertical-align: 30%; text-align: left; width: 20px; } .submenu_glyph { width: 20px; vertical-align: 10%; } .menuitem span { vertical-align: 20%; } .resetHover { color: black; } .dropdownMenu { font-family: Verdana,Arial,sans-serif; } .hostInfoHeader { background: none repeat scroll 0 0 #fbfdff; } .ui-autocomplete { height: 300px; overflow-y: scroll; overflow-x: hidden; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect-checkboxes span { font-size: 12px; } .ui-multiselect-header { background-color: #E5E5E5; } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-filter, .ui-widget-header { font-weight: normal !important; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter { margin-bottom: 4px; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; } .ui-widget { font-size: unset; } .ui-checkboxradio-icon { display: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { color: white; background-image: linear-gradient(to bottom, #3a3b3c 0%, #100000 100%); background-repeat: repeat-x; } /* New Checkbox Stuff */ .checkboxSwitch { position: relative; display: inline-block; width: 45px; height: 24px; margin-right: 5px; vertical-align: middle; } .checkboxSwitch input { display: none; } .checkboxSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #aaa; -webkit-transition: .4s; transition: .4s; } .checkboxSlider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .checkboxSlider { background-color: #3a3b3c; } input:disabled + .checkboxSlider { cursor: not-allowed; } input:focus + .checkboxSlider { box-shadow: 0 0 1px #3a3b3c; } input:checked + .checkboxSlider:before { -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } /* Rounded.checkboxSliders */ .checkboxSlider.checkboxRound { border-radius: 24px; } .checkboxSlider.checkboxRound:before { border-radius: 50%; } .checkboxLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; } .right { text-align: right; } .radioSwitch { position: relative; display: inline-block; margin-left: 5px; margin-right: 5px; height: 24px; width: 24px; vertical-align: middle; } .radioSwitch input { display: none; } .radioSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; width: 24px; height: 24px; background-color: #aaa; -webkit-transition: .4s; transition: .4s; } .radioSlider:before { display: none; position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .radioSlider { background-color: #3a3b3c; } input:disabled + .radioSlider { cursor: not-allowed; } input:focus + .radioSlider { box-shadow: 0 0 1px #3a3b3c; } input:checked + .radioSlider:before { display: inline-block; } /* Rounded.radioSliders */ .radioSlider.radioRound { border-radius: 24px; } .radioSlider.radioRound:before { border-radius: 50%; } .radioLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; line-height: 20px; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } .ui-tabs-active .ui-tabs-anchor { color: #FFFFFF !important; } .bb-chart { } .bb-chart-arc path { fill: #A8A8A8; } .bb-tooltip { } .bb-legend-item { fill: #A8A8A8; } .bb-grid { fill: #A8A8A8; } .bb-axis { fill: #A8A8A8; } /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: transparent; } .bb path, .bb line { fill: none; stroke: #E0E0E0; } .bb text { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused { opacity: 0.3 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #E0E0E0; stroke: none; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } .bb-chart-arc .bb-gauge-value { fill: #000; /* font-size: 28px !important;*/ } circle { stroke: #7e818f; stroke-width: 1px; fill: transparent !important; } [id*='_edit'] .tableRowGraph:hover, .tableRowGraph:hover td { background: none repeat scroll 0 0 rgba(200,200,200,0.8) !important; } .tableRowGraph { border: 2px solid rgba(0,0,0,0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/main.js���������������������������������������������0000664�0000000�0000000�00000025404�14136337723�0022721�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { var pageName = basename($(location).attr('pathname')); var hostTimer = false; var clickTimeout = false; var hostOpen = false; // Setup the navigation menu setMenuVisibility(); // Add nice search filter to filters if ($('input[id="filter"]').length > 0 && $('input[id="filter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="filterd"]').length > 0 && $('input[id="filterd"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filterd"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="rfilter"]').length > 0 && $('input[id="rfilter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="rfilter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchRFilter).parent('td').css('white-space', 'nowrap'); } $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); /* Start clean up */ //login page $('.cactiLoginLogo').html("<i class='fa fa-paper-plane'/>"); $('.cactiLogoutLogo').html("<i class='fa fa-paper-plane'/>"); /* clean up the navigation menu */ $('.cactiConsoleNavigationArea').find('#menu').appendTo($('.cactiConsoleNavigationArea').find('#navigation')); $('.cactiConsoleNavigationArea').find('#navigation > table').remove(); if ($('#cactiPageBottom').length == 0) { $('<div id="cactiPageBottom" class="cactiPageBottom"><a class="bottom_scroll_up action-icon-user" href="#"><i class="fa fa-arrow-circle-o-up"></i></a></div>').insertAfter('#cactiContent'); } $('.maintabs nav ul li a.lefttab').each( function() { id = $(this).attr('id'); if (id == 'tab-graphs' && $(this).parent().hasClass('maintabs-has-submenu') == 0) { $(this).parent().addClass('maintabs-has-submenu'); $('<div class="dropdownMenu">' +'<ul id="submenu-tab-graphs" class="submenuoptions" style="display:none;">' +'<li><a id="tab-graphs-tree-view" href="'+urlPath+'graph_view.php?action=tree"><span>'+treeView+'</span></a></li>' +'<li><a id="tab-graphs-list-view" href="'+urlPath+'graph_view.php?action=list"><span>'+listView+'</span></a></li>' +'<li><a id="tab-graphs-pre_view" href="'+urlPath+'graph_view.php?action=preview"><span>'+previewView+'</span></a></li>' +'</ul>' +'</div>').appendTo('body'); } else { /* plugin stuff here ? */ } }); /* user menu on the right ... */ if ($('.usertabs').length == 0) { $('.loggedInAs').show(); $('#userDocumentation').remove(); $('#userCommunity').remove(); $('.menuHr').remove(); $('<div class="maintabs usertabs">' +'<nav><ul>' +'<li><a id="menu-user-help" class="usertabs-submenu" href="#"><i class="fa fa-question"></i></a></li>' +'<li class="action-icon-user"><a class="pic" href="#"><i class="fa fa-user"></i></a></li>' +'</ul></nav>' +'</div>').insertAfter('.maintabs'); $('<div class="dropdownMenu">' +'<ul id="submenu-user-help" class="submenuoptions right" style="display:none;">' +'<li><a href="https://www.cacti.net" target="_blank" rel="noopener"><span>'+cactiHome+'</span></a></li>' +'<li><a href="https://github.com/cacti" target="_blank" rel="noopener"><span>'+cactiProjectPage+'</span></a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://forums.cacti.net/" target="_blank" rel="noopener"><span>'+cactiCommunityForum+'</span></a></li>' +'<li><a href="https://github.com/Cacti/documentation/blob/develop/README.md" target="_blank" rel="noopener"><span>'+cactiDocumentation+'</span></a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://github.com/Cacti/cacti/issues/new" target="_blank" rel="noopener"><span>'+reportABug+'</span></a></li>' +'<li><a href="'+urlPath+'about.php"><span>'+aboutCacti+'</span></a></li>' +'</ul>' +'</div>').appendTo('body'); } ajaxAnchors(); /* User Menu */ $('.menuoptions').parent().appendTo('body'); $('.action-icon-user').unbind().click(function(event) { event.preventDefault(); if ($('.menuoptions').is(':visible') === false) { $('.submenuoptions').stop().slideUp(120); $('.menuoptions').stop().slideDown(120); } else { $('.menuoptions').stop().slideUp(120); } return false; }); $('.bottom_scroll_up').unbind().click(function(event) { event.preventDefault(); $('#navigation_right').animate({ scrollLeft:0, scrollTop: 0 }, 1000, 'easeInOutQuart'); }); /* Highlight sortable table columns */ $('.tableHeader th').has('i.fa-sort').removeClass('tableHeaderColumnHover tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-up').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-down').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort').hover( function() { $(this).addClass("tableHeaderColumnHover"); }, function() { $(this).removeClass( "tableHeaderColumnHover"); } ); $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); // Turn file buttons into jQueryUI buttons $('.import_label').button(); $('.import_button').change(function() { text=this.value; setImportFile(text); }); setImportFile(noFileSelected); function setImportFile(fileText) { $('.import_text').text(fileText); } $('select.colordropdown').dropcolor(); $('select').not('.colordropdown').each(function() { if ($(this).prop('multiple') != true) { $(this).each(function() { id = $(this).attr('id'); $(this).selectmenu({ open: function(event, ui) { var instance = $(this).selectmenu('instance'); instance.menuInstance.focus(null, instance._getSelectedItem()); }, change: function(event, ui) { $(this).val(ui.item.value).change(); }, position: { my: "left top", at: "left bottom", collision: "flip" }, width: 'auto' }); $('#'+id+'-menu').css('max-height', '250px'); }); } else{ $(this).addClass('ui-state-default ui-corner-all'); } }); $('#host').unbind().autocomplete({ source: pageName+'?action=ajax_hosts', autoFocus: true, minLength: 0, select: function(event,ui) { $('#host_id').val(ui.item.id); callBack = $('#call_back').val(); if (callBack != 'undefined') { if (callBack.indexOf('applyFilter') >= 0) { applyFilter(); } else if (callBack.indexOf('applyGraphFilter') >= 0) { applyGraphFilter(); } } else if (typeof applyGraphFilter === 'function') { applyGraphFilter(); } else { applyFilter(); } } }).addClass('ui-state-default ui-selectmenu-text').css('border', 'none').css('background-color', 'transparent'); $('#host_click').css('z-index', '4'); $('#host_wrapper').unbind().dblclick(function() { hostOpen = false; clearTimeout(hostTimer); clearTimeout(clickTimeout); $('#host').autocomplete('close').select(); }).click(function() { if (hostOpen) { $('#host').autocomplete('close'); clearTimeout(hostTimer); hostOpen = false; } else { clickTimeout = setTimeout(function() { $('#host').autocomplete('search', ''); clearTimeout(hostTimer); hostOpen = true; }, 200); } $('#host').select(); }).on('mouseenter', function() { $(this).addClass('ui-state-hover'); $('input#host').addClass('ui-state-hover'); }).on('mouseleave', function() { $(this).removeClass('ui-state-hover'); $('#host').removeClass('ui-state-hover'); hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); hostOpen = false; }); var hostPrefix = ''; $('#host').autocomplete('widget').each(function() { hostPrefix=$(this).attr('id'); if (hostPrefix != '') { $('ul[id="'+hostPrefix+'"]').on('mouseenter', function() { clearTimeout(hostTimer); }).on('mouseleave', function() { hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); $(this).removeClass('ui-state-hover'); $('input#host').removeClass('ui-state-hover'); }); } }); /* Replace icons */ $('.fa-arrow-down').addClass('fa-chevron-down').removeClass('fa-arrow-down'); $('.fa-arrow-up').addClass('fa-chevron-up').removeClass('fa-arrow-up'); $('.fa-remove').addClass('fa-trash-o').removeClass('fa-remove'); setNavigationScroll(); } function setMenuVisibility() { storage=Storages.localStorage; // Initialize the navigation settings // This will setup the initial visibility of the menu $('li.menuitem').each(function() { var id = $(this).attr('id'); if (storage.isSet(id)) { var active = storage.get(id); } else { var active = null; } if (active != null && active == 'active') { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); } else { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); } if ($(this).find('a.selected').length == 0) { //console.log('hiding1:'+$(this).closest('.menuitem').attr('id')); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); storage.set($(this).closest('.menuitem').attr('id'), 'collapsed'); } else { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); storage.set($(this).closest('.menuitem').attr('id'), 'active'); } }); // Functon to give life to the Navigation pane $('#nav li:has(ul) a.active').unbind().click(function(event) { event.preventDefault(); id = $(this).closest('.menuitem').attr('id'); if ($(this).next().is(':visible')) { $(this).next('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).next().slideUp( { duration: 200, easing: 'swing' } ); storage.set(id, 'collapsed'); } else { $(this).next('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true'); $(this).next().slideToggle( { duration: 200, easing: 'swing' } ); if ($(this).next().is(':visible')) { storage.set($(this).closest('.menuitem').attr('id'), 'active'); } else { storage.set(id, 'collapsed'); } } $('li.menuitem').not('#'+id).each(function() { text = $(this).attr('id'); id = $(this).attr('id'); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).find('ul').slideUp( { duration: 200, easing: 'swing' } ); storage.set($(this).attr('id'), 'collapsed'); }); }); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/pace.css��������������������������������������������0000664�0000000�0000000�00000004003�14136337723�0023051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: #5CB85C; position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 3px; } .pace .pace-progress-inner { display: block; position: absolute; right: 0px; width: 100px; height: 100%; box-shadow: 0 0 18px #5CB85C, 0 0 5px #5CB85C opacity: 1.0; -webkit-transform: rotate(3deg) translate(0px, -4px); -moz-transform: rotate(3deg) translate(0px, -4px); -ms-transform: rotate(3deg) translate(0px, -4px); -o-transform: rotate(3deg) translate(0px, -4px); transform: rotate(3deg) translate(0px, -4px); } .pace .pace-activity { display: block; position: fixed; z-index: 2000; top: 25%; right: 50%; width: 25px; height: 25px; border: solid 4px transparent; border-top-color: #5CB85C; border-left-color: #5CB85C; border-radius: 18px; -webkit-animation: pace-spinner 400ms linear infinite; -moz-animation: pace-spinner 400ms linear infinite; -ms-animation: pace-spinner 400ms linear infinite; -o-animation: pace-spinner 400ms linear infinite; animation: pace-spinner 400ms linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-moz-keyframes pace-spinner { 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes pace-spinner { 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes pace-spinner { 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paper-plane/rrdtheme.php����������������������������������������0000664�0000000�0000000�00000001476�14136337723�0023765�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $rrdcolors['back'] = '1D1F21'; $rrdcolors['canvas'] = '060606'; $rrdcolors['shadea'] = '0B0B0B'; $rrdcolors['shadeb'] = '292929'; $rrdcolors['grid'] = '545454'; $rrdcolors['mgrid'] = '6A6C6C'; $rrdcolors['font'] = 'FFFFFF'; $rrdcolors['axis'] = '2C4D43'; $rrdcolors['arrow'] = '2C4D43'; $rrdcolors['frame'] = '060606'; # RRDtool graph fonts in RRDtool 1.2+ $rrdfonts['title']['font'] = 'Arial'; $rrdfonts['title']['size'] = '11'; $rrdfonts['axis']['font'] = 'Arial'; $rrdfonts['axis']['size'] = '8'; $rrdfonts['legend']['font'] = 'Courier'; $rrdfonts['legend']['size'] = '8'; $rrdfonts['unit']['font'] = 'Arial'; $rrdfonts['unit']['size'] = '8'; $rrdfonts['watermark']['font'] = 'Arial'; $rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 0; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/������������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0020015�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/billboard.css�����������������������������������������������0000664�0000000�0000000�00000010367�14136337723�0022470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/default/����������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021441�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/default/index.php�������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023254�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/�����������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021262�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/128/�������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0021574�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/128/bar-alpha.png������������������������������������0000664�0000000�0000000�00000003034�14136337723�0024131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/128/bar.png������������������������������������������0000664�0000000�0000000�00000002064�14136337723�0023050�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/128/map.png������������������������������������������0000664�0000000�0000000�00000110316�14136337723�0023061�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/cacti_logo.gif���������������������������������������0000664�0000000�0000000�00000013011�14136337723�0024050�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/cacti_logo.svg���������������������������������������0000664�0000000�0000000�00000041220�14136337723�0024105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/favicon.ico������������������������������������������0000664�0000000�0000000�00000002576�14136337723�0023415�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/favicon.png������������������������������������������0000664�0000000�0000000�00000014233�14136337723�0023420�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/index.php��������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023075�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/logotype-a.png���������������������������������������0000664�0000000�0000000�00000030026�14136337723�0024051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/logotype-b.png���������������������������������������0000664�0000000�0000000�00000041221�14136337723�0024051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/tab_list.gif�����������������������������������������0000664�0000000�0000000�00000001522�14136337723�0023552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷|�€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###������������������������������������������������������������������������������������������&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¤�,�������/�I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/tab_preview.gif��������������������������������������0000664�0000000�0000000�00000001541�14136337723�0024261�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ �������������������������������������������������������  !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��D�,�������>�‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/images/tab_tree.gif�����������������������������������������0000664�0000000�0000000�00000001542�14136337723�0023540�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ ����������������������������������������������������������������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¥�,�������?�K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/index.php���������������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0021630�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/jquery.multiselect.css��������������������������������������0000664�0000000�0000000�00000005277�14136337723�0024412�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/jquery.multiselect.filter.css�������������������������������0000664�0000000�0000000�00000000622�14136337723�0025663�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/jquery.zoom.css���������������������������������������������0000664�0000000�0000000�00000012362�14136337723�0023035�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; background-color: #3f75a2; height:0; position:absolute; z-index:auto; filter:alpha(opacity=40); -moz-opacity:0.4; -khtml-opacity:0.4; opacity:0.4; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; background-color: #3f75a2; height:0; position:absolute; z-index:auto; filter:alpha(opacity=30); -moz-opacity:0.3; -khtml-opacity:0.3; opacity:0.3; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #191970; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid #3f75a2; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid #3f75a2; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; color: snow; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #323232; padding-left: 3px; padding-right: 3px; border: 1px solid rgba(0,0,0,0.75); } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #111111; } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #323232; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #111111; } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #323232; z-index: auto; } .zoom-menu { border:1px solid #aaa; position:absolute; background:#fff; display:none; font-size: 1em; z-index:auto; } .zoom-menu .first_li span { width:150px; display:block; padding:5px 10px; cursor:pointer } .zoom-menu .inner_li { display:none; margin-left:150px; position:absolute; border:1px solid #aaa; border-left:1px solid #ccc; margin-top:-28px; background:#fff; } .zoom-menu .sep_li { border-top: 1px solid #c5c5c5; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float:left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { float: right; margin-left: 0.4em; margin-right:0.2em; margin-top: 2px; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } .zoom-menu-hover { background: #E0EDFE; cursor: pointer; } .zoom-menu-highlight { background: #E0EDFE; } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/main.css����������������������������������������������������0000664�0000000�0000000�00000111146�14136337723�0021457�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main styles */ body, table, tr, td, textarea { font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', 'Helvetica Neue', 'BBAlpha Sans', 'S60 Sans', Arial, sans-serif; font-size: 12px; -ms-overflow-style: scrollbar; } body { margin: 0px; background-color: white; background-repeat: repeat-y; overflow: hidden; } textarea { font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', 'Helvetica Neue', 'BBAlpha Sans', 'S60 Sans', Arial, sans-serif; font-size: 1.0em; padding: 5px; width: 400px; height: 100px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: left; } td, th { padding: 0px; margin: 0px; } th { white-space: nowrap; height: 20px; line-height: 20px; user-select: none; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; } img { border: none; vertical-align: middle; } i.fa, i.fas, i.fab, i.far, i.fal { padding: 0px 3px; font-size: 13px; vertical-align: middle; } .menu_parent i.fa, .menu_parent i.fas, .menu_parent i.fab, .menu_parent i.far, .menu_parent i.fal { color: #3F75A2; } fieldset { border: none; padding: 0px; margin: 0px; } hr.menu { border: 0; height: 1px; background: #333; background-image: linear-gradient(to right, #ccc, #333, #ccc); } .reindex_methods span { font-size: 9px; } .checkboxLabel { display: none; } .realms .checkboxLabel { display: inline !important; } /* links */ a, a:active, a:visited { color: #2d4ca8; text-decoration: none; font-size: 12px; } a:hover { text-decoration: none; color: #333333; } th .fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } #main { display: none; width: 100%; position: relative; z-index: 0; } input, select { padding: 0.4em 0.4em 0.4em 0.4em; } label { white-space: nowrap; } .glyph_tab-console:before { content: "\f1b0"; } .text_tab-console { display: none; } .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right !important; } .left { text-align: left; } .center { text-align: center !important; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; font-weight: bold; cursor: pointer; } .filter { position: relative; left: -20px; margin-right: -10px; font-size: 13px !important; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: green; font-size: 1.5em !important; vertical-align: bottom; } .associated { color: green; font-weight: bold; } .notAssociated { color: red; font-weight: bold; } .disabled_row span, .disabled_row td, .disabled_row a { color: grey; } .disabled { color: grey; font-weight: bold; } .idle { color: green; font-weight: bold; } .running { color: red; font-weight: bold; } .newObject { color: blue; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: green; } .failed { color: red; } .accessGranted { color: green; font-weight: bold; } .accessGrantedItem { color: green; } .accessRestricted { color: red; font-weight: bold; } .accessRestrictedItem { color: red; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .drillDown { cursor: pointer; } .monoSpace { font-size: 9px; font-family: monospace; } .utilityPick { width: 200px; } .itemlist { max-height: 200px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { display: block; width: 100%:; } .deviceUp { color: rgba(40, 180, 40, 1.0) !important; } .deviceDown { color: #ff0000 !important; } .deviceUnknown { color: #0000ff !important; } .deviceDisabled { color: #a1a1a1 !important; } .deviceRecovering { color: #ff8f1e !important; } .deviceError { color: #750F7D !important; } .deviceDownMuted { color: #ffe333 !important; } .deviceThreshold { color: #ffa833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #aa7807 !important; } .deviceAlert { color: #660000 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff0000; } .deviceUnknownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #0000ff; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #a1a1a1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff8f1e; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffe333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffa833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #aa7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: rgba(148, 179, 107, 0.8); } .notBeingGraphed { color: #484848; } .submenuoptions { background: white; border-width: 0px 3px 3px 3px; border-color: rgba(0,0,0,0.7); border-style: solid; position: absolute; top: 45px; list-style: none; text-align: left; margin: 0px; padding: 10px 0px 10px 0px; } .submenuoptions li a { display: block; padding: 2px 15px 2px 15px; font-size: 14px; font-weight: light; color: rgba(0,0,0,0.9); text-decoration: none; } .submenuoptions li a:hover { display: block; background: rgba(0,0,0,0.1); } .menuoptions { background: white; border-width: 0px 3px 3px 3px; border-color: rgba(0,0,0,0.7); border-style: solid; display: block; float: right; position: absolute; right: 0px; top: 45px; list-style: none; text-align: right; margin: 0px; padding: 10px 0px 10px 0px; } .menuoptions li a { display: block; padding: 2px 15px 2px 15px; font-size: 14px; font-weight: light; color: rgba(0,0,0,0.9); text-decoration: none; } .menuoptions li a:hover { display: block; background: rgba(0,0,0,0.1); } .import_label { opacity: 1; } .import_button { display: none; opacity: 0; } .import_text { opacity: 1; color: #2d4ca8; } .color-icon { background-image: none !important; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0px 5px 0px 0px; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: lime; font-weight: bold; font-size: 14px; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: rgba(255, 204, 0, 0.8); font-size: 14px; } .deletequery { cursor: pointer; padding: 2px; vertical-align: middle; color: red !important; font-weight: bold; font-size: 14px; } .deletequery:hover { color: red !important; text-decoration: none; padding: 2px; vertical-align: middle; } .odd { background: none repeat scroll 0 0 #F5F5F5; border: none; } .odd td, .even td, .even-alternate td { min-height: 20px !important; line-height: 20px; } .even { background: none repeat scroll 0 0 #E5E5E5; border: none; } .even-alternate { #background: none repeat scroll 0 0 #E7E9F2; #background-color: #E7E9F2; border: none; #box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .saveRow { background-color: #EAEAEA; text-align: right; padding: 4px; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid #006400; vertical-align: top; } .linkMarker { color: #c16921; } .filteredValue { background-color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438c; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { color: #000000; font-size: 10px; font-weight: normal; font-family: monospace; } .hostDown { color: #ff0000; font-size: 10px; font-weight: normal; font-family: monospace; } .cactiPageHead { background-color: rgba(0,0,0,0.7); height: 45px; width: 100%; padding: 0px; } .cactiPageHead div { left: 0; top: 0; } .cactiPageHead #tabs { overflow-x: auto; overflow-y: hidden; } .cactiGraphPageHeadBackdrop { padding-bottom: 0px; float: right; position: fixed; } .cactiPageBottom { background-color: rgba(0,0,0,0.7); height: 15px; width: 100%; position: fixed; bottom: 0; left: 0; z-index: 3; } .cactiConsolePageHeadBackdrop { padding-bottom: 0px; float: right; position: fixed; } .navigation { overflow: hidden; } .debug td { padding: 3px; margin: 0px; } .breadCrumbBar { display: none !important; } .cactiContent { clear: both; width: 100%; vertical-align: top; } .cactiTreeNavigationArea { background: #f0f0f0; overflow-y: auto; margin-left: 0px; margin-right: 0px; height: 100%; float: left; display: none; } .cactiTreeNavigationArea a { padding-right: 18px !important; } .cactiTreeNavigationArea div:first-child { padding-left: 5px; } .cactiTreeSearch { padding-top: 5px; } .jstree { position: relative; display: block; } .cactiContentNavigationArea { overflow: hidden; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: top; left: 0px; } .cactiConsoleNavigationArea { background: #f0f0f0; overflow-y: auto !important; overflow-x: hidden; width: 170px; height: 100%; float: left; } .cactiLogo { background: transparent url('./images/cacti_logo.svg') no-repeat 30px; display: none; cursor: pointer; padding-bottom: 140px; margin-bottom: 60px; width: 156px; margin-top: -6px; margin-left: 2px; margin-right: 2px; } .loginLeft, .logoutLeft { width: 33%; float: left; } .loginCenter, .logoutCenter { -moz-border-radius: 10px; border-radius: 10px; position: relative; padding: 30px 0px 5px 20px; background-color: white; top: 30%; max-width: 360px; max-height: 300px; margin-left: auto; margin-right: auto; background: rgba(255,255,255,1); background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(255,255,255,1)), color-stop(47%, rgba(246,246,246,1)), color-stop(100%, rgba(237,237,237,1))); background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: -o-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); background: linear-gradient(to bottom, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ededed', GradientType=0 ); } .cactiLoginLogo, .cactiLogoutLogo { position: relative; z-index: 2; margin-bottom: 0px; color: #223a80; font-size: 48px; float: right; } .cactiLoginLogo i, .cactiLogoutLogo i { margin-right: 10px; } .loginArea, .logoutArea { -moz-border-radius: 10px; border-radius: 10px; position: relative; min-height: 200px; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .loginErrors, .logoutErrors { color: red; min-height: 15px; } legend { font-size: 22px; font-weight: bold; } .loginRight, .logoutRight { width: 33%; float: right; } .loginBody, .logoutBody { background: #2d4ca8; background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJkNGNhOCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxYTE5NWUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); background: -moz-linear-gradient(left, #2d4ca8 0%, #1a195e 100%); background: -webkit-gradient(linear, left top, right top, color-stop(0%,#2d4ca8), color-stop(100%,#1a195e)); background: -webkit-linear-gradient(left, #2d4ca8 0%,#1a195e 100%); background: -o-linear-gradient(left, #2d4ca8 0%,#1a195e 100%); background: -ms-linear-gradient(left, #2d4ca8 0%,#1a195e 100%); background: linear-gradient(to right, #2d4ca8 0%,#1a195e 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2d4ca8', endColorstr='#1a195e',GradientType=1 ); } .versionInfo { padding-top: 5px; float: right; margin-top: 10px; color: white; } .actionsDropdown { vertical-align: middle; padding: 3px; width: 100%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdownButton { vertical-align: top; float: right; margin-left: 3px; margin-right: 5px; display: table-cell; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .cactiTooltipHint { cursor: pointer; padding: 5px; font-size: 14px !important; } .spikekillData, .spikekillData td { border: 1px solid #999; } .spikekillNote { padding: 1px; } .spikekillMenu { background: #f5f5f5 none repeat scroll 0 0; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; margin: 0; padding: 2px; line-height: 1.5em; } .spikekillMenu li { vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .loginPanel { padding: 4px 0px; } .treeTable { width: 100%; } .treeArea { vertical-align: top; } .graphWrapper { position: relative; } .cactiGraphContentArea { height: 100vh; display: none; overflow-y: auto !important; overflow-x: hidden !important; margin-right: 5px; } .cactiGraphContentArea>div:last-child { margin-top: 10px; } .cactiGraphContentAreaPreview { height: 100vh; overflow-y: auto !important; overflow-x: hidden !important; padding-left: 10px; margin-right: 5px; } .cactiGraphContentAreaPreview>div:last-child { margin-top: 10px; } .cactiConsoleContentArea { height: 92vh; overflow-y: auto !important; overflow-x: hidden; padding-left: 10px; margin-right: 5px; } .cactiConsoleContentArea>div:last-child { margin-top: 20px; } .cactiConsoleContentArea>main:last-child { margin-top: 20px; } .hyperLink { color: #2d4ca8; font-size: 12px; padding: 3px; cursor: pointer; text-decoration: none; } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: #2d4ca8; text-decoration: none; font-size: 12px; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: yellow; white-space: nowrap; text-decoration: none; } .linkOverDark, .linkOverDark:visited, .linkOverDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: white; text-decoration: none; } .linkCopyDark, .linkCopyDark:visited, .linkCopyDark:active { color: white; font-weight: normal; text-decoration: none; cursor: pointer; } .linkCopyDark:hover { color: white; text-decoration: none; } /* text styles */ .textError { font-size: 12px; color: red; } .textWarning { font-size: 12px; color: #ee7600 !important; } .textInfo { font-size: 12px; color: black; } .textHeader { font-size: 12px; font-weight: bold; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; display: none; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: white; border: 1px solid #BBBBBB; position: relative; z-index: 4; } .textHeaderDark { font-size: 12px; font-weight: bold; color: white; } .templateHeader { background: rgba(0,0,0,0.55); } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { font-size: 11px; color: white; font-weight: bold; padding: 0px; white-space: nowrap; } .cactiBorderWall { border-width: 1px; border-color: #E5E5E5; border-style: solid; } .cactiTable { display: table; width: 100%; margin-left: auto; margin-right: auto; } .cactiInstallLoaderSpinnerTheme { border-top-color: rgba(0,0,0,0.9) !important; } .cactiTableTitleRow { color: white; float: left; padding-left: 3px; text-align: left; display: block; width: 100%; height: 28px; line-height: 28px; font-size: 1em; font-weight: 700; background: rgba(0,0,0,0.9); } .cactiTableTitle { color: white; float: left; padding-left: 3px; text-align: left; display: block; width: 70%; height: 28px; line-height: 28px; font-size: 1em; font-weight: 700; background: rgba(0,0,0,0.9); } .cactiTableButton { float: right; padding: 0px; display: block; text-align: right; width: calc(30% - 3px); height: 28px; line-height: 28px; background: rgba(0,0,0,0.9); white-space: nowrap; } .cactiTableButton.debug { background: transparent; float: right; padding: 0px; padding-bottom: 3px; margin-right: -5px; } .cactiTableButton span, .cactiTableTitle span { color: white; padding: 0px; white-space: nowrap; overflow: hidden; } .cactiTableButton i { padding: 0px 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0px 8px !important; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-column; text-align: left; } .formColumnLeft { float: left; display: table-column; width: 45%; text-align: left; } .formColumnRight { float: left; display: table-column; width: 45%; text-align: left; } .formData { display: inline-block; float: left; text-align: left; } .formRadio { line-height: 22px; } .formSubCheckbox { line-height: 20px; height: 20px; float: left; } .formSubCheckbox input { margin: 0px; vertical-align: -10%; } .formSubCheckbox label { } .formCheckbox { vertical-align: -15%; } .formFieldName { display: inline-block; color: #000000; float: left; text-align: left; font-weight: bold; padding-left: 3px; } .formFieldDescription { float: left; text-align: left; font-weight: normal; line-height: 14px; } .formTooltip { display: inline-block; padding-left: 4px; } .formHeader { float: left; width: 100%; text-align: left; line-height: 25px; background: rgba(0, 0, 0, 0.55) none repeat scroll 0 0; color: white; font-weight: bold; } .formHeaderText { padding-left: 3px; } .formHeaderAnchor { float: right; padding-right: 8px; } .hostInfoHeader { width: 100%; } .queryAdd, .templateAdd { padding: 3px; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 35px; } .formColumn { float: left; display: table-row; color: #000000; } .formColumnLeft { float: left; display: table-row; width: 90%; color: #000000; text-align: left; } .formColumnRight { float: left; display: table-row; width: 100%; color: #000000; text-align: left; } .formFieldName { color: #000000; float: left; text-align: left; white-space: nowrap; padding-left: 3px; } .formData { float: left; } .hostInfoHeader { overflow: hidden; } .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } .ui-button-text-only .ui-button-text { padding: 0.4em; } } .graphItem { background-color: #D5D5D5; } .graphItemAlternate { background-color: #D2D6E7; } .break { height: 4px; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { border-bottom: 1px solid rgba(0,0,0,0.5); } .cactiNavBarBottom { background-color: #00438c; } .tableHeader { display: table-row; color: white; background: rgba(0,0,0,0.55); } th.sortable { cursor: pointer; line-height: 10px; } .tableHeader th { color: white; vertical-align: middle; text-align: left; font-size: 11px; font-weight: bold; padding: 0px 2px; height: 28px; line-height: 28px; } .tableHeader th.sortable { cursor: pointer !important; } .tableHeader th div { display: block; padding-right: 8px; font-size: 11px; } .tableHeaderColumnSelected { background: #3F75A2; } .tableHeaderColumnHover { background: rgba(0,0,0,0.4); } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { font-weight: bold; vertical-align: middle; text-align: left; cursor: pointer; padding: 3px; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .graphSubHeaderColumn { color: #white; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { max-width: 20px; width: 20px; background: #3F75A2; } .tableRowGraph td { padding: 3px; vertical-align: top; } .tableRow td { line-height: 20px !important; } .image_table { width: 100%; } .tableConfirmation { width: 100%; text-align: center; background-color: #f5f5f5; border: 1px solid #aaaaaa; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { display: table; color: rgba(0,0,0,0.9); width: 100%; text-align: center; height: 20px; margin-left: auto; margin-right: auto; } .navBarNavigationPrevious { text-align: left; white-space: nowrap; display: table-cell; width: 10%; height: 20px; vertical-align: middle; } .navBarNavigationCenter { text-align: center; display: table-cell; white-space: nowrap; width: 80%; height: 20px; margin-top: auto; } .navBarNavigationCenter span { vertical-align: middle; display: table-cell; } .navBarNavigationNext { text-align: right; white-space: nowrap; display: table-cell; width: 10%; padding: 2px 0px; height: 20px; vertical-align: middle; } .navBarNavigationNone { text-align: center; display: table-cell; white-space: nowrap; width: 100%; height: 20px; margin-top: auto; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 12px; background-color: #f5f5f5; } .textArea a { font-size: 1.1em; } .popupBox { #z-index: 2; position: absolute; padding: 0px; display: none; overflow: auto; color: white; background-color: #e5e5e5; border: 1px solid #e5e5e5; } .installArea { background-color: white; padding: 10px; } .textAreaNotes { font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; } .textEditTitle { font-weight: bold; } .textMenuHeader { color: white; background-color: #9C9C9C; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; } .textMenuItem { background-color: #efefef; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuSubItem { background-color: white; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .txtErrorTextBox { border: 2px solid #ff0000 !important; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: bold; } /* tabs */ .tabSpacer { width: 0px; padding-right: 2px; padding-left: 0px; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #dfdfdf; white-space: nowrap; width: 1%; } .subTab a { height: 14px; border-bottom: 1px solid #555 !important; } .deleteMarker { color: rgba(0,0,0,0.6); vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .deleteMarkerDisabled { color: rgba(0,0,0,0.6); vertical-align: middle; text-decoration: none !important; } .deleteMarkerDisabled:hover { text-decoration: none !important; } .moveArrow { color: #00438C !important; height: 14px !important; display: inline-block; width: 11.75px; font-size: 14px !important; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { display: inline-block; width: 11.75px; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } td.tab { border-top: 1px solid #999; border-right: 1px solid #666; border-left: 1px solid #999; padding-left: 3px; padding-right: 3px; min-width: 0%; border-bottom: none; border-top-left-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; } .cactiGraphHeaderBackground { display: none; } div#gtabs { padding-bottom: 0px; vertical-align: bottom; display: none !important; position: fixed; right: 5px; top: 5px; height: 30px; } .ellipsis { width: 25px !important; display: none; } .usertabs { float: right !important; width: 80px; white-space: nowrap; } .maintabs { line-height: 35px; float: left; overflow: hidden; } .maintabs a.lefttab, .usertabs a { color: #fff; float: left !important; padding: 5px 8px; text-decoration: none; font-size: 18px; vertical-align: bottom; } .maintabs a:hover { background-color: rgba(255,255,255,0.3); } .maintabs a.selected { background-color: rgba(63,117,162,0.8); } .maintabs a:active { font-size: 18px; } .maintabs nav { display: block; } .maintabs li { bottom: -1px; float: left; } .maintabs-submenu { display: none; } #menu-tab-graphs.maintabs-submenu, .maintabs-submenu-ellipsis a { padding: 5px 5px 5px 0px; color: #fff; float: left !important; text-decoration: none; font-size: 18px; vertical-align: bottom; display: block; } .maintabs-submenu i, .maintabs-submenu-ellipsis i { color: #fff; padding-left: 2px; font-size: 18px; border-left: 1px solid #ccc; } div.submenu { display: none; position: absolute; border: 2px solid #2d4ca8; top: 0; left: 0; z-index: 200; } div.submenu span { display: block; } .tabs a { background-color: #ddd; background-image: -moz-linear-gradient(#f0f0f0,#ddd); background-image: -ms-linear-gradient(#f0f0f0,#ddd); background-image: -webkit-linear-gradient(#f0f0f0,#ddd); background-image: linear-gradient(#f0f0f0,#ddd); background-repeat: repeat-x; border: 1px solid #555; border-color: #eee #ccc #ccc #eee; color: #333; float: left !important; padding: 5px 8px; text-decoration: none; font-size: 11px; vertical-align: bottom; } .tabs a:hover { background-color: #ddd; background-image: -moz-linear-gradient(#e0e0e0,#ccc); background-image: -ms-linear-gradient(#e0e0e0,#ccc); background-image: -webkit-linear-gradient(#e0e0e0,#ccc); background-image: linear-gradient(#e0e0e0,#ccc); background-repeat: repeat-x; } .tabs nav a.selected { color: white; boder-bottom: 1px solid rgba(63,117,162,0.8); background: rgba(63,117,162,0.8); } .tabs li { bottom: -1px; float: left; margin: 0 3px 0 0; position: relative; } .tabs li.current a, .maintabs li.current a { background: #fff; border-bottom: 1px solid #fff; } .tabs li.current a:hover, .maintabs li.current a:hover { background: #fff; border-bottom: 1px solid #fff; } .tabs nav { border-bottom: 1px solid #ccc; } .tabs nav:after, .maintabs nav:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } .tabs ul, .maintabs ul { list-style: none; margin: 0; padding: 0; } /* Navigation Area */ #nav { float: left; border-top: 0px solid #999; border-right: 0px solid #999; border-left: 0px solid #999; font-size: 12px; margin: 0px 0; } #nav li a { display: block; padding: 2px 4px 2px 5px; background: #ccc; color: rgba(0,0,0,0.9); text-decoration: none; } #nav li a.active { font-weight: 600; font-size: 14px; background: #f0f0f0; color: #000000; } th { border-right: 1px groove #eee; } th:last-child { border-right: none !important; } tr.selected { color: white; background: rgba(0,0,0,1); } tr.selected a.linkEditMain:visited { color: yellow; } tr:not(.selectable) a.linkEditMain:hover { color: #2d4ca8; } tr.selectable a.linkEditMain:hover { color: yellow; } tr.selectable:hover:not(.selected) { background: rgba(0,0,0,0.3); } tr.selectable td { padding: 3px; } tr.selected a { color: yellow; } #nav li a.pic:hover:not(.selected) { background: rgba(224,224,224,1); } #nav li a.selected { color: white; background: #3F75A2; } #nav li ul { display: none; padding: 0; } #nav li ul li a { padding: 2px 4px 2px 32px; background: #f0f0f0; } #nav li ul li { list-style: none; padding: 0; } ul#nav { list-style: none; padding: 0; width: 100%; } .clogError { background-color: #FF3932; } .clogWarning { background-color: #EACC00; } .clogSQL { background-color: #6DC8FE; } .clogDebug { background-color: #C4FD3D; } .clogStats { background-color: #96E78A; } .clogLimit { background-color: #EACC00; } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } @media print { .noprint { display: none; } } .ui-tooltip { max-width: 500px; word-break: break-word; } .ui-tooltip-content div.header { color: #3f75a2; } .ui-tooltip-content div.content { font-size: 10px; color: #333333; } .ui-tooltip-content { overflow: auto !important; opacity: 0.95; border-radius: 5px !important; border: transparent; } div.preformatted { font-family: monospace; white-space: pre; } ul.pagination { display: inline-block; padding: 0; margin: 0; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { float: left; padding: 0px 2px 2px 2px; text-decoration: none; margin: 0px 1px; vertical-align: -40%; } ul.pagination li span { float: left; padding: 0px 0px; text-decoration: none; margin: 0px 1px; } ul.pagination li a.active { background: #3F75A2; color: white; } ul.pagination li a:hover:not(.active) { background: #f0f0f0; } tr#realtime td:first-child { height: 68px; } .logEmergency { background-color: rgba(255, 6, 6, 0.4); text-align: center; width: 12.5%; padding: 3px; color: black; } .logCritical { background-color: rgba(242, 23, 33, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .logAlert { background-color: rgba(242, 25, 36, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .logWarning { background-color: rgba(255, 122, 48, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .logError { background-color: rgba(251, 74, 20, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .logNotice { background-color: rgba(250, 253, 158, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .logInfo { background-color: rgba(204, 255, 204, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .logDebug { background-color: rgba(205, 207, 196, 0.2); text-align: center; width: 12.5%; padding: 3px; color: black; } .darkblue { background: #2d4ca8; } .ui-corner-all { border-radius: 0px !important; -moz-border-radius-bottomright: 0px !important; -moz-border-radius-bottomleft: 0px !important; -moz-border-radius-topright: 0px !important; -moz-border-radius-topleft: 0px !important; } #graph_view_tree_content2_child > tbody > .tableHeader { background: rgba(0,0,0,0.9); } .menuitem { white-space: nowrap; } .menu_glyph { font-size: 12px; vertical-align: middle; text-align: left; width: 20px; } .menuitem span { vertical-align: middle; } .ui-autocomplete { height: 300px; overflow-y: scroll; overflow-x: hidden; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect-checkboxes span { font-size: 12px; } .ui-multiselect-header { background-color: #E5E5E5; } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-filter, .ui-widget-header { font-weight: normal !important; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter { margin-bottom: 4px; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; } .ui-widget { font-size: unset; } .ui-checkboxradio-icon { display: none; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active, a.ui-button:active, .ui-button:active, .ui-button.ui-state-active:hover { color: white; background: rgba(0,0,0,0.9); } /* New Checkbox Stuff */ .checkboxSwitch { position: relative; display: inline-block; width: 45px; height: 24px; margin-right: 5px; vertical-align: middle; } .checkboxSwitch input { display: none; } .checkboxSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.55); -webkit-transition: .4s; transition: .4s; } .checkboxSlider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .checkboxSlider { background-color: rgba(0,0,0,0.9); } input:disabled + .checkboxSlider { cursor: not-allowed; } input:focus + .checkboxSlider { box-shadow: 0 0 1px #2196F3; } input:checked + .checkboxSlider:before { -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } /* Rounded.checkboxSliders */ .checkboxSlider.checkboxRound { border-radius: 24px; } .checkboxSlider.checkboxRound:before { border-radius: 50%; } .checkboxLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; } .right { text-align: right; } .radioSwitch { position: relative; display: inline-block; margin-left: 5px; margin-right: 5px; height: 24px; width: 24px; vertical-align: middle; } .radioSwitch input { display: none; } .radioSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; height: 24px; width: 24px; background-color: rgba(0, 0, 0, 0.55); -webkit-transition: .4s; transition: .4s; } .radioSlider:before { display: none; position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .radioSlider { background-color: rgba(0,0,0,0.9); } input:disabled + .radioSlider { cursor: not-allowed; } input:focus + .radioSlider { box-shadow: 0 0 1px #2196F3; } input:checked + .radioSlider:before { display: block; } /* Rounded.radioSliders */ .radioSlider.radioRound { border-radius: 24px; } .radioSlider.radioRound:before { border-radius: 50%; } .radioLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; line-height: 20px; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } .ui-tabs-active .ui-tabs-anchor { color: #FFFFFF !important; } [id*='_edit'] .tableRowGraph:hover { background-color: rgba(0, 0, 255, .3) !important; border-left: 2px solid yellow !important; border-right: 2px solid yellow !important; } .tableRowGraph { border: 2px solid rgba(0,0,0,0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/main.js�����������������������������������������������������0000664�0000000�0000000�00000023715�14136337723�0021307�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { var pageName = basename($(location).attr('pathname')); var hostTimer = false; var clickTimeout = false; var hostOpen = false; if ($('#cactiPageBottom').length == 0) { $('<div id="cactiPageBottom" class="cactiPageBottom"></a></div>').insertAfter('#cactiContent'); } // Setup the navigation menu setMenuVisibility(); // Add nice search filter to filters if ($('input[id="filter"]').length > 0 && $('input[id="filter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="filterd"]').length > 0 && $('input[id="filterd"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filterd"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="rfilter"]').length > 0 && $('input[id="rfilter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="rfilter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchRFilter).parent('td').css('white-space', 'nowrap'); } $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); /* Start clean up */ //login page $('.cactiLoginLogo').html("<i class='fa fa-paw'/>").css('font-size: 20px'); /* clean up the navigation menu */ $('.cactiConsoleNavigationArea').find('#menu').appendTo($('.cactiConsoleNavigationArea').find('#navigation')); $('.cactiConsoleNavigationArea').find('#navigation > table').remove(); $('.maintabs nav ul li a.lefttab').each( function() { id = $(this).attr('id'); if (id == 'tab-graphs' && $(this).parent().hasClass('maintabs-has-submenu') == 0 ) { $(this).parent().addClass('maintabs-has-submenu'); $('<div class="dropdownMenu">' +'<ul id="submenu-tab-graphs" class="submenuoptions" style="display:none;">' +'<li><a id="tab-graphs-tree-view" href="'+urlPath+'graph_view.php?action=tree">'+treeView+'</a></li>' +'<li><a id="tab-graphs-list-view" href="'+urlPath+'graph_view.php?action=list">'+listView+'</a></li>' +'<li><a id="tab-graphs-pre_view" href="'+urlPath+'graph_view.php?action=preview">'+previewView+'</a></li>' +'</ul>' +'</div>').appendTo('body'); } }); /* user menu on the right ... */ if ($('.usertabs').length == 0) { $('.loggedInAs').show(); $('#userDocumentation').remove(); $('#userCommunity').remove(); $('.menuHr').remove(); $('<div class="maintabs usertabs">' +'<nav><ul>' +'<li><a id="menu-user-help" class="usertabs-submenu" href="#"><i class="fa fa-question"></i></a></li>' +'<li class="action-icon-user"><a class="pic" href="#"><i class="fa fa-user"></i></a></li>' +'</ul></nav>' +'</div>').insertAfter('.maintabs'); $('<div class="dropdownMenu">' +'<ul id="submenu-user-help" class="submenuoptions right" style="display:none;">' +'<li><a href="https://www.cacti.net" target="_blank" rel="noopener"><span>'+cactiHome+'</span></a></li>' +'<li><a href="https://github.com/cacti" target="_blank rel="noopener""><span>'+cactiProjectPage+'</span></a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://forums.cacti.net/" target="_blank" rel="noopener"><span>'+cactiCommunityForum+'</span></a></li>' +'<li><a href="https://github.com/Cacti/documentation/blob/develop/README.md" target="_blank" rel="noopener"><span>'+cactiDocumentation+'</span></a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://github.com/Cacti/cacti/issues/new" target="_blank" rel="noopener"><span>'+reportABug+'</span></a></li>' +'<li><a href="'+urlPath+'about.php"><span>'+aboutCacti+'</span></a></li>' +'</ul>' +'</div>').appendTo('body'); } ajaxAnchors(); /* User Menu */ $('.menuoptions').parent().appendTo('body'); $(window).trigger('resize'); $('.action-icon-user').unbind().click(function(event) { event.preventDefault(); if ($('.menuoptions').is(':visible') === false) { $('.submenuoptions').slideUp(120); $('.menuoptions').slideDown(120); } else { $('.menuoptions').slideUp(120); } return false; }); /* Highlight sortable table columns */ $('.tableHeader th').has('i.fa-sort').removeClass('tableHeaderColumnHover tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-up').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-down').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort').hover( function() { $(this).addClass('tableHeaderColumnHover'); }, function() { $(this).removeClass('tableHeaderColumnHover'); } ); $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); $('select.colordropdown').dropcolor(); $('select').not('.colordropdown').each(function() { if ($(this).prop('multiple') != true) { $(this).each(function() { id = $(this).attr('id'); $(this).selectmenu({ change: function(event, ui) { $(this).val(ui.item.value).change(); }, position: { my: "left top", at: "left bottom", collision: "flip" }, width: 'auto' }); $('#'+id+'-menu').css('max-height', '250px'); }); } else { $(this).addClass('ui-state-default ui-corner-all'); } }); $('#host').unbind().autocomplete({ source: pageName+'?action=ajax_hosts', autoFocus: true, minLength: 0, select: function(event,ui) { $('#host_id').val(ui.item.id); callBack = $('#call_back').val(); if (callBack != 'undefined') { if (callBack.indexOf('applyFilter') >= 0) { applyFilter(); } else if (callBack.indexOf('applyGraphFilter') >= 0) { applyGraphFilter(); } } else if (typeof applyGraphFilter === 'function') { applyGraphFilter(); } else { applyFilter(); } } }).addClass('ui-state-default ui-selectmenu-text').css('border', 'none').css('background-color', 'transparent'); $('#host_click').css('z-index', '4'); $('#host_wrapper').unbind().dblclick(function() { hostOpen = false; clearTimeout(hostTimer); clearTimeout(clickTimeout); $('#host').autocomplete('close').select(); }).click(function() { if (hostOpen) { $('#host').autocomplete('close'); clearTimeout(hostTimer); hostOpen = false; } else { clickTimeout = setTimeout(function() { $('#host').autocomplete('search', ''); clearTimeout(hostTimer); hostOpen = true; }, 200); } $('#host').select(); }).on('mouseenter', function() { $(this).addClass('ui-state-hover'); $('input#host').addClass('ui-state-hover'); }).on('mouseleave', function() { $(this).removeClass('ui-state-hover'); $('#host').removeClass('ui-state-hover'); hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); hostOpen = false; }); var hostPrefix = ''; $('#host').autocomplete('widget').each(function() { hostPrefix=$(this).attr('id'); if (hostPrefix != '') { $('ul[id="'+hostPrefix+'"]').on('mouseenter', function() { clearTimeout(hostTimer); }).on('mouseleave', function() { hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); $(this).removeClass('ui-state-hover'); $('input#host').removeClass('ui-state-hover'); }); } }); /* Replace icons */ $('.fa-arrow-down').addClass('fa-chevron-down').removeClass('fa-arrow-down'); $('.fa-arrow-up').addClass('fa-chevron-up').removeClass('fa-arrow-up'); $('.fa-remove').addClass('fa-trash-o').removeClass('fa-remove'); setNavigationScroll(); } function setMenuVisibility() { storage=Storages.localStorage; // Initialize the navigation settings // This will setup the initial visibility of the menu $('li.menuitem').each(function() { var id = $(this).attr('id'); if (storage.isSet(id)) { var active = storage.get(id); } else { var active = null; } if (active != null && active == 'active') { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); } else { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); } if ($(this).find('a.selected').length == 0) { //console.log('hiding1:'+$(this).closest('.menuitem').attr('id')); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); storage.set($(this).closest('.menuitem').attr('id'), 'collapsed'); } else { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); storage.set($(this).closest('.menuitem').attr('id'), 'active'); } }); // Functon to give life to the Navigation pane $('#nav li:has(ul) a.active').unbind().click(function(event) { event.preventDefault(); id = $(this).closest('.menuitem').attr('id'); if ($(this).next().is(':visible')) { $(this).next('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).next().slideUp( { duration: 200, easing: 'swing' } ); storage.set(id, 'collapsed'); } else { $(this).next('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true'); $(this).next().slideToggle( { duration: 200, easing: 'swing' } ); if ($(this).next().is(':visible')) { storage.set($(this).closest('.menuitem').attr('id'), 'active'); } else { storage.set(id, 'collapsed'); } } $('li.menuitem').not('#'+id).each(function() { text = $(this).attr('id'); id = $(this).attr('id'); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).find('ul').slideUp( { duration: 200, easing: 'swing' } ); storage.set($(this).attr('id'), 'collapsed'); }); }); } ���������������������������������������������������cacti-release-1.2.19/include/themes/paw/pace.css����������������������������������������������������0000664�0000000�0000000�00000004003�14136337723�0021434�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: #3F75A2; position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 3px; } .pace .pace-progress-inner { display: block; position: absolute; right: 0px; width: 100px; height: 100%; box-shadow: 0 0 18px #3F75A2, 0 0 5px #3F75A2 opacity: 1.0; -webkit-transform: rotate(3deg) translate(0px, -4px); -moz-transform: rotate(3deg) translate(0px, -4px); -ms-transform: rotate(3deg) translate(0px, -4px); -o-transform: rotate(3deg) translate(0px, -4px); transform: rotate(3deg) translate(0px, -4px); } .pace .pace-activity { display: block; position: fixed; z-index: 2000; top: 25%; right: 50%; width: 25px; height: 25px; border: solid 4px transparent; border-top-color: #3F75A2; border-left-color: #3F75A2; border-radius: 18px; -webkit-animation: pace-spinner 400ms linear infinite; -moz-animation: pace-spinner 400ms linear infinite; -ms-animation: pace-spinner 400ms linear infinite; -o-animation: pace-spinner 400ms linear infinite; animation: pace-spinner 400ms linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-moz-keyframes pace-spinner { 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes pace-spinner { 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes pace-spinner { 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/paw/rrdtheme.php������������������������������������������������0000664�0000000�0000000�00000001475�14136337723�0022347�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $rrdcolors['back'] = 'F3F3F3'; $rrdcolors['canvas'] = 'FDFDFD'; $rrdcolors['shadea'] = 'CBCBCB'; $rrdcolors['shadeb'] = '999999'; $rrdcolors['grid'] = 'C4C4C4'; $rrdcolors['mgrid'] = '1A1C1C'; $rrdcolors['font'] = '000000'; $rrdcolors['axis'] = '2C4D43'; $rrdcolors['arrow'] = '2C4D43'; $rrdcolors['frame'] = '2C4D43'; # RRDtool graph fonts in RRDtool 1.2+ $rrdfonts['title']['font'] = 'Arial'; $rrdfonts['title']['size'] = '11'; $rrdfonts['axis']['font'] = 'Arial'; $rrdfonts['axis']['size'] = '8'; $rrdfonts['legend']['font'] = 'Courier'; $rrdfonts['legend']['size'] = '8'; $rrdfonts['unit']['font'] = 'Arial'; $rrdfonts['unit']['size'] = '8'; $rrdfonts['watermark']['font'] = 'Arial'; $rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 1; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/��������������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0020716�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/billboard.css�������������������������������������������0000664�0000000�0000000�00000010367�14136337723�0023371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*! * Copyright (c) 2017 ~ present NAVER Corp. * billboard.js project is licensed under the MIT license * * billboard.js, JavaScript chart library * https://naver.github.io/billboard.js/ * * @version 3.0.2 */ /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } .bb path, .bb line { fill: none; stroke: #000; } .bb text, .bb .bb-button { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc .bb-gauge-value { fill: #000; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc rect { stroke: #fff; stroke-width: 1; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ .bb-axis { shape-rendering: crispEdges; } /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused, .bb-circles.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step, .bb-circles.bb-focused path.bb-line, .bb-circles.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused, .bb-circles.bb-defocused { opacity: 0.3 !important; } .bb-target.bb-defocused .text-overlapping, .bb-circles.bb-defocused .text-overlapping { opacity: .05 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Zoom region --*/ .bb-zoom-brush { fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; user-select: none; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; user-select: none; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #fff; empty-cells: show; opacity: 0.9; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; } .bb-tooltip tr { border: 1px solid #CCC; } .bb-tooltip th { background-color: #aaa; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #fff; border-left: 1px dotted #999; } .bb-tooltip td > span, .bb-tooltip td > svg { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip.value { text-align: right; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs-gauge-title { dominant-baseline: middle; font-size: 2.7em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #e0e0e0; stroke: #fff; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } /*-- Radar --*/ .bb-chart-radars .bb-levels polygon { fill: none; stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-levels text { fill: #848282; } .bb-chart-radars .bb-axis line { stroke: #848282; stroke-width: .5px; } .bb-chart-radars .bb-axis text { font-size: 1.15em; cursor: default; } .bb-chart-radars .bb-shapes polygon { fill-opacity: .2; stroke-width: 1px; } /*-- Button --*/ .bb-button { position: absolute; top: 10px; right: 10px; } .bb-button .bb-zoom-reset { font-size: 11px; border: solid 1px #ccc; background-color: #fff; padding: 5px; border-radius: 5px; cursor: pointer; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/default/������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022342�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/default/index.php���������������������������������������0000664�0000000�0000000�00000000050�14136337723�0024155�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/�������������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022163�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/128/���������������������������������������������0000775�0000000�0000000�00000000000�14136337723�0022475�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/128/bar-alpha.png��������������������������������0000664�0000000�0000000�00000003034�14136337723�0025032�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR������€��|yyÎ���tEXtSoftware�Adobe ImageReadyqÉe<��¾IDATxÚbüÿÿ? °�1'2‡™ÃÌ@æ"s„‘9"ÄÉàV&ˆÓR~¬ F˜XΞ=ËÉÈȈfòÀšX€j`"‚ a˜b°Ì!pç!@…Â0]‚(n[“[ @ gΜq@ÎÓ >H=7� ò‚0ÀÜ#€¬ æ6˜ ŒC‰PS1TUˆàT‰â$˜JA\*…±ùÅñ` lÚy±y“];@�:ɉAˆ¢´LU]e%ŽH,wè!z‡¢‡è¸B$‰C¡0˜þ·ÓÙi æýlÙ$pˆ›öçÈ¥~¾¹ÑÆ2K…2²È9óN‘˜gçHÌ‹Â%ó*ã ṎY+ÔN 5fRHP¦³Uh#1;™]$'©š¦á÷)RJFÎ~ÓDÁ„“³Vqó¾kúšn>~LïîïþÜ5¿×|ýë^Æ}ògïUè¡ Æ]3«¡ FîsP"1G™#”idIarÊœ0gæHÌEa‘adŒ¹jͪ`¤û¦°©`dü€“2¸A „‚h4Ù]ݶϜ¬Á,Â,Â"¬aKÀ¬À»'"Cò“/È(7<fþ€÷-2Y ‘B(1–TÃýOàÔ°ùƾ’šˆ9†'Ž5ÁoðÄ…iÂÃn�qòDlH)QUãÎ/ôˆÇ–‰š¸Wëxj½æŸˆgÕõ¬/¬3”Ø+‹ÕÄ«ZGYãM"f sm‚åÄû_½fe2«Ldo„¹~È W_áSÕ8õ4ú^¿Z¿žOŒ½xyâ[u=(®?bm7Ã0PäñÁŒÀ ìÀìŬÀlÀ�|[Jä:Û>•Zs=ßÙ×Âý>´ÇÓênõ M<º9ª˜å_ðŠ`$3äÑC?ÞTÔ•6‘«]™#æâŠòJæ 8£1–á·l‰b`¤«ÃÚ ãiFØ Åc ñH­ŽHŒgk”@µˆÃØ~W)¥1^¬ŽHŒa¤*›´OvõÖäaìž¹ZC~ØUb”•é79Rê±¢h0ñØNª–gä³Ã-4qW<Nžñx”³§F\ÈyüoŒS¯­ŽôaÏuoÑ1? X•\=j¼áõAz¬hJ ^ß­€9a\©Fê±xzä==J_?B+NÎ]ÉåUf_{½îz|FõX'=z<=¶¯ð Y•Ü=ƒxtgxq‘=ŒÝ3ï]™ÂSy(S Œh¯ ?+Ïè^§•gÜL±Ú×IwDbæ×<íø+@oVpÔ@ gÂ݋耨!=ÐEP=Ð-¤* €|‰o²Y§•dqC™LœDëõJZ9 ãØð@$½Y"òÎg²^Élï۹ȃg¶InØŽZœ€ÈC–µÖÃÇ ‡l}ç¬C÷Ãh'j¡8´"¢Že‡½îd©¢qøÄ"J…g×MŸÞ33¨:SzîÉíÌžêŽCíû=Ž"-b|®rÈtH9´8Š8Æ…r93¤Nqû½d8bUH¾‡ ýåè\^²µN#e®"ùEV/„ˆÊ8bíDX=<W9Lå20Eëègd××ëi0ÓÁáë¿å2Cæé4Ô¡ÎU¶Þ9¼½è²\Ň=Jߪ]ŽépÕ‘"ÏæþÆ¡Lx‹£LÏ8ôêaÔG€²ïìöô^A4ÅaÖ–êaÅÛ¸·R‡Q¿‡ Q5—M²žœÊeO‡ÓÞæîohÏ@°LO‡Ÿ3:“Õ…Í)ëL®Ê+õ”Н²Ìä2êá×_…=%ª‡©¾,¥áy›Ô¬'2eç<px9º§Lsˆ€æœr¤Çoê­ÓÍäò·uªØú!³tfq”ñØQ.ËbòØ‘·‰tª9ü™é)Úm…w?ÞNè½§CÏöYOþ—çõ¶. ^+ÛãðdEúr¨Ãj.ëYpC¨ûBvV¶:á/€=°è$@9ú����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/128/bar.png��������������������������������������0000664�0000000�0000000�00000002064�14136337723�0023751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR�����œ�� MÏ ���tEXtSoftware�Adobe ImageReadyqÉe<��ÖIDATxÚ¬“ÁiÃ@D‡ A'YÛÑ-¸r5¸1_\C H) ǬÐAÆ3 ^0ø¦¯ÃÓJúû´ØñP@ì)|? ÓºÞ5>Œ£ÁàOÜÕ§ë~=“_Ƨ‘sÖL6*Ƴñj,+Zã­ŽÚÛwëZ—'Uôoýøtë[U´w°®ÒUõ½XuÆèÕ g‹©}²àOŒ‘&tê¼G”OB…8 ¬énz”Åö™�שc¤©óöAåÓÍ;qkZ)úX>V³á¯!*ÅéÿN¤R Z$•¢–:„5†X­c„   N(‚€1€–ý2�30�3P¦HqBW˜ÿq(t?E¥°.ö÷SPôÄzW‹“ZÇ´Ÿƒ¯§L=°{5líváêÞbŸœj¼?ŽI\Vn¶vªÊþ‡f_nÚ‘”zÙçÚTgõvÿ8œ™|eƒ°‰*ã=È2¾04»èøJœ¥sÞ½Â0kXw${ж`r²Œ_1±EÇWŠ às/øhv‘ËÔÀXt†1‹.ãÿ!LNÑñ•È—ó¨cÙE ÀŒµì Áñ]õ wO~€ ÿÿxö䘔$$Ô-¶BzÜËZØN¦ÛÝ za¨dì¢(™¶CÀJ‹Û¹Qp?>�¼t“ŸŒW"ƒŒ]ƒ®µäc#@×ÉÄâÎ(å7ˆ›‹åQ¢˰Kà†°OàRýòk‡‰(.­¶^mà½?«*¼]§‰í,I7±ø<µão~#’=¿˜ÖAZiÍ h(»9p<É-{€I~4_Ú©=˜]+0+¢úvö€ >¶á9p’‰AŸE~ñ,ƒ>u°+¢d"Z«›¬Ÿ¤½ˆ±Û7°'8þ€hòcìkb€Y+Š˜‘­å-@»f³Ú0 ቬ”B:’÷9÷P¹âlw¬DŽLBäíu/ƒ×òøÐ®G‹Ao¤á½‚+®~°Cùˆ÷B¿¬Kþ“%ãÈõèà<—›_ÎoD‡èÅß‚Vƒ÷÷ʼ¡¼mˆF¾¼OʾLòl¶%ÐñìÂÝŒ…z´H¬±žÛ×p%Ck9cëðb;ðцûÈêKørBÏ&>´a|‚d O`ç÷sqDR› D]ˆ_˜¸ø/qÙ&¥C%¢8D+Dý&ç$ Ñ ‘Æ&#¢§³"Ó™5Q&~Ù/¬–.›¤ZB‡h…¨éœ²ÖD8D+ÄÒzΉ=ÍÙzg:3ŸpÙ(>Q¢biÅ&B„C´Bd:'0¢9âÄ~_9pà����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/128/map.png��������������������������������������0000664�0000000�0000000�00000110316�14136337723�0023762�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR���€����¶¯É²���tEXtSoftware�Adobe ImageReadyqÉe<��pIDATxÚìX»räD½-õ<ì]?"ŠO Š€ Š”*¾€„ á6"!#'# $%$Ú*§„®­r`/öŒg¤ñxF¯æÜÛÝêÖHÞ…u²T{ÜêÇ=}î½­;Z©=` ¬€¥1fÖã}Ƹ‡Éª,ËlµZmôã#ÛaB9$@ h,TU5¦ûý~ºÝngëõz~uuU¼~ýºÖ›Í¦c ƒ´®ëÔb§iQ3l4ÇÚ#oß¾-///ë‹‹ Ò`‚6†¡7ža×9Œޱv¿\.ëëëëæÍ›7êööVkøÑ1fÀPv†ñl·ÛÍa|”çùkËûû{sssC0NA8Ñ`2Þ’'ÀÆ3·{‚  ÔÝÝ]Š–×Ìõb±ðlÌ»{ñ$jV‹]S´&î„�Æ pÄ#,¬4 Qh'À”ɱq¡!'–ï 8ò5vo @A‰$.X·‡ º€¶ƒÅ$€ÉÔ¹µÇ|›²Cà2 9�ˆ¡� #‰ Ú‚/¬­þÊ‘¼�ŸÃhÚ6­°+¯A­‘QÀ§Ð@6c>•þP±Hذf{ÌÕ°iä ñ1ö$L¹Ä uí®æà‚,Ëä(GRLÆ•q‹ÛÖ_ü ªù|nÜÓødû®9åî?üÊ&d²ï€?É\À›€O�ʾ~5ôOfègà‹Ì|F™y\ý|c4—ÚÛz”£³ciB]XÙzUË?¹Í�ÍsT^ia‰•åj„ ´{GPY‚«{‰TÀ’: ²Ž&ØZ‚­Uà‹'(Qà œ‚¼£À¹Ptxê¹ð”‚"(ð.d²æÐ…<±£  AŒ]¨{.lBMÄÒ)8p¡j LPõÀ²Nc).]ù‚*(h¢4î‡äÓu_ÁZˆb°MÔÝ,x‚iÏ(Ø™M8M”FÝs„E5  Qƒ.¤"ëÀ…z7pcÒØÈ³Pˆ¡Jü†ŠË‹ïøË R+‹T;#‰¸d›0l‚! šÃþ¥¡ÿ´òpܵ:ϲÐs „‘RN\@áãôlŸ×)cYôj½îÓ+wgâ± cÊL~X†Ô¾Ïƒ6ü‚áˆ"mÃÙú–šŽûªЋ»…½W¦¥–Ì™°—÷_¹q§àvqkÝVÖçnëƒ4˜(Ó<¥· 7`Ü2E±iã2¡ÚCfHÞ\f‚¿NA¿Ó ˆËE¤¹Ms´vŒ€¥Uí„#XÚsmZU‘ŠÚ¥‘ؽZÞ·úMû('ªÕ²ªºIÕ«l²=iÆEOE~’Ö/< yÞžkñ°»‰”PpÊn–¦©¡ÃSÆ ” y¤øüGúI5K¨ú>¡ò¯„þ®ú±Rô)Ú¤üø’MEÉ/À—}®Jú)©è:Á\òUê[ÔÆós¢c©’¨sDsàLÊäKüØg�º'çvÞ:záŽlåMnO¥Ú½â-«ÑÐ ÆÏ-—%˜8‚3§ µ^Au¨àÄ*˜‘]"i¤ Ž8N;.0Áqƒ&V0í*èÇฯ@¶Œœ„ &½DAô qa‚øò© F.xgÒu ‚\8îºàœJ7R0 i|Ú…ÓXsádÿ.̼¬ÿG ŠSì‚Á@Nå$ö³0Kßã‚W`ä$Î{ç`2;<‰/P*¶F,A`ûZQ ‰ä¶²o(ImG´4²RáBÅBË÷Šg\#ÁH0|,Ïþ�¡)OÆ‚2Œ#<6Ï$x¦€‘`$ >‚c0Œ#ûFÙùðÿ-Œ/Y#ÁH0~€ˆ$ùXPF‚‘`$ë_ص{ÝÆ à³+ʲ> \àÚ�÷WäRäÒ¤K“H•&UúëÒ§Ká*]Š”×^á&v*aÖ—Mвd‘Ü›ÙÝÙŠtR¸\<é¬Ýá–-K?\„)H1`xå ±\€%–üïW8~]×õãn·+...JM,ÉfÙ«“dbiyåÐB7 ÛˆE1Z,§WWW‡óóó†‰%XFÆÄ’,a6ÍéHIn·ÛSœ<ÆÉû»»»úòòRÝÜÜH‚m‚-K8šl… O&!9%!9ŸÏkœ×××’¨aD,q²dJg}¢ö™8pŸçùÇÖ÷÷÷êööV¬V+­µ€ Øg dpÔM°À 4´3òŒ4™ÖçŒI²Ã“,ÙgâFB²ÂD,‰WŠõz=ÀÇôü[ß3±6¾.į-±d^I“µÏÄì±@D,YGjb‰4±Ä"Šx%nƒ²,õdÚ;îìÙKÆf$^ÙÄ' ð~HmaóJ<w± @ƒ¼—Xˆ¶Ì¶EºrŒ??„ÄR„FÓjHÇ+q§¢[ÅÄ’„$&0Ä’N$.ÀÄ’×Ŧ y¥¾'ïˆ"b)ýÚób`e%½&šXZ,iˆ%žàµ�;n¬Ynú˜%0±TÁ›„>RÙÇ,_X¾•ÀíÔo9¨¯5¯ü·qû¤à¯\Á÷¸ sõ-äêÍ+ÿÁígܾTÙS/¼•§æûYó½ïÎ\¤6ÖÛf=ôX°e8lVîÌ ó.ÍÊ Ø{65Ÿ]ܨÁ$ØšÛQ;A%à‹§)ðԑठð z[¸a‚éÿh ¹…Æ/b1ŽZØt¶`PŸÀ.âæ$j¡Œ4q‚mÖN@G!sdÐ'Ø´#'ÈÚ è<./P›Ã8Á +r | OÝG¡t%¨œèç:ÎÄ­ìH°y>*`pãSk)ì8 »]ÔÂFO«‚ó€ íE;ΪQC|ùLm,±dÖG,#fÈzË$¼|÷]RZ²ç#ÑmÙùlhû§±|4ÄR î´yHæ9™¶pJøTäcbٵǸ‘ö¿ú á¥klÇóøcíEµB{§‘d±˜-–+p¬QoZÀ +à˜ Ú˜"�~Ù’€c¸ÇÐfFÞŒÍ |¢f¦s,ÀÆ5ò{Ð!DõÞã&³å| ØÑŠÄ7»ËÕ©@^F8K!TDKCAhŽÂrí^Î#²Iµ‹§D`Uƒ¸ô{5[µ­Öm1%¼Òdé©=*Yž?˜*¿×ÈcÚÿ(h¯²)šåEáºòþ´ë•žÐÊ­ƒ&–G§qÇ)Ëcéµcdõ•„ïªBÂï•„o4¯|‹Oü„Ûß ?V ¨@Œ*øNTð§Äwpò_¨Ä/xÿÿä™YpÆyÍô'$ÓÈ ˜Ÿé+&] eZì˜Ht7ÕcI¦ÍÀÌ>ÄaSW@´ ô&«QüѤbòÈ Î‚„pA‚Aœ  [µZ�¶n= Þ˜ý-¼” (0<ZÄ™_DŸàÌ'à0Ô´î; v}‚Dê‘Ôí58‹[ð &q[€ Ö`ö¦-)qìºÜå¤y©…(Á¨3ÁË‚ýèx ¦MØÂ(8‘ZGAéý…‰ú8AæÎè. ÔÎKz³b4¥�‡)áˆef H«8-±'• ¤©Àë|ÃÅ$]PRT бLRTÀ}ž˜ˆe* ¤öŽq"–©@* ¼Ö“D,ST 0·Ï°wm»Û@””åK’M‹ö Z´½üÿk~ Û¾¥yÉK“^²IlDZuãrÈrHQ¶Úp¥Z”<$g(Er΃Ȕ•“° £]œ;aI¦è} y¼b<f¶pŒ—®ë^±l›¦yÕ·;ýÚl6ÕÓÓSu{{[]]]ÕN¤Šhšx•“¸_0UL*%²Í¦P€]×¶íL׉÷Öv!2ó@9ÑÐûô8ˆ?>>>–÷÷÷åÍÍMy}}Ýaº´²A_Õ g”¤9Á T9]æ@—ÃA %if` êzp`5‚àæT�Îêîî› óŸ9’ô&|p$¬¶ÄуYÁ¶ÀdRÀE2ãøˆÄˆ\.—À­��êiÖz[µë'J$»šÙãà$¾¼EØ"ÀÅ$‰ƒÃ «½IК*Ä}½^ÃÀ°­uÒ¨!HŠ*Xr¶- ñG6c˜½D�¤Q9A¦á‡j� µÒ[àƒÖ $Š‚ 5°Vµ] ³ Y8{¦ciB€¼HeɘN×Ò †’d'Òbx(Ð8ap7 ¤† ¬�' hE–@äbÂVa1j¥ànÒ E�2ƒ+œ”:±˜ÙâX¢-l$jÈ@±ÅÁ‰àix˜D5EyPÁ”N‰Çj<„ƒ7†¼Ú4óˆÇÚB÷ÍàÈNm‘'êC€3§5 0þfpFY-hö(v ¯)ñ^Ù«eÛ àZjQÆ·ë… âÊ ›ÎŒõnÝ™¿h†láÆ[.aªøYÀ¹µTG|[˜=^º˜´Ë÷c¹Ôh_áì ?·wÀË2] ;5¡Ñ„}‡êìX@fŸ9V§GÌîte$ÔJûFÌ)r=ô"sœï×â ¼ˆœr¡-»oËëN$.õR#nþßj#«©^ ?éÚ¬èýë…„-?ãöñ•7 ãí7Þ€5ø®º3Û÷â÷¨Çø• ÜŽì„×Ö— K�Ý ’ÉøNŒRøtiEnרõ9áÕâÝÍVx½îÒp‚‰Ö ÷? k¸×YYëÕÖîzSï5Ecи]án…}1K.>1ï/¬×¥KlÌ=0·¦»¤vÞ;æÊ·Q—0÷¼¿0cî]äÙHTÌ;ï‚A½ÏBÀ=0é*òÀž(ç€÷¹ñÖËil{�Ô§¶Í&DÏéÙ´æ�*\±0ÿi5íõy�CP/l›È¼K„ªQ^<Àà.Ë‘h¦ÉEÈ-ɵAú2â4œ[fþ(�y|Ï"¤9-ÌþË�d­'µœŒñÀ̶]ïv©ñmzÆýEXÚ?CëQ�´QÛ…H„�-u};Â…í൴kÂkKÂØ¥öBuà4”~’»Â?¦=€Ãt;o˜8 »tm‡NC¦‘v¨zÐ’ɰî_ˆø…vbjܸòz-ªÄma‰‹‹}a%2PÞXö-í�·L¤lKy ‘j1§·«@c7dÄ;â¹â­l’È®'»rƒ¿’!œ‹¥~‡Øõ\æ7~{äwG¡r¹Z¯£ŠP§˜óá{w>ÈÞE¤³O\à"Êå’exÈqÀbÃÌvþY°©ú9"4ˆù‚¢çYÖå®È`æ"lN4'Õd1=ìD?=Šýy)8#¤>ÄŸ’˜rèÍ”G"“á,—K—P¤¢V$­Å°.×VþžTÈM"F< é÷%‰‡³Áýi©¼Ø¶“¶Æ3TIzºÅŠë�²ç"ìXq‘p¾ŽetzªßÜ56¿‡Ç\1m›ï$ ( à¯p±Õ£xƉb ˜^;¤¢S„g&‰à*Á.Dëø#ÙâçŽtÙ[aÆRyK#‘µ¯«òáá£Óyw)1ÜÅN…Þ#‚²”§¿ê:Õ~6§p}¹ƒ 2ÅÄp"ÓÐÓæ˜&û¤œ|õÓÓóÈv£F=héÊ ó+3£:OýIL}¸§+%ú"ûîWjz—(•Îó¾Tú7Êþ¿úä[_R}q®Äºå{Üêò›¾‘ÿUWaåOñ¥7 Û¯½kðmtgêïň­ð7äØL;1·ÑS| €L+G~‰{ üt"\þÉû8·ÿZ=¯mŠ uY¸8Q¯êr�ÞáþG–¶¥çœ!€Ú¼ŸáÑ™ëÖ´™cï<�ÊP*ݺ,€3a{.ѧØ'ZǰzêØaçíEãç4 �” ÀÅpRè†< A“ y`H„ å5äDÈaRk †•{@�äiè(ç­÷À? óÀ,ò@ajäYß<mèbpòð€ýaƒ ´©E(kà2±ÙiHØ™¦'‘Šôu@?gžwá"LŸ†<‹<И‘‹P/º¡”lÖûCÀ= L}Ö÷@|:>ëR‹PFPìçDN†= p¨Úð�ûôw2‚9>KôÀgð€bõÆMu–ö�«Ï”=4 ­Kõñ!ø½ªÓÿô[á3;×3EßPo'Ê[–αŠõй”ªkû·´‰‡p!˜VÃc©­c)6`ºÇ*o¦`¼õ•d�@d�@©Ö9@d�@ðÙßlŽ àÈÈ�2€ È�2€ àø†r%ŠãþÃ"/ È�2€ 8ú ‰Üu¼»üQd�@ü/�¬UAd�@|Þ�> ÀÞÕô¸#QR’Û}Z`þÀb±çæOç–_3× ‡rJ$Hî¶lK\UE‹”Dõ<@*€`ŦÅÇWÅ"­(ïìü_ ‚£ÇãÄŽ Æhfù z}dŸ=ò÷P¹Ñ«:‚Rãt~†¡ÃdûñãÇåÝ»w^Ö-AÄ• SlÄóÕ¹H¹19GAµ ìGrp€3ÈþúõküòåËøñãG÷þý{Úr Ò%ã@„T¤¥NID‘wÈ ¼[æ† ’‡‡‡‡aõøíÛ·ñóçÏîÇTá u˜u¼ ™¨7¢ˆuÜQÇp@ÇÓ¨‡§§§qê|øùó§ûúõ«ùôé“ïé3ë0E¶ð*I1Ù•“H^+F z…Ð1è‚D$øÓá@ŠމÐ8´€’Þ:¶2¶Ô9ä\N2€àÞ Z€»‰~71à€òïß¿[ðñLø.hIr]:.É•úÆkXçr4l¿¢ÿ8€�ëðFŽþãŽĻ×vzõBšÞÀâÀÄñ–ô* ÀÚÈ=íp€w9ÓȈÎÁefú ìʯ@vl˜R§e£çÓÈ;¦QIý�À!ýŽiúXªLYÉ`ayÇ\«’É…6äPÎæ68 î$�ð#ŸÎ*´pp‡N!æpÀ´ÕN”‰¼‚½O@­a*–QO²¼óc? àúî€ï?òéµAÓ j[úÿíF dJÑraL”†…Žyçd=ïGÌur’÷"ª�è‡%ÀË„2ù°S+éç�PqÓwL¶õ¤Q ª­Ð)Œ•[½t,ÐOªÐ¹g�ØQÌ,ö,û¹8®êQ³2Ýò‘£žiè<�`!àôK�AŸã7Ò+^˜€Î @CR²×YòÕKˆ’V)�,›~#ŽÞ¡X.ˆæúQÃjJ¢¹(˜ë{¡CH:,Íd:&<�[1ýh8L"ƒ� �¢¹�´…l'Ú)ñðð’ÃóÄÉ€dçÀÈukaôR2�@¨ˆr&Kƒ‡øÈÀÈ“p)›†# æ"üðSçLD—¦;tÊuj)¥:@;¦ØÛbç\¹×P‚2� [š¯\>–„[I§6�À½¡-°`Ù èP8—”{-Sðµ*¬óÔiÇÄq“Ž€'Tå"}Z.˜‹ À{A>˜Ô{IÁ—%镨 ÝZx«¤iË´jR­—ƒðÀxÇxÑDBY *½c”ó:ŸÐr,Aj/àØß-Ó0ÄÀÂ�0‘ܤs:§ .— %b�wÅ#vHZ) LÃ{(ðØRç–ï i3‚ߢʉŒpI6˜:%Ñ^&®›|G$eƒ‰…’~±c,5\‹Xj—¤ƒ¹`¶+¦½¡cçIe†‰)úÓÔêËŽK�Š L. œ!’ïñ¿—Îù+ý2² ]’ ìÕÖ"¯‰# Ýâ@‚0B½yí|ë3ùÞí›oþ@ãåßÖIèŸÿÉU ÿòÍÿ4™¶ôßÿÊ´¥ÿø” K›ÿùµ'×–îN¤Yy÷G¦ÒdgÃ2G,P¸¿‹Ç8Á¤1ÆÉ¿s6Q÷s¾ê ``­'�ý)6 ×¶ Æ—ˆ_Zu8‡xIг«r�/bà°É@Ÿ10„ÆENÕ €êC è«è‹ ðœWCà€g1Ð¥ƒÚ Áu% Ïå$ÌàIØ¥t’ð\„—ræ ð$lw2 C`^Ê@›¢5kIØ©ÿû 4‹ › ¼J4‹9°‚kÝ,¨cÀf ìOÂB´Ì€�Àл*áF!Zf Ÿ,¢õ$|5L‘r%<×-Fû0› Ì�\…$ìw1à6§á9�ÈW˜â4<ïbÀUNCgJ+L‘ó.ÆÅixÍX Ôå°‡±Ø8¯„®" ±õ¥+M˜òcúa“~7íž › œ÷2pmö„ ŽÃ*�qÍ«ÝÃ@·Ê�¢nOL-,×"ƒ˜m5ýƒ«a ŸÛª:`É ¶c-°6¥é’@mÂw— ]%†Ç!õC(3€½6«¿ lø¦3¥«¦9€}¸kªy˜3`ãÎo°\A1KÂx[L“^…)Ø1 BÁ­\Î@ü)ãŒtoð÷š‚踳â>J~[5°k CKk²»3ø�ƒ”c·A°ÚF¥rk…«»–Êî¤?«¾G_‡DøßknÏzøÝõr½ñ’ø�ƒ È–%ÀI§žIŸÒÑf¢ìg!åÅøù.Y·Y_ºÀö…'�½@Î’Ë2ÛðÊr"½«‡_I|ŒIü43¢;õç¥al˜X–ùXη›ÕýI‹?ºyî'P&?„èO§uºjUÜ‘¦ÔŠ`[Å}b ' †âüM0ø´4&÷2ÈÇBá"f™©ÄìcrâN.hšÃ+·>…YŠ-Ï"“¹’D&ñƒðV‰O‘dTRS}(Hß“#"O§'á´²îYbWKôþ™Ø==>e~”Ù&‰sɨD𙼤a`î1É×'�Ìs$Rf1Æ®ÉÄ:!1M‰t'¦ìã<ÌøB®XV˜/n\Èvrêaÿ óºÉèd€WBG…(IzF,+ÎÚÐ Ùñ<âÞÒcÞfÁ+».Œ& ¹™MS"+Ñ~ÄqÊùWƒË±3¨9¢tFg›ÔZ&ØB™¸7à1…E?°ÄžL •…å‹Èô‚YN/ØÈ˜¸&LžèD9`MZèºÇ)tñ°ˆ‘‡ã«\Zy1 ˜ËÑFÓ“&&å”Ã:¬v,gÓÙPÚ\Ô™ÁäWðÿ|ŸT�±ú•«YZž·½•–Ëñ4 Cµ£‘&{&§!ÙÙ «¾öÇð𔉕ÕÏV@“y“Va*FqiŽÉêøˆ--V–ÙE³% {w:=Åm´1érì ÔrÃ$*1ÄJ14›.´&ÝZÁ÷§œªÆVä–̉­ÜÄçØþ")<4… sOl¯Óbäò•(ñÈŠ?n<€º?Õs­¸yZd ïOq bÖ˪j“m¤ljü… –.úbWÀöß–6¥çt;Í*Ö¢KßÊö{e/¾ðÓ ž °ÌcÂ1|Ö%¿’,Âïϱ„°¼är¬ØÃB)>O¿ íJs•û»âÎwõçý<(ö�C¹ë8‡ËÝ…5WDù)·ú³˜8ŽYÂý,¥þ{¸í æxíCš˜ ä×®#d¨2Ÿ 7 vžd%rœÚ²K¶±%žµ¬ñ=8îõ®If*Ç�€|YÚˆÖ²kbcÓ!^R�8�oÌ€M’—8 �/eà.e ‚n;»!¸_ -„à>ÁnšdP ”BðÊ ð$lŠIØ…a“ðE ¬NC»0 Þõix\Ÿ†Û 왆ÖäSæ~}n3°> ›I(CðR[…¨ÉÐv¥9S¸¦�ÀÐ6{ ‘Íx­b AëIxÜ.ÅU T”â¼–Jñ!Ÿ†Õ PÃÖ“p¥W3 Kñy+ 7VÃg1P¨‡ÅJØ­'á³ Jx©eàþm8^k8¾ wCif—¯ú& Æç†à5f�pÏ ÁK@´tùg'a‰¡¶N ØÙ-ÀP·Äl¯[ Ú¦v5ד®=×wDèÈØ¶5‹>?°6 ©i¼ßqXß"Ò¦KÓªœ„3 y- ÃÆwêÙ(pñ¼¤³£É®4Ÿ7È@ÃbÉ•cnÄ!hgf혷L7$1ª-&xa±¡x¼À.Þ<¢ÏÇÃ-&ko¾Õ @(� �€P� @(� �Àoàö ær§7(€P� @(� �€P� @(€ß€o àÆ(� �€P� @(� �€P� àŸ`!anü�ƒ&¡P� @(� �€P� @(�pó‡Ñ¸ÛÝÐgH€P� @(� �€P� @(�U`˜¸»è  �€P� @(� �€P� à7ðØ;·åÈm# £IÎH¹Jå"•¼ÿ›ø!ìk_ø"©²]^Û+ifH"‰4qI›u­zª¸<÷ ¿> ‘³4Ž£û \¦Ä2òÚZ;â>,7X‡íåú›<&ާޅmXynÛ/¸=Íó<ò2mŸE½qºÝnÓår™žžž¦OŸ>¹eþþûï§ï¾ûn– ²tìößç³;ḼÇï¯ÿ™È²ÝÉm\Ëíeé—eö‹ûÌîã7x1nY”5‹.Ö-‹Ânm^^^좸YöéóçÏôûï¿ÓÏ?ÿL¿þúëüÃ?Ð?þ8×ëõà ÂÈ)ê=ó~B±ÞŸû®ýþXPL(j½žRQ^Ó¢°óÞUq·í”tË¢-J»sýbñîùùyµü¢|÷Ûo¿u˺_ÖóO?ýäŽ�æìТ-ë•!°å,ºl÷ÞŠë6[“•¥gT|Q0Xš•v…Wë.ûSœ•_Ösygõeí@LüñÇ´(>ýòË/“ó ·¿Ü;ÎE@y›P\B@K¯–÷Û”Pš]˜×†­ŒK£•ƒk³•Áê ng<¯ü¸(ã”î–u¿X}\”tŠ®Ê/ Üö¼X|Í‹òórÍìò_� ,<Á+l@ñ°F/ð [ aQ!X¿o±�x §”_,‹°º¼KrÎâ.Ñ-J:Ó¢œÛŸÅG‹ŽóŸþéŽÏ¼ïλOøÿ¾1¡±«¿Bi§ZŸuåm¶,Ÿˆ, Ûä§,ow^aòé½w÷YÞm;/è=€Þpû³ó†à<ÁsÖwM`�ÁýÁò�€Ý=„�ÀèÁµ;°8°ÒÍ¥âäÂâÝž¼õ'¯8»¿ó‚Þ{ÁèâÞX¶~Cpkç®§p9Â5Hz€T8·M ¸/ˆ<€•MÄxð†„»‡$ÇÖwJ;«;…€s}ç Àä8opç€5Ñ9¥ònÛÝç’ª«V�ËÉ(þAY#\•=|¼âhõƒ²N)·vò¼¥ƒ²`ýŽ“œàöâÞíW…@Ï…Xփߞ·æma³†€û8‡Å5¤ÛKŃۻ†æ<Ààø6� ¸¸W<€`Žҫ›;==€äÒx·ß{�ƒÛg�~ŸaL^¹uÛy�{‚·üºðÇ÷`‘Dy€ðŠƒâçû^É^Ä;Æ9Á㽓Ö÷Û[ß˜ÐØúNq·ö0f^3ö^¸Jy�%â<su=€PÜìõLPº÷×£ÒÆÃ”g¥YaÿA¥{ÀÕü¬ääcz–Êó1ß­Ëcõ¹ÀP²ºìþd¬süÄ>ƒ˜8é¹{Añ°†E~f„àöqJûc3¯yªÓ†9�ÃÁïK×7ìøË1ÎÇ„åCâó÷­ &<`ûHk7´óVG�<  8*ï¶×´ï³Çæ’ k”Åî/“XÑhÊø~{¸¶£âŽTœ·½¢Aaö�viV8oYyá� °àkœÉþ)Å öYñÉß?Cè�˜QqTÞ)å-xP>"eq>î+ÖõxÒXy Ј ð`}V^Xb÷÷P�×s€â=�\;ÐýY!€J‹ñÆì½Úú.ÐøÉŸ|�±Îƒ¡ÎË ¼À 8ƒBåÁØ ›áÃã<†™/MœÇásÒâlu·ïÛ…@4ò'ƒ‹º�Ç�L”þ›QùD« eDò+ËçÑÚha©4ǸÇE¥°ì;ïB\á6߀t€•¤Ë¦Ü¸¤ T6uŒ»©â{¬ý‰¨;L€`e �‡ŒM(ßÁqQ=†J¢‚CL®Ì>yÏRa˜ô±ÉBH(mÅä/ „¤É_ö¡f˜qÔ˜R¨¶/•M\îÎ9*yŒ·åh§Å0â~ªÇˆ@0V*^UÎ ×DJ¥Îãqálý €›9 „CJé„â>ņÝs¾v— ãy¹¶ñÜŸ=ÌÁvX#œ”ä¾¼²½JÕ»äÊcàêFZŸ÷Ss‚© „Òè%VÂ(5°¥ñ÷žË),fº#ë¯�2Óâ7¤¶MÉ[_žmX©¡èÚ%e”=ì�‰?Œà…åKÞ’f¾Ôököå±ÜŸÆäM$n¦ ¤Ôµæ- Ì]ÓzoíÏçâóëöŽçÛ[®­]ó2î¹––ÏW}€ÿe¾ÈóóyIÿ^¶äò¯ã±O3æ?ËæͶ.-I©ååïua~ùǵI¢ùç:Òm:¼p<gyp)â²-Úw¯ðt?-1cº‰vÏY°P/Éuס6–8 ‰ØÔ—õì‹zB7ÁÛolÔ¤^7ym"¥ò妚—s³Ðœ­„<€ 4…ƦŠ eî3T{sÙêmMúTÂN�à"¨Ž‚*z@­­Âêmm¥zz“û¿¿ä¤^Ò0eã¿…žÚ\«]¢ð€�{G¸Ú˜éÛr€wØËЖlÚQó!ð’ð€ZÔ¼ÕÆŽõºp0”½5=Ï×ø”^-jùÊæÕž„[]û²ûzr7X‹«T7X,ó2ßS˜¶ÌÊ�’K-¼DóPL‚±¯=`ÌK¾ÌG˜šsÀ”z9z€ ×L ­®Å$xkL‚2ŒÇà<àún9À§¬k—O,S= މ$xÎzÀ±µm• ç«ù½sÀ²Üº{ÊËj¤Ká|b)9`ú9àFùH‚3œÊuX§l/0z[OØ—éèX÷ç�± çV¶ì ¤fh®m! ެ(·µ‘êͤsÀØÖ ¢}/kü#€K¥2‰áp®­§Í®m]vCqá¦-±Øf‰¦_¯¬ +ƒ!¡¼êUk=Hªƒ{£œî a}~ß&æZ’`ÉúcÕú:¸îDб¡¼4õ¸z‰;€–nt4—v©æ:ä ¡zÍí�*9 6ðH �—J¶ª•´՛Ëö†àßž™Ú‹‹\ºœ«TJzÀ-“K9 –jn}\ǽ. Pà9�%²T“ Ú|À”0V·ÿ©ãÖÇŽõz�¡Ó”Zé$„.|³m ÔJa|ÿk¹fìß#tøâÙ äV•Ñ ø|s) bI…ÀñÝ1 {kplª™‡t¨Žm! ›¹%Jkòö’L^â($úóS×R]—r� ïp�Ƹs¨$Á9•ßfE+kÝ 4%¥®�F!®Ý(`97÷÷ AÕ%lBo™BHÎ$,Ï¡á�L‰÷fë9  Ôhš˜ˆÝ½Â&„µ„�‰/}–™¶µ{Ftbê£AŠM¡¶K¿­<ç !”˜rõáHîUèÜ”ow©Ï]€|Ó:ÓN·»X¨ ;#Øf$¥ZSné\€i8KqbÎmÇ‚¬ðÌÛÝ&´$,À&r÷.Õ6´rÛ¦3‹'ñ|YŠb k“*„£Ðšð|Ó„äRëâc_ý¿ögp/b:¥Å"––CkÖ¥)9Hä\ÕîÆXö™´åü5ôW°<_Q¦Î³`òÙÚ@ë=„VôBö‡zÉœ"~p {\B/"ßLŸÆñfÜÓ­Û“2ìŽvAؾvU;ç}Vpû&FCP˜î²l€À×3¼�Ú½ÞoMøÞ]}Êî°¼7}ÑÍ(†ø¡Fò×l†ëõvÿs5ÉŒŸ» ¯nÙ~‡ç~Võ+²I<&ÇÖ5øÜÁ"ò 9“8’;V¨tAòñ ^ëE…¶ØýIQŠ3#8 $›HÈçàÚf )~¢p‹K̸Nø äˉ»/Ù(Í…ÙdccŸÀ}|T6iE[£^µýÅò~ܦá²>,ÙÚ³‰LÂØ÷D“ꛣžïÜ­º'$Y7¯ X&váUGŽz6Ðax~y)¤8‘È(nD{Z¤$´bb­È ’ùÀæî¥ �…|·w‡d‰1ô8¢³µ[ŸdˆäÖºGR×¾ûù­—&Ô †k{¨="¡ß»À8«í:íEÃðòüìÝ–+’„ñ};qGnöï õ7Üò¾ ²¾oß’cÐB“ÐI )Û½j•Xyë{*ƒ'¸JÆú$rÃÓóSD’޵ Ãb31Ð÷†<Bûvó³×âûµ”Ù,é ,¤ÌnŒ88HD€Ý{ÎQÕº];<?=ÿ•“tæÄý½Kꎵt/N’A×ð<)®¦(™Ý±œ>ØBÏL¾4¶˜-Ì{ ¿»<ùúÁÚšh,A>½GÙ½Ø+ìhࡽë¯Í±âçw-\«[¨pB#À< ±Ï5;h—ì±Êù†Ù}àáÛ&óÅn[Jt^ªÙËl@e«³Ä}4웪s÷a׺J²Ç®ˆ­r(·Ã@ÆDám,ŸÌþ}2»ËœjDéyhæ 7|~ú nnâB‡öo³ €…ar(ŸAyȃf Á¢þ{÷¨˜>Ëo…IxErØÅƒsŠ<„¢zƃ¯�ž>?Ç^ˆaÌøerÌMñØé€??f1PgXèj)�޽‰`ÚÁDó è)qw¸×50°ƒé‚%<AäûÚ}"ÐàXPðX<„A…âx\n)*{‰ðÂ]¾ñ튼&žeØj¸D}´w½& ë= Ÿ??ІQ«ÒƒXŒ]9QbÕrÔèédåÓ2Ñh-9\·Ç^`whëë€P}ËŸü8b-„à=н1H¡ßf „L™5ï“è“d3lÜ­FNüpZ€'†fœ0¹Â@æ,Càó”ÂoŸ+]V”€¦&Ô’“”ž`I~!amá»AW}žüúiq €£L[jEbª�ˈÃLpË4¸¿Å!"–æ!EónÕiˆhnÇÂëóåD4½gæ(;›8Â-%G6ÕÁT†1VT|å)Öx?tñQuÀ:`„Xÿ±„(1&ƒFF•d\,oe¯ÇÕ$åfޱ¿ãï³Ç¶ºF(šÞÃËaR” ø0Ñ_]²Ó¸Qb‚c£MÍ'Râ8ºg˜Ã`ʰý&‡ ÑìpjBü¬p!ëD]Ž5Z€A©?lÄu%N"r{uÉ8 ÞGÕ"øÀÕ “ý³Ã>‰´„Pȧ…Ô>â‹SCâ/G6SôÓqªþ&ò§ dUíÕäú—!ŒëCĶåYŠÅy‘CSÐjb‚+U>9x„<d©þ—'¾w¸ã>ˆ‰º³ãÀ>Ôþ!©@üCõ'Çü8Á!'+SûðgŒà©07ÌÕgnaVzÑ1‡¼´@íl[uñö*¤.áíç½m!û@Í? ðûßšë /ä¯ö æáѽi¸½kÂñó‚Ï¡RüxJçOþ¶“áD=®W>˜]0 o:¡ËòØå%öæøì`,´B7Áƒy|¼KjIäCÀ„Õ‡>m+”H¡eSÅ�No3ÔÑÎmÍ-µ¨>öõ¦ÆTIPDKÑ^×Ö”ûo�ͱ¹o£ê< æ¨ïïC•s€ú¶ÄÒâopíüš9`8 Åj*½* !ð5r@NèÃæçDP¥CÀ4%–r|P‡±œªŽ!Š«s%*½ÀË]µ­æq¬çêt\ Ù€{T[éÿ”(Cõ!ï2îK‚ç!Ð’âhÈÔ^98g’`©TÈX©xl¬jÈ{À©]¨$ë^ÒPîj‰¥Ô $¼µä÷ç€Df-Å•ë†r3ß7 icuï–º´”*ÁéØ Êf»Á¾0Âjééþp{M †npªwƒ¦) :)Û;…é±Àéõ9à�¼¿ÐÇéè¬å±€Œ-éV·„ ù¶5ŒoÉCÆ[Ç6 lÚ^Q=à[zÍ9€*…¼Iú8åƒ*?ÈÕ£�ðP)… \Qäþ£-9 ¡ÇzØ…J8Ý=!2ˆ–NbJì\®)®£¿_ùkËT®Ï&z‘òa¾·LQ[{×X äÇwî÷�é­BèyŽ+ÁSq,`2! m:¶SŠ£/¬íꥰx{ü<ç‡,±­¨R^›£+€T=´y@æ%ï×{À�F:›ý]ÇåšÓ\ ¥»AIuŽ„î�Nõ$˜ËV<\±].µ’¤Äí\ÏŸæ|ÇÚW !lí~Íà”ЉUÂlâÛ[C°Ë9Õ‹‹”`¡Ç0·55OÕo½ÀI„HC—Ý'Ü®.4S\Ì¢€m–(Z;$|´ó�œ "OôõÁ‹ME[ïÓK,L - †2•loÓÓcIÖšÔÀc ˆ§o˶OШXˆ^È)ž6¡@WœO‚)¯˜W¡€Î”—D[y{Þ»w‡°MJ¨h“ŒûÏî¿´ÊKë³…PŠèþk �lDj;ÑVÙnùÓyaÁ=(žøÍ²u©& €²‚É^/Í? €OWÔ¢ þ3‰gqŠÂÉš&Éi¡iáþÈ\ÉÆåßÇZóò¡@(� �€P� @(� �€P� @(� �€P� @(� �ÀÇ�`Gõ� �€P� @(� �€P� @(� �€P� @(� �€P� àÿ|øPnë±ñ@áƒG€P� @(� �€P� @(� �€P� @(� �€P� @(€`´ê @(� �€P� @(� �€P� @(� �€P� @(� �À7þÑPènd?îÏ'èoˆ(� �€P� @(� �€P� @(� �€P� @(� �€ø �>ø/(¨(� �€P� @(� �€P� @(� �€P� @(� �€ø�Ÿÿ ÀÞ¹í:Žk˜%9ÁÞwA<Ù<ù\'ÌM60$™C’nKµE™¤~‹'ÛÎL×ÛòZ´êcIkѾïÛñ¸‡c ‡~‡×wxÔŽÊãGfNÏGñ;Çß©ïÁxwx}ÇG86òÝ·ãç~¿o>|ðÇþ׿þuûÓŸþ´õÕWûíø…)báŽ4r¿;|ÏiÏý£|Cÿ¸çqÈëùš?~ü¸üûßÿæýë_üÃ?øÃ}óÍ7üõ×_?L  "°ö;™fi‚Ö^K5A׋2 Їc?'BûÇÅ8_þùÏòO?ýÄûÛßøïÿ»ûóŸÿÌß~ûm€Ü5„Ö„RáIµG�…ÆÙ>qƃÀçq¨ùr@à㑎Ù_~þùçsö¿ÿþ{Á}÷Ýwçã àøCM¸ÖLKÕY¯©q f´:ÃüøÑf|=®ÛÏ8 áW/¸WùCxw<ºü‘ýq@p�wN�whÂy-€p1ÜÓ<³ÞÝ (ÎvB@Ø…šGá“àDZ[÷BûÃkÀê…?Ôßù™?�xýóSpÿx¼W@õ­iƒ¼ø–Ó£àªm+Ž-Îü9ã üŽ5:<¯�/ôáý½VÐáœ7 €&|C›}ù^ÅžQøô\xq’.ζ÷ìšð^õÃìûcõNÏk€ôp~ëqøÇóõ¡»ïø›€¼©Röu0Û®ª¤º“2ëMøSõ£ð‡à{xäp¤Ù?W¯þ^`¯þy<ü̇(ñ�p X›}Møb–k^<žó‚yÕj³® ¶îý€Ÿíó1îü£¿v/¼ô³êÄ™Âzçw˜Àvœ#o÷Çû{ãLþ’Ôf_88œu<—�5MxªØº<'Ìø9ëA¢ê¯AøSý}¸óç‚ú¯„7 ÂÌŸªïÇ“4Àƒ ¬ ßpn5÷šªWfÝ)p˜}/èí>z}˜ýÓá-p~Ö½šû³N‡Øü9?ûÇû[Å{a×å9e¶"¼æà u÷~fÄÔ}áOaÃÌŸªÂ‡ÃEáýL{Õ!ð8zü(|ø ¯Ü @àL»Æ¬g‚ 3¹ @eö“ãó‚Ç$Gð×î…Ž@øSh!¼¿ÕO�‚–?�4fÄì#®ÍûO’ÅŠfïJ¬çxÁ£&8œýàO¡ýcÔ€(´Ÿu/øñ¾¯O Aëª�œpnšý;M @Õñ\­x)ry yB85�háu:¨ú#�ÐÆ ®¨~‚äóxD08ûQØèàá�&>hÿpPðø.μªÄ>�+2¯ï+IMýAå÷†·Ïâ}Ìò°¸ Nð|î‰OŒÿ@üÞ7?byì…?Þ÷NGõÎ~óXñö™àŠ 8áù9¨:c!S)häŒk¶j€‡â· µ~ÐE3ŸÜéPŒsB¤ì¨qÆI…ÍÞ«Ø|­K³£Í‡ƒÑö1϶ï`òƒ™_6.sÖ=°p-(¼ >\¤hQ`è ‹µ…³&àbÌ‚‡G*œ4 vâ!4�Ãéùãû‚¡Ç{ ¬™�…_*LB }bÖ£ÐÑö9|¶ …ê¿J�a¶ãó lÜÿÎM� x´û€MÕ  pá¶Ÿ|@h£©^_´¬($< HTw!!WÐ�*D(Q#\TuPÙóp{Wd |@Óö1ÌM`Vžfß 8… &á"„( Œ‚£x~–ƒàK{;Ô$™ó먩}Ë©úqö {™ðṃ@àðжp.e{!eF{(¡t~U PB!µ×f„Çç8û„øÚŰ'į³ì. í¡øÏ Žno¿<}�–�0&'ˆ`8Gõ9‘d‚ È¡ú.>Šç.>Ù~ðä�,v¢6œG„ !/@¸œ ŒÑÑ Ðò�aH(4AÈž‹8žOÂcDˆþÁaùÏÝöFÂæÓ¼?ÃcædøÃר2N*¹ašðšSâ“ùí}{üìQíý‹¨þ1ôEõ¯:Aéù…Ý»FîÏA#"…ŒçQhaôÑö£ À2Øí„^¢ÐAÕO'ˆ‚À™ƒ 0¨ù3„^ŸÕO�'g?¨qòQ¥Ãꮋ½¼hójBØqæáõ°HÇØ­¢ÊW¢€ ˆfTU?½Ž�ÀÑeêïgBg�|JÙHƒ¥P!`­á/jš ­˜A²{t¤!ÄIÛßA2PøðC™÷$ô9Ó�­VòŽf ¤ÁIÝÅkáäì£ðRð¨þèÐPxíjÕö[�¢Àƈ \©–I˜@‚ï“"<Àç‹Ç„GÑF ÀÇ�¡¯ ª9�@jÕÎf>Ññ¡ðqÖAÀ-Î~t°!ö3j�¨yŠóZèC @Çþ‹º Ø’šG5!HBp‚޽¦QÑÑÉçø(g^P³®eƒQ•Qph…/B‚Ò$-1ã—Ê‚œñ¨æBÝÕ™¯ÀÐ'³À"#Ý`'@8e] 6ûN!Ž P<«NZóøÂœ€Â/¤" cíü@l~J(èXj‚zWêFM€’›@Kåá||Ͱª›@£9Âhÿ.ˆF¡+�¢êï„„Àšà­GMhÐ�|l¨õ¥/p1×Âï �À¨)ÂT ©]4Z°Á±ÔׄV—Êኒ³X!NÉh*„ˆã ”¨ ÚcðêéuÄ×Z/à\Íî3�Rpö•È@•°Ÿãž�Æ™’‚·„B.沘}†Ä‡…íkÏ]€ûq?P¥gËM„]h¸)8·fVÌ2Vw œÏEÚ¬‹ó�1£Rv‰$µ×zâÉ÷`À^#4¢€ÃùI¡•Ÿ…mÍ|<¯-ŽVU¿Ñ4ÑÎ/bÆvq^PyÕ¤Ö€ ÐÚÌÇçê⨲O€G@ÀïìèO䬷ÖfuD`RƒŸ‡Ð˜`¨Ëã1)zD8‡í¢j>óƒj\ûÏÉ÷-¨›�ø’‚ãjrk]QÉ+º?=AµsRpÍÖ¥à*�)´Ð‚³ ‹JYMBª0jÂi¯5­k³Ïù «�†´¡§ J>AB’¶Š*/«AA¡´s5µPÓ A«!*Âg Äs7+ ö¾&¼6ë€ÚNÑÊÌg0*�œb6,óž =!g„Æsø¼µW˜4ÂV47\j@*`H¥=jB×Õf5 µ[\Õø�jì0­™ŽÃ5ì·)\Màˆ€ø¾�kZP¸¢8§Ín̬°ÂW¨_{Jmê€tÏÎlïµvN~iŠ”?* ˆ Az_Àh9ÝÊX/ Z;§}kLýŠ­2€¼@ê}™²²7Ö0­óŠ#¬~oÕ.läÛ¤U k ? ÔKï·¾:KƒSãCj‚Pk¼IðÕÏýLZ×uúöò=âŸc¬gÇ¡ãç³Þ_ÿ0Ÿð™?ÿóßA‚whÀgxüA¼>Ží÷ÎýåxúîñØ:~tÿSP;¾[ûÇo¾ÑýÖýà z·;nÑŽp‰ýžßJo5±+ ÷<ò°>¨?üÔÝõAYuËnw7·hz»xè ÇÝËÜÅ]9ü ËÑ€±Aowy¯5 5¬ëÎþV’E�»B¶‚”ë#‚ÔE àŽÜ/¸W„ß›°7öT—úÀŠpc®ê°U©æ&иVÍ<¯÷¶T¨rGQ/Û“&ÐЫQÀUeô[›êûM ç¯ØÅuîM ØÅåîuèxV®¸«×œ ÷#•æ_[; ìmІpwýØÚ2Š˜Ëbk+ <·BjWÉ'¨D­cYu¨ØU- ðsâÈkÕ]ï˜H„¶ŠÔ i@# NŒx�ÑUn$B[ßö§ÂàÞ7Á(ÐÈÙ€½´ÇRá-w‚{wØZ \î¶ ×#9Û`,c ƒƒ&0µAîáå±ÒN®ƒ -·;…ì–œƒJ&ØJ.xª¼°7§«¯›^ ´! æ�Ò4`ÂÚ¼ÒV9ÜÀÚ*†ÆM`o›À„˜Ïj>€+µÀd9즡m< p=¹ÖôjQ ¿@î•ÆQ½³¨ýöý“6D–ôÖÉ&2Á÷¥Âó™ 7‚k]öN&ød-ðV0—]uýÀÒÍÝëÕàÛ¢À`5È ‘e"^=Õxk9¼Í%B#µÀRd,õîE½h8Á×MàÞïíã9€ÞŸÉ’lY ôM¶6û{¿+ÌãMQMè©Z`ïCµk¬Üê]á­Ón(†ðÞßT5Ö^ØÛÅÐHdïlíb¨‘\ì¶8UÛâ<á'ºÂó¡çV†FFHíñ@G¨QºK'øZ"t/M Õdà¹L¦j^|¹ÿºÂ÷±&ÃhvAC]áLà­ëOÔð̺€€Àƒ0¾2›žÃ橃´Y à0ŸµûAijÐàžî 66ß§qÇ[˜ÀXÈvÜXÆÄ<À½ÔfE§:&ð\Œµ�•ŸÇsý€}ZZMÑʨüɖƨŸq}Ç–Ì칎|Ÿ.ÛǬöNoïÍ 8Öî8Áù~À½ïž�°UM •ôÝÁôŠ!îVîZ1DýUln§Âº˜Ù!ÂýL?Ù&)jg‚<çV·Bfvˆ4ÊvþT›¤¤ lsaP3,ž˜ª~"T ƒoÓ€¦ñx¿·Kld€háóZ_˜K…w=ì :1b� ]í3ëÛ Öb˜+†¶~ììé­ ñt0_ø“l•]sxyð9"hÀÈ&©ÁëäåSd‚k½šØ%VjÀÈU¶úZï]Î)l- î”yÀò’ $B½5Œ±~@¼Ôe,šÈ·Âfœ`-:®“ÇÃu'h­O'B#™Å¢.=·0âý`¼ÛÞ+\—Ô¼ª: #‹u™ØÖ}™@í:—Kî®]º·—ÆÄ€ñ¿÷µL`ï_�ó€ø/ï–é–˜¦þˆ•.Þ³I þgã„tÀ+›¥á? ²{×&)ñ¯KÃàÄˆŠ ôÚâ­�K¹¼gƒ\®–ñÜ Õ5M`´!B©®¼4€ÛQ@ß$å”AqpîC  ¸|)þmòè&©Ýéÿ\—/�ûSMQtËEÙæºÂš»*O÷‰ÍÒ\AëJ�{ÇWõÛâøÞzèm>f©+ç)ÜÙEË÷A ¨\°å�šÂj翽“¾‡b`—XíÓhâJë™ â^µ�+5ÀXh8Æ€‡V[š:µ§P¨]]k‹ ‰)Ãyž�ª·i¯š€D)WäÚ‹¦¨f(üžè Œ€!¹üVIþ÷²'ÇCa°6p ÍT°ÑsbŽ(û„Þ€Z&èÄ$¹ü‘©üpW÷Uâ,郞oSå>oírG)Gn]]~•´hŒ•N0¹î·jÐ+ƒª£’ãá+µ(8vœ<7y"tNJ¸ß¿ÇFòìçÍ6ük¯ ÒÄ0œf€2—§ê1¼ÏÞ#‡7Þz .î8í?üÂñ÷ñ5^Óy†\æÉýûLcÆë}(Ÿ¿xŸÎ7(|�Ü]3@¸—¿èëíË[¨‡qüû H¼pð±(©m„  ó³ÅÝz’ ‰†k Šc] ¯ëewÛ½{ß'õ†æìô3 Y~€"çm»o'¥“`¢g>œ‡™aЇ¿f3ªhÒ¨¨=aü”ZŸÚCLœÑ ÞAm£¹$…ç+ò?® gø2­ô4Ÿðǵe¦xÛö=ϧÑVª+þœ|…+¬2ŸKÍ}T}}Ýa Ÿ‰äÙ¯p±;œºíÛö¤®–J›©ê´òFTµAÃ2—¤ò˜40&Áü'ã}ë ž%;�Ü]ûö^å-uUÿÝÚ½fÎ7ï –‡Þ¡?9Sám! † ž¯B"¦g+Ï)\Š÷”ùº¼Sé<ã»>Ç]ã“KÉJî´8†\ðAÙP®)˜�¥jK:ΕGÕEÈŒ*z©›KÑò ¢2M•¾%D†µ¥Øpm„ÉZ¼,¸tŒf·í㙥k åºR.Æ”ÂG-p2{ä\¯4oÎy¼â,SL)¦?çg'ðX ¥ŒRª<éQ†ã&pŸ°³ÿžŸ¡Ëø%ø#™‚&Ur|¥µÄͺJü*šô½Êgg2ýƼ73ÃÊ_©ãjqíÈïÁ9]Bº`æl tN˜~¯HI\ÁµðÀW‰…Ëådc˜;´T‡Y¸Îår\5É‘ ~ på7œ˜"�&ATv*ô”#?KJ–Èꌻâ÷ë©Pðè;‚ÃPêõeÿfç•Ò¥:ç¤JèÆþ¸÷±O$k"ë|Ü]¾ðJŽÝJ@À#KµQBÿ®zëQ¯VÔ0, 8•Âï<4�ÿ+«XË'Ó¦Šò‰Ré´Ñ`D|™ )™Zì\¶vñÌ£(¼øšéGHvÉ¿áó‡,ìäÿj¤B¨B.÷øP7cn¤Çâù"«kŽJq0:ÊåBù(‚tóÊXÁë9*¦eJœt×§ZžPXÎ2H¸G}™4qL£ãŸ]©6Ck,µÞ°#$5àµîŒý/ ¨)Í«ªÐ�RšÉ”hsÊï)øÎ:¢Ø a(Î~ IºKÊs ½@©4)LG®ûšG¬·€ìÀýcÑ(Ì:“NS™³S™ÿ‹@š hʼnr6ÀcÈäT0-6”ÿú"Zs®<àãýÅ„ûõÄýùÑéÔºÀå¤7ÍólÂ4“+¶¥¦Ç2É©ä‚ð^ªþZ­H1fÑн>"×òL˜.G{vÌYžO°øåì \„$[ò}ÇXc„.1,ÊäæëŽ ü^%xa8‘ÐOÈràátyu‚(²$º*õ‡pW'(Ùa3†3»Ç !Obbrœ„Ût®’B$ˆpÍi0,Æ(p÷N0ür®—㸠ðUMÅ%'X×!h9]c1h84ñc‚HTX3g±ÜA܆5Ð{fˆa”¥,’`LÑ' >�RNÂ] y%YÊÊá„'—…®Ø§ ]ý>w%Di¹Œ´*2¯O®%²<<GØy ˯+šÐà“Pfì×I\ -»Ä|exà.œ²J¸*$“KÙï„&Y¶�+´•`B\\/t._1 /n>ÜaU]L…ž_ý·ô\\LÔ%¢è óÔ¢(Œøú€+ÙqWÊ‹ÆÇÂ<r9\‘ß`‡èa°›Ì4™˜v]1È”œ-ejOr”à˜«AÙÝ&eyŒòµ>wikVfËL3s¬t5oÏLDÇ¿h·c'6©4 à뵃ÎðU`]TòÚϬ ²ÎM¥5¹¬—ÌeaÌ©-–;Ól¿@Ô�‚ÙÍ Qi?ãÂ(¬ÉÓÈ2Oòà.‘Ù¦,+3'ù‡ÈÒ±áÁʵÈ?|»ø˜f7ŸØD $xª ^yž… 4‰”õ=È/Ê%eVê‹*IVº‹þ"\ }4E?ˆ&"•­+üP,ˆR÷Çe¯ËVúX@qùtȪ3üƒï¬’Ìv²ˆ} ¸¨’-àD?–õ'B8 çK*¹ýK¡]Ö:Ël?Ù¤ËZíÉ!)ÛhÄn¼Í RÁÀÜl=+=ó¾ Ë§˪ÖÀ½Ý†ik±ËÒ_±ø¸±ª.zè,uÎ,"äDÅ6Š|!MÔüLùdR®…A\éV´³(òÑa׺LØÆR¶ æ×ƹt7®Úv+‡ïƒMùÿÒMQ/”jQGF$Ñ*È_DgÕmÔÖ)Ûú–/•‰÷œ\‚wê"ÖÂò=jùY ”Ń—Çcb迊£EòT$¥=†yYgrr—ËÝ5æ• –ž_yÇõç×ï?Zbù&” ÷ÿ\ì(ÑW’ÄŽ1±0A¤Ûv6 ÞŸsb§©Ã.‹¹¾EáöqûXY®åÊ2ž\mÕBž0S¥e]n»®‹*›Jf?üÌ1_OóKè¶cº ùº ØúilÊöDé›Õsb¿ïU=c›íúݬhq¸çȉ}F\ø0‚ëNËã_êÏõ—S*‹%ñµñ؉m³*·|–\•56ç‹"±‡[`–~‡l¿Åȃ»S¢–¸, *–ÒÂÙG¹zκÔW}Q[¿jÄNáG /“µ¼Ë ÐYnìH¨n©í#À­øÁœMÑO±Aém«(ŸàÓ`ÈÇ %ßÏB”²ü6HìŠsÅ~‹‘]£å+.Òv­¾ N¯%._ "©«ã¸=Þ‰F$);GDs?ë,Ⲹ’¤eA½ØÑšE/¶Û–G•d'„bQR~ˆ¶ %ßk5&ÔéCŶ·« ”|9LU¡q‡ l­õ ˳Ʃ,6ÖRÂ_ß!R8a;° F.:êë—׺ý•-Â^ÞìB ¾ëÓÙO([ðYHsÅ5U«VçVÙ”m‰¾}Ê “Ä•±s›®=¹?pÙš¶³±ýVSϼ³S±ãl)Ã&KeõÉ•ë‘çw†J‚"nbÜÆsÚZ¸ºŸVÎ@k[lõjꛢÔªúRn¶¹ôÿ>¯o@`(ýÓëra´ü‘öm*:HÙí‰êy¥våø… –1>olœwÜ*;Æ:îÍeãÁê“’A«ß8‘;Ίöp9y¤ÇdwÛƒ üš¿àH~cìª9nÛ~/[±Å.£¼//ÿ_}¦ŠÙu‹¯Ð 3ÒºÂØþvb©…R>áÔ<@šK3uÙã+3;?n�UûË)»ê¯*îjì;ÅÇ„ þUï;­ó‡ Ü]¶y†8ë°;Üv{l³-, ¨sVR×gB†:¬Ö\å;WF»L²%±²…Ï…à<­ëÊŸï;ÜLz´òû™ïhßO‰_ 9&†~…7_,øâo @ü»Cþx<Ããâõqì¿wî/nìøÑýo} y|· ú›ï»#¥ã·înôjon½=nê´T*ó¼1VüµŽ<»ÎjƒR{Pøv{ŒvŸÕ±?è1Úíy|ÄæpQä[õ2Ÿ&š� â4¸9] “D*OpëP¥ö$-ù ržÖö<ÁÏÒœ®Ëj×êt8ÜÒÔ€¥1°k¼–&°ŽÍÕÄT!Úε~ ^j@) _í­Š¶¡[-¥Ê`m¾œöU·¶ æ¥R÷Ju'ˆw(umg½–×*4`i[,‰k¥º\î®ê·#@é^‹T“Q`n`©s‘@¿Ê¶ ,óa°ïžt.ZK¢£y@M[©îç¢ÀÄ <@s‚î¥< ¥W•Rã5t©GZœ4ù€š{]êѪX®(ДÊël :Zªuk˜€vs![Ñ€Áä¢aUjvà£@/Ç .·fH.|À󠕬·ákƒoøÖv‚õ”…žÔ€ ÃÓëP\Ç[ÚµÀäe^éD*\+Úúap¢Ìläã™E¯Ä\;N°[zJÕŽç2ש(°T÷²žÌYæò€'!ÑZÞšh ÏZßÒh…ÁNCd,Íúî-ý€‰A×ñrxÞ`'¢�}’j†I…/3WºÞ†K÷ZÙ>×Xú¡PÚ)‡Ÿë¬°Ì'BýŽÕkeÌ–©ŽÐHЋVs!ÛmC=Á¹´]v„Æ5`$¸5ZbîU­ÚºÅë—™‚êHÑJ]ª#yÀ #KSÞ°Ô´ºjº2W -O´ÅÝxé^×€N“Áõ“‹õ6›[޵šžªZöŸ§Âïx¤w;W?Ñ-2÷ÉU¼‘ð²vºÂÏ„Àñž ÕµUvê Î ºÞ¦: M†š ¬íàJÑuïöæ­iÀX*Læ]¯H„ÆM`²Ñ hÀªøÊe: Œv…'“¶º ¦—®ð:Ý«]Û0°Ž¹¥Â »ô5 gs> çi,Ô†ån"4‘_+&0–µSgŵåŸ ÙkàvÖæêÙ<`zÁYjÀd.ÐÈžë?“tZbm¥Ò4`°Ðذlm¤n¨êåËkû™t�0HcþÊXÝÌ’+=‘ ¶ð:ë�0W¹,8Ö4`®èù€÷\«’¾>ð2?OCW{™À2Þ»Ô¸ââhþê=/ûðˆnæjǺ“û.f7´Ž8l`­ŽyÖj|a›ì–iÀûÈ.Ó[eÇ®x:I/žÚ Õn1¹…§pOW;^æ…hÀ:¡Ógó�Æk‘<`{}³t-º’Z ÑøVYy­{`lqtäJ÷×7KkZ@C‹X•ëúþôÜ^pOåûs›¥5mÝSLî“nùÀË`‹•ºyÀž \_¡±½ q(ü¿ÎTí,ýW$ÿ9—œ›Ð«‘<€CÒ>Ù­¹üßÎT¯J-àúƒÒÀöëúnñ ÕÀÛâ×?·^Ü»%÷ll])¿¾Y‡‹?{¡«{j³´ø2èë_˜ƒ>¼@g³´kW®¬ »¼Sck%ãÀ�@[ ¡=B,®VX¦t+ …Fú½'ƒÖE ïG�c†UËXÊŸü{ƒí;¼ÞøÞ–XÆ·3Ô…=€e ZS•ªS&Ð�í:;![»þí|æ7I.îúÖ³28ííÑúõ€<·�RF]ú+X5œ Hc—‹*ÔFî¯`hçc*\›õŽÃÖn{´$�äÚ»ú‚‹×‡ð´¸‰Qåíð›{vþÒ€ÞQq‚ϯóƒÑØÀÄzÚÛVÿþÀ�®âI×êÄP.{¤J¥308‰ãXÿëvà*ƒ^ƒï7áu~X=G›|~ÐÚmèÕ+ýâo àö•å^¾¤ãæ¾ì›Ê�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øUü|ñ7P¸9¾Ù Ì�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €øeÿØ ˜¾ð(|á`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àWñc7P`g7P0`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�àþóÅß@ÖÝñ—{û|á6`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�à×ðóÅß@ávc»‚ù�`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�À��`� €0�¿ðŸÿ ½¯Ýqž·Ñ–œì¢xw±ç=Ÿþì϶@ýnŸ›oœ±lŠ"%Ê–ïçã¾x’qœ„&/‘I)qžçåõHƱˆÇô|Q^_Œÿ̓ˆä¹Y|Ƭ¼f=Ÿ­×^ß37®-7ÞZ¯¯‰÷ñï&åÜ.ƒÚ£8ˆ?_^´êp}¾>¾ˆ>??×sôŸÿügùøø ~øa}Nüã—?ÿùÏô»ßýŽ~ó›ßЯýkz¾Þ0QlGŽxá åó\€_»‚T?ßzÝ{þõÿ”ßò›Gbü¦sÇ“/eù¿<^úIϧUW›ÒÃKÁïç/e¿Ÿ¯ );lНóôÏþ3¬Šÿ÷¿ÿMÿú׿VŇ?ýéOô‡?ü~ûÛß¾ô%�l÷&¤€)éU{¬ÏÑÞ«(VûR”Lò=R™Êó)Ýï6ŠƒvlJÎ7…¯£;nÏãKÁq{mJŠô·â_ ëÈÿûßÿþÀªüè÷¿ÿ}X-ÀËÐ_þò—/�¬è9©p·¢½V)€¼£Z9?±ï£–¢7Å­ÄFòÂÁ p~.)x;·ÿãf²÷ד‚¥ÇMÑïcUvzÜ”¾Žú÷ómÔ/\ñ+½W³ÿ·¿ý-& °à5òã_ÿúWZ­À?þñ?�¶›çB=c¢0“Þ‘JÚçÕF«¢d ®ÅEŒâ‰„–ù#‚P¶Õ‘ùì N›åÍ”½K2ñüH X•¾*ÿ¥ø¸úUÉïç«âW ¼”6¿¹ x)?¾@ñÃj!š.€ ¾Géê{„Ò]¦[(±õ:ÿN�‰G㵤إbÖ'fÂcR`²$\ÁÒ¯ïe#6ó½på'?¿)üý˜|üØ­Š_¿k5ùÜì'ŸÿRòîûW�¤à/`½n=·^³¾÷ €õ Î*_™Ô²RQƨÖ¶|°0Ï‹rŽ¿6ÉÑËAÊFs²&ÜœK�È×ø¹ä§czÏ6’ƒ¢øw4ŸLþfâ×çÓ¦ü%E÷ëè_GþúüuLk´¿¹€wÔÿÀ²¹€eÀzOëãË2,Þ 0]@KùB±d¸ Íì{@•ë‹À‹™íâœ2“Ž3“/βðÿÓN<n£}÷ëëù4¹5H¦}=·*n=—”½)?Eö»¿ßWå¾³*~ý¼Uù �¯Çe‹ V�¬×PŠÖÿ“X[ߟFÿvof  ™å Ì+Ub²À"†éÖÀÄÿ“ðí÷áÂ×/iš•˜Ûœƒ]“”ºlf„Ù_�W>3ñ 7÷ÌÇ/Éô¯Ÿ—¾5ØKf½6`óóo °ew �¦ h)¿6âɲ†¿Ž•€­PdòÑJÀ¶ˆÑ¼HÅ+#„‚‰Eô!)Ru<ã‘}2õ‹0ûE·òô’ùÌÎMÛoáf=—üþ6ò×éÞ²Y€ÕÄ¿Ãú\º€×óõÚw"(`;O›Û¨[�knnkAœÏFµt'bTË‘´‘Í1 n TpÈàNùbÙµ‰[�nÞ7?MÚœ™õä R—Él£0HóϦ{K²�Û¨›ò£¼Ÿ¯Ÿ™×cUxñéHÊßîCµ�ÖèW•_S¼âÓeÔ ÅKŒ(+œÇ�iÔ/Âôs ˜¢INáÒy¡ð%|1…ã¦>¹€ Lïâ–®›rÓÈ—£¾°�k ·>_A¿ô|åÛë)Ø-Áë˜øÈÅKà7¬¹�mŽîT¾õ¿À‘„r©pî»S &ü·4ý{0—îÓPô®ðíõÈF/Éb%o¸ùgž�m>?¹…E!aUvBrëèN. )>a»>õÛÈ_’Œ4�X&^žÎ”+\�ÿ_S(U:Ó 4æå\ÉܘŠ×F:S´¼fá€àÓ<fbŠà9¸ò·ƒD°“%àS>9ý“`}mUºf Ö{ÜÞ·ÿÏÌþ;&`zn4ëßP~Õ‹Q/Ÿ«£]‚Áp–Ò¡pn bŸ�B¢‘®]Øcº†RdÏÁ €€ ~Ò\@2ÿéy Sú—[ƒõù–!Ü-ÁŽ}ÄoÇ"r]�ósMùQIÔPA‚[ƒ†ÒµÊ¿fæ”Ç=Ò€þ#^>î`à ŸT©ãÊÊÎüþöœÄÈߟ3ì#œ?_A°ôEšü-áç®n PŒvy Ÿ÷‹È_*”d0È”¬%w‚PjçE¤Ïƒ¶‰<Rá\ñ,\”‘¤²SlÂG;ÏåË4/€5ú5+ÀÜBz$v.vþœ 6RÖ/ñœ`M.XÀø¿ˆ „—€#=(f>(IœbÔ‹¬\à×Q^– ¢òF¬Z·Hß.*t2•[<òô-ËòíÝ’$ÿU¯Ÿ“ŸOMiÞ¿zõqS~2ëïçiÔ§|�sûsn ’égr1]@Åæ¾P´bæƒfú+–ÿÏʩ¼ËÌ"^S-sE ^˜þôÉ2-íª`. nÊÜÝfÖÑ.™; >X·×2  (~âÊO`I¥ïd2 PóÿF2'¯*J­GÃÜË`nᾜ ü,Øãµù¤ÄMÁAfïÒ|>)|½nKŽeS:îÛ™E föã&ø…aa-[LaU$SÒ>êÓkÜp¿ÏGxzŸup7˜w�¤À�@uX‚òGc´«çX*VcžJ®bÔ®€[Ua Üp „pþ\Xù<¦ï–Ó?æÿ÷QÏcH ÜAÊRÊ']#\$ñ8@³�5_é¢'N^#G{0Ì|PRµ‹â&¥ ƒŒç¼’·p@Éÿ“R™e bÊ®Y€¤”¬iSX€‰`>êù¨æ–@³�Ü2ðG6Hd±£í�Ôd‘ˆöå´0H+ ŒðÌܳ@EñA™ïsðÑ›=€(¿Y’#ÝøŸ¸¿—õ|ëãKÀ˜x (M¿t Iñé®t ËôoAéø®»��2.НŠÂÉ Rü?G±´�A˜ó¨\7IÓ.M¾¨ò q€ˆÑ¾»�1õÛÏm .Ì? '¦ø‰)~b£¿8¯DùUˆ·¿±ÿ]A –Ä!Q• â\q€T¸5úƒðßÁ¡ôˆM>z3E‹à4‹ÀG¼P6iS¿tŽ™ýÝüóþ}Ë H y2¡å8’Þ· 9¨A �€ôÃÄk`PZ«¬Ø@@*¼°Ûè]DF°Å\¢A“+ZZé ÔG‘ Åw<úgÊJ¹€‰'¢¸¢y<À]BòñI©ü9·Jð·ŸoZ€J@Ùçe9™S= {�¨Å"å˃Ež"�2åË‘oôÊcR~ñÈFtºž_C"å\XmôL™¾¶¾ÈöwËh#<ˆ�ŽÄuZÔdse �ìKÑ¢[5邏>¿òÿ>³,BòÝ v À]�Spæ,X@Hy}>ÊåˆçI­½vˆº,@#ØÓDÒÑ^µÏämV-@° O¾obnÁ€Òß·T,Àb<—×ï>í\JR1esåOÖÖ,æïeª×‚ðÿ¡w•Õ0…â…Á^*13£>°©!÷û$ûúÒÈ3zü2�$3¥.rÄ eîç,eóÑÏ}¼°�™²­Ñï±Ö¨o�!ÈàïJ@.‰²ÒÁšÒÕx@\Õ¹ˆQ^\ÃÌûÂf¤Œxb+j9Ù(·FºøZr‡<qS¯á �´ÈÞ²IUŠ©·ž`]YÒ3ÿ¯¸ Œ¢Œ ¹�E±‹°Zw¯Úñ+M=ŸÆ2¥¶�@rš'L8>¦�¼`à@Kíj™¾&�RJDõdøv5l¸†Ðp(––5PÎÊæÖA´€Šf€[ r�`w ©ö.܂ⱀ5Ú[Ê—žhh Ú{„…Hípáí¼Y@Ëhïq*=+)A`¡L˜ P”ãQ¼ ÂD&üÂXJ¶¦pZRG‹ì¥âeÇ€´M�ˆÚ6b•uuQ6e8,Bd+rxQ2ÑQøøl©µp dŒxi ¨Gñ� HzªÒkÿ×”+_—×r¥* 57à@¦4 ¢A$Ô,E%F˜€øÿ¼½«¦tí<÷ù5GVáíâ3Còñé¼Tªë:M¹Öû,“oÍT�(U¿V¿Í¬àO¶q)ÿóø ²ò° E“"È›´×ùymÚ¦™p-²·”-çúÖœ_»¦�M¡¡Òö¥)9³–…°”¿¥l–ŽÎœ>‹¥wùµÔªiÁÍ¡ñAVƒ©øëusô[Ö@S¶Tªš&-7ö¨ hûÒÚÁ¬fQEÉä4ýVPÈÓÀü<WâÄ® KPSìêZ@ÖúÌ4ê5`«Dú}%(^WvsQñÜ–)Õƒ¶ÜiE"¡0­‹¨jd ¹°­L4@È®`í5qYÕ…4F°Õi£™ø¨ŒÎÉR¸5’5ÿndûŠQn¢ê*VÀêðÕÜBa ¬„’˜5h£~`S•©%Fj£Õ{]K5“®E÷šò¤’Z~°À 5°\€†J›x0rVuPsÚ¨.F°ôÿ-E·F°ç}Öõ=£™´=l*@ÐL¿ç|ð¶“’ Ìš?,0T¦™QÆ. ŠçltÄ^Åõ¥çs4_­)ݺ®WéJ  *Ý´ZÀ‹NáJkx ¼½¬Vã‹@ŒÈ¸[Á­‘ÝzomÔ{�QS¾Ãäûc€FPXC¬˜ôj‚ÉÊj€R,@ð*º¥°åöŒrÏÈ>£t%ÐÓb‚ºhÍ÷Å®TYþݽ4ÌŠ7„«ˆFщ à˜ ñàÊu-åY×zÌ{íÚšÏW2‚a·�ž…¡5ÖòpkáˆÇJD1zkÀ g”söZ)ðžÏ·|õ…W€`Ƶ¥a-+`­ •‘î„Cé­iiHîxlæÖ9kÔj>^Š ­µêì 6¬,#¥tlÁk%z\Í(Å^½¦5ÂA^Ïh¯þ߀ªU0šG4å“ÕCàÙ¥Ä(B§Ò»�1J±=£ûÊsçè×àÜ L³ Áã:žWã ¥nÑ´:F‡Ói…÷Œ`ÏûÎ*ûŒò广A¡½%œ×¨ èíC ¾Í¨BÍ X¯_y~Fi=ʽ:Ò­s�Xûû‡0¢ôó†ò©„³Š1¯(vĨ®�¢€PÙ)ÔøPuŸ@íœvŽVkZ-WÑ .—G^ëQð%÷œ×ö îÞ,:øö6Á¡)Èc‰¹ 練.y€tÁ\ߦøšKèÙ,z”•ð‚¡ V+›3†‰Þï4xøQGp‡òu�¿Z–€¢Átt0Ö¾Ë ¤#ð[*¯¥Xâk×T4ʪo–?dÿü\pÇâÇ ÜŸ‚B{¯mýjXìøBÏ(‹ &[B'\Së>j|Ç»”8Z‘gßãýÝÀx‚‘ØÁg4EÏw6øóð4Š—Û”6òýg~94^`ô̈Š7;vŠÿ3Vñê`¸ãþãóù¼„¸»üSþÎ_Ò½Åiš¾ùÍüü½Þ“ûGžA¿LŠ¿ÀÁê çÿŽþ÷õÌsüïºåW!ü=øŽt\çf çº?Æ2ú:þëc,—ëñ«÷oã¥ú,ò€|3Ñ¥rÌâø<Žå3û7»¬ö‘Úf¶¯z’YÁÙºu¾Æh³'¹$¿H_Çîê�SªÈsœÎ%�äË5–I°ª²•ûXÌj"âýœrþgq–<ˆõré)ÀX©æ€°²`vÊÔ’'5ÅêAÅ ¬�¨ÉsvŒþ†òˆTX€qRý�œz-ê¬[€»³s`µ ëRkCùÒÌÖ•‚½WEù'Eº`.ÕÒX‡ßY½0ûèñX9ËæZn@0ž�à‰¨É`3иžÛ"U\À©Ú1@Í¥68¯Y€yH�ØÎm P“çìp•À#ÒņZx^ª‡ ‹µ8‚@M¦ä—iC´ä`Ò?µ[ 9i#\ sÕ–jÛ3¦bVØ#Ó¾ pé°�B´³1 è•ëI˜:EZ {™Õ‚À›åéòÐÕÚè_Ú1•ÂhP%縚m ÐkYO€ S¤áaפúü¼ë�Wåy.8!ÞV p‚QºÓG5<Ïìó³7°v„¬ �Ÿ'ãÖ¾Y@oôoL{­@Ã\Q¸6 x4ƒÀsRís³Ò|޵ªÓÁŽL`m&pÒdµ²Þ±õhfÏI5ƒ©´’kŸJ&ðQŸ¬ÈÇñ™ÀÙ‘c32Ÿ ¶ÅŸ ìIZ+"`œTói`Ïĵaæ3Öñµ€šògŸèÉP¦­ôJÝŒ—j»t&ø¨ãÔ›[¹–š}¢=› tƒ¼"]Ü1ÀÕŒUhÌ®ÄWs™Ð&-=ÞÊ— ö2\&Xßy€ùbLÕÕ“"” ô¤‚ƒcä7 »L}q*’+5r�Ž:@-°8j,¤Å@‘†©;ôIµô–Ù�¼Ö¾�ðJIØ`ø³’ ¼P»,Ò �㥪ÏÎ|àp«½²m{ÖFOöt¢u H™+U;°8JíÖ, á®õœé p¸€›üÕ ‘*.`ŒTíL §Ô¾èq•´�éh}Ôµ ð£Ú,à*£t>T­q:©¯Ì—¥ZŸЩpÕeækõFkµ€qóÕ!œê ·ƒ%8šBC£ÄÞÊ<êAàÅ>ËF"È+Þ•³g»¸8â€ÎYÀI‘6‚À_åm [lCžë#oñ¶0ŽI{BŸ‡hçŽY�5ÊìÎHå„HECÈ8©¶›B{z-7Ž×_×ó×æÛŠAžªÕãë°f‹+0X¤!ºB®ƒFT[“ ˆv&ðLár8ƒüðT/40Œâ8šAà0\@C¶+�F¶-ÐM!£:‚njYyd�Å œx;¬jnõ¡[€ù¹Žh·ø ­ª™Àe¬ ¸ R‡ 8'UŸð”ÙÇ �Þìê·m å¢Ú1€Ub_®Y€N‘2�Œ•jß4ÐZÄöÈ&¬U à™Yk ¯`*-À™në‹Ó@§Hà¼TûA yJ�x‹—÷, i0Êpã*–"}€ÂR­§‚O®¸¢8vÓõTp…ÙyÎì \n�/Õv"Èš´>lÈR¸saè`f?ã­Ìâ2Ü%U_9Øâxœ~æ�8³êzl9øÑfö3žË^,wŠ4Ü%ÕvCˆ&S)ß)ç˜ÊÖËî>Ëó !“ïý±6�´˜<Áð`‘†»¤Z_hÙ«‰A•G*›\©£•NW{6^Q˜LϹè)³Ÿ\|R¤á.©ÚKÃÇ1ï!jvPè+SÕJÅOºh?c_÷ª”kÇ|å‚HÃ]RÕ-€§yœ²ÿɉÓþêµwr•´ÀÀDûë%ö¥£5Ü�ži¸Kª¾…!ÚÀâP2¨šáJ«{ýžM¢&…a�o›]+·Ò±0¤S¤·Iµ> °äÉc)×Z¸òãl¥Õ÷ãý«­.luQ¤á.©úö²8Väù�Õ·3Z.O¯½³ë‰=7˜c{ï¥ó«XG‰ôõžZx^ªýËÃ5y ®‰úëû6‰ª1º1;Çá{/Ý Ò �ã¥êÛ ÂÃ1;õ•ØïÝ b6Dr�Ü»›ÕU‘2�Œ•ªo—°Éàrœ*àJ÷Ú¹~€¨0;b ‡ èÙÍjÀ.a"`œTýA‘=ÎÂI‰Ïà1€µä¾Vbî ϰ'ñ(•oü4ÎûšmvuˆTÄ�ã¤Zß&nbÏ£Õ�î“«%V.Ò“ìsfGérnÄUÁž)ÀX©¶]€tŸs[�?Î&QL×�p‘é"�¹I”wÎë±” k[3Ü3 è`¿·§ƒuð4°c wHµ½. *–µq§4éqÔ}y€¨0ƒšÞóаߚ€‹ëNˆôå:(Ü!U{»xéR-WªÈtÀR Q®•Ùk™@Ép-p|ä�°dÙJ²…¶ Ò �ã¥ê/kƒI¾ï‘`i”*<Kîüµ€ÈmYŽÇ.Ö7�ZŒÞTî)ÀX©¶÷²doÝå” –ù¿ITÏõS€F/îtB¤�ã¤ÚÞ Æ5)s�Ûãû<±¸€AÌÞ R€qR­Ï—“àØât{NS½O‡né f¹H·ÿ—Øf¨oÅu¸A¤�ÆK5¢ÂÁRä$δ$\ÌÐóØ×•«[ÌFÁtÌp–éJ9xH�ÆIõ˜FåÎ [9Ç‘=n×Óbk{ž“+|’Ét=ÅqL’®ü1ÜR¸CªeCˆü1ÙÅ,P—ÚíÎ(Ö}Ÿ÷µ¶ B¬’abŒ‘>§ØfÌÓ Ti ÒmaÈx©ê³€š-«•×—\¦Ôºùƒ@‹– cTé^‰ýŒœXvQ¤�ã¤ZZ�É¡C†šLCCnžÿûEÛÁä^»Ž×˜tüpä�‘n�/U=и gA –²çµ>ÑR9ù(Ñ:‚ññ"�'U}`Óò—ZCH´Ë¢Á® 6_÷‰ÖbÐ`Z¢uÓãEÊ�0Vªz-À:§%®•sû|¡ç\ß»œŒZÌö0E߆Өŀÿb—Ëýâ(Aÿß3=iYˆb\‘°zý_–‘µ›Š¸5þÇíÌë¸Ç^¯wo&5ƯOúº–…gtXÝã\ÜÞöï~sB<¬K¼mÿ§¯Ïòi/oÖ·ï¥ÔUÏ^Ûøœ:¼rŒÇwïl“…MÛ¹/¹}}EºïôÝ1]²}í¼î×|1¸_·~Æî‘^¯¢Þžpg ’ÞÿJö¾øÛ®e7°ËbýŽOJ^ î×DÓ[å7Ș|+Ž’¬¾nvQö _ Øåš¼›œS&ü/ ÇäöÈò»¦.f¬dð�Ó!ƒC¾¹ð7îwžöïbR°ø”Æ¢"ö’çC¦_|Æ ?z`œ³Ï¥ êç²°È ‰Æ”eÎO 3baíÃeäž]“`·ï<{ °ýUñ]úWü‹Ñ±[žýS…Öøõá°&±Ð°.‹òû[2 åw1Ë•Yºm í– òwsYæR{Îó’Âhå0ÞÂ_¢vø.ìR.–¥F¦fJß°}î—‰]â׿žíŒ/‘¹’£‡Y‹ÜŠ¿k?‘”ÛÚØOwµdnOŠ&fâÌ,Ci+²3 ó‡o÷Ô/°B¶/æ—ÝDúdÊÆy8¾O± Ëöä¹¼�@›áVõí„‚#ÃRò¯»?ÊLqÜ¡¾+™xb6j¸q DŒ‡íöÝ_ÈÚ‹›"()B‚á0ñ!sSÌíñ¡Œ7ø¸Y”&<ÅL;8óÑ7EóQÏMõ.&Úx [¶Ëž2Ó¹o ¹Ÿ"‹{v lñXÜt°ßÛëìósžYГn>ºÞD郎 -æ;wa°xc¿ù¸»ËÌ/EÊã‚t£)�d`J[d�¤-�%¦¨È¿ cãûð­ñPHÌX#°�•"3órŸ/F\Š¡bÌ]’°Ü¹Q&f÷¸E#þ5Ì]Ð@Cæ1™õÌáí:ÈF6B^àsظAûb:Ÿù—0mî ,¨ÛÞ»GáÒdóà,½‹b‡yð·EµÒGª!pó‡ûgíÿ37$§)Ù}ËÙe€å#?Y¯l4î~Ÿ[ àDÇ{÷™JÈfi0ñë³ÙÚ¦Ã4à¢cd­™Ày9ši†O¡´˜„{9É&F(°)%eh>‚ßî1‹X)û¾5¦ï2dQ9±+"w3‘™à#Ö �±Iñ6zâ>==°Y€I<JŸÍžbæ2wBå$ƒ'.“•¢üÞ¹áç¢!d çŽ÷~šQÿtêóÍ7ø´â-å\bÜÝ9ù«\¦N¸Œ«ÎÈöe>7¤° „cŸ%,¢2k+-EÁ‡Ä‹ˆº#‘ˆ¥s½ût– ÚG1wª2JqK<ür #¶áf—«?Å8a»ç4Z#›2~9%¹¸…É­HdÁÜ;ð%¹skÅäk·v¹¯Œ$åDGàº%áv)D”¾Ñ?gc-zl.UŠu$ƒ’ÝÜÅ6ʉEÞvÒáx1€6@Ê÷y2AyW>UuŽ}(;©’OÚ³@Q0+ãÀüã˜`±[,SfužóçÜ]ªeÕ´i+™)1º^ŠFݵöãZëÒØ(FkÌE-†*¦”ÎͦÀº¢ÉK·{Y€"åšEdhœMSR0§ñ— M¿ãìš(S»¥œò€(d0ñ(Œ¿S™!x±£§­´4ÀÂ1äß‘¨Òg,M‘éy©ö?Ùg]BeŬ‹M¹W °æ…©R!Yþ‹'54 )@ʦ‹$ YÄãBAì&´ÄûGG¡Öb„°xÄxª–ôäü1ÃáInªc>ÍŒ1”ÕWžµ¬d÷ÄÙ×E>KÑ‹xÇàùŠ)žŸùø0¿ç|X橨ÅWlêF^dpÅM²l"/š¾ˆO9Mßè´)Íy,Š]TuQN?%Š/<Kª¹xªÝ#¦ ðógU¿nrßâ»I7ü²�ŸYèyTßò$Jv>æ×Q&•EŸYÕVçÙt1õkÊM8ÑQÃÎ ù[Ê3ÆX̉ƒ¸tŸm$³¢,îé3ífò’@(J"QT&¥39Êy|]Û\fÅk¬´|düŽk£¨š>?æÜ‡Q#-ªoìX lOSŠœwdó×#~‹LÄ2W,#ÁKY¾˜ò°6ä|¥¹|ÖLxJ>§&aòCôE3U6f½ ûý…£ŽÏekZÉ EYŒ»ë†Ï€y}e¯ÙdÓtÙÃj#«øX-€UW7à—R–Ž••9·Ž6‚–­îµ¢õΡǤ]i#¨0esI!Wnq}«ÛT‘ß— È*MŒù"YAjÕ/N0Þû°±œ™=·³Ò(·¯üÚ¢8E'±Í…<âG†1p>x•ý_sò¬\”f5ÎÃÈsë%2ƒÅìC醒³ŠÝ¬óbUjíFb,Í Þ³�}0ë™4žRÜ+Y Âó¬ó?J‹‘>”³²cˆÊš;LRW›°)^m€òìdVXIåÕ¨–wCæãƒ­!hBãmEVŸÅHA6ME»ë(ÃZÖU´ÍªÞ.àªO!DÍ*T“€Õ4Y+û'Z?Õ ýz6£Ì1ès´P´ U>Í5q¬ñ­m “÷IêÓmf®X~BAeSÊÓ ¾�P¤Ž‚žŠ1kz"� ¼Ë…bYñB&_vs&Ìd Q$p´ÏÈX™™Î̹Ì9ðò1Ë[ÊèÀL1kÊàÁêÈ*ËÈ"ë 6@Kk™•tDGVVFÎà«PrËG ÀýtÈÍcÌKa,AV¶†Ål ˜ Skw!f׎ȖýOeóoÞИBÂÑZÅ[»¤Ý'¥2(‹QY:*ÚS)&»=›EÜ|jÉ»˜QÞ:¡äLaoîÈÆíæûÓ×ðœSÞÕ•ÏÅø^³€¼ŒÊZÀBÔT>.–3©ô¡Ré;yó/5ǘWýöÞ9Y«A‘9I Ü–ÈÙ<Et gæ[ió2 ~Ñèf!1j‰ùsÝˆŠŸ5{P«¬<ðñÑåºÔBѾÆdçì‰ê}ª=ð=_ÜžÂés]‘\ëåÅ9}Õ´¶[€Ž{œD5àtò¦ùß.­û òÆ#¾b·�× ó½ÑqG £Ze¹“dz×úûü|å!¹ûÓm�´µIÎO1âpG-Ê~oñÝÁÈpˆÞ…®É›˜ȵ mi{Õàk%ÉÎÚ²°L¦Ú9O_Ù?P@¢Z+‡Œ;0uwÆVŠöÜ€ÒëR«È’bÒ~,šaçöÞ¼ Vò…!1ËvÊåŽQÚ9ä"wµö!ƒM N}HgK¹:[vÿ•ö®R ‡¶ug'R® ú¦Bͳe$Ë^ «¹K±�Ÿ¶Ñ4G¸HÚÞ¢îº]Æ_ù/ÒC‡Ô彑f]yÇd¡fó´ÙJª*Nd†Œ®(o¿åóã󇼿H¡©˜îèÉ•‡�bQ8©ÙÛÚt ·"}j¹©Ò_Õ¤Žo=­^4ø™èÒŒwîç­!ÓX5¿¹€NWÊ{ÿsÉÅb²o*«ÖNÅëß‘­K$Ñ&&‚¿PÄÉAÍ€Ko,j‚, Õ2XŸvºSÅø¸ÇT‡’—>?~ø(–)©>ÈæÐ†¹åùpå®d/ ö:yƒ e#‡–3©9 Òÿ†Â„Õc†P”ÞÆNÚ¨Õç\¾3ÏIJ­¸0¾ÒL‰µgÙ¶'¢ª•¯g<µ›yæÖpÑ}†³fs½ÿ†ãvôþgÐÓ–¿·t¢4ªMRY«ÇW*¸¨*B«öþ˺“^˜ý¹õþ%'ðsíýÏ‹r1ë|~þð‘÷þ‹½göHO:S•¬ +:aÄÐ-âŸLF|Ï�¹j¸ÑûŸaYôþGÖs(×r©±IÙûŸïî¢ôþ9*.CeºÏ3½ÿùü¬÷Ÿ ùªäõùó‡uÈ$&ÊÀvˆ y´ïZut׊Ly]¼ìÏ“õt¾Ö™âXƾ{—ßì¯ÏWšNóÚ61/Vö!ñQ›/Vå|R¾Ø%†rG¯£�'–q+•@Åa¯°–ýûâtµ€)Û…$îUÛmi+ñª1²skSᙲr“‰°·WýLáH¢ìÉkÝcöYG˜Â±‹ |²Ÿ7²òqÈWÔ¦U;™ŸLÁ¬\}ËÚÍdÓ*¿xÔúE}y·2¹Ÿ>ÜÀ‰¸w«;³pY0ÿ@YïÂQzÜz­ !ë, Ùû*+oµ´ÔÒ;u„¬9‚òÞÑÌfõþGµ¬LêŽX’µ÷_ëNÔÚxÁÙZ¬ôL\íLæÊÌËÇ$”®u(—M yO`¥æS­|E6ÚHÙç:r“'ë)Zœ'o]2J7ÖJ_ç³b™Âi,¤5ÛþÔ”ÐÙé �Ÿ¬ËWÖ›òݪbf³x;—؆¤ØŒ(ß>" *³™[¨Á[ ² ‡u–ìq;Û}ëx ùçˆE¯zÒO©DŠùg¹øòj?!„¤,³•Aï»Ü7Âsᘯx:Ú¾Ø ÛxãÀÌ;o´AZÓU¹ÁbxÓîóµÎ¾¢8ÇVâb Uþ.­‹Å#Áj›.?§\'ãÅ|Û;s­7Lde«v>ñp¶±P¾Ø„»¯Z;ùî^å¬ù= ÔÊÁêŠVQÀàõˆrÒ. FQ1qd~¯ša¦FÒÌj#YN!}+5mºº,˜ÊKÂåf—lÆbOÚó5^T¦³L­•I |G6¹©ßx*_îþŽ¢ÁQ¶Mëž“¡Xáqô(ò.\¾5\ÔW?‰Qjß3¯u9È‚°d¤.|*›ÉöîÜ<&/Ÿi«ÃB¨/ܨny£Œ}Þ ›ÕêŠõWÙý(ñs½'pþøÔ{ÿ5„ÞÿŸe￵¿Á;ô±í0²Ã®ÖAI¿[­\Qì2ÞÍÁÙt•äê-p•òFõõü$J›€½ƒÀêµMêö~sÿÊß< £»ýe½÷_”B¹¸ë¶Hdélk­÷þ׿ì2a”ߨÚû¯JÕnü®·”Û¹ˆ}ÈS‘{dŸ­l …fŽä ß”!_ILQ† ñXIJ-Úc™TÓnZüèCî>©L?Ë„¹Ç]î‡3Y˜ëÕµDSê¾.?jëi*ë B‘‹ðıð`ùbW½Ä×sÞ-€¥µbI¾Y¿ˆÕì}ÿùl{÷Ù|‰™kßÿlu~ži»V¤TjÄŠte¾³B±ï¹®X†SA,ކyÉ"fÑB¾’©wß¶âGÿmêHyn&Š=‚ŒÕ^¶9/'íêS{¡yÍ­PB{Täßiå$ÈPj…%"mÒîòêgGÃØ7AåV4Aõ€whm<³my�à\ïÿ¹ìmOï?™A—/øqöþŸŠÏ\/~x£Úû¯¿5kŒsôþ×zRÞ›E“¨][ûþ“¨dEQcçûþó餶ïÿ~ 쇑HÀ<*{úK^C?;Á÷ýÏ~ì)oWVÚò™È^î Ùž¼G|Qfäì}ÿ•²¯Ú‰ßhíûOFƒ ¼ò=(‹øµï½‚óê}м¼[,Íf‘F­z¸³Pþ,î (TÐ2%l¬TNoÓÓÊæNÉžE”Öî]*i5Óݹ ²yDý_¿—Uöýߨ@,ا¢ á8RŠÒFÀfùOŸðX,òÛ÷?ß•…Ħ’1ûé¶bñ(š2ö).ï:c½ |‹Ö­œíÌY]…7ŸÄc¹¸Ø/•uLEf¨HìÓÀö"ÁÅwg…²¬Æá6÷YÀÁ8©[ªý›…¯Í·–'ÞXAÁ×ûŸ j­YSIÅr-Õñ{~úr«¼N[.¶ˆ|£)’;×{ò ®ÅfÙÉâöíÞÿ¬‹µÛù3BŽÂvr¯`ndŸäÖ¯vï¹P¥ÖûÏúÕ.öþË~XùÛxEV£÷ßjhuõþÇüG²Šoôþ{—^žÍÄÊÎË´U‰žÞÿãw~ê½ÿZ¡0‹fK£­®æ?°¤ùNT]µœ}oO￱rnÊ~FJÁN}ùVµ÷_[A$ø*¬l‘ þ ˜¿~7°Hΰ,Ûž„‘›¥ó80ùÖ¼Hùv/òwéò}|ŽFÑB;ÌÿFö:‘ÝÕÞò›L ök$Ĭ)ðÙ@¿ÀÅwüÌ»¡ kyµ‘D«{8~2/Æ<õÍ”.g)YÍ-O_XŽàý«aõü2‰l™®ËqȦKy<š÷ó9M%’mg>d¡üËìÑ‹_QVÝoö”9ʼ1è 2¹ SeçÓ2áTî/hVŸû=ÆçóIEß:›âõ÷þ++`ó~ fµ~½ÿüǯôþG¶1s"¹[óõþçë®ôþ){'k9Mé±Mß ³æm¬¹«î-ÑÚ÷ÿR=ôd©¸ê¿ëŽdoˆ[jF í·Þ³ÑègC‘úÿ¾ð«…ÿ}=óÿã»nùU¾ã×¹p_÷:þ=eôuü×G-Òð«÷ï}—ê3<Ÿáõ÷8ì˜*GGÃK¥£ö‘q<Åa3Úì“Ñf£Oº]¤Ã¤z�@“§ÅuÓ—X946'ÁæÃÀCˆvª0F£]3âþ,yVd›�pƒH‡K5·�dcC¶¹NN6-vm&[ hXX±�Ñ1ú¶¸A¤C¥ú€‡“Sk`)r c˶�­q. ú–&S �7ˆô©–À:,®;\ªÇk=ºpF¬ƽ >ÚÀ+Ò~ß]ªu�´äéŒ\<žÊb‘ÿo¿Úô“Á^¦�¨qçç8“j>;"–ض¬±Ã­N¶E­X€§ÃD5Ž'åZ‰­,0@¤FÀr^ªG ðì0ý“?°Â•¨„*Óé Pû$íƒß ôºg<Ç‹ô©–Ó@mP=.'_\u«ý1@>+0)@xø–œi‡T.©ÖA-Ùžp¯ñ„âõDÐÙà¢p0[K éfŸF"è1ÜVuÍ®¼òcT;™=1à1À "*U{К^;lñČՊYY€w\Õò�FÀkY + ÒáR}†Ç³`›*qUGèIXNÝ©à©#Ú ˆ•Øjr$×^#Òà ¯IÕ—x8ó–A­jq•3°v¤‚kʯdÙ£µL ´�aŒH£kxMªe Л½í‹·n5>èL­DG–µÅ ­"*U{0uʵ3i™ŽGãðOùáùæ Ö 0X¤Ã¥ê«Ôr—Å o¬ÚŸ îý±®üZA¨†[Dz‹TíTðÙRû…2û5p±qÁ[´pÔ­ŸáV‘•j=<°à§ÓpÞX@Ä�7ˆt¸T펠3ÓëÎB[g•õ¤aíh¶:;µ~Øà‘•j>OÕâh…(­ºSÁ?2³FÎú.Ã]R­§‚/”دöô¥‚$f û ¸&Õö, 7kqÒcÕB•OW*x WZ-]Í žÛì+i*Õú,ÀWudWcgåZÈÕ9 x8ÄÚټЊ­8JçvCè‘:Ñê—êQ ¸R_qæ¦F¯¥&ÓG€G‡h;›âÅËüuŒ(Yùó�פjÇ�7•‚{ –3;ÎUÙ¿1Ó£|^ªú,àGh ñ°û“g0Y€x»H‡1ÝÎôrÛáÊÔa°fÕxÍÿdšB[Ók€D:\ªír°§€Ý\ŸQ~> è:§+­^�+®ZJ pƒHùeaºTóTðó"\}–SG·õÌdÛß¿>ù‚À8 Õn9˜]pƒH;ƒ@ŸTë‹C•Ù¯VY— �#ú4.T˜µ\À�‘—ª¯+ØSf?ÑÂØª\så/®YÀOƒQÞÀé0fëë¼s—JS¨§{ͪ\/âùÏ…Qir:œÙv9¸'mu±º:³¯æl’Ë|õì£Kœé𗂯Kµ½6°wÁmô±k±¹ä²Ü•¯×®lá�O2Ì-@‡S8ÓzMªý]ÁKîk%vmvÅý=ÿ?±Ü_ewVÚ{BgƒáÄ$µ§E:TªcÊÁ’l’e&Ïý8×nyÑXaÐ:èp½PŸlK5/=/ ªx­ÓÚ©€ZQþdÃu¼0°R§Ø'RWðx©¶W÷t/8§×±SÒåúºíœK˜z›mBžT2<-cDÚ·.àœTÛk§pz-“'fåò´�àÑÑzbàYVc:ä�¸A¤Ã¥ZOO)vgŸeÍ¢NŒåRù­b·àB)¸ÆhÈ-À"*Õþ®`Gôrv#ª*¿·+ØfdtcVº€1 Ú¯'ð<T»RíSñ�gK,'N¹2²\À`‘‘j_O ³Äî‘çb°øl–À»ýÒ‰îU«Ì®1û°‘Ê-À "*Õ2ìYvƒ{ß…Pa“ÄãC°WþˆÆ™6‹ŒNBŽü1è�¸I¤Ã¥ÚÞ"æ<§U¬’`õaŒúücal¯M§\-å †�néP©¶3ƒÊë’EÉ* ëúé §ndúQ×I �×`:^ª�¦ðÍ÷_ж5>úÚKs㘛šÓõs�né©~`ªØ¨Þ©uì“kPä÷&P �“#½âk-³JÚEMLo�¸I¤Ã¥z�`ªD*­¬EG Ôìßf2e�˜œbíH·l!Ø¿Ç*—�7‰t¨T¿ŠA59¶æ,'÷^ªÉTêb)�àa¶£páQþTavfŒÎëO±Ý"Ò[¤š»€ÞXj Ý}–¤°l]¿` ~f;·5ïa´Áìú‹w7‰t¸TsP›J×8ïÈYM'Bš£)ô'ÎèÆlÀÍœ‘j€Ø(T·º+%ö`,ÍÔkSñ�-æ:[-øir2lF9�‹t¸T�ÄÐÿذ¨¤°ªy*Êc(5s�ÀËà…’pPŒF1K`Œ&� é-Rý@¬ÌG<Ï+ )/q8{üPe.À7f’Ö†#Ý&ÒáR=�C{O…Žmb­¸50vIÈ”³*óY%�¼ÌE¿¹²˜\†IÈ”1œ�p“H‡Jµ@l¸™‹¿ÃdU§c£Ì>u1r’A‹&»ùC˼J�Ü$Ò!R=�‘ˆ?Ri2 kýÿ†0»Ì�0X¤·Hõ �Á(D[»“·^k°¬ýà9)9¬òµÌU˜”®U¢:sûc¤[E:Tª�‚!£ü¯WX²ÎQ%~-_¿Â ƒéèiÁ �7ˆt¸Ts�´8ˆýV©õ-qiŸ‹˜:Ä SÆùH·Št¨T#½(€¾[zveA¿8Šá³•¹ÆñK>žï}Aß± �������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����¡HDÂwmæé…€)àø>¸�Ä����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� !‰Røž-À§¦€ãû<žð�ß¹�������@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@���� ¢HDÂ÷læ0½0ßç€��€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��hE"‚¾g�ÄÏ@Óë Žïóxø€ï;�������Ñ__þúnÿßë¬\���� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@��èE"‚¾g 0ͦ×ßç€�B��@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ���€�����@����� ��4„þ?s±œ»‘Û·S����IEND®B`‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/cacti_logo.gif�����������������������������������0000664�0000000�0000000�00000013011�14136337723�0024751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89aL�y�÷ÿ�ñóð1“0Ge-wºYxÒÖÐx¹F:q(X¨IDEC ©Üs|œreed‚ºO”Çiz¼jÀÀÀâåà„Ë@”ÔH02/• 5c ’ e»1O|CL¬F4¢)$š‰7•(&T{Ä\ ¯âVZ³LuÃ89N*n‘6DšAŒÍd5 2³âkI¬4D«!Q¡ÛNl¼U˜ÖJ¥ÜPl�ˆÎB²àsšÔk9¥$…!nÀ5U³)?•9A£@E©2<¥-tÂII­#J¬<„Éa¤Ùnc­6’¼jy¸?vrÁ@Yµ+!’!i¾3yÅ;W¨+ :,ž)‹Y�€Ê>[´EsÀY‘…ÊY“ÐhØLŒÍ\'”ÒZm¾E¨¼¡ˆÇv7™¼å{¤Û\”ÑaC©)ŠS²0`¬Im¾N2¡!ˆšÕcŠÍRŠÍJsÁP]ª2˜ÔR`¶OÒF«Ýk¥ÛfKŒÐDšÕYyÃSF±±±;¥%€Æ_a¹/f¹QHž$„ÊR‘‘‘E©:,%0†0]˜7’ÑPU²:E…5Zµ4V±BJ­,{§<S°IªÝd°ábd¹IÃRo³Mb°Me»9ºåt&8$š[µ<qÂ7“ÉH ×mm¿=„ÊH|Ç<„o’_zÃBµâxO®?zÅJ©ÞSE©BL¢:-ŸB1Z‡,EŽ'‚Äg5¡,]¸-E¤"®Þuh@¨ŽÏZo°Yi°9m[F^§=-“ÇU[—M@¦8ŸØ^2`–/2Ž&ƒÂDN 'ªÞ\šËn{c²2+žØRN¯&5ˆ‡ÀO‘ÇUQ±'i´U~ÈE •}¾`$”Ào*— ÒPN¨0ŽÄf1¡= C=§S¥.eºBO¯7‡Á^_¶G@§/ ‰_¸6Q¨<Ѝ‚ÅÔÁ—   !™^‡T™³’ ·É±&–"¿ç|Z§/00G¢5p¶b‚‚éòérµ?[pLR¤Dk¸5ÿÿÿ!ù��ÿ�,����L�y��ÿ�ÿ H° Áƒ#èHPS‚ƒ� œH±¢Å‹ÿ�èPÐ@”ƒ$2*¹ãG­DŒ(S¢dW…£b¤HA¢�§Z$(ðQɳ'A� ¨!¡)R7ìÐ1å'L˜C}JM™�E¶HcÆÐØB憬_tè” s jƒ©h)F –HgÌ #K"<x´„Á•]Ú¿;ž¢#FL;3(Ø‘e DdA¸r…—K‚ylL(r £ TN!YÖb1¶l©“”< Œˆæuí:]ÉP¬FS‹1-bÏPV×6žNF¼L�áZ%t¹0¥.µø©1¤Èlÿ‘[ç+^DF:M¨rå¾ß Dœä®²ø[RuäR#k6@ç(K\:©d·}õ% 1×™ ˆH'm€J5¤‘Š.ˆÀ O ÄvCxÝ–›htÒI4Oè4© ÃO”ˆR)puC)Òa„o¬WF'n< øÜs;Ô #J  `¢,3„…GÑ­çe<q‚+¤rÏÔì!Á” �'3”—ç¥WÅ8àp Y@€À=• Ðl^”�+3ü"‹RŽØÉ'–C4›Òá*ýäÒ…”…VÄN2ÌÐ^�¶¤†µà È&¦Ì¸J*¶(ÿ�ÚR¤€#Ô±�"�Npa <á†nð0Š+Ь²J5 DñN­5p¿T(Úàð„’ZpÁ®à£l5"tá´ñAаXE¶Ñœ0ŠZðàD¸ÊB#€³ ;Ñ­t¬¸^’Æ{½öŽ€O* ¤Õ¬þÔÀB¹(©ºqÂ&ôzâ„©`ú…¬ñDl˜àñ‹nÜ Ê—\lÌ…K8¡>ý€Ð ì± É À(^DW…†ŸàÀÅ&<p±Â3«èL�]P¬ ×ÆÑJ*ÍtOGTÃQ.§Z ¤ÃØâ á  ÌÙžD]MÎ>ŒÿP. lJÁàª!´V‹+¦Ýxÿ!Ä9ƒ0²ÒÊ] ( � `¢¹I ]Šyp½N4¾Dhƒp3²ªÃ ( €c\âL3“àDMáUŒ¤Ÿ˜N¯Nðòô–Q Â\ÑJìÀŽ: Á|¹)@6%¥Ì$ÍóÀ0TÀý?ÒzƒÆï„)+KóÐ@Èô0<û“ÔP@öp‡z#qS J¾HlÅæ3€Œõd"ø’Æ6Á1- ~ökž„! @,BV?ûG*ÐE¸@ªð�<H *œk"PÀ#AÍ´ Ã0À8ÿÆ1 Û$ÀøR-6Æ-¬À Q«ßýü�Jâ„0ø�*Ð ôaè@< sÔI€�x‰¸%¸ÁÞ`€ìÃè‚´Zp°‰+È@ÔŠ &X‚ŠÐ«P8 À à†8Ä!F`ÀæÁevPƒ-¸Ä`žàaˆ·8Â> Ÿ(À�bûÖ 9È/0áTƒ0Ò°È,„Š(7TÁ9HÁ–Äd(j…’„Ž(C˜@B.ˆ°c*y¦ý#ÁÀ˜æ„YfÀqE°%.á�‚)ð’‘*T€È1Ìh‡Ìÿ M^  Ÿbc Fy”ñÌ ãHeüqµ~“v+g Ñ©ÎÀ¡S@@/.p�PEÖ`‚|®cŸ¡¨! ¼ùI“ÔŒÁ ®™#ìC¡û¸Ñ?"-„!o– hÎ15"£€gG¹Áˆrˆ±XÃ:N ~ÖÀ†É!øÚ8JôÆPhÆ‘GÀ¹í>•è`ñ…tµ¨±˜B*R¡TºÀ• ¦j X• fýÇ PÀ@˜¾±4UL3J =`" }ÛÌj– ²Õ­‹€ë| ˆºr£Œ£ zÒ¾ö“�w€ì¾™‚S´` š!…2ä2ƒÿ(ôÕ¸ÅÕ"{ÉBqE€[ý †gô`WxÁf;ëË,•sm;J‘ ˜6š¤‚ÿ¨Á‰\„)Æ ôƒPÆRÂ=ãíd \X’ŠÏXÆF0„åÖU¤VXƒIËñоú5 Ňdv”1¨ôS!q¨8V ƒþãmdƒZŠÜ[ÂW¾Éµ/ œ‰D‘!&]ƒ/ú*ì†@ÀYkÀ#‘ÂlA¶‰ñÌ>L J@²ÊÚY3|N3ÁÃpXˆ_° ÎRϹc9€ÐŽ©fb¸$vL…¬U š¯ÕLWô##€"õÀBÿö3 ¯ ÿo0ò[“<„+$·É†x²4 Æ5¡Ê'}à±e.k@hÙ8Å%ŠacH\³3¿ø… âp„ã éuæ7и8 oUÃ2ê|g£g ª@/Æ(…GðÕ„È¡ �`à5‰Ã) 32tF1rÀC=(‘b�ýf+ ÷ ÔC 5-šìƒ.DPP@T‘i‚Wû"-0—a0Ø\Ûx rLÑ“fp@áoý‡Álg÷ ³jˆ¶§ À@pÓ,J¡ßéJÁºxE!ä 8°0Ð�8QŒKðZãµM™ñ�ŠJ ÀèÆˆâ¦ä­ÀÂÿ-‚zð |áûÞÅTp†.P x>‰pð,báâFm…‚Iä!9²Ql“I?؈EzçÃd@y(g‚ÊYîr˜_á2WÁ1va"ˆÑA¨rúëóBÐPÜÕ@1 gÜ 6\±ƒm¨š' � …¬Øvá \½Y÷ƒžÑò¢¾�æ2˜öÌo„¶åHû:^ñŠ,Ããç4t83a ñ®²™‹¯éÔ ^b�QÿF ’�]ÞGV||ŸaçÇKBØÅÄŽbŽ1óS•!<zqS¡ 0`€äÀ;9ާ`¡SclàJþÐç¤ÿs©aŠ?ðñ öÃâKêÐâ÷fÀÆf)¯Šèz å8i&–yüÜG�´R €¼Ó Ur % ^  ±@ ±p×6j$æ‡~= ~JÖ~ï'f óg ÀúågúÇþW G�5 +0 4œÐ Íp>‰¡€tr!0m´ð âÐYY£ùЀçg Ï6_£&m´@ È ;àÇ@‚×R@·ýçó€éu.Ðä�5˜Ÿ@²àˆÐ;Ø –@ ´`â�]pÞ°Ä ö£EpK8M¸oß�…4…J@‚@PXH[Ø$ÿPMàp]�}ªõMŽ@†v4 hH'6ÒÑ"O0ß� ± ÌÐ ÌÀQ³‡}Èrz0hðr‚Hˆ°YJ ei§|þµò $Ð;€Za(‡2 ° û0 ›è^ o�,'° Ð ÔX ‚´Š° ~à‡Ï °(‹_—ä�fÀ 3w‹€|º˜e¼H!�péÕJ6q´I0ÒŒUðŒÛ Y H£Pä8…¤ç_Þˆw2ð 9`äÈ g Ò0Uø·Êçy? �ÝÐ,0 Àƒ2ov´úX*-S Ir‚ ß²yNB`Kÿ©WÀ— }  3' @Ó@ëÐXÆpà‘5@{�³�<ÿC°Èx 6Ѐ¢ÑoPnð’1i/4yNŽcKpà‹ dj°“î'2à“” ¡@æ€,R?°e0 ] @ÈvT)<’ã`�·0 \Ƀo€1ðã@–¼pNl…–#°–ËЖ I p铌@Žªp?p—æÐö g��V" @Q î°>1˜`Õà�Gpº±ƒm�)e/› ™È³¼T—Ùp™£Ö–ðƒ€�‚à€€W¤ ˜4MÒ`TÖ›ÿ°Z!4Ià�ð`Û°ƒœÂ‰:Nà Ç)\_ðÊ™™Ñæœ?H‹.0֩怸0 ³@w°Q›0 ä9 € oP V q� íùÁÉAEò¹VLPŸ÷¹Ñ& W𜃅ý p©ð뀠È£ `@›!4¬` V õ�ÈÀÅS ”ÒDÈ“ò)\úϰœ±8$Ú9Žå˜¢+úò°๠é –“n’ Ãfq@ P à° zà ßâA‚t¤GöáÐßøO ‘9¥s ¢ÒðÓ°Ö1S!U ã0¦eª ƒIßpËÿ�jç�îÕp*§<ù{ —@© )º¡ÀÕõ§�ƒ°9�a”�¥‰ Ô8b° b» =á°™°è{À‡©A sZ]²bai�ü 9À ‡PzØËP Ñ ±@ p�"p°™W  îg©9Às© ¼šæÀÓ€³·ê “¨9Æ ˜ É 9$@˜€CÙº­ Ø­sÙ@`å°Oäzç:��¢p0€ QÐ Q 1Šl"`¯øª ph©ÀŒ0}à¯&; ¸�O:¢êðé²)û&+`¯š­?˜2 ‘ÿ´±Û& …ã*²$ 4/;1k±ß@³6Ë TJR<K®#Û\ZS�˜ðCû E âÀ H›§ ´Àöà³ýÓ6ε1›)V;L¼ŠOJ»O_Û´ j2ìpR{f›hëjÛ«[kŒÈó0p+¶s+µ2>™·0®Ðj¸ƒÛ6…K³ˆ‹·Õ)RÿªˆŽk¡Ð‚ûdZ“@ ”Û­Š‹y‹…°|û¹+%¶ Ð ¤[³ÝJx…ºA ‘«ëWMÐÒð³&»³k³Ó™§Rö±ºK-Ö»æ�¼S¨Z³‘D¥éˆ¼™ð¨@h½K΋.�½Eÿ+½Y«¢÷÷±Öõ\½ =#~&Ã(p©h{µšªµë·çË…Ûl`mB4'¿Õ9L_T ù´¹°¼hÀšþÛ6  üBªPÀ¼º}¥À¾ØÀ!�žÂê/Bcf`¹¼sP í ºË—ÀíÈÁw�}ZÃ]@#|º$…ÂÉËŽ@$ÀÁT +6Ú)0 4<—;R;[e­æ ƒ¦À<ÜÀ.ºÞ«�‰jÄ·«´VöL € $ÀÒ�`Ôðº3À‘D¥HŒ”p½¾Ð]ìŽa<Æ à3&“�³ Æã;FXüÆÇòÐÅ WÇ!Gñ-ÔÿÀ |L½$ň€ì ½è ¨à‘uL� Ü)9”±V”)ŠL›ɾȨð >àp†PÆÓQüº«|«Â»ØŽ¦ŒÊ )Å¢{ЭŒ ËåpÁZØÄ;L¦Œ§5@�€ ÝBÒ�"p³®UÖ hÆÌæ<kº\;P.‰\( p Ö챊8UÛ<h\ìÅãúðÀ¹ÜÌ;0 ¬ä/猵ÁŒ»|ÕÎrìÅ$`?€lá¬öÐ3…É&€ÎLµþh\Ø‹¨€ æÀ, Ï!ÀÌL�J�“è¾…¢�‘¤ Á\½¹›¿ŽxÑlàµ?ðÍÌ5ÿP?ðÛ<%   äs值֥Á¾èÒ0Mh]Ó6M� - 0"¥sA`¾ÜŽ$@ÔmÐí‚5à!`mÒ<%çüÔúÐ_Sí‹U /Ý?°ï¨5 àù¿æ| bt…dÍv,ÌÃ$@É_ÌÖnmp]† Y -ñq×kÐyíyNŒ—=Ï€]‚]Ó;°ò¨…âËcT R°ÝÍ_Ùl0ÙPÙ5p ÇðÕØ)|ÐcÄs›WÖƒ&”Œ}ÕêÛÖ�†ÚÇ`Y·:"4Öà²ý ´ÝA€  Ó2=Ù„=ظàÐ'Ü:2ÄíÀs€Ü¯Ð…ÉæüÒý»½Ñ]ÓÓ ± ­#ƒÐÙ}pk°AàÝÌ Þ1=Þ.h¸PÓTp�•l…’Cg@we’\ÊóíÜ¥ÝÖ5]Ù/Üß$]( NÊÞ|àá­¾*°–½Ùߢ19t�ó€ŽÖßLßy >`´6 £,….˜Ó,³È<ÏÍmYJ°âò(’–ÞèñZÞp5Ïó:¾Úw€ÔßYÄ üy˜ “8‰ž#@8’¢Ð¥b›Uïà"°û°±²Y£cn *;ç` ä>�;�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/cacti_logo.svg�����������������������������������0000664�0000000�0000000�00000041220�14136337723�0025006�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!-- Created with Inkscape (http://www.inkscape.org/) --> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" id="svg3460" version="1.1" inkscape:version="0.91 r13725" xml:space="preserve" width="94.64875" height="150.45721" viewBox="0 0 94.64875 150.45721" sodipodi:docname="Cacti Logo Dark.svg"><metadata id="metadata3466"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs id="defs3464"><linearGradient x1="272.65039" y1="412.10303" x2="358.84012" y2="367.53931" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3472" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#b1e356" offset="0" id="stop3474" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.68538" id="stop3476" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3478" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3480" /></linearGradient><linearGradient x1="326.96289" y1="408.83789" x2="345.27209" y2="399.37125" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3484" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3486" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3488" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3490" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3492" /></linearGradient><linearGradient x1="281.43115" y1="410.20654" x2="358.31714" y2="370.45325" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3496" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#60b656" offset="0" id="stop3498" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3500" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3502" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3504" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3506" /></linearGradient><linearGradient x1="321.16992" y1="396.92529" x2="335.38837" y2="389.57376" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3510" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#008800" offset="0" id="stop3512" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.05054" id="stop3514" /><stop style="stop-opacity:1;stop-color:#006800" offset="0.97752" id="stop3516" /><stop style="stop-opacity:1;stop-color:#006800" offset="1" id="stop3518" /></linearGradient><linearGradient x1="280.25195" y1="414.8042" x2="304.05466" y2="402.49722" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3522" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3524" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3526" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3528" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3530" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3532" /></linearGradient><linearGradient x1="268.89551" y1="401.52393" x2="303.23343" y2="383.76974" gradientUnits="userSpaceOnUse" spreadMethod="pad" id="linearGradient3536" gradientTransform="translate(-268.34645,335.74803)"><stop style="stop-opacity:1;stop-color:#7cac56" offset="0" id="stop3538" /><stop style="stop-opacity:1;stop-color:#086d05" offset="0.49437" id="stop3540" /><stop style="stop-opacity:1;stop-color:#008800" offset="0.52806" id="stop3542" /><stop style="stop-opacity:1;stop-color:#004900" offset="0.97752" id="stop3544" /><stop style="stop-opacity:1;stop-color:#004900" offset="1" id="stop3546" /></linearGradient></defs><sodipodi:namedview pagecolor="#161616" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0.39215686" inkscape:pageshadow="2" inkscape:window-width="1707" inkscape:window-height="901" id="namedview3462" showgrid="false" showguides="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:showpageshadow="false" showborder="false" inkscape:zoom="3.85" inkscape:cx="62.073409" inkscape:cy="75.903985" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:current-layer="g3468" /><g id="g3468" inkscape:groupmode="layer" inkscape:label="Cacti Logo" transform="matrix(1.25,0,0,-1.25,-2.1464919,988.27088)"><path d="m 32.813247,718.30853 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.166 29.9321,4.2422 0,0 1.7344,3.5918 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.5005 0,0 1.499998,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5,4.5 -16.5000003,-12.5 0,0 -5.0000001,-13.5 0.5,-23.5005 0,0 4.7500003,-8.75 26.0000003,-5 z" style="fill:#155104;fill-opacity:1;fill-rule:nonzero;stroke:none" id="path3470" inkscape:connector-curvature="0" /><path d="m 30.813247,719.97653 c 0,0 0.5,-13.75 -2.5,-20 0,0 -5.25,-14.5 1,-25 0,0 17.3325,-9.168 29.9321,4.2422 0,0 1.7344,3.5898 -0.9316,10.7578 0,0 -3.25,8.75 -3.5,25 0,0 0.25,6.75 1,11 0,0 18,1 19.5,15.4995 0,0 1.5,16 -6,18 0,0 -10.5,2.25 -10.5,-7.5 0,0 1.5,-10.75 -4,-11 0,0 -2,1 -2,7.5 0,0 2.5,20.5 -6.5,35.5 0,0 -7.5,12 -19.5005,2.5 0,0 -4.5,-4.5 0,-14 0,0 7.5,-19 4,-32 0,0 -0.75,-6.75 -4.5,-6.5 0,0 -5,-0.5 -2.5,9 0,0 5.5,12.75 -3,18 0,0 -12.5000003,4.5 -16.5000003,-12.5 0,0 -5.00000001,-13.5 0.5,-23.4995 0,0 4.75,-8.75 26.0000003,-5 z" style="fill:url(#linearGradient3472);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path3482" inkscape:connector-curvature="0" /><path d="m 65.979747,759.14253 c 1,-0.3716 2.6113,-1.1284 3.2656,-2.0664 0.4102,-0.5884 -0.2852,-1.7016 0.0449,-2.2666 0.3418,-0.5869 1.5215,-1.3818 1.6895,-1.7055 0.9922,-1.8985 0.8554,-1.75 0.9922,-3.6202 0.1484,-2.0058 -0.9297,-3.0659 -1.0899,-4.6001 -0.3066,-2.9492 1.125,-5.2724 -0.2285,-8.0742 -1.4238,-2.9497 -3.1289,-4.6689 -5.9492,-6.0581 0.2871,-5.6284 -8.6387,-0.2827 -9.0137,-5.2241 3.6484,0.2422 8.9121,2.041 11.0117,5.2251 6.3203,2.0132 10.2969,10.2676 9.6114,16.7236 -0.3907,3.6817 -3.5664,14.399 -9.334,11.3335" style="fill:url(#linearGradient3484);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3494" inkscape:connector-curvature="0" /><path d="m 37.313247,787.80953 c 4.3364,-0.9009 4.5278,-3.6885 5.5923,-7 0.875,-2.7226 2.4902,-5.0151 3.0742,-7.9819 0.5918,-3.0034 0.2793,-6.0444 1.0742,-8.936 0.6465,-2.3511 1.6133,-4.983 1.8516,-7.4898 0.5312,-5.6284 1.4082,-10.6914 1.4082,-16.2593 0,-3.3296 0.4238,-5.7177 1,-8.6665 0.1386,-0.7099 -0.1895,-1.5444 -0.008,-2.2417 0.2579,-0.9863 -0.1894,-1.9941 0.008,-2.7578 0.373,-1.4512 -0.4317,-2.7715 -0.668,-4.334 -0.7031,-4.6445 0.5019,-8.3906 0.0176,-13 -0.3164,-3.0156 1.0722,-4.6738 1.2168,-7.666 0.1074,-2.2051 0.1113,-0.8555 -0.6485,-3.0176 -0.373,-1.0586 -1.2851,-1.3046 -1.2578,-2.7246 0.043,-2.1894 2.3145,-3.9238 2.9238,-5.9336 0.6778,-2.2265 0.2872,-3.875 -0.2695,-5.9726 -0.373,-1.4063 -0.5117,-5.0488 -1.3808,-6.3692 -1.2657,-1.9218 -4.418,-1.6738 -6.2168,-3.039 -0.0469,-0.4317 -0.0274,-0.7969 0,-1.2266 4.1269,-0.6211 4.7441,1.8574 7.9492,3.3008 1.7285,0.7773 5.3203,0.3242 6.2656,2.7246 1.0137,2.5723 -2.3184,4.3613 -2.5996,6.9238 -0.3106,2.8418 -0.2246,4.9336 -0.9258,7.7403 -2.7519,11.0273 -2.8926,23.3203 -2.4062,35.205 0.1406,3.4507 0.8437,7.2505 0.3398,10.7295 -0.3242,2.2359 -1.3242,4.4038 -1.6543,6.6773 -0.7832,5.3882 -1.3535,11.102 -1.3535,16.6479 0,9.0625 -2.8867,21.8272 -11.666,25.667 -1.3369,0.585 -2.2764,1.2569 -3.8916,1.0249 1.3706,-0.7148 2.1967,-1.915 3.5581,-2.6919" style="fill:url(#linearGradient3496);fill-opacity:0.77999998;fill-rule:nonzero;stroke:none" id="path3508" inkscape:connector-curvature="0" /><path d="m 52.313747,730.80953 c 1.205,-0.0122 2.4277,0.01 3.6171,-0.0493 1.1856,-6.1411 8.334,1.6577 11.3379,1 -3.0429,-4.6489 -9.5586,-5.4849 -15.2382,-5.2329 0.1582,1.2461 -0.1934,2.2832 -1.0254,2.873 4.0996,0.3047 8.4785,0.2305 12.5898,0.0274 -0.0156,-0.166 -0.0293,-0.7422 -0.008,-0.8945 -0.7891,-0.2579 -1.7539,-0.6993 -2.6074,-0.7247" style="fill:url(#linearGradient3510);fill-opacity:0.67000002;fill-rule:nonzero;stroke:none" id="path3520" inkscape:connector-curvature="0" /><path d="m 17.646747,758.14253 c 3.2016,-0.8598 1.6938,-7.0908 1.0835,-9.0913 -0.2329,-0.7646 -1.3506,-0.8906 -1.4493,-1.9248 -0.0459,-0.4824 1.1958,-1.2134 1.2823,-1.7417 0.2534,-1.5503 0.1543,-2.9702 0.0757,-4.5674 -0.1402,-2.8637 -0.1065,-6.8315 2.2417,-8.4326 2.7402,-1.8691 6.7402,0.1377 7.9921,2.6904 -1.7529,-0.1152 -3.2983,-0.8969 -5.1757,-0.5488 -0.4927,2.3687 -1.4375,5.0152 -1.3838,7.6162 0.0547,2.6573 1.7343,5.2339 2,8 0.2754,2.8658 -0.7627,6.0352 -2.3335,8.3335 -1.3384,1.9585 -6.5616,4.1787 -5.3076,-0.2583 0.3168,-0.1543 0.642,-0.2905 0.9746,-0.4082" style="fill:url(#linearGradient3522);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3534" inkscape:connector-curvature="0" /><path d="m 4.3132467,745.14253 c -0.3589,-3.602 -1.5274,-7.2627 -0.7569,-11.0078 0.6104,-2.9643 1.5518,-7.8086 3.8228,-10 4.4033003,-4.25 14.5928003,-3.9043 20.5395003,-3.6094 0.167,0.1778 0.2588,0.3887 0.2764,0.6348 -1.9614,1.0742 -5.0146,0.5254 -7.124,1.0664 -2.2017,0.5664 -5.9893,1.1055 -8.0913,1.9824 -2.2915,0.9571 -3.6958003,2.9766 -4.3330003,4.9336 -1.2032,3.6944 0.7983,5.2242 -3.3335,7.3335 1.2832,3.6094 -1.6665,4.3028 -1.6665,7" style="fill:url(#linearGradient3536);fill-opacity:0.47999998;fill-rule:nonzero;stroke:none" id="path3548" inkscape:connector-curvature="0" /><path d="m 38.979747,788.80953 c 0,0 8.334,-5.3335 8.334,-30.3335 l 2,-84.6245" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3550" inkscape:connector-curvature="0" /><path d="m 32.646747,789.14253 c 0,0 10.333,-6.3335 10.333,-27 l 2.0508,-88.9492" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3552" inkscape:connector-curvature="0" /><path d="m 29.646747,787.47603 c 0,0 9.333,-11.0005 8.9995,-28.3335 -0.333,-17.333 1.3335,-86.334 1.3335,-86.334" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3554" inkscape:connector-curvature="0" /><path d="m 25.979747,783.47603 c 0,0 8,-11 8,-40.6665 0,-29.667 0.3335,-68.833 0.3335,-68.833" style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3556" inkscape:connector-curvature="0" /><path d="m 30.646747,738.47603 -0.3335,-64.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3558" inkscape:connector-curvature="0" /><path d="m 16.979747,761.14253 c 0,0 -16.66600035,-7.6674 -9.3330003,-39.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3560" inkscape:connector-curvature="0" /><path d="m 20.646747,760.14253 c 0,0 -12.8330003,-7.9995 -10.1665,-38.666" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3562" inkscape:connector-curvature="0" /><path d="m 22.646747,758.80953 c 0,0 -9.4995,-13.3335 -8.1665,-38.667" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3564" inkscape:connector-curvature="0" /><path d="m 24.980247,752.30953 c 0,0 -9,-12.5005 -7.3335,-32.501" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3566" inkscape:connector-curvature="0" /><path d="m 22.980247,736.14253 c 0,0 -2.5,-9 -1.8335,-16.334" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3568" inkscape:connector-curvature="0" /><path d="m 26.188247,733.60103 c 0,0 -0.708,-6.1245 -0.0415,-13.7925" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3570" inkscape:connector-curvature="0" /><path d="m 53.563747,675.22653 -2.25,84.2495 c 0,0 -1,18.0005 -4,22.3335" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3572" inkscape:connector-curvature="0" /><path d="m 58.063747,678.22653 -2.084,20.75" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3574" inkscape:connector-curvature="0" /><path d="m 63.313747,758.47603 c 0,0 7.332,-9.6665 5,-27.6665" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3576" inkscape:connector-curvature="0" /><path d="m 60.313747,756.47603 c 0,0 4,-12.334 4,-27.9995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3578" inkscape:connector-curvature="0" /><path d="m 58.979747,746.47603 c 0,0 1.334,-12.5 1,-19.4995" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3580" inkscape:connector-curvature="0" /><path d="m 55.645747,740.80953 c 0,0 1.668,-8.6665 1.0019,-14.333" style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.25" id="path3582" inkscape:connector-curvature="0" /></g></svg>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/favicon.ico��������������������������������������0000664�0000000�0000000�00000002576�14136337723�0024316�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h�����(������ ���������������������������� ¥1��|��# 1�ÔàØ�š%�•�5­J� Y �1`<�š!�…�øøø�E¸b�!Œ,� %�D¸a�.«G�r&�ôöô�)\5�›&�+@�>¿m�?¿o�CÀm�•(� �AÂs�"‹+�”�F»g�•�+­J�•�:®N�C ��y��=²V�KÂu�™"�=ºc�!¡2�òöó�’#�#¤6�?¢Q�œ'� ’�;¬S��€��MW�MpU�#§8��S�5³T�$¤7�9µZ�5°P�3°Q�<³X�7¯P� y�¤1�8aA�x�U*�RÈ�'�Aµ\�!ª:�5¸`�,|-�–�œ*�BM�“�QÄz�A½j�›&�*Y5�3µ[��Œ�LÄy�;´W�+@�8°Q�m�"£6�š'�{-�'Œ;�=½j�†�!Ž,�›%�=ªS��c�9®U��c�›'�@¨Q�d�üýý�œ)�“*�ž+�-ªE� –�8ºd�J��F��/­J�&¥9�:¶\�JÀr�2X9�"-�˜ �8®Q�ƒ�+±Q�W �z&�XɃ�™/��.�w�' .�y¤€�G½l�!t+�ž,�F¼h�<¸_� ‰�@¼g�:±U� C�6ŒI�J¿p�CmN�DÁo�˜)�I¾n�0a<�K­Z�" 1�8�üýü�4·^�š#�FrP�"¡3�Ž�GmO�”��>��.°O��s��$¨;�&¢5� „+�Hµ^�.±Q�4­K�u'��Eºd�z%�-²F�)«G�'¬=�“�2®M�›%�8®R�@´Z�.³U�õøö�` �4«H�U]�@¯P�$2�ðõñ�ÿÿÿ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9£"·€©»»»»»»»»»«%kµ=n»»»»»»»»» ±‡xV5Š˜»»»»»žDp¥i^h§”»»»»¤®<]+7v b~»»»y :U Cq“'šoA»»²¨6w}¬™XKŸ#»»P8°uY,„dH­z»»–…r‰¢t»��.—œ`»»F‚†S¦›»�>Nj1f»»m(;ƒ?»�4¯!\c»»[Œˆa¸»J I¡l ´»»sM0Z‘»2EW)/$¶»»&_»»-ªQ@»»»RŽeTO»»»{G»»»»B|L’‹3»»»»»»»»»»ÿ��ÿ����������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/favicon.png��������������������������������������0000664�0000000�0000000�00000014233�14136337723�0024321�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��P��P���éè&Ù���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<�� IDATx^íÝpÔe~ÀñX¹N+bddÙ å¶7êUdCÂn‚ÐéÝÍyí´wÖëͽ©Ø±S§?N¥Õ@@B6€ üÐi;½ódΛ^¯VA0Í*m1ÙM²›ìn~l’§Ï7B‹(²ûIø^ò<of¾ãý؇ï>¯ý>ï{öçåäð@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�É,àµÜ°¢¶¹8¸µíæàöcóýûö]3™ï/÷ ø• ø«Ã³‚ÛÚÖTlk}5¸µå‚µMéà–f 5õ•oiy»|ëÑg‚µÍ_éää €ÀdÔ6~¯âÉcgVïy_Ýµó¤ªØ~\•omÕG‹*ßvT­Üñ¶Zµû=µò©wœÿÒŠoO¶9p@�×5áʱ8êHê]çz'ªœÈ–oo;»¢æðW\¿³œ˜,ÁPãÇ‚¨w›—‹çÿý÷¡°Zµë”ržæÿAm[îd™ ÷pM X}d¾~³o¥~ºžq<ÏïPuDW?óóúèn×î0'B�&‹@ Ôô«÷´gÏs­x²ÍÛ¿¢6\0YæÄý@�®¼€RWéø5Üõô q@]ëªÝ§õ.ôÈŸ_ù;Ì@�I"P±¥áú@¨1¢ßy_@w9mª$Óân €�W^ <ÔR …û(eýúçïÔ;o&•×6?såï1g@�&‰€ó-£@(<0Õæ¤Iò¸r7@Ààæ&ušS €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'@@Í{L™¸$@@]‚æ4 `ž�5ï1eF à’�u šÓ €€yԼǔ!€€KÔ%hNƒ�æ PóSf„�. P— 9 ˜'ð»kÛ ËjÂmGÕŠP“øX¹ë”*«mÚež3B�Wöî͹º½Ý;}tÔwÝÔ8r®ûîS¿\\º¹1QjM—V‡ÅGùŽwÓ:Ä{*¶œ¼nªþµû¦ß½öø4W.N‚�ŸHÆ<KR=ùˆzžKtåèxÚú¢žÓú85%ŽÈŒS=¥œ8O½}&ÑÿΙ>ñqâl²ÿÇ ¹cãáSÚð”8‚¡¦ÓÁÚ¦wõ?ÃÁ­-/—oiÝV¾¥å[­s¸Ö@àÊ\5Ÿûþ˜ç`ªÇ£Ôè\¥Fô1˜¯FûóÕpr ‰ô}.Qõçõ]ƒK7U+w¼55ŽíçîçS層vžT«v¿§Vé–o;ÚY¾­mWEmÓï\™Kˆ¿ âgsoK'òëÆ‚9”¯œ€êæÔ="3T²Û¯ÿG =! }å­hò÷7VzW7¥Š'©Õ{ÞWúŸý:¦U·?øü—,¼Ü™2'ÐÉ»o(áPÃsU¢k GóÂàÐ/}XUlkS«Ÿiwv¤‡›LÜÕÄß„€E±Î¼G]çP_¾Ò¯sNÝçÅ»ešÑNyµ~j_ñd[{Yuë"‹.{¦ŠÀøb‘¼¿p^çìO'¦4£€CaµJLK¿Ñt:°é o0Yñ7Ø Œx– ôy†ŒÛyžß‰ÐÌ:öšnX¿.Ú®5á—l¸ö™#ãØ·/çšx‡§ÑyÍÓ¨§í¼šE4/~3¬Y9Oç¡ð½ãº¸Œ€é}ÏŸ8¯{êÏxšóš'¯Ž#žŸÄô.ý‘§`¨ñýÕ;ÿnú`~ˆ”ʹ*Þé9¢†æšO^ÇtÕîÓ*PÛômÑÅÅ LHôäߢ?(?õ?çy¹Ý3¯Š"ºj§~C©&üKÓ×óC@$ä>¤”á»Ov ¢x:OãõGšôÓøpÌ_ž%ºÀ„€ÉñHÞO×?§ô·Œ.·û$ â€·´ŒE4jZfò:`nˆô·Ž:ßm' Ù}ÃÓ”¯rfòUԱυ†ï]` BÀTýÒÕúcKÇGR4»|*eW@õI[›0u0/DJy§;?Içüª;Ðìj[@ƒ[šÖˆ.2!`ª€óCÈÎoyÐìâéÜš€šº*˜ ÐìÃy~Íð"ãf˜*@@ hfo"V<…7µÌK,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/Ú.@@ (µ½Ì_,@@ (/"“Ó¹áäpòÕ™aöÑy­JvݦÔhZ^Í Fþç±HòË•o*u£ñÇŠ§ÔO¿õ‚@ƱXÁÌÑTž7Þ9«8Ö1ÛgàQÔÍ[œèZúÁpj¹JvûÍ>t<S±{&, õ'{RßzªUÝûìqãïÿäCõý{å±µoz ×ïóûL<Û¿¬¸¦ñNÏæC·)ãHpÃO ôœÍ-LÅò×ÄòëѼH_4/¥ÞˆyG¢kv_tNbh°µ_©áOÂbü¡ç9AFFFÕ`zD YqŒªŸŸ¨L?¼ÿ÷R•uþ#zÿÀºC%½ë•¼WÕPòü††ÒoÒÇ,b¹9”ðD•š«Ô`¾êÍWqê™y Æç(P5œ~K”?|±À‹§+Õ£õKTUÃrc znO4–ªP[@Õ´­P”¾±öµ¥‹³Èˆ7wxwÂ9œÌW}‹ùG¢kŽ~ÍsN:=ÔF@©çeþýÝÇÕÃû¿¬ÖÕ—Xq¬?X¢jœˆv<öúÒ%v–1ƒYÇ;òîQ£sÇvš6„óü èe›Á .°- ÎÿPTÖ•ŒíD×,i¯ª[:3ƒœØu“XlÞÎk#ýùz7F@)—°1 c»mÑ-ïUåe›ìªc³Õ»±5ÎSw›vžì@‰¤DÀÚ€êˆê§ñÎË=ëTÌÎ +öܤ7êy]¥ ¨dA1Æ.›êìDkŽ®PUu¥wÛSÇËÌTu/œxΦú# Þ4ºx޼jW�Ç;[ÛZ{, *ëKx¾«ñιÅzšîï±ëµOžÂ7%vŽ·= Î´²Þÿcv çô·p~;ÙíQ)ÊǘìlbV³¶> ­Î»ñþŸÐs©®üùzšˆó>«•Ä­°= !ýq&½ÝC@Ï (µxšþšæÉ‘µ²L:+Ûê|¨¾ò@ÉßÐ ô·Žþ™1ñM¤¬JbémèúCËÇ>ÊTyèÎ[ è§š[::¯…Ⱦ7’xÞÒ §ms@7ë×?¯ó7ݽ÷î« èEñμÿrv¡|I¸²f…€­uvŸcïÀ¿Qò‡ÄósbÏY¨¿ß¡†õê-ú:';P+º7a“´1 ú§íÔ¶åúµOÿÓÄó ¢gsoLäàìDõÏØÙðÁz:am±â/²) Î/1U7—ý“þÐg^r-½ŒÀ‡ÎÏOÆòw ôzâί3#£yJ äªáÑ÷­(�“—ÀËÿý„Z×|«þu"ç·2Í=BúG›šÊ”þmÐwt<¿G8³èïÉ-ìçß›êöÔè×EŸÕuÚmæ‘»»ïã¼=ý¿Ø~&ý ɟí5úèþ¹äà+/¥ÔÈÄü*}wêÌ@óÙ“G;^6þx»ûµÔsǪûÑë·ìÖ?ífäá|ÆÓ9ô»íÿðÄ‘²k÷.ž–e:¸¹ÑsÞMΜ£"7Ì5ùèœö›£=·Þ¢T:5®ØùÁM¿˜ø›W‹GÙ¿Äøc}ËWÕ£o,a7fc ˜ó¥F}¾ëº¼¾S©Âb¥ÿiô3OÅÊ–é€NÌ7W§Ž§¿Îî<e_Wï_ÃZB� ¨|3J@YJX.@@ h&ÿGì@-Óÿ|J@ (u@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  ”€Ò„”€Páâa”€P:€€P€€P*\< C€€PJ PJ@…‹‡aPJ@é�BJ@ ¨pñ0 J@ (@@(@@ (.†!@@ (¥(% ÂÅÃ0(% t�¡�% T¸x†�% ”   ”€ à  4Ó€®?¸ìV \  rr®ê*(jX°Huy}FÑ9óT¬l™Ré~y5/y´ãåä#û—¨L4ÕoSs, çéÿ!‹.èò½š& YGÕš€,QÕ-+TÕ¡e_gñ €Àgê{R-¸Éèݧ³»fZ"Ú-W½¹ÜÙ}¯;°t1‹.haÑ ³eZÿùÝ.S•uËNí /¹–Ń� |”ç›-ðõ$ ‹Þ…²•í@k;¯–lcá €À%ôë {œ§ñQƒßH" Ù´êÐrµ¡¡T=¶Ù-,¸„ÀG¾Åq¯o¨×à](Í. •u%ªV¿ûþøÿÏY8 p΂¢ j¡¹o&ÐìºñH©Òo %×.[ÄâA�Ë´{½ÓõSù#¦>•' ™Ôyç=äì>߸ó>d(ðQa¡7^è{ÔÀ×C hfu^÷ÜòvP?u/ exÙp38/Ð1ßWÔë-~×Ù‰vô¦½L@õkžÎÓöP›ÞyÖOŠ€€X ÃëÍÓý…³,4ãkžôÒuž²;WÚp¸´w]] OÛÅ+‡\ Ðãõ}·Ïë;á„tDØÞù¬¨þϦäçE èÿt½þz¦ÍMMecáÔÿz´ª¡ôùµ¯ñm#€À„ 8o.Åø¾­w¤ÿ¡ãÙá|ÔiDÕ‰êT:Fò ”ª(ÍúG—ÐÚûzz}ómcOy'ëQ£ïÛŇóæPuK™ZpùPÕ›%oé]gMe½ÿ+zÑð—!€ÀgbóæÝØ[°ðŽHïO» Šî,| ZP´æü»ã«+_þH,àx²Ý%KûÆÊPßšÒÉ5ª¾qÃ÷?¨Ú+ïoµþñß?ÝtÏÓòhüÎ#U<XYwçýú»ìkÆŽº’¿ªjXþƒuý_«o^«ü×p#€� œÉùY‘ë«?6c¶Š^?K|ŒÎÌU=ÓnÜžÑI¹ `‚@Ǽ"ŸÞ-ÄÇù«sóÚm‚ s@�2  1q#@à³”« P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €�å@�„TÇ0@€€r €�B*„c @@¹@�¡�Â1   \ €€P€€ á†�P®@@(@@…p C�(×�   B8†!€�”k� P!Ã@�Ê5€�¨Ža €@çÜ…Å‘‚¢Áxa±êòúÄÇè‚›TÄ[´Q@ÀÈü›òu8½Ðn¯o·5pLh÷z§G ŠÚSã ¨Ò;Ð.oÑ?!Š�X%ÐUà{á“�ÊžÂë§(\¤¢ó}«à˜, õ.üúˆ¨BIDèxz‹N;»Y4@�«ÖæäüZÄë;¨Þ¤C˜]D{ôíqÝ…Åf“E�Î Äܼ¨Ïë‹8;ÑL"êÜ&6Ï›õ»ï¾A°Z Óë»%á->áì(“úM¥K=¥wviý´}Dú6;•ßÕpLp>,(˜©w¢Oôz‹?ÖtÞ\rBéÎg=¸&t\^_C·ø¨!€�\$ÐëY4«wï›1oѽãü×î‚¢Ÿè§ì»ôîŠ{}·†� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €À¤ø_aÁÙ^öp����IEND®B`‚���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/index.php����������������������������������������0000664�0000000�0000000�00000000050�14136337723�0023776�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/logotype-a.png�����������������������������������0000664�0000000�0000000�00000030026�14136337723�0024752�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��€���ç���Ž£çè���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��/†IDATx^íÝ ˜eïñ„‹‚ &YB‚d0lH2“™L² –äÀª«æ¸«{X—Ãê9¬»Ëª¬·uG8D ÉH2ÓÝÕ3“QƒË.xŽ×�á¢2áâÞ0ÉLîÄL¦÷ÿvºÇžžî®ÿ[—îªî/ÏSh¿õ¾o}êíêß¼u›0@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@À§À¥·=õÆ¥«ÿà²ÕëͲtÕÀõKW<vžÏjY@�@ jݿ鄥]_ºlÕÀÈe«·dÆ,æÿ[5°!j}¦? €� €�–/¿ëØe«ŸøÆ¸àWMM° €� €@”®ºýéV·ð—ý\f—®ÚòGQê;}A�@�ð pùíëUPBàÒÛÿ’‡&X@�@ J2³÷¸6�^¶zàÉ(õ¾ €� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎÀ8ï=úŽ� €�x �z@c@�@ ÎËV<¾lõ–ŒfYzûÀ“qÞVúŽ� €�DB “é8n×àä·íœ<¸wÇ”‘j/Ç»mDùÏÖ—^¹lõ@u—U#˺¶ì¾lõw¯êØ´é¸Hì4:� €�xØ74iö¾Á)ûdÉÔj92üâ¶ŒòŸg·È\&³…5\v_²êé™^½Y@�¨©Àþ¡³®0³}µ ~ùvc�åTõÀðÒÛžº¼¦;Æ@�@�[Ý/MmÚðgB`Ü ™}\¶jààå·?y­;å@�@�š ìÙ1å¥ZÏüÅu0úYBàÓ5Û4Œ� €�ØìÙ>骨„¿¸Î�æCàå·my³}Ü˶¤R+ –«‹·gÖš5'µ9ÎGZ’É[S©_µ&“¿‘e¤`9lþÿy©Ôæ¶dòýË—/?6î&ô@�XÈuO�º‘dÕ–±ØéuRÂ[¦`y¸°Z y×ÍK&÷•),?î¿%(þX‚àñuj@�@ œÀÞÁ)/�ƒ €—¯ØÚH#­\�lO¥þ\>;bþòe[‰ÉmE�@ &þö�ƒ €æTpMvb- xr*øÁ|7döï/á/¿Î¼5kšj´I4‹� €@c�ƒ �ç~ö³¯¹bÅÉfÉŸºméé™Uþæ9ξÖDbÊœîîÓòåsëœ!3~×–‹ÿÖß>¶@� � €^‡^Ggçqmï}ïñféìì<ÆÔ#³* tGÜ®ë“Ï?Y¸Ž\;¸§¸Oùv̿峉%ú<QQæèj™Ìľ›ÿ­0³N¾-sãJQ»«*,kú h—" €�/@�$�zUÔFò‹¸ÍÙ�è8é1a.•ZëV¿Àó‹Ö9P¸Îü¾¾ö1mõ÷/*®s~:=¯°ŒÜ}ü߯•éí=·9•úšÜu|¤°lö§Rß‘k/(¥gÈçß³NnÛå³…ÿ¿Ì€Ž»:ßéýý'Œ©#‘8´`ÆSÜ|ø@�À€@¯ƒªÔM pþÓ6�fƒcÁÅRÇÁÂ>I˜[0æótúÂâ>Ë)æÖ1ýI$®Ì—éÌdŽ‘:ïÑ\—(w"KÖ\ä8§Ëiêß•[wîç?ÿú¢¾­œgs2ùñ1õ$“eËzÝ'¬‡� €€J€�H�T ”…B €‡ƒ €-ŽóMø+(Óo_‚¥Si]s·(Ôí-wÊ[ÊŒ¹q¦§g™W{ÖC�@À—��èu�Å!�J€{Wñõ…ó‰®yéô¥rÚxfÛºu äôîj™!<0zr29œ7‘Ͼ_´þ3R6™_Ì)c¹î±¯°ÌüdrÜÁ:Τ¢z~íÕõ@�ð-@�$�zDq€àž-èçK ººJ^s×ì8K²o(ÉŠnêêzµq)€(g{Í—k ‹f7—‘z¾>fö/™üœWwÖC�@À·��èuÅ$�*˜Ùû‚\ãw…ÌÐ[äú¼·JH-Ûž»Î°8�š™¼b¯Y¯*²ØY|‡¯Ô3z¡ü÷asm¡WwÖC�@À·��èuE=�ÎM¥ÞXâú=3ËWn}=M�ÌÎöô|fL[k×^’w•ÓÅQtú÷‡^ÍY@�@€@¯)êPN×α¼ùÃs�”GÈŒ ›ráh�L$~2¦ÝÝïòjÎz €�"@�$�zH¥ <²¥Ìl—ã¬q«_N‡6Y'•ó@¯©f�œ –S»…7’ì6Û½hãÆeÛFß‹,³ûÝ<Ìçr=â>©ïe·Eî8~¦>ÊÔ—€ŒõncÃ|nÌ×-—ïÊcšm”›ºÞ×m¤ßÔT€�H�ô:�ËÌ�®)º!b§Û›6ä=ÂW‡�M(+êËuææÍ2:{Wtp©k�óeåÇöÖÂöÚzzȃ§×Ýüñÿ5ÞÚ™Kyák5õQ¦¾d|Ü­#òÆOÆuËeû¶j¶±-•ú@\·‘~#PS Ðë�,�å¡Éc»bÊÈ_ñ67JŒkG¡²ð‹_œ$Ÿï.ªk{aÙâ@ Œ‰Ü+á²Å–g2ÇÎuœwŽ©#÷ hùÿ n9pA_ßÙ6¯`ÓÜ2gnQØ{Tþ÷®Âÿ¯Ü]ÈÅ6š>S†�èuôÆ{=`jôr `¼Ç2½¯¡��èuø• €fv­D 3!мnÍ,{²¯UËýïÂG¯ŒÖ—L>oÊÈÿþ¦é›ÜµÛ^ˆÌú²î€œþÙ’ýï‚7‰˜ÿ–Ù·ì«àä4ð½EŸô%ß§1ÿ. ˆ6д'§­†Ê…·Rï8.gO�ô:*c= °1F:[ª��èu€• €¦.ù‹üvkCL…r»²õÉun¥Be…õ6¯[w–Ywª\ƒ'§ÁŠgGgJÕѱiÓq£³z§€Í:2ú‰ ð­µÖŽ@­h}•#��ëkD³55 ��½¼rÐÔ7'‘¸XBÛ Ú S¦\6�fƒU__»ÌøýÒ­> žƒøÞT¸Mm_ýêkd½GÜÖÍî'�Ê5”kÇÆYÛW jý”%��ëg4³%5 ��½¾J0WçDyåÚ5Rîk²lÓ†š‚r;‹ú6Qä¼\Bޤ̣Ÿ7KönÁDâNù÷5%¯5ÌUÒÜߎœ¾^Ê:Rö+ÙõJ,ËïºëØÑ@¹‹y´L*uÿ¢•+Otó’¾]?.¬&“O»­Wø¹ÖŠ�h£Z?e €ÀúÍlIÍ€@¯ƒO� «ž(§ro[¿~šv‘°6Å¥oås³Dî ?(ô™LžoÓI Vã•%��oԳŠ� €6ƒª¥·÷L¹Æï-²ÜRR§žË6¯YÓRà O+k¶�¨QjÜ2@`ãŽ~¶<0 Ðf0åžÙg^¥6æF ™ñZoSO=—•Ó¿Ÿ+ô››m·—�h+ÖXåå2†Ê1rC\edûx`\wýއ��h3R‹Úœÿjéé9Ϧžz-kNs‹ÉèAŒ<ûoªíö*Üy -l”7[2—H¸-…׳ÆmÓ €qÛcô7v@ Í -�åáÏ6uÔsÙÖÞÞ«Æ„7Çù‘l¯õuŠÀz%l›F€�¨Q¢ >€@ëá³|ù±Ì"¯Zs{Í›uÝõ°‚¼á$ëbáÏ�ëa ° ~€~ôX…��¨&©²�°Êà49`äv ª7 °ÞÆt=l°ö"ÛàG€�èGuP� €ŠaB‘* �« Ns‘ �Fn—СzØ78y¿,™¨,G†_Ü–Qþóìö™e«·Dj©·ñÄö,tœIí©Ôår@ÿ;y$JZ^÷mù÷Oåq)ûeñ³xéßr¹~q~2¹X^÷I¹©åAé×K~úP´î^Ù¾ïI½+¤¥£ï¶ékذ=ž/oUù¨ÙÒÖ nÿA©ó)Yºe¿¹£¿ÿ›ív++wY¿NžAyµôýËÒÆ/lûm^X® ySL‹ÔwжNMyéón3æ[g£ôýel´»mk¥ÏeÛ?«l÷/ý´S¸îžžsd¬\%ß›6oã‘>|7û=N¥^Ñô¥l™Tj{©>V+�Ê]ú§È>yÌfÄà}^\áüÞÞ+äøÐ)uÜ#~OÊoÓv*uиŠïfYéÛum޳LÆç©^ÚÔ®ó&sg¹ì_Yú¤ÝØxdËÊÓäîôS´í5T¹LfÂq{wLþß{§|{ÿД碲>ôËÁ#GvïŠÊ222|H™ÿ2‡‡ ïÙhWT–燞ßsÓ#Kž‹ÎÒñÐM^tm-¾hòC=M 58YŽÈÁaܳµ!§R9«m“›V¤O×É÷hà)z–aÿ{DÞƒrðþHö†‹´}±}œ<?î¯dÛ\­í—}oBþJóØ‹ÍWÔ¼âOêù´xŽyÄŽÖ©°\¹~˜Àê¥>OëÈø3aTÖý˜æõ‚Å}–õîÖ´kþÈñã>¿»{¶„Ö[¥­gsc&”ïM­଻îz•¾¯±Ì—1áÈ<îIåjŽ9éôeÒFŸøm÷ahÆËiû9ž¼Ï˘)Û_¹Y­ÕqÞ+õ¿è÷8ݼnÝY*—F*48xú)2Ãö”œn•™¶h-ÃÃCêÀ¥ fZn×m™›^½eó’'«õ}›ŸNÏ”ƒÝ½ÙYðVF»]Í==gÉÁ÷‡ÕèS©6äÀý‚Ì‚^ í¯¶ŸÚ�hþº7?~ðÚ~—“¶wÊá%Úí/,7'•š*?NÏxm»x½HÀ‚ï†lÛv™!´š© ;�¶õôüqvv¼:(•ü‡=Ø)á,7>æ¡ö•Æ™ì«ßjf¹ÌY Uÿ Ë¯ÂøÎeÿ°J¥º´ßÿrcÞôÓÖ ’°„´Ìö=µà—ï0¸¸Ù�(¡ô¦ÍKôòã«]ÇLå¯â>90ê‡ZS¦ {{ÊÙï4õ…ZFldFæ¯4}ÖöCóÐÞß?Yò»´u†XnÄöÔÙkמ-ûno}ŠZ�ÌmÛˆ|Ö-ÏdŽUŽPf�å’…“ä;üÅÜÌÚ«ƒ‘ß²µ˜4o/²é·|‡^žµfÍd·ýÓžH\,3Õ¿´©ÛkYóÇÃ|Çy›[ŸÊ}.!ßÔÀö3°HúÀÎ)Ó¢þL¿€�oÞÜqäŽû/ý¯ŠJë™ë²ä@R•žv6'ß_3{‰ð—;ÈJ�:$?ºííAÙ-�fgþŽžj ì ï«.Ç9"³]ïpÛ~ó¹9Í&ãj‡¯öJlwD`vÿȾڤy{G3€Í2C]«±Rí�(~6ãÊœ~•·Ír·r¬ùr3~.}5§‡×¸õ­øséë“6š²À"å=;&�\ÈŠrMQž4§¦oÜÜñQÛƒ„[ù9ÝݧåNGÔ$`¸õOÄsšW•Ë”½!¿=Úþ¸@¹æï1m]U,÷Š„»×¸í;éÏ¿…ѧ(ÀlL¥îTØ:(ãäÂZþ¡TÍ�(Ç„·ØžÚžÛ×÷§nûDŽƒ?c¼jë”?.Sn},8¾¼[[¯M9`ÑØ·}J70ʱ-¸¾E=�Þ¼y‰£=@hÊ™™ 9è´9@]¶âÌd"ñ© Û ª>sš­RßµíT €RG(ymß*–K&Ÿvc´³ÀÑmN$*^/ä `ëí·O‘Ðy(,oM½Õ € ûûÍÌV§·Åænc5{×lfÙ%þ™[_Í瀇Âè/p|�\K� .dE¹¦¨@¹Pý¢æ "I?ÆAĦÎrýÌ…ÓPr6ý«T¶½ÂõDÚ6*À‰rߪ­§&庻Û*ÌÆ%ÃêSÔg�sÛ=2½Â#t €™Ì1¹G¹Ôd?¿«�çvw¿Þ6èʵ|* åZ™=½/¬±ê¥ÞŽM›*>zª5‘¸ÒK½šu€E£eÿöIW�£Û‚ë[Ôà\âùbáâƒ`î™`5ýÑ0¤rçÖžž÷hXµ,#?·•í¿r6¡\�”»8—ÔrÛTm'“÷UØþÐnZ‰I�ÌÌK§?UÁ'SÀò=ùïª}¥^ë ;�šë”åûfõ¡Ì¦=àö‡°\Ïú÷^·9¬õZÒé/W<» ×™†Õ6°H~÷¯^wÚÞS†£¹ ¤Q`Ç~·ƒ™Íçò—t wy= •ý1O$þŸ×:«µž~?´�˜L~¦ZÛáµù}¡ìþK¥B»k;.°â8<Ð<›Qf‰}?WÑëþϯ'߃Ãa@¹s÷¤–Dâ'6ý4ßMóìÉJÇÄ…«WO’Ù´—mê-(»MÚx 9‘¸Af&çÍrœÓÛŽ7ÿ-³ŽK¥¿Ÿ3,ß’ÙÙçe«g/J½Ã.Ð<¼;”?ÞgËCÿm~G¢¬„¿$�´¢ZS”g�oyäâë‚ú²-¾çž“å cu9à˜Ó/²Ü'–ý„ÜQ÷Ž–ÞÞY~—²Êq~ns“~ýZ¼I9àþ…ü»]Ó/yÆW›”].3 keý'lÚË–•GÓ„�¥~«Óó² ænÛ ÙE§R‹4ÛŸ-cöc2iü=ëíƒr7ƒØžª“ýv@–kÜú-oS8Ço�”¾™Ðt‘[[c>—Ëz?²527g” G¾g�[å¼m²ßãdr§¹†Uöû‡‚øË,ö €æAÏÒgó¶}àI$~nnns;^Ê÷wƒM½bfgôå¹éôl©{¢[ý¹Ï'šï£k¬¾Ïæm9e-ɤí±Ñ·?¬ïÊmj¼b2 ø‘½ƒ“F-2\œŒb�¼isÇ¡[6w|(ÈoœøWÚø²?‰Äê@Ÿ^ï²Ar°ÖöÑܼ¾²­°rÊîB©Ëê¯ëöõëK>šGÛ÷r§€eýßhër‰é¾_Ù&¯¸:×6xš‡—Ú•V0™|%ˆ±eñ&ç<~ŸÌùÇ,ö‹ù#akXÐ<rƲ/efêcn3cmÆ­&}S]Ã*a§ôMòlR9V}Áfeܽ´ •*H ;(—Àœ§®WŽERïê¶[o}ùÃùZ‹6T�”ǵøé7ëæöîrÆþÁÉWïÝ1éÃQYößzãï^þ?+2QYŽìÙ±GÉö½²#óí_$"³|}ëm™›ºøÃ‘Y6_|õ ?Y|rÐ_@9Y=ZENe¨žûd?-”Ÿ²]sºIöêÓMå~l´ý¯�U3Ì¿èöq¹_Ûÿ@ Ç7Œow`¶IiçýZ €¯„�Í3Õ}8:{ U¨äXq«Ëo�4¯´ÚF9kfÿÝú•݇‰Äg5u˾’:kêÔ”±¸cgМŠÖô‹21š>cÿÐô¦LT–#Û~¶M�_Ü¿5r¯]‹é0°ê¶Ôöh~Ù™?Çù«Ê*¬íŸy|@MŽVcqÎÔ:�J8?èí—}þGZÿ  ß÷ ç·¿Z0SJ£‘0àâtúdeû&ü b´ãÍO�”ïà_k·/{œ’Y:ÙÆ+4}Ë^;™J™W±¹ý‘µN™nM;%˘÷ö&“÷¸µ]îºJS§¬¯>,§øÏóÜWVŒ¾�0Øw÷FûëáÔ•+Ot;øä?—ƒÐÍ[ üõ¨ôÚÊ>¾FÛmë×OS¶_ó�Æö›WÏi·?ˆ�èöØ í6V3�šSÖZ#y‡ò•ÅÛ ëúºpîw¼QÛ¾Ìàß­5 ²œ×�hf*e]«'¤üßjûÞºnêÚI9þ•½Ë_ÛV©rmŽ£ºÃß¼©äP.k™î§¯¬q Ðfˆ.tœ¹Ú9xÌ·©;Ȳª>ÊvA¶™¯‹�H�ÔŒ«yÝÝ×(Çi:è�(7¨¯'3§‹5Ût/Púz†™±T¹þ~ïv›¾Ëìâ?hêoéê:Ó¦^mY3+§i¿µ¯¯•�¨UmÐr@ ÍЗـ«5sÍйۦî Ëjú(§B€A¢çêbP‡*AbŠfœÊ)õg€‰Ä UÛrçªnk‚/å%�ʵyVo41Z±í¹¬s¯Æ®ÙqþɶnMù¹ŽóNMûryÉE@h—!��m†¿6�Ê_âëlê º¬æ�I�,ÿ m?ûƒ�¨×Ó¼“Vþ˜÷¼D¿§€Û”71H¹ÿ¥ßš`KÚ@9U~‡ê{Ÿ›ùWOws+¯ÿs»>0üÏ{zJžÖ¶¹SÀÁŽéÈÕF�$�Ú Jm�”ƒä{lê º¬ê‡€À²oRñ³?€z=ù1v}‡lP¾k¾#3åfýÖ[Ò6�æž³§ Veï’­´3W¬Pß<£ñ µ 0ØYµ� €6ãZ�åTL`¯³é_¾¬êÀJ�$� ®jÞ2:NPÆò¸°âwP�Ë=¨ÛËwÒvÛ�h™£úÞ›ÀDÂÓ#mÌ›.Ôm¸ß%¬ «ÞÊ�m‡\ã•'��mF½6�Êö›zƒ.«:H� €ÀŠá"NPfJÕ§2§Þ½Ü=ÞÜÓsŽêØRëðgÚ'�ý³Rõ� €6£š�è®Å]ÀÜì>JŽ–Ðœf°òóöòoiK§?eÎÌcª´û)_Ž�h+FùH � €6”�è®E�$�º«�8X\§€ _'.mB œ©ø v_™r@-ÊF^€�H�´¤@w- Ð}”è`-o‰Ó)`#:oíZõ[hrAñ %Ÿ—Wj�µ#›r± ��mª6�Êõo·©7貪Y�®äÀ‚Õ›@¤_¿®Õ `¹wMý}-UŸíM ù:ä!ת5#ä80KÞa­Ù& F‰2± ��m«6�šƒ°M½A—%�º¾§4{ñÐî¦>£W•}pÀm¬J�üaÐPêüw·v³Ÿ'3ô[lI¯pÂòåǶ8ÎcªíË߬á8÷hz«�˜J½»d°æUpš]Ýe€@›‘® €ò˜ÿ°©7貪ƒ?3€ÀÎ�þIoq*ß%'è�(ÁNõ&æTê_‚þnjëó�¥Y+WžnÞF¤ñÍ•‘r®së[sÿ©Ú:¥ýû$hÿZ,²ßÞ]î~<Úm/7Ðç@ Íp—Ùåp¸£¿ÿ›ºƒ,«ê#�XÃ�ØœH\©§�ßt�”'Þ¢i[Ê ù½´©ËO�4íH�úå6æ…3¼PÞ³ëÒljÚ:'d2m¶·Ze €Õ’ŽA;@ í0Õ>pUf ßb[wPåÕéÞW<?ž©m_~¤^Wò4ò9bå®Ñ’öG4}˜“JM Ê<_Oë† ªwÜšþ«RíËì‰ú®^žçV²ÍdòÍ3)ãébcÚ¼ë®c¥ž}ŠöFÊŒ»ëfä=Ÿ,µþœîîÓ4ë›2‹V®<1è1¢©Ïo�4mÈ8úívšrRþWnãIÊ|_SgKOÏ_j¶³Úe€Õp{@ íð4IÍPf.^^´qc­~<TOÏoO§/µÝ~·ò2³sƒÆÇ”)W—vý ð—š:䚦’ï uÛÆJŸË˜¦i;�{{ÏmÄ�(Ϭû{¥ÑÁ0à›ºº^­l?Ö;³ÝÆXд!õ<ªÞV“ÉþJ³wRWBUŸ\kWî4¬Û¶‡ù90LݘÕM�$�ÚY9ø©_º.³€›;3™clÛð[^â¿U¤‚ ©­]]3ä�«{Y2¹+¬�(!ý§ªíO¥~³8À÷½^ØÝýziû%eÛep=Ï�Êõws´>òGÔcaÀììX2ù¶dÖùýNÚ®T�œµfÍdO»µÛš tœ²¯²‹·jë’vïÔÞalëãµ<Ы\®G�$�ÚëérmŸØ[Ú¾fͶíø)¯=M“;íóíEŽsºŸö&È©d9ùfùQÕ…¿£§xV�”º¿®Ý?Ò·ÈÚ4_Û/+·9ÎÙ~uø“²ãpœïC½@Ù'Éðí¾i½ãŽ’Ï¨“õ}6ÎsÓéÙê~¯ÿ!áuŠßq¢]?¨�˜<z½¥Þ]^7¿¯ïìR}5ß7ËOÍïîž­Ýî°Ë�ÃŽQý@ —á*?ÞÛÍž<šár ¾V‚Ò¼ríÙry\ƒ—¶5ëd¬”×ÑåBàAéßJùï?5}“Yƒ“ÜÚ‘Ó§gIùE²\oÕ!ÿV]w—ï—Ì2ügh0‘¸Íjûå¯%™ì“u®2ºhéê:Ómû%ÔO–뜚Í>•íÂvûeLŒ{¼I, ãìX¼bÅÉn>ùÏ;:;3@Œ’V!¤ò%¾ ¹ÖMú£ìf<É9,ãvc»Üej¶É|W´¶å‚ €¦m bkm¾²­?.7{gÆ®M]æÝÃælˆü‘ô¾ùÉd{˜nnÎ@7¡úœ�H�ô2ÜgÊiC«`a“ƒ¡9 Êböß~–²*™üWý³ï›EÐ,ì“ü u…�å³åaoÿèþó¸ýï/·ýŸ4׉©Ç­W'1øT…ñá;�fCQ"q©Çqb® TT,+7ÔÚΠ`v&PBÍöJØ][êzÀÖîîkmêS6(·ñõ¼¢yòÐË/^®C�$�zÚ&Àx>z Eë•ëûÜTêµî›[û¥ï‘ß·uóŸ—» ÄÜ],ÁC}š^Û^åäf™¿‹k� Ò¡\]•^Ã&ë�M¸‘@ðÕjlO¥6ª�g¯^=I¾ûm¶Wfì÷Ïì ‡;lê©FYÍ™  ×_¼:\�H�ô:¬Í)\ ƒÕ8°•k£RߥoÏÖ²oÛ–¡åò(°f�s³;›£ºýf†¯ÒÍ7QŸ ÛU.GxW¥±X�”F$Ìœ!¡`oØÛ…�hLÍ㩲3’Ê?BÍX,µ/Ìc^´uT«Ðë¯Yƒ®G�$�úúæ/êjÜJµS1�¦ÓVÏ�«ævÈн.?ðªÇØTzW«\ÃtE5·É²­¸„÷(?Pµo,=~_g2ùt¥?²§2ƒšÌ홾Ðs•A**0ëç8_²Ù^óÇd™YJÕL¬M[~Ê�ýüš5àº@ ßa_Ë÷cV컜ޒ÷ ~¨a­;oÍšéaÀì,àÑ›3 ,Þ꿈�8~¿ÈþúÝ,ÅéAÀìXI§/®ÕX)®¶jú#o5ù€õ1Ìœú¶·ã®Ù57øän�‹ÄwŒ�h={ 0ˆo€y4‚Íi;ß’X·¾g¯´8ÝT¿\ê¹Û­ßÚ~Tš4mÌ=ú\>õlš¶]?åÌ#zܶߦÏnonpk+ÿ¹ükßʽ´¿Ï¼ÃVÓß0`vf¬¿‘ôcØÏþõ²nÕ 48«³ó$ÛcC{"1¿T_­ŸŠ`>UcŽ�¨ùöPfT€�H� êë ÔWÉÁÿ»¶U/?ùu4}ovœûi#àu·jú¬mÓ-�fÔåÑ6µøQ/µ Òóðk×w¤6Z�” ~rþwüfläö©êÔc¹WÁUjÇŒ)ÙO?׎Á ÊÕ"�š6eÖóíVýO&‡Ê½OÌ®‘å€U}A öD¹¬€À½CÓ›2QYŽlûÙ¶ŒòŸ÷oÍÜüp°ÎO}7m^RòbáFjr}Í»ä øb5„ZÛÜÁ¹ê3EOhÂOî^õ¿&�šúšÓéK$TÕôÇI,~a˜­Ùg�Í)_YViÇEÞ.¬ÀÂ}#ýú¸,{jõ=–vÃ;\°¡Òν6ÛhfûÊŽcsÙI2™®–[q¿ €š£ e g�ŸJø3ýˆs�¼ùᎧZ£å9o×Ë D¨wâÚxKXz½0·9ØQÖ\‡(?ï·é«¶]m�4mÏýæ7_+}©þÁÉäv™¾µSþ²33§­ãx XÆÃÜÔ;§»û4›qQÍ�˜mëh ùLØ×Ò–2¨V�Ì>Ò%™´úƒUèü‘JûÍ<!¡9•zlÃ2öwj¿Ï~Ë�½|›x¡i3î&�3‹xÓæŽ <”Êmº ‚sZ‰rpû– ­´nD/ÞmëÖ-z{åGíGfÆ­ «ÏÍõ†Žó¼ÔûüÀ'äNÜ¥^Þx¢m³Ò³âÊÙ˜›vä®Ï.ÙOŠÁËÚ¶´å$ô›o5§5¾ÒíŽÖ2?þªWê™gz©¿T›!_¸]\¾“J§/µñ+î¯ÔóÕþpœzùŽ”XÇÜ4q‘ŒçÏÉ¿‘e»ª}Ý)΃%÷‡¼¢PÓ†X¼Ýï6JX»ÀfÖμ ³yÕªSUíJˆnëï?_¶åoůGÚù†#rßÕL¿ÆÁ”Ñä{ÿŒ¶¾ÙŽ3IµЧÀóMMS§7‰JŒï `Çð\|^<GAU{=ÑÌ*´÷÷O^ðùÏ¿Áïâ³çÙ¾´ôöžé·fýì_ßRŸßw³MæNP·>IøCŸÛŸáY°aÃ)nmi>o»óÎ3‚ÚþÙ_üâ$M›‹å4¾ rXÀ}2ffiú—}Ÿl@c¢p;å‡þxMûAÙ” „¹±3UÓJe̱ T?§wvž ©;¨mÔ¶gúÔ¶~½ïwggflÈÒÜߪf[+•É~ÿÿÌ”×jÚ"ü)0ë¡Èд¦{ €þfoÜ|q_=Œ¶F°€Ï5ªÛ�u&ik;^à(„À8Î�Ê©ßgW>ºèÄ:l %@�l¨ÝÍÆ"€@^`×ôé§J�ÜQë·�xÓÃK¶vnê8•‘„�ñ �Æ{ÿÑ{ð! œÖtËÎ>&Nð–‡–|:9Ðv¼rVE�ˆ�#²#èÔN`¤©éÕƒg7]&Ë×MÌ/»/iÉìûŸ—‡ºzäž]‡ŸøfF³lâ+™ O½?Ôeõ÷Þš¹å‘%£ËÍ]|ÿÍ/¾¤ó‡³^U»=DË ´�0hQêC�,§5=®= =8mÆ“US(+@�dp €�5 �ÖŸ¦h``ï|6j/@�¬ý> 4¢�°÷:ÛŒ�‘ �FfWÐJ€�ØP»›E�¨ �£¶Gè!@�lŒýÌV"€@D€Ý1t : �Öùfó@ ÚÀhïz‡@½ �ëuϲ]  `,vD î€u·KÙ ˆ“�0N{‹¾"P?ÀúÙ—l ÄP€�ÃF—¨æþþS%nš—J}§ÒÒœJ]_›Ë& €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñ �FkÐ@�@ t`èÄ4€� €�DK€�­ýAo@�@�Ѐ¡Ó� €� -`´ö½A�@�B �†NL €� €@´€ÑÚô@�]€�:1 €� €�Ñš6㱡éMåòx´zOo@�@�¬†¦wƒ2üevLŸñiëX@�@ Z/¾aö$U�œ6ãàÏšš^­ÞÓ@�@�OƒÓÏý›J!ppzÓÈÐÙ3Þé©rVB�@�ˆ¦À®³f,‘ëŸ-‚r“ÈÖ¡içþq4{M¯@�@�| d&L8fç9çLšú†9fÙ9åÜiòÿMôU)+#€� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €� €@õþ 0eÁ}êßê����IEND®B`‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/logotype-b.png�����������������������������������0000664�0000000�0000000�00000041221�14136337723�0024752�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������‰PNG  ��� IHDR��B��à���I›x���sRGB�®Îé���gAMA��± üa��� pHYs����Ê&ó?���tEXtSoftware�Adobe ImageReadyqÉe<��BIDATx^íÝ ¼]U}'ð૨õ‰–€‰ÒII� EûœÓñÑ©Žm§écì8Uk{­€¢’’ÜsîMÂC¤EëX¬mgl ‚¼©jÕ–ú�•¼ !9ó_çÞnNÎ={Ÿ{wïs¿ù|ö‡³k÷:{ÿÎÚk¯=gŽ? @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @`&††jO:gè+O«OWמ<“e±m @€@_V­½ëe«.ºuê5·}6¦]µæö¯­Z{Ûg¬¹ãª3ÖÞqv_ a# @€�~ üFå¶§F�ª¾öâ/í=síµ3×Þ~ÀôÚõ_©­Zsë×N_{Ó¡ý,›m @€�z&ðš‹o>dÕE·Ý‘‚N³�´ß¿­»£vÖº»¶uÑÇö¬@VL€�è—@›‹ÏŒ€“‚&µ­Z{û}¯]÷ŸèWm‡� Ðu×\tË‹_·ñkm… ±ÀtÛÞ3/ºíÍ]/ @€�ú%°ê¢Û7œuñ—¦„" ­¹õoúUNÛ!@€�t] žû·vn‰Mž÷Œ5·þ°ë²B @€@¿âùïN7½aôßjý*§í @€�º.ÐIz}õ[‚P׈ @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ P4A¨hGDy @€�¾ B}£¶! @ h‚PÑŽˆò @€�}„úFmC @€@Ñ¡¢å!@€�ú& õÚ† @€�¢ BE;"ÊC€�ôM@êµ  @€�E„ŠvD”‡�蛀 Ô7j"@€�Š& íˆ( Ð7A¨oÔ6D€�M@*ÚQ @ o‚Pߨmˆ�(š€ T´#¢< @€@ß¡¾QÛ˜}µÚœƒÚöüÃczQѦ½{çòŠ n¼÷ä n®Mgz庩sÁgŸóúÕ7¾¨ˆÓÉ«¿óôÙWãì1˜aïÿÐgîÚ:÷7cº±öèaµÇ*êôüZmï=µNþ¬\óåÚëÖµÓÙ¿^[µööïž¹æÎ?~ù…_ø©s®®=y†«†Í @€�ÁØ»õgíÚ:oóî­sw<ºë°ÚvΫíÞVÜi×ÖçÕöìé,òá[jg®½½¸Óº;j¯½øK)=ºjÍíŸ9ûÂÛçn ´g @`†xàE/‰ðó퇶7ø4†²Y„BÚë6üKmÕêÛ~q†ª‰Í @€�Áص}Þ+wo›û£‡v”'¥P4ƒPj½ZµîÎÇW­¹eãàÕD{D€�ú,°sç¡G=¸}îãE¾6UÙfkJaè¬uwì=ó¢ÛÞÜçêbs @`pî¹gÞ3vm›ûƒKt;lr(šÍAh¬_Óµ•ùú §FÚ ÐGûï›ûÞ2¶M”yÖ¡uwÖb¥;úXelŠ� Ž@<¶S*øScO´ÅÓdÑ_èæWN­´' @ »ï›÷ÆÚÇúñø¬6ë[„&BÒº»>Ô‡*c @`p¢5膢$åß(n}epj¦=!@€�½H¯ÍØ^îÛb³ùñùÆ ϺøŸk½®2ÖO€�F`Û¶ç?{×¶y»²Z\Šþ¹[cc-FgW¾Q;åƒ_zÞÀTP;B€�z) =ñv²Â¿b#Çë?^ï$;{Í­'õ²ÎX7Ahð‚Ðk×Þ²b`*¨!@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…„¡BWP…#@€�½„¡^Ö/ë&@€�…øÎwú?|ú»î{z­ÌÓ?<¨¶çñï=‘j¦ñ·%￱öò n.õtÊÚ/×–½»öÓ…®t G€�å¨ÕæôðÎCzྐྵWþhçÜí=xX­¬Ów?·¶wïŽiÄ‹U༛^^ûÐ-§—yÚ{Þ ¯þìn:õ¤¡¡9O*÷ÙBé  0`|ï°CØ:÷“í>¬öðýójnŸWÛ½­¼Ó®­Ï©íÝ#5ÔL§\ïûüɵóo8µÔÓo:µöá[O¯{ýÊÛÏÿü)‹ì4bw P^·Í»®ìágrp„¦5Š½Ì ¡}AîúSk¼ù´Gνá´å=k(9D`÷Ö¹ÕÇ*oëO³–+A¨Ø¡f:¥¨ 4Þ²uÞ +¯ÓˆÝ @€@9ÚöüÃwoŸ»«Ì·Á¡éÄŠò-3ˆAè#wžQû³ë^ýªrž=”š� °{ë¼7 Ò-±‰P¤E¨|A'«Äƒ„>pãiµó?êMp*± (§À®­‡],e]‚}^A B©ÏÐy7œºcõ'?½œg¥&@€@ɢ寡"\æ•!K`PƒP„¡ºáÏ*ù©Dñ  PNA(ëòëó¢Bå<Ç(5 -°kë¼ÕZ„Šr©WŽVƒ„Vnª­|J¡O G€�Aعmî„2 búÀ§ÖÎýÜÊÛõüb¿ PxñJwÌÛíñù2DÙ]ÆA B«ï:#2}FáO H€�AˆÛc—=ö gwÌ(þÞb:ïú•7ò¹Å¾ @ 4ñ~±ké™q„ŠlÚ-á ¡óâÞþš‡Ï»ñ䕿$¡ d­[yÖîmsÿþ¡óóÒÕv/Ñæï‡@كоï»é´Ú7Ÿ¾÷üëO½ó¼Ï½jÞ ŸSìJ'P«ÍyÒö퇱ë‡ó.ŠÛeÿ±÷áÃjµGÊ9í}ä¹µÚ^oŸïG@é×6οù•µÜñšRN«ïzM8ñßÏ»þÕWœwóÊåC×zJ¬t'H&@€@™îž³òà­ÏzÁý[Ÿý‚Z™§ûžö“µ=ß»§£¬ñÎ8¦öÞkO(õtî-+jºá´cÊT••�̘À7.|ö¶#ìÚ>a­ÌÓ¶C¯í¹÷û¡?ý܉µô*‡2O©%(^NºbÆ*”  @€�2 BOd'A¨L5WY  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@!A¨ ÕÈ* @€@9!A¨œ5W©  @€@¡ BÿtÊI]¨VA€�_@¬ ´ú®3jß¼âÁ¯¹ö�tIàù vlŸ¿°VæiÛ¡‡×öÜûý'RÍ4þö§Ÿ;±vþ §–zºàæÓk]ªVC€�f‡ÀÖ#þý‚Pm‚Ðùןú/³£ÖÚK Ð%­G,ø¹Gz‰¡húÀM§ýY—ª…Õ @€�Ù#°íÈ»Ü+÷­±ó®_ùø¹×®<eöÔZ{J€�º$Aèw¡ò¡Üxjí¼V~µKÕÁj @€À숧Ç~"‚н;JÚWHgé•\ø?svÕZ{K€�º(°ûè£ÝqÄÂ‡ËØ24›ƒÐ¿xÚÞs?¿òm]¬ VE€�f§À¶#>#‚ÐCekš­Aè_ˆ[bׯ|÷쬭öš�ô@àþ#.xð¨…_{à¨òŒ-4Û‚P @õ~Aןþ³=¨VI€�f·À÷úÌíG,X·=[ÜÖï,xߡلRø¹à‹§¥wGÇèøÃ»ô šÝßR{O€�=xà°Ÿ>dûá ÎÚ~ä‚O¦A;ꥵG¦‡qmƧVÛ{ï½ÓOú‰EÞÓŠÚ·¬œñéÂÛO¯]xûköM¹ó5µßzúžóoXy[ _»àÚª =©çß @€�ý¾èâgîœ?ÿ¨‰iûœƒxì–¾î±/\vÖŒNßü›Ó¶2ï¾­Ï~Am:Ó#Ïx^í_÷îxÕ7ø…³frúÆ®_5rû[~ð¦•G¥éÜ/¾êè¡ÛÞð õ� ÐR nã}wºO¼í=úïèR¿ @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡‚P‡€'@€�Ê+ •÷Ø)9 С€ Ô! Å  @€�ò Bå=vJN€�t( uhq @ ¼‚Py’ @€� BZœ�(¯€ TÞc§ä @€@‡¡ÚÑÇÔ:ܼŠ @€�3'Aè[Ûç/¬Mk:rÁÝ3Wr[&@€�t(°ãÈûŽzÉ´‚ÐŽ#þ]‡›·8 @`æ¶-\xøCÓ B;xÉ[g®ä¶L€�è‚ÀƒG.\½³ÍÛcÛŽ\xmÙ²§vaóVA€�eX|á…Ï\V©<cÑÕW?­é~ =éØõëXºqã¢å6¼¬q:~dägbùç”Ù@ÙË-ð… Ÿ½mþÂÛwÏϾEVLG.xðÛÇqX¹÷Zé  @ c¥›6½ñøjõ¾˜¾Óí+\:2²êøJåëñÙŽøïÃ'T«4NÇ?|B¥òƒø÷‹;.˜¦ÀÝsæ¼íˆ…ùÑQ/ÙÛ¬uhG GzimÛ‘ î|pþü¹Ó܌Š@`–nØð'˶l©Eˆ©E˜¹oß¾E+ÐÒááó–ô£cŸå˜–mÞ\‹Àô…ù[¶<HFö¥\[;ê˜hñYaèú=ÿ-E_‰ÿÿbÜ »jÇQ W–ko”–�z*Ah¨Y:~tôÕË6mÊ€&‡¤†–V*ÚÓB[91@Гïž?ÿàï~øÓãïOɱˆY @`¶ D¿Ÿ%ÑŠó7f>Ó†‰ý?axø›'ŒŒì B)Å|ߊ麸EöÉ4Z.ÝN;aÓ¦=Ñšôļ—^jºÙV‘ì/«ÕÃSËÎDKOj1ŠVžÕó¢Cõ9W_ýäÉû¹rhè)š^Âèèó-{ú xØ @`@W«/§¾ÖÆôáèý®´›Ñ7èM“ƒM´öÜ™µûÑJ4º¯)BQ´ýÑäeÒºÓ6bZ«_Þ¸¾ô$Z̳z|ž÷3:ú¬ÆyâÉ´##`½!¦ß©ÏW­~dÉððÛâÿÏZ²eËs§(ãA±½Ÿ]22ò¾ñu§å.\Z­¾'ÊüÇãë¹0~³Õ>Æ6†&-¿6ËÃç @€@ "$¼·±PŸßÞjâöX‡Ì ,óîÉ·Ò"d\:y÷SGìÔ´|¬ué€>DõåÇ[•b{÷É%ó'–O­N±¾Æ¿?ëØÓ¤ãöžøì‘eMÂL,—žfÛÛ¸LÌ¿­~[o¢x¥rÏÉ##ÏovÈ"�½vùe—µx¥W©ÜQ‚C«ˆ @€@–@ž àýYëi B±ÌåÝBéV\¬ëÆÉ·êRàJÿ_ïÌÝÐé„ÿóÄvS¹§zÚ-öûÛ1mØ·|¥²÷øK/]Ü4U«·LÌ·,ú?Å­ÀÓ²<|N€�”@ WªTÎÍÚ•^¡h}ùø~a'=¢?<ü¥¸}÷¡˜.ŠíÞ½ßm¼h±‰²”Ê!èºý‚P|–ÂS½ãwŒt† Ë–§`3ÞÒÿ=¯q?ã–ÙÑñï»'ÖË}wÑÐPó'³|N€�K ÈAhyŒf·¯ÆBÈX¿£¿}ÙÈÈ¡‚éV^”Çëó¥Ö¢W¥ybþ[&¡G¢øÑËÆrL 94~}‰Þ>9L…×H±Ž Ò @€�Ó(j:.ž\K 'Æ2Z;Nµ“󇆎ÐóÐDŠÿ¾µIÚÝlùè ý'ÛHý€"|í7à^¬÷‹ûžžK­Q££tôž6¾  @€�™(jJ-?éVÕ²‰Çòcœ¢W\ÑtZ~ùåO ü8Ög(wJ·¾öµ&µ:íkñ‰'ÑŽ:ñÊ+ÇÖ:GÇë™=Z¶N€�tU ¨A(Þö¸åµy¿þ?9^ó1ÞŸ(ŠÎFÀù×IO}3½„¶Þ¢T©|fbûõׇlØð+YøçœsΓS辶9ñê’¬uø|�â8·ªãq•hÐý*Ñ!PTº*„"|D ¨fm4‚Ä;'wj޳qò2í>>¿tݺÆÓY—ï B©E(ZgÒ-²–SÌûô¶zÙ¿PÓ[ci¾xœãDËS,óãØî‚Eñ(}<6¿uR@ÚÙll£Éû˜ùO/¯ev4*•aù•fýœ²|}^Ô’õ=…ë-êÂ=KªÕ¥åÙ«±’FýýXìÛ®©ö+ KŸýAÙöKy ˜ÅÍ‚P<õ[ ¡æž,¢8A~jò€Šq²ü_¡ã/¾ø°ÔQ9O¡©Ê–7­¸ä’c'Æ $ÿ·b�ÆW6Œ‹ô©ØNýi´©þDh;sßShS´^¥q”&nÝe™ú¼œQo~m¿ïO³ºnáÿaÙöp¼þ¶|azOÙöKy ˜ÅÍ‚Ðq6¼xß ‹qOÖ‘ê¢K.ùÉFªô(y€'`Ló§GÔGFÎÞ/U«õSËK´ÀÜtÜ•W>oâóÔÔëÿäÄÅ# ¨˜žKad"Õ—‹÷›Eææ=\yƒPý—nµúoÛíÜÁîæÉ¤ã￘µÝÜAhxøW³Öåóò ÄÀžoÏ„b¾w”m/¡²1å%@ S YJ ʼnü¶Æþ9é$¡èñXæ+?Ro™4¨á¾ŽÅÕê]iž˜~n<h|kòc詃sŽ[ãó/×[c&­c"¥[Hñ÷'nO¥ }uêOw5™Ò-³x‰ì¢‰n'ůóßÛ×1»ñ|¥òp&d2ËÛ"$åá,í<‚¡ÒV^'0¦ BéÝ]1Šrêïr`3xz’kÒKV›Î“‚Mùy¼¿@ X&­£!D¥02¹i==ü¯ºªeSüÄöë¡l󿳦„D({¸q_ê¤GFþwžº!åQüy!Ahðk¹=$0@S¡´‹+.»ìèëóÕúãå­>yŸàù½ ®¸@ü]´ý¸¾®&Slç±h™¹®‘7^¬zZ„£ïÇçNµlú÷zËR´Êì B##c¯Æ+û”¥Óü'¯^ýôØ×iÜÏÔy:^öú‚<‡\Ê£4øóB‚Ðà×r{H`€Z¡´›õw} Ÿ´$½©½Z½6=Ó·sMñ:Џ(¼q2W´Ø¡äͱüúÔÁ:ú ]“Þùÿÿ›i°ÂOmÆûŠx}Ì»"BÑëcÄwÇ:†§Xßù“ŸÈŠÐõ_Ó<ñïï‹õÿnÖa;~ýúŸIOÈí†FG¯O/}ÍZ6}.åQüy!Ahðk¹=$0@ѧæÜÆ·ÏÐîµ½+) í{Ájêô]©ü÷¼+„òJ ö|‚ 4Ø5ÜÞ¸ ôñ¸è_- ÷Oô‹I“d÷¦½O©%“Ôç¨ Bíh ÷~bŠ~vñde®¾gE’òÔX‘ކ² БÀ¾wsM:IG(º«£•–|á¸ø©sôÄcþᱦ]„ÚÑàyãönüи+êÑÄtw³)¾_^ré¥/*›‚ T¶#¦¼L)ЄâöØÞ8yÿþl%[tõÕOK£>OzjloôYšßއ ԎրϯØ8ù/ÿòéSM+·l9¸Œ‚Pš2 ÐT .úwDðùFšb$éo¦æüÙLµbË–¹oŸ0 ŸO/\·î'Ú1„ÚÑ2o¡25e&@ ©@z:+ý*­O×^›ë©¨A§LÁgÂd:/Å„½†Ø?AH @€�)!•cСA?Âö�BàY´‚P)“B Ð+xëóbÜ¡—¬~yØpIz·V X㦼·Ý)žÐú“%ÕêïL5€b«}H;<¼ ÖqZôåùOñßi•ar™£“ô{ŒüÒ’_Ó´žæéuJåŠG®_Eþ|òk×¼Ùüq ÞšFîN/Úív½I/éW¤,«£ðÍ[ÞØ¿÷œ<2òü©ÊpþlôåúÓ¼ëË5_ º¹¸Z=+í\¹|Æ—-»æšgtâ‘\£ßÝÔǨRùŸó»Øazé¦M/<ntô˜Å•Ê)1àèÙaøÆ–ÛoñMË¥ò7Ûÿ~¡cbðÔ¨3ÿ%ÏqKõ êï¾ÑäÛ9f©~¦zç³åõZÓ÷jR½ ƒw¦:‘¦“FF–¥sßü¡¡žwr_¾iӋ㮊ïÌïä1˜˜'Χ¶³ÿæ%@ §@ê7“N1ýkœœ¶G‡âÝõWaLñšŒ¶þ½Z}<.èùObµÚAé'ˆïDyvGYö´µ½eN¯‰õ>ÿ½áøK.)ÄSc±¿¯Šýýòx¹Æ^wÒÍ©RÙ[?®Õê×Ò!gÕ˜r¶ÔϪ>0e¥²3¦–¯Ei¶ãC\Ñlé‚Çæ]ÝÿI–©NÅô£ØÆ¶p¿¦Ý:Êe{SfùÒ{ö*•ßîÄú¸~ðyi4õo÷¤ïf¬ïÁ˜ºóHåÛ°áäÆòõ:¥9õzS­îÍ4ŒãvâÇ>V‹côš¼ŽñÃë9q|ßÛøJ7-Üv¥×è´ÜVb$êqúŽD¹~Ë|~ÉÈH åÝnžùâ)Õå±îtžMÛɵÿ“˾7y¶cr¤ÎÓã­-ŸZ'šú…i:ïË~Ùžhá8;G‘æÄpIœX5{½Ïû»âÊ+kñDÝU3õ®±Ô'ÅOÖß¡ÖÿýÒ>ô£µØæµñ+ø¥yŽKã<©E-^¶ûõ‰ñ˜¦s¬êƒZV*Õlûé*ñÙ}ÓYoÛËDHÚh ¸bùúõGäõèåÈÒõwâmØpVº§cÕ‰sKTß6lxUŸƒÐAQÏ?—û8Œì‰V›7g—Ìã®JÈÖͶléìû”¾'—_^‹ã|_¬ó½íÔfeM?6ãxŽžç›ÜûÞä˜ö-ËÂçäH'Ú¸õðµø‚?ÖÉ—2ç²¹‚P¬ë ©¥&ç:;:™4ÛF²ˆ ¶(‹¯›·ÆRª¿ ¶¡¯Ù6Ò…pÓ¦7díóäÏã}t¿Po-ì°Ì… B“ö#Z]‹Û¿šÇ£WA(~œ!ð?bÚÛ©qæò3„R¸ËøS�Œù?œu<"�- ·ôÒ,Êñðñ7þÏé´-¼âŠgÇùöÛ™Ç#ÇwJʪ >'C ½¤´ã_K9¾°“¾ô™A(Ý [¿¾ºq¢èh[¶Ü›Õw¨[AhQ:yŽ>ÜQyÛ;úV*µe—^º'ï­²¥ëׯH'ân”¹ˆA(.¤)îY::šy;«A(.–Á±Û¢Û<Ë÷9EX¹hYº—§lcóüE«SZºÅfëâܱ§u¶³ýýæ¿eø‰Ôï(Ç©¶>Ëx·ƒk»uL¡¼òæ#0…@üâÝ·©¦}"˜æÉ¦eŠÛ3GGkÌÌ‚ɯ ©Vwµª@Ý B©Â4=»ü¢N̉Q’[í÷’-[žõ'½N¢+Û/d𨷏XgÝŽév:~däï»u±Ì}Œú„RŸvnñ¥¾l)èLU'ëý€*•¯çÞ×.ÕÛ´½ØîMyÇ ‹Ûî¿:ù݆–Wry'Ð@œhßÒΉ¨Ó/lÞ¡˜ïÆ]¹¸v¥ÌqqhÕß Ç¢Zo•ëâɹ£u¥ b¥òÏ­ªW½þ¤~=]*s¡ƒPÚÇÑÑûÒ”S^ˆ«Õ·g—pÀôެ¯m´”¼'ÖÕû[aÇ®OA(êÌ/FkJ¾V›ôýùòœxh¢å’‘‘»2ý»TWëüxËÐUYǵÞÔÅïL*‡ ”¥îsSÌ¿öÚƒg0lLÙ"”ú›äyB¥[ßÜ뉧s¦zõF§A(.z š½ 7wÙztrOý³–W*gLõ%JOÞt³Œ%Bé‚|S¯ƒÐŠjõØzGù×–ëíC Ã…m–Ç_|ña!èÎ6×Ù}ß±L¿ÒòÇÃððû»}Þ„\æ LS ¾°_žÁÇž84}\;NÒ7#€Œ‹Nº0¥qlšqw„Òɳˆû\oò¯V×5Ûç4Ëò+®èêÅ$¡0þd³íõõ©±u!…ô¸Ø4vãÖXÜÞyF˜ß;cõ!]ÌGG_Ýx òü8‰r+ët”žJŒ‘ü¤ÇÜc¼ŸŒpñ»ÓòJ­sÑù:}·ÓÓ`+¢>§¿§©ʧ×*=µÁÕW?9ÊùÓ*k‹:™žrÍr÷9 ñ?-¾Œùš¥{ð«4=•ÆÎh<0'¦')ªÕ®<IÑí“M:)¦~�= BŸîzy»tÜÒE¹Ù>×;³wùVÞøm¶MEBõãT©\Ó¬ÿT7‚P Y½|Ò)«ž¥ŽËñpÀQ½ BiL¬¬2L|žÎ Oiu?æCzÖt;ëGþ÷˜þ8¶÷†‰"ÂEÚfôãùPlÿúvÃP=D5tÀŸú8[1^PÞýoc¾Ý.r´)¿È6¶ñ%# ¼72²%upŒ_h¿œ.„Ó™âó¦”ì•M/®Ñü]ä,ÏE|l`º{¢ëÚ˜~=wYFF~9‡þ½Ø—ÑX~{[}\Râ&:nªVɵÏcMïÆ¼›ã„ýûm‡áá·Å>¯e¾Uï–ž†Êáœ~%7Ýçx2'÷Ó>cñe~W«ã<¿qªªœ·E¨>øÝÈȯ嵉ºð¦pùhÔƒÇóš¤Ç¦SËMcY»„bÝmuŽ'üR«Ý½±\5öû7òîw³ãaàÍS#•'ô¶jJ}«b›wæí“ZhÒ�•Y§¶XçÍy[¶Ó>D?ÇûmñC¬å­¶‰íÖÇoŠsV|ÇoÎUöôƒ)Æ=kVîÅ—_þÌtÎÊó½ŸgoìßÇãïomy~‹[YN>'@ ±E¨éÒˆµñ먈é—hžn:ñ¥§CºQ¦XÏÕyO¤)4Åû‡6n·Ó ”{@µywª~JíXD Y7�¦ ô3k×¾ä€}®Vs?öœú?½´RyA;elœ7oŠ¡ þ:«SíÁî̼Ô/¨##Ü&í8Egàt›£ åcÑúð®N\ó.›ç{Ù*E�¸¬ýJOè½3«lËGG_VÁ<G ïùö8f‹³ÖÙêóXÇ'ó>aÛìqúWŒ½B$_¿ºtŽ餼–%@` “"l´Ñ”¼7Þ+ö ýÂÌ„âB~뢡¡§u£\é‘×8‘^ž§uc&ƒPj ÊϨú¯Ì·GÓ/óf}4bù|A(Nèq¼Îm§lÍæÍ„ê·­2ž.šª,+FG_Çøþ¬ kª+q<>Ó¸žNƒPê+–wõ8v»Òûç:uÍ»|'A(êÏey;×ç«Tš¾f¥±¬ÑšwAÖ­«z¿³h-‹e»òZŒØæÆ<?œoÚtÀ-½¶‚PµúhÞcc>ÚH÷Äs>¦½7ncýV›«ïhö<AhüÄöß:ÚPÃÂ?}Ùe‡ä¼q¦‚Pj©ˆc1ÜÍ}^tõÕOK·;³.úã·(–5n;oJfK7o^ÑiÙû„R#`ünž–¡Xº„"�üEΖºtËä¿tjÚÎòÓ BáùGYulòç1ÿßæ-W´ͼn9<ü‰¼ëË3ߊ8W¤Ö¥Ì}ŠÛŒëË„ƃö%yÊc¦!_â¿Ìs²ù¾›w€°i£é"¹‚P„‚¼£·S®¸Ýur›© TR)Æ•igò̉ë²~Qw„âx¥“§<­æéWª‡¡J厬_ýõ@>:ºßËy;mŠú÷ÍÌ:­QqûïÖN=Û]~:A(êÖog9Nìo½E6çLƒ"æ)ÛqÕêÉY?^¦êË•gý­æ‰ïÍ?e}oâó¾¯í¡4Ðm§å´<SÄÉ!óÅ•õæévÞß%í¼AhªÇØ;)Fêßyš¡>Bõ>)ÃÃïídÿš-žÏdÝìFŠº4¯Ó²÷3¥·¯gÖ…tá>mò~u„RŸ’ønþ k»éâ¿xÆŸêÔ³ÝåÛ B€–EŸœ|ŒÌüƒ9q›:o¹Âþ#™?è*•¯F°zjÞuæ/ŽÑ'²¾71 ”Ô|ú-kà¾x*¦ßåJÛ„š¿ªBš3§ŸAhéºu/Œ Yë׌uf}[·‚Pz¢(OêÖCí~¿ÛBÕêݹ[ƒbíè}l;e ûë³BcýS<%ÿc1ïUݘÂÿSðò<Ù*µs@ÍK Ÿy‚P|Ù?ÝÏ2MlK„¦ªwý Bi¼—¸h¶¾Uš†þB[fâ»ÙNJý¬òÌŸ‚Lýmò ·³ö¯þH{µú¬ 4ß BYÒçfJ Wбyf¢|‚ T„ 4~¡Íì3ý@.ê{ªVÿl&¾›y‚ÍÄãóoÉBš´ªåÙ·ú˜DÕê÷rm#Ç£õ=Z ”ç`š‡ÀLä B##ž‰² B‚P©‚P !Ðï í¡™øn¶„*•ÛÚ¿Þîþ,Ý´é…yn#¶Q†vÆnÊ;¯ Ôî5?~ BÍ¥u–nÂfcgéÜ-B‚Ð~¡`_‹P¥òÛy‚S *é5ívþŽÐ/ˆ ôý:YHê×EÍv´+  Bžk^¡]ò›É#KGPÉ÷N±4àf¼_pþÐÐÁyÏeqëmA¬?÷i3˜¡¼Ô|ú-  B‚Pëo]î ´y³[c“úàLBéå±VÏBbÞÜÖƒPÞ÷óé#ÔïKŒí(¾@ž @ûòn±F-}„ô*M¡±§Æ~M¡'êlã»Æb\¥«3Çú*i¤îhúù<gP·Æò(™‡�)r¡x³øL B‚P‚ÐüüÏï÷ šNTÌ;ŽP:KO>†n¾”»U¨ZýQ„œŸÎ:÷”¢³ôæÍneHŸ˜) 졬S4Sß0å„¡"¡ô>©è?Õr”çú;Ô*•Wô½E¨RùøL|7Ûí#4QÆôÆ÷øñõpÖ9gÒ«6þ1kÿò¶¨xwË;cýwõsŠ"—6î‡WldYŸè“@œ˜îÌñ5½b£OÅÙo3‚ T„ ou?1.š{[]¼Ó@€'^qÅáÝ Béõ±½Ì±q"Tl‰ïætƒP*ëÒ߸âŠ+²ž²ªžf«[íc½W¥’ù^¶ôî²E«W?Ùm·=5½d¸ŸS³ò B3Qsm“@B—d½]»~Ò«TÞÝoÀ¼A(~‰ŸÓí²Åæ;Y¿ZÇOÒ¼2úT™ú8´Z¾n:<ü«ÍÊ}â•W¶\¶>úîðð»¾Ï•Êç³^™.`‹«Õ£·ûzQŽ÷-ÕG.ۻƢEôãY?Òç&ÜKëŠïÜ]YÛ­¿k¬Z=½Ûu!k}¡zªV7e}¿&>‘¦K­[•i¼u§å÷&Žã÷V^{íS²ö­_Ÿ Bý’¶©É6ϯ³Ä/³#û š'_(6w³\qâ=¬þ¢ÙŒ'LÒE½Ùv{„êû\©ÜÓÍ}ŽcûŒXçƒYûœBZÓ}Ð ì7.K¡µE]¨ßriòšNƒP„Ýwä QƇRŸ¢nÖ‡¬uå)WcgéÉë\xÅϳmYõmâóØÇg¡‘¬ ž¾¯KGFöëОµŸ½ü\ꥮuhS NHÛ3OHéâ»iÓ5‹††žÖæê§={ ^Y'·ñAض¿4U›ö†&-˜šËcŸÍú%^÷Š `/‚PÖ…wüX¥Sþb7ö9­#.ZA¨åퟴÝšgK:výú#ââÙúe«aRoý}}£K§AhÙÐÐ3òòz}¾¼[u!Ïz: Bõ:72ò3i�ÅÌsÏøw-æûç©ÞëzKž2¥´6lxUž}ìõ<‚P¯…­Ÿ@„>œëd”F~æåv_ŠØFQö›uÅ%—ÌÍõTÛØ;жvÚbõâJå9€¾’Ë"BP4×ßÚ‹ ”Z{r•¡Ry4öù”éú¦åR°m]“k{cÇÿ‡e BÑ’ð×sjµƒÚ5J·ïb_wår‰©ŸJ·ƒPZ_lÿ¯r…ò±«¯¯¸øâCÚÝ×éÌŸ't´jšØfzQmVÿ«ÉÇ ŽÉÿhZÞ8Æ+2n)O^O|wÏÎ~wsA¨›šÖE Cø…tr´¼ìÉuÒOSþDÌÿæ%ÃçEçÇEÑ:qìt§å›6½¸Ù.,ºä’ŸÌ󪋉rǯ÷G#DlŽ_â?'Øâ±ÚÌrÅ[ÌǯÉ_ŠíTâ×÷Cy/:õ§„†‡¯êEŠ“ý§r‹J%µFìøÙ˜~9¦—ç9é—x¬ÿ ±5'lÞü½¼c»Ô[ß≛2¡8®ßŽ‹ÞŠ<u!ÙÅëŽÛ'®÷G]ʼ=Z7ùôœ¡¡'õ"ÅŽWçn5IahÓ¦ÇÓw Êô˩壓ïfX¼ìek×Úìxw+¥uÇþ}!oLÛMõ¼iLï4K-×Yƒ&ÆqM­®a»-Öõþ4^ÑòtÜsœ/ò|¿Ò<©51ë´,e ùœ@ŸÒ#òYe8ÁÄ­”X.5m?ÚÑ}SŽ߸Ë+‡†žë¿9óÄÖpâ‹eöÆÉõÇyË”æow鄼|xø-½BâÞ“ë„~à~ç>á“;ø6Ø4S*æ)fgé±÷Wå¯ cóf_LÇç©_À7lxC³zÐé­±}­&ÕêÝ픩>ïØw w}˜ê»!ò±åM.êÝ Bã-_™OÈM¤¾E+¶l™Ûh¾$nONë{ß…vêHžóJEûØuë´: B}¾ÈÙL:ªÕ–c¥´}2ÎAÙӬŸ¯Åõm´üÛÍ}ÁkÜ÷t<qݺg÷$ÅS@í¼Ž ‡Çå�Ÿh-iú¤[‘ƒPÏ|RËhô[™ê»Õ­ ´líÚ#§sïÊ~§ÛÎÑ*Õ¸ÝBKׯ_-ºùÂùØûÈhM-È�sª®øLq®IýÆ¢UPæ•Ç Š%ÍÄoéåɡź÷ÄX-g7m‚Ûf¹;Œö!�íÛ‡h†O-V½B)`ÅvvÎб˜:FŸ¤¸Õò’¦û\࡞9†Çq6<¯×A(­?Z;~½gûÑê{“n55é\Üí Tÿѳqãûr>(P_(neýI£}„Ï7á|1ÞþLA¨X×8¥!K`I¥r~ž“\—OÊS¡ñfóëò<=Öå2eµí÷‚Íɸ>>_¿(ÄK'gà8L½ÏcìuªJ4ÛZ„Æ/ØC­¾TÝjšØFϨïù>¡úw}tôïò~# =˜ú@5ƒ¸µ|ÑL·" B¹.7f"P\8áVòžŒº4_Ë ”žR‹Ûv?êÒ¶²Næçõ‹`<U4e(èp@ʼnõæ~z¬-aõÇŽ‡‡O„ÆHO£eüévÿQpU_¿}Bõ×™äéðüD¿oŠÊÏÌd„²¾>'Pè$ù®ú(}¸ÈÆ6Z¡Ä-UïË3ðc¯Ë›šäã©·¶:„ÝhJë?.FÓêó>½ÔË}O#·ÜçYrkl|Äð¿Ê3žV/‚PzL?úž¬É ¾ku¡ÏA¨^ïÓS¬©zŽsOš/~¸}²ÙS{ÑŸíÏ—]zi¿Îaû•W*ÁEN äˆ>C¯Ž‹pêÀØöSUyNb“æÉ B©¼Qž?kó×b®“i=NýÍNº“=»„Ò:—W*?—·ßDîýÈqiX×÷ÒØg}k©8/Ïw'ÍÓ‹ 4±í?êâ»™žÖìno\ß ¡úw½Z½0÷¾—¦ƒ‹¦þMá´3Ï`¡¹·—Ã\Êû-1¤wóÄ/«wÅIbGüºêÕI7WJ“£a(=eÖ«²°Þú¯ÓK/}(~yþï<‡¬›A(m/úAœNæ}kH'ú¸¸¤ÛaÑ2¸9+¥2j¡Ô7­þÐðð?Å+_NÌsü÷…•jõí™Á=œ#0½£õNÌ{RŒñ“LO.OïpËqn{ž BéÇFì×y¿çi8ˆ©:ò×_ÊZ­þç8†ŸVå½õíÝ~kÛVšN¶ ‚ ¤þaœPîKcntùñî=q’jù¨édžx¯ÒOE0¸!½(ÝVkûäžç‚1>Qìç£1}¬Ñ´c€ÈtK«õKWǯm:ÑTU!ösÓx_©Þì󨀉ÅôpøÞÖªOPcÓèäyng¤0wÒÈHÓAúÚù Ä@˜‡Fïëñ±$êå?¦ÁöÚ)Ûļ±ìÛ2/¸cä?˜Îú'-sPòOu£ë߉±Ô_ÑX¾ÌPž»¯T¾ÞÉ~¥×iÄ>ÝŸ÷G™¾º2£å2½y>êõ;£î|¹^Ïc ´úxKÓK¬U¹Ò÷?Zíÿ1££Ïʳãï²»¤KË ÐMôKmbdâx)dꯞpŠ“å?Äÿ_»Óør—,\·î'Ú-æâ?ÿó£Ó-‚XÇ»ãD¶:õhwûóÇ:ÒÓ*§–øûÿª%ƒ§+¨UYc_Ò %?6eYb$èØÆŸOçMØñÈ𠣌gE(ý½TÖ8‘^Óg§µßc#RÔ×36ÂîÛÓíЩFnµÏKÖ¬ynÛ¥>Êõõ Êü1Oî[K­¶—7¥_ÿa}S”ëÿ¶4¾2BKªCï‹éWÂää%[¶<·Ý:9yþzžJe´Õw#>û«tL;ÙξeÓwsýúÅi¤äú»ãÒq­T>:­º1v ÿ1õÍkV¶4žT|~í”ë®Vÿvq‡¯IÛ­Ÿk¢¯O®óËððÿ9ydäùy-S?¯úHÑ##§Æyäœðzkzj6¹·F¦ýÝŠï:´,K¯ô=ÎÚ·TGN¬VÏ»_æ#@€�Y 7Å…ú†¬>]³€Ë. @€�ƒ$7Å/îi½tu¬ì  0`yƒPÜ2½f:oŸ0.»C€� ’€ 4HGÓ¾ @€�m Bmq™™�$Ahަ}!@€�Ú„Úâ23 0H‚Ð MûB€�´% µÅef @`¡A:šö…�hK@j‹ËÌ @€À Bƒt4í  Ж€ Ô—™  @€�AHol?aÓ¦Ä[Âk­¦e££ŸöŠA:òö…�¨ ,~}„ OÄtU³)Þ<ÿ—Ç/ÇE€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� @€� %ðÿ¢­³žFv¶+����IEND®B`‚�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/tab_list.gif�������������������������������������0000664�0000000�0000000�00000001522�14136337723�0024453�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷|�€€€}}}yyyppp\\\HHH777)))$$$ !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```]]]YYYPPP???000###������������������������������������������������������������������������������������������&&&TTTqqq}}}€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ƒƒƒˆˆˆžžžªªª±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¤�,�������/�I H° Áƒ*\˜Ã‡#>dH±¢E‰#ZÜÈÑ`Æ|:Šä2ãȃ�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/tab_preview.gif����������������������������������0000664�0000000�0000000�00000001541�14136337723�0025162�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ �������������������������������������������������������  !!!"""...OOOlllzzz~~~~~~}}}|||{{{yyywwwuuusssrrrqqqqqqppppppooommmlllkkkiiihhhfffeeecccbbbaaa````````````aaaccceeehhhmmmrrryyyƒƒƒ‡‡‡”””™™™   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��D�,�������>�‰H° Áƒ*\ȰáÂ&€±àĉ ^¤H„£@7B¼¨äG‘#IvÄ¥Ë-_ÊÌH3b@�;���������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/images/tab_tree.gif�������������������������������������0000664�0000000�0000000�00000001542�14136337723�0024441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a��÷ ����������������������������������������������������������������  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???GGG\\\ooozzz~~~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚‚‚ƒƒƒ………‡‡‡ŠŠŠ”””›››¢¢¢«««µµµººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿ!ù ��¥�,�������?�K (PÁƒ*,x°¡‚… J„HP¢EŠ -:Ĩq"ÇŽ1Vì(rdÃ’C¢LùpeÄ–.ªŒ9!Æ€�;��������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/index.php�����������������������������������������������0000664�0000000�0000000�00000000050�14136337723�0022531�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php header("Location:../index.php"); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/jquery.multiselect.css����������������������������������0000664�0000000�0000000�00000005277�14136337723�0025313�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect {box-sizing: border-box; padding:2px 0 2px 4px; text-align:left; width: auto;} .ui-multiselect .ui-multiselect-open { float:right } .ui-multiselect-menu { display:none; box-sizing:border-box; position:absolute; text-align:left; z-index: 101; width:auto; height:auto; padding:3px; } .ui-multiselect-menu.ui-multiselect-listbox {position:relative; z-index: 0;} .ui-multiselect-header { display:block; box-sizing:border-box; position:relative; width:auto; padding:3px 0 3px 4px; margin-bottom:2px;} .ui-multiselect-header > ul { font-size:0.9em } .ui-multiselect-header li { float:left; margin:0 10px 0 0;} .ui-multiselect-header a { text-decoration:none; } .ui-multiselect-header a:hover { text-decoration:underline; cursor: pointer;} .ui-multiselect-header .ui-icon { float:left; } .ui-multiselect-header .ui-multiselect-close { float:right; margin-right:0; text-align:right; } .ui-multiselect-checkboxes { display:block; box-sizing:border-box; position:relative; overflow:auto; width: auto; border: 0; padding: 4px 0 8px;} .ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup) { clear:both; font-size:0.9em; list-style: none; padding-right:3px;} .ui-multiselect-checkboxes label { border:1px solid transparent; cursor:default; display:block; padding:3px 1px 3px 21px; text-indent: -20px;} .ui-multiselect-checkboxes input { position:relative; top:1px; cursor: pointer;} .ui-multiselect-checkboxes img { height: 30px; vertical-align: middle; margin-right: 3px;} .ui-multiselect-grouplabel { border-bottom:1px solid; display:block; font-weight:bold; margin:1px 0; padding:3px; text-align:center; text-decoration:none; } .ui-multiselect-selectable { cursor: pointer; } .ui-multiselect-optgroup > ul { padding: 3px; } .ui-multiselect-columns { display: inline-block; vertical-align: top; } .ui-multiselect-collapser { float: left; padding: 0 1px; margin: 0; } .ui-multiselect-collapsed > ul { display:none } .ui-multiselect-single .ui-multiselect-checkboxes input { left:-9999px; position:absolute !important; top: auto !important; } .ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; text-indent: 0 !important; } .ui-multiselect.ui-multiselect-nowrap { white-space: nowrap } .ui-multiselect.ui-multiselect-nowrap > span { display: inline-block } .ui-multiselect-checkboxes.ui-multiselect-nowrap li, .ui-multiselect-checkboxes.ui-multiselect-nowrap a { white-space: nowrap } .ui-multiselect-measure > .ui-multiselect-header, .ui-multiselect-measure > .ui-multiselect-checkboxes { float: left; } .ui-multiselect-measure > .ui-multiselect-checkboxes { margin: 4px; overflow-y: scroll; } .ui-multiselect-resize { border: 2px dotted #00F } @media print{ .ui-multiselect-menu {display: none;} } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/jquery.multiselect.filter.css���������������������������0000664�0000000�0000000�00000000622�14136337723�0026564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.ui-multiselect-hasfilter ul { position:relative; top:2px } .ui-multiselect-filter { float:left; margin-right:10px; font-size:1em; width:100%; } .ui-multiselect-header .ui-multiselect-filter input { width:100px; font-size:.9em; margin-left:5px; height:15px; padding:2px; border:1px solid #292929; -webkit-appearance:textfield; -webkit-box-sizing:content-box; } .ui-multiselect-excluded {display: none} ��������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/jquery.zoom.css�����������������������������������������0000664�0000000�0000000�00000012730�14136337723�0023735�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#zoom-container { position:absolute; z-index:auto; width: 100%; height: 100%; } #zoom-box { background: #000000; filter:alpha(opacity=1); -moz-opacity:0.01; -khtml-opacity:0.01; opacity:0.01; width:0; height:0; top:0; left:0; position:absolute; overflow:hidden; border:0; padding:0; margin:0; z-index:auto; } #zoom-area { display: none; width: 0; cursor:e-resize; background-color: #3f75a2; height:0; position:absolute; z-index:auto; filter:alpha(opacity=40); -moz-opacity:0.4; -khtml-opacity:0.4; opacity:0.4; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.5), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.5); border-radius: 2px 2px 2px 2px; } .zoom-area-excluded { display:none; background-color: #064072; height:0; position:absolute; z-index:auto; filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity:0.5; opacity:0.5; overflow:hidden; padding:0; margin:0; box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -o-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -webkit-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); -moz-box-shadow: 0 2px 6px rgba(0,0,0,0.75), inset 0 1px rgba(255,255,255,0.3), inset 0 10px rgba(255,255,255,0.2), inset 0 10px 20px rgba(255,255,255,0.25), inset 0 -15px 30px rgba(0,0,0,0.3); border: 1px solid rgba(0,0,0,0.75); border-radius: 2px 2px 2px 2px; } .zoom-marker { cursor: e-resize; border-left: 1px dotted #9d9d9d; width: 0; height: 120px; position: absolute; z-index: auto; display: none; } .zoom-marker-arrow-down { cursor: e-resize; position: relative; top: -6px; left: -4px; font-size: 0; line-height: 0; width: 0; border-top: 6px solid #93CEFF; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-arrow-up { cursor: e-resize; position: relative; left: -4px; font-size: 0; line-height: 0; width: 0; border-bottom: 6px solid #93CEFF; border-left: 3px solid transparent; border-right: 3px solid transparent; } .zoom-marker-tooltip { display: none; position: absolute; z-index:auto; color: #969BA3; opacity: 0.95; } .zoom-marker-tooltip-value{ white-space: pre-line; font-size: 1em; float: left; background: #000000; padding-left: 3px; padding-right: 3px; border: 1px solid #333333; } .zoom-marker-tooltip-arrow-left { float:left; width: 0; height: 0; margin-right: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #333333; } .zoom-marker-tooltip-arrow-left-inner { position: relative; top: -4px; left: 2px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-right: 8px solid #000000; z-index: auto; } .zoom-marker-tooltip-arrow-right { float:left; width: 0; height: 0; margin-left: -1px; margin-top: 4px; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #333333; } .zoom-marker-tooltip-arrow-right-inner { position: relative; top: -4px; left: -10px; width: 0; height: 0; border-top: 4px solid transparent; border-bottom: 4px solid transparent; border-left: 8px solid #000000; z-index: auto; } .zoom-menu { border: 1px solid #93CEFF; position:absolute; background: #070707; display:none; font-family: Verdana,Arial,sans-serif; font-size: 12px; font-weight: lighter; z-index:auto; color: #93CEFF; } .zoom-menu .first_li span { width:150px; display:block; padding: 4px 15px; cursor:pointer; text-align: left; } .zoom-menu .inner_li { display:none; margin-left:150px; position:absolute; border:1px solid #aaa; border-left:1px solid #ccc; margin-top:-28px; background:#070707; } .zoom-menu .sep_li { border-top: 1px solid #04335B; } .zoom-menu .fill_title { font-size: 1em; font-weight:bold; overflow:hidden; word-wrap:break-word; } .zoom-menu .ui-icon { float:left; margin-left: 0.2em; margin-right:0.4em; margin-top: 2px; } .zoom-menu .ui-icon-right { float: right; margin-left: 0.4em; margin-right:0.2em; margin-top: 2px; } .zoom-menu .ui-icon-empty { width: 16px; height: 16px; background-image:none; } .zoom-menu-hover { background: #04335B; cursor: pointer; } .zoom-menu-hover > span { color: #FFFFFF; } .zoom-menu span:hover{ color: #FFFFFF; } .zoom-menu-highlight { background: #04335B; color: #FFFFFF; } .zoom-hidden { z-index: -999; position: fixed; top: 0; left: 0; opacity: 0; } ����������������������������������������cacti-release-1.2.19/include/themes/sunrise/main.css������������������������������������������������0000664�0000000�0000000�00000136226�14136337723�0022366�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main styles */ ::-webkit-scrollbar { display: none; } html { height: 100%; width: 100%; } body, table, tr, td, textarea { font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', 'Helvetica Neue', 'BBAlpha Sans', 'S60 Sans', Arial, sans-serif; font-size: 12px; -ms-overflow-style: none; overflow: -moz-scrollbars-none; } body { margin: 0px; background-color: white; background-repeat: repeat-y; overflow: hidden; background-color: #000000; background-image: -webkit-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -moz-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -o-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -ms-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); } table { border-collapse: collapse; border-spacing: 0; border: none; text-align: left; outline-style: none; } td, th { padding: 2px 2px; margin: 0px; } th { white-space: nowrap; height: 18px; user-select: none; -ms-user-select: none; -moz-user-select: none; -webkit-user-select: none; } p { color: white; } h2 { border-color: rgba(255,255,255,0.1); } img { border: none; vertical-align: middle; } i.fa, i.fas, i.fab, i.far, i.fal { padding: 0px 3px; font-size: 13px; vertical-align: middle; } .menu_parent i.fa, .menu_parent i.fas, .menu_parent i.fab, .menu_parent i.far, .menu_parent i.fal { color: lightgrey; line-height: 18px; } fieldset { border: none; padding: 0px; margin: 0px; } hr.menu { border: 0; height: 1px; background: #93CEFF; background-image: linear-gradient(to right, #333, #93CEFF, #333); } .reindex_methods span { font-size: 9px; } /* links */ a, a:active, a:visited { color: #93CEFF; text-decoration: none; font-size: 12px; } a:hover { text-decoration: none; color: white; } th .fa { margin-top: -5px; position: absolute; right: 3px; top: 50%; } pre { color: #f7f7f7; } #main { display: none; position: relative; z-index: 0; padding-right: 5px; width: 100%; } #main > br { display: none; } #main > table { width: 100%; } #navigation_right { overflow-y: auto !important; padding-left: 5px; } input, select { padding: 0.4em 0.4em 0.4em 0.4em; background: transparent; } label { cursor: pointer; white-space: nowrap; } .glyph_tab-console:before { content: "\f185"; padding: 0px 8px 0px 8px; display: block; } .text_tab-console { display: none; } input[type="checkbox"]:not([name^="multiselect"]), input[type="radio"]:not([name^="reindex"]) { display: none; } input[type="checkbox"] + label:before { border: 1px solid #7f83a2; content: "\00a0"; display: inline-block; font: 12px/1em sans-serif; height: 12px; margin: 0.25em 0.45em; width: 12px; background: transparent; } input[type="checkbox"]:checked + label:before { background: #3C8A3C; color: #FFFFFF; content: "\2713"; text-align: center; } input[type="checkbox"]:checked + label, input[type="radio"]:not([name^="reindex"]):checked + label { color: #FFFFFF; } input[type="radio"]:not([name^="reindex"]) + label:before { border: 1px solid #7f83a2; border-radius: 10px; content: "\00a0"; display: inline-block; font: 10px/1em sans-serif; height: 12px; margin: .25em .25em 0 0; vertical-align: text-bottom; width: 12px; background: transparent; } input[type="radio"]:not([name^="reindex"]):checked + label:before { background: #FFFFFF; box-shadow: 0 0 0 3px #3C8A3C inset; border: 1px solid #7f83a2; text-align: center; font-weight: bold; } input[type="radio"]:not([name^="reindex"]) + label.ui-state-hover:before { border: 1px solid #FFFFFF; } label { white-space: nowrap; } label > span { color: #969BA3; } label.ui-state-active > span { color: #FFFFFF; } label.ui-state-active { border: 1px solid #7f83a2; background: transparent !important; } label.ui-state-hover > span { color: #FFFFFF; } .nowrap { white-space: nowrap; } .wrap { white-space: normal !important; } .top { vertical-align: top; } .right { text-align: right !important; } .left { text-align: left; } .center { text-align: center !important; } .flexContainer { display: flex; flex-wrap: wrap; margin-left: auto; margin-right: auto; justify-content: flex-start; } .flexChild { display: inline-block; margin-top: 5px; flex-basis: 20%; min-width: 200px; } .usermenudown { background: transparent url('./../../../images/bullet_arrow_down.png') no-repeat center right; } .usermenuup { background: transparent url('./../../../images/bullet_arrow_up.png') no-repeat center right; } .user { padding-right: 16px; font-weight: bold; cursor: pointer; } .filter { position: relative; left: -20px; margin-right: -10px; font-size: 13px !important; } .badpassword { padding: 4px; color: red; font-size: 1.5em !important; vertical-align: bottom; } .goodpassword { padding: 4px; color: green; font-size: 1.5em !important; vertical-align: bottom; } .associated { color: green; font-weight: bold; } .notAssociated { color: red; font-weight: bold; } .disabled_row span, .disabled_row td, .disabled_row a { color: grey; } .disabled { color: grey; font-weight: bold; } .idle { color: green; font-weight: bold; } .running { color: red; font-weight: bold; } .newObject { color: blue; } .updateObject { color: grey; } .unmetDependency { color: red; } .foundDependency { color: navy; } .success { color: green; } .failed { color: red; } .accessGranted { color: green; font-weight: bold; } .accessGrantedItem { color: green; } .accessRestricted { color: red; font-weight: bold; } .accessRestrictedItem { color: red; } .graphDrillDown { vertical-align: top; align-self: left; z-index: 4; padding: 3px; height: 100%; width: 22px; min-width: 22px; } .iconWrapper { display: none; } .deleteIcon { width: 10px; height: 10px; cursor: pointer; padding: 2px; border: none; } .drillDown { cursor: pointer; } .monoSpace { font-size: 9px; font-family: monospace; } .utilityPick { width: 200px; } .itemlist { max-height: 200px; overflow-y: auto; } .realms { width: 20%; vertical-align: top; white-space: nowrap; } .spikeKillMenuItem { display: block; width: 100%:; } .deviceUp { color: #3C8A3C !important; } .deviceDown { color: #ff0000 !important; } .deviceUnknown { color: #0000ff !important; } .deviceDisabled { color: #a1a1a1 !important; } .deviceRecovering { color: yellow !important; } .deviceError { color: #ffaa00 !important; } .deviceDownMuted { color: #ffe333 !important; } .deviceThreshold { color: #ffa833 !important; } .deviceUnmonitored { color: rgba(250, 253, 158, 0.8) !important; } .deviceWarning { color: #aa7807 !important; } .deviceAlert { color: #660000 !important; } .deviceUpBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(148, 179, 107, 0.8); } .deviceDownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff0000; } .deviceUnknownBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #0000ff; } .deviceDisabledBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #a1a1a1; } .deviceRecoveringBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ff8f1e; } .deviceErrorBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #750F7D; } .deviceDownMutedBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffe333; } .deviceThresholdBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #ffa833; } .deviceUnmonitoredBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: rgba(250, 253, 158, 0.8); } .deviceWarningBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #aa7807; } .deviceAlertBg { color: rgba(22,22,22,0.8); font-size: 10pt; font-weight: bold; background-color: #660000; } .beingGraphed { color: green; } .notBeingGraphed { color: #484848; } .submenuoptions { border-width: 0px 1px 1px 1px; border-color: #3a3b3c; border-style: solid; position: absolute; top: 45px; list-style: none; text-align: left; margin: 0px; padding: 10px 0px 10px 0px; background: #100000; } .submenuoptions li a { display: block; padding: 4px 15px; font-size: 12px; font-weight: 500; color: #93CEFF; text-decoration: none; } .submenuoptions li a:hover { display: block; color: white; background: #3C8A3C; } .menuoptions { background: #100000; border-width: 0px 1px 1px 1px; border-color: #3a3b3c; border-style: solid; display: block; float: right; position: absolute; right: 0px; top: 45px; list-style: none; text-align: right; margin: 0px; padding: 10px 0px 10px 0px; } .menuoptions li a { display: block; padding: 4px 15px; font-family: Verdana,Arial,sans-serif; font-size: 12px; font-weight: 500; color: #93CEFF; text-decoration: none; } .menuoptions li a:hover { display: block; color: white; background: #3C8A3C; } .import_label { opacity: 1; } .import_button { display: none; opacity: 0; } .import_text { opacity: 1; } .color-icon { background-image: none !important; } .emailtest { cursor: pointer; display: block; float: right; text-align: right; padding: 0px 5px 0px 0px; } .reloadquery { cursor: pointer; padding: 2px; vertical-align: middle; color: #32CD32; font-weight: bold; font-size: 14px; } .verbosequery { cursor: pointer; padding: 2px; vertical-align: middle; color: orange; font-size: 14px; } .deletequery { cursor: pointer; padding: 2px; vertical-align: middle; color: red !important; font-size: 14px; } .deletequery:hover { color: red !important; text-decoration: none; padding: 2px; vertical-align: middle; } .odd { border: none; } .odd.tableRow { color: #9d9d9d; #background: none repeat scroll 0 0 #fbfdff; } .even { border: none; } .even.tableRow { color: #9d9d9d; #background: none repeat scroll 0 0 #FFFFFF; } .even-alternate { #background: none repeat scroll 0 0 #E7E9F2; #background-color: #E7E9F2; #box-shadow: 0 0 1px rgba(0, 0, 0, 0.1); } .even-alternate.tableRow { color: #9d9d9d; #background: none repeat scroll 0 0 #FFFFFF; } .tableRow { padding: 4px 5px !important; } .tableRowGraph td { padding: 3px; vertical-align: top; } .saveRow { border-color: rgba(255,255,255,0.2); text-align: right; padding: 4px; } .treeArea, .treeItemsArea { width: 25%; border: 1px solid #006400; vertical-align: top; } .linkMarker { display: none; } .filteredValue { color: #F8D93D; } .graphItemGr1Alt1 { background-color: #EEEEEE; } .graphItemGr1Alt2 { background-color: #EEEEEE; } .graphItemGr1Cust { background-color: #D5D5D5; } .graphItemGr2Alt1 { background-color: #E7E9F2; } .graphItemGr2Alt2 { background-color: #E7E9F2; } .graphItemGr1Cust { background-color: #D2D6E7; } .graphItemAdd { background-color: #00438c; } .graphItemDel { background-color: #C63636; } .graphItemHR { color: #FF0000; } .hostUp { font-size: 10px; font-weight: normal; font-family: monospace; } .hostDown { color: #ff0000; font-size: 10px; font-weight: normal; font-family: monospace; } .cactiPageHead { z-index: 10; height: 45px; width: 100%; padding: 0px; border-color: rgba(255,255,255,0.2); */ box-shadow: inset 0 1px 0 rgba(255,255,255,.09); */ background-color: #000000; */ background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3a3b3c), to(#000000)); background-image: -webkit-linear-gradient(top, #3a3b3c 0%, #000000 100%); background-image: -moz-linear-gradient(top, #3a3b3c 0%, #000000 100%); background-image: linear-gradient(to bottom, #3a3b3c 0%, #000000 100%); background-repeat: repeat-x; } .cactiPageHead div { left: 0; top: 0; } .cactiPageHead #tabs { overflow-x: auto; overflow-y: hidden; } .cactiGraphPageHeadBackdrop { padding-bottom: 0px; float: right; position: fixed; } .cactiPageBottom { height: 30px; width: 100%; border-bottom: 1px solid grey; background-color: transparent; float: right; text-align: right; line-height: 30px; position: fixed; left: 0px; bottom: 0px; } .cactiPageBottom a { color: #9d9d9d; padding: 0px 8px; text-decoration: none; font-size: 16px; outline-style: none; } .cactiConsolePageHeadBackdrop { padding-bottom: 0px; float: right; position: fixed; } .navigation { overflow: hidden; } .debug td { padding: 3px; margin: 0px; } .breadCrumbBar { display: none !important; } .cactiContent { clear: both; width: 100%; vertical-align: top; } .cactiTreeNavigationArea { overflow-y: auto; overflow-x: hidden; margin-left: 0px; margin-right: 0px; height: 100%; float: left; display: none; color: lightgrey; } .cactiTreeNavigationArea a { padding-right: 18px !important; } .cactiTreeNavigationArea div:first-child { padding-left: 5px; } .cactiTreeSearch { padding-top: 5px; } .jstree { position: relative; display: block; } .cactiContentNavigationArea { overflow: hidden; padding-left: 0px; padding-right: 0px; padding-top: 0px; vertical-align: top; left: 0px; } .cactiConsoleNavigationArea { overflow-y: auto !important; overflow-x: hidden; width: 170px; height: 100% !important; float: left; } .cactiLogo { background: transparent url('./images/cacti_logo.svg') no-repeat 30px; display:none; cursor: pointer; padding-bottom: 140px; margin-bottom: 60px; width: 156px; margin-top: -6px; margin-left: 2px; margin-right: 2px; } .cactiVersion { padding-left: 10px; color: rgba(255,255,255,0.2); float: left; } .loginLeft, .logoutLeft { display: none; } .loginCenter, .logoutCenter { position: absolute; background-color: transparent; width: 300px; height: 200px; top: 45%; left: 50%; padding: 10px 15px; margin: -100px 0 0 -150px; } .cactiLoginLogo, .cactiLogoutLogo { display: none; } .loginArea, .logoutArea { color: #9d9d9d; } .cactiLoginTable td { padding-bottom: 6px; padding-right: 6px; } .loginErrors, .logoutErrors { color: red; min-height: 15px; } legend { color: #93CEFF; font-size: 22px; font-weight: bold; } .loginRight, .logoutRight { display: none; width: 33%; float: right; } .loginBody, .logoutBody { height: 100% !important; width: 100% !important; } .loginBody input, .logoutBody input { background-color: transparent; color: #969BA3; border: 1px solid rgba(255,255,255,0.2); } .versionInfo { position: fixed; left: 5px; bottom: 5px; color: rgba(255,255,255,0.2); } .actionsDropdown { vertical-align: middle; padding: 3px; width: 100%; text-align: right; display: table; } .actionsDropdown div { display: table-row; margin-top: auto; margin-bottom: auto; } .actionsDropdownButton { vertical-align: top; float: right; margin-top: 0px; margin-left: 3px; margin-right: 6px; display: table-cell; } .actionsDropdownButton > input.ui-button { background: transparent; outline-style: none; padding: 4px 10px; } .actionsDropdownArrow { margin-top: auto; margin-bottom: auto; float: left !important; padding: 3px; } .cactiTooltipHint { cursor: pointer; padding: 5px; font-size: 12px !important; } .spikekillParent { padding: 0px !important; } .spikekillData, .spikekillData td { #border: 1px solid #999; } .spikekillNote { #padding: 1px; } .spikekillMenu { color: #93CEFF; background: #100000; border: 1px solid #3a3b3c; ; margin: 0px; padding: 10px 0px 10px 0px !important; line-height: 1.5em; } .spikekillMenu li { vertical-align: middle; } .spikekillMenu i { text-align: center; width: 2.0em; display: inline-block; } .spikekillMenu i:empty { width: 2.0em; display: inline-block; } .loginPanel { padding: 4px 0px; } .treeTable { width: 100%; } .treeTable td { color: #e5e1e1; } .treeArea { vertical-align: top; } .graphWrapper { position: relative; } .cactiGraphContentArea { height: 100vh; display: none; overflow-y: auto !important; overflow-x: hidden !important; border-left: 1px solid #000000; } .cactiGraphContentArea span[align="center"] { color: #9d9d9d; } .cactiGraphContentArea .tableHeader > td { color: #FFAA00; text-align: left; padding: 3px 5px; width: 100%; font-size: 13px; font-weight: 600; text-transform: none; border-color: rgba(255,255,255,0.2); background-image: linear-gradient(to right, rgba(0,0,0,0.5), rgba(0,0,0,0.1)); background-repeat: repeat-x; } .cactiGraphContentAreaPreview { height: 100vh; overflow-y: auto !important; } .cactiGraphContentAreaPreview span[align="center"] { color: #9d9d9d; } .cactiGraphContentAreaPreview .cactitable { background: none !important; } .cactiConsoleContentArea { height: 100vh; overflow-y: auto !important; overflow-x: hidden; border-left: 1px solid #000000; } #graph_view_preview2 table.cactiTable { background: none !important; } #graph_view_tree_content2 table.cactiTable { background: none !important; } #graph_view_preview2 .tableRow { background: none !important; } #graph_view_tree_content2 .tableRow { background: none !important; } .hyperLink { color: #93CEFF; font-size: 12px; padding: 3px; cursor: pointer; text-decoration: none; } .iconLink { width: 20px; line-height: 20px; display: inline-block; } .piinstall, .pienable, .pidisable, .piuninstall, .pierror { padding: 0px 3px !important; } .linkEditMain, .linkEditMain:visited, .linkEditMain:active { color: #93CEFF; text-decoration: none; font-size: 12px; padding: 3px; white-space: nowrap; cursor: pointer; } .linkEditMain:hover { color: white; white-space: nowrap; text-decoration: none; } .linkOverDark, .linkOverDark:visited, .linkOverDark:active { color: #93CEFF; font-weight: normal; text-decoration: none; cursor: pointer; } .linkOverDark:hover { color: white; text-decoration: none; } .linkCopyDark, .linkCopyDark:visited, .linkCopyDark:active { color: #93CEFF; font-weight: normal; text-decoration: none; cursor: pointer; } .linkCopyDark:hover { color: white; text-decoration: none; } /* text styles */ .textError { font-size: 12px; color: #FFAA00; } .textWarning { font-size: 12px; color: #ee7600 !important; } .textInfo { font-size: 14px; color: #9d9d9d; } .textInfo.left { color: #ffaa00; } .textHeader { font-size: 12px; font-weight: bold; } .textOverflow { max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; } .bold { font-weight: bold; } .remover { cursor: pointer; } .messageContainer { text-align: center; position: absolute; left: 30%; right: 30%; margin-left: auto; margin-right: auto; z-index: 4; } .messageBox { padding: 1px; margin-top: 2px; border-radius: 3px; background-color: #04335B; border: 1px solid #04335B; position: relative; z-index: 4; } .textHeaderDark { font-size: 12px; font-weight: bold; color: white; } .templateHeader { background: rgba(0,0,0,0.55); } .templateHeader td { padding: 3px; } .textSubHeaderDark, .textSubHeaderDark:visited { font-size: 11px; outline-style: none; margin: 2px 0px 3px 5px; } .cactiBorderWall { border-width: 1px; border-color: rgba(255,255,255,0.2); border-style: solid; } .cactiTable { color: #9d9d9d; width: 100%; margin-left: auto; margin-right: auto; border-color: rgba(255,255,255,0.2); padding-bottom: 10px; } table.cactiTable { color: lightgrey; } .cactiInstallLoaderSpinnerTheme { border-top-color: rgba(255,255,255,0.2) !important; } .cactiTableTitleRow { color: #FFAA00; float: left; text-align: left; padding-left: 3px; display: block; width: 100%; height: 22px; line-height: 22px; font-size: 13px; font-weight: 600; border-color: rgba(255,255,255,0.2); background-image: linear-gradient(to right, rgba(0,0,0,0.5), rgba(0,0,0,0.1)); background-repeat: repeat-x; } .cactiTableTitle { color: #FFAA00; float: left; text-align: left; padding-left: 3px; display: block; width: 70%; height: 22px; line-height: 22px; font-size: 13px; font-weight: 600; border-color: rgba(255,255,255,0.2); background-image: linear-gradient(to right, rgba(0,0,0,0.5), rgba(0,0,0,0.1)); background-repeat: repeat-x; } .cactiTableButton { float: right; padding: 0px; display: block; text-align: right; font-size: 13px; width: calc(30% - 3px); height: 22px; line-height: 22px; border-color: rgba(255,255,255,0.2); background-image: linear-gradient(to right, rgba(0,0,0,0.1), rgba(0,0,0,0)); background-repeat: repeat-x; white-space: nowrap; } .cactiTableButton.debug { background: transparent; height: 1em; } .cactiTableButton span, .cactiTableTitle span { padding: 0px; white-space: nowrap; overflow: hidden; vertical-align: middle; } .cactiTableButton i { padding: 0px 8px; } .cactiTableButton span:last-child i, .cactiTableTitle span:last-child i { padding: 0px 8px !important; } .cactiDebugTable { width: 100%; } .filterTable { white-space: nowrap; } .filterTable td:first-child { width: 55px; min-width: 55px; } .filterTable td { padding: 2px; white-space: nowrap; } .filterTable label { vertical-align: 10%; } .formRow { display: table; width: 100%; padding-left: 15px; line-height: 30px; } .formColumn { float: left; display: table-column; } .formColumnLeft { float: left; display: table-column; width: 45%; text-align: left; } .formColumnRight { float: left; display: table-column; width: 45%; text-align: left; } .formData { display: inline-block; float: left; } .formFieldName { color: #e5e1e1; display: inline-block; float: left; text-align: left; padding-left: 5px; padding-right: 30px; } .formFieldDescription { color: #969BA3; float: left; text-align: left; font-weight: normal; line-height: 14px; padding-left: 1px; } .formTooltip { display: inline-block; } .formHeader { cursor: pointer; float: left; width: 100%; text-align: left; line-height: 25px; text-transform: none; padding: 0px 0px 0px 5px; color: #93CEFF; font-size: 13px; font-weight: 600; } .formHeader:hover { color: white; } .formHeader.collapsible { } .formHeader.collapsed { } .formHeaderAnchor { float: right; padding-right: 12px; } .hostInfoHeader { width: 100%; } @media screen and (max-width: 640px) { .formRow { display: table; width: 100%; line-height: 30px; } .formColumn { float: left; display: table-row; } .formColumnLeft { float: left; display: table-row; width: 92%; } .formColumnRight { float: left; display: table-row; width: 100%; } .formFieldName { color: snow; float: left; text-align: left; padding-left: 3px; padding-right: 3px; } .formData { float: left; } .hostInfoHeader { overflow: hidden; } .queryAdd, .templateAdd, .navBar, #ping_results { display: none; } /* switch to horizontal scrolling */ .tabs { overflow-y: hidden; overflow-x: scroll; white-space: nowrap; } .tabs ul { display: inline-flex; } /* dropdown menus */ .menuoptions, .submenuoptions { width: 100%; left: 0 !important; border-left: none !important; border-right: none !important; } } .graphItem { background: rgba(255,255,255,0.05); } .graphItemAlternate { background: rgba(255,255,255,0.05); } .break { height: 0px; } .next { padding-right: 6px; padding-left: 6px; } .previous { padding-right: 6px; padding-left: 6px; } .cactiNavBarTop { border-bottom: 1px solid rgba(0,0,0,0.5); } .cactiNavBarBottom { background-color: #00438c; } .tableHeader { display: table-row; color: #9d9d9d; font-weight: 700; } .tableHeader th.sortable { cursor: pointer !important; line-height: 10px; } .tableHeader th { border-color: #333; color: #9d9d9d; font-weight: 600; vertical-align: middle; text-align: left; font-size: 11px; text-transform: none; border-bottom: 1px solid rgba(255,255,255,0.1); } .tableHeader th div { display: block; padding-right: 8px; font-size: 11px; } .tableHeaderColumnSelected { color: white !important; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 3px solid #3C8A3C !important; } .tableHeaderColumnHover { color: white !important; } .tableSubHeaderColumn, .tableSubHeaderColumnCenter, .tableSubHeaderColumnRight { cursor: pointer; text-align: left; padding: 3px; outline-style: none; } .tableSubHeaderColumnCenter { text-align: center; } .tableSubHeaderColumnRight { text-align: right; } .tablesorter-headerRow { } .tablesorter-headerRow th { border-bottom: 1px solid rgba(255,255,255,0.1); } .tablesorter-headerDesc, .tablesorter-headerAsc { color: white !important; background: none !important; border-bottom: 3px solid #3C8A3C !important; } .tablesorter-header-inner { padding: 2px; } .tablesorter-headerUnSorted div.textSubHeaderDark { color: #9d9d9d; } .graphSubHeaderColumn { color: #white; font-size: 12px; vertical-align: middle; text-align: left; padding: 3px; } .tableSubHeaderCheckbox { max-width: 20px; width: 20px; } .image_table { width: 100%; } .tableConfirmation { width: 100%; text-align: center; background-color: #f5f5f5; border: 1px solid #aaaaaa; } .navBar { min-width: 30%; white-space: nowrap; } .navBarNavigation { color: #9D9D9D; width: 100%; text-align: center; line-height: 20px; height: 25px; margin-left: auto; margin-right: auto; } .navBarNavigation a { color: #9D9D9D; } .navBarNavigation a:hover { color: #FFFFFF; } .navBarNavigationPrevious { text-align: left; cursor: pointer; font-weight: bold; float: left; white-space: nowrap; display: block; width: 10%; height: 20px; vertical-align: middle; border-top: 1px solid rgba(25,255,255,0.1); } .navBarNavigationCenter { text-align: center; display: block; float: left; white-space: nowrap; width: 80%; height: 20px; margin-top: auto; border-top: 1px solid rgba(25,255,255,0.1); } .navBarNavigationCenter span { vertical-align: middle; } .navBarNavigationNext { text-align: right; cursor: pointer; font-weight: bold; float: right; white-space: nowrap; display: block; width: 10%; #padding: 2px 0px; height: 20px; vertical-align: middle; border-top: 1px solid rgba(25,255,255,0.1); } .navBarNavigationNone { text-align: center; display: block; float: left; white-space: nowrap; width: 100%; padding: 2px 0px; margin-top: auto; } .navBarNavigationNext i.ui-icon { margin-top: -16px; margin-right: -16px; top: 50%; } .navBarNavigationPrevious i.ui-icon { margin-bottom: -16px; margin-left: -16px; top: 50%; } .textArea { font-size: 12px; } .textArea a { font-size: 1.1em; } .popupBox { #z-index: 2; position: absolute; padding: 0px; display: none; overflow: auto; color: white; background-color: #e5e5e5; border: 1px solid #e5e5e5; } .installArea { background-color: white; padding: 10px; } .textAreaNotes { font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; } .textEditTitle { font-weight: bold; } .textMenuHeader { color: white; background-color: #9C9C9C; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; } .textMenuItem { background-color: #efefef; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuSubItem { background-color: white; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .textMenuItemSelected { background-color: #E1E1E1; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } .txtErrorTextBox { border: 2px solid #ff0000 !important; } .txtErrorText { color: #FF0000; font-size: 12px; font-weight: bold; } /* tabs */ .tabSpacer { width: 0px; padding-right: 2px; padding-left: 0px; } .tabsMarginLeft { padding-left: 2px; } .tabSelected { background-color: silver; white-space: nowrap; width: 1%; } .tabNotSelected { background-color: #dfdfdf; white-space: nowrap; width: 1%; } .deleteMarker { color: red; vertical-align: middle; text-decoration: none !important; } .deleteMarker:hover { text-decoration: none !important; } .deleteMarkerDisabled { color: #9d9d9d !important; } .moveArrow { color: #00438C !important; height: 14px !important; font-size: 14px !important; display: inline-block; width: 11.75px; vertical-align: middle; text-decoration: none !important; } .moveArrow:hover { text-decoration: none !important; } .moveArrowNone { display: inline-block; width: 11.75px; } .action, .shiftArrow, .calendar { cursor: pointer; padding: 2px; } td.tab { border-top: 1px solid #999; border-right: 1px solid #666; border-left: 1px solid #999; padding-left: 3px; padding-right: 3px; min-width: 0%; border-bottom: none; border-top-left-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -moz-border-radius-topleft: 4px; } .cactiGraphHeaderBackground { display: none; } div#gtabs { padding-bottom: 0px; vertical-align: bottom; display: none !important; position: fixed; right: 5px; top: 5px; height: 30px; } .ellipsis { width: 25px !important; display: none; } .usertabs { float: right !important; width: 76px !important; overflow: hidden; } .maintabs { line-height: 30px; float: left; overflow: hidden; height: 32px; } .maintabs a { color: #93CEFF; float: left !important; padding: 5px 8px; text-decoration: none; font-size: 18px; vertical-align: bottom; outline-style: none; border-bottom: 3px solid transparent; } .usertabs nav ul { float: right; padding-right: 5px; } .usertabs a { padding: 5px 6px; } .maintabs-has-submenu a { padding: 5px 4px 5px 9px; } .maintabs a:hover { font-size: 18px; color: white; background: none; } .maintabs a.selected { color: white; font-size: 17px; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 3px solid #3C8A3C; } .maintabs nav { white-space: nowrap; } .maintabs li { bottom: -1px; float: left; } .maintabs-submenu { display: none; } #menu-tab-graphs.maintabs-submenu, .maintabs-submenu-ellipsis a { display: block; } .maintabs-submenu a { padding: 5px 8px 5px 0px; } .maintabs-submenu i { font-size: 18px; } div.submenu { display: none; position: absolute; border: 2px solid #2d4ca8; top: 0; left: 0; z-index: 200; } div.submenu span { display: block; } .tabs { float: left; width: 100%; line-height: 20px; border-color: rgba(255,255,255,0.2); background: transparent; } .tabs a { color: #93CEFF; float: left !important; padding: 5px 8px; font-size: 13px; vertical-align: bottom; text-decoration: none; outline-style: none; border-bottom: 3px solid transparent; } .tabs a:hover { color: white; } .tabs nav a.selected { color: white; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 3px solid #3C8A3C; } .tabs li { float: left; margin: 0 3px 0 0; position: relative; } .tabs li.current a, .maintabs li.current a { background: #fff; border-bottom: 1px solid #fff; } .tabs li.current a:hover, .maintabs li.current a:hover { background: #fff; border-bottom: 1px solid #fff; } .tabs nav { border-bottom: 1px solid #000; } .tabs nav:after, .maintabs nav:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } .tabs ul, .maintabs ul { list-style: none; margin: 0; padding: 0; } /* Navigation Area */ #nav { float: left; font-size: 12px; margin: 0px 0; } #nav li a { display: block; padding: 2px 4px 2px 9px; color: #93CEFF; text-decoration: none; } #nav li a.active { font-weight: 600; font-size: 14px; } #nav li a.active:not(.selected) { color: #93CEFF !important; } #nav li a.active, #nav li a.active:hover { color: white !important; } th { border-right: 1px groove #9d9d9d; } th:last-child { border-right: none !important; } tr.selected { background: rgba(0,0,0,0.4) !important; border-left: 3px solid #bababa !important; color: #bababa !important; } tr.selected a.linkEditMain:visited { color: #FFFFFF; } tr:not(.selectable) a.linkEditMain:hover { color: orange; } tr.selectable { border-left: 3px solid transparent; } tr.selectable:hover:not(.selected) { background: rgba(0,0,0,0.2); } tr.selectable td { padding: 3px; } tr.selected a { color: #FFFFFF; } #nav li ul li a.selected { color: white; } #nav li ul { display: none; padding: 0; border-left: 3px solid #93CEFF; } #nav li ul li a { padding: 2px 4px 2px 35px; outline-style: none; } #nav li ul li a:hover { color: white; } #nav li ul li { list-style: none; padding: 0; } ul#nav { list-style: none; padding: 0; width: 100%; } .clogError { color: #FF3932; } .clogWarning { color: #EACC00; } .clogSQL { color: #6DC8FE; } .clogDebug { color: #C4FD3D; } .clogStats { color: #96E78A; } .clogLimit { color: #EACC00; } .clogStats td, .clogDebug td, .clogSQL td, .clogWarning td, .clogError td, .clogLimit td { padding: 3px; } @media print { .noprint { display: none; } } .ui-tooltip { max-width: 500px; word-break: break-word; } .ui-tooltip-content div.header { color: #93CEFF; } .ui-tooltip-content div.content { font-size: 10px; color: #9d9d9d; } .ui-tooltip-content { overflow: auto !important; opacity: 0.95; border: transparent; } div.preformatted { font-family: monospace; white-space: pre; } ul.pagination { display: inline-block; padding: 0; margin: 0; vertical-align: middle; } ul.pagination li { display: inline; } ul.pagination li a { color: #9D9D9D; float: left; padding: 0px 2px 2px 2px; text-decoration: none; margin: 0px 1px; } ul.pagination li span { float: left; padding: 0px 0px; text-decoration: none; margin: 0px 1px; } ul.pagination li a.active { color: white; background: none; box-shadow: inset 0 0 20px 0 rgba(0,0,0,.5); border-bottom: 1px solid #3C8A3C; } ul.pagination li a:hover:not(.active) { color: #FFFFFF; } tr#realtime td:first-child { height: 68px; } .logEmergency { background-color: rgba(255, 6, 6, 0.4); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logCritical { background-color: rgba(242, 23, 33, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logAlert { background-color: rgba(242, 25, 36, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logWarning { background-color: rgba(255, 122, 48, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logError { background-color: rgba(251, 74, 20, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logNotice { background-color: rgba(250, 253, 158, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logInfo { background-color: rgba(204, 255, 204, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .logDebug { background-color: rgba(205, 207, 196, 0.2); text-align: center; width: 12.5%; color: rgb(211, 211, 211); } .darkblue { background: #2d4ca8; /* Old browsers */; } .ui-corner-all { border-radius: 0px !important; -moz-border-radius-bottomright: 0px !important; -moz-border-radius-bottomleft: 0px !important; -moz-border-radius-topright: 0px !important; -moz-border-radius-topleft: 0px !important; } .menuitem { white-space: nowrap; } .menu_glyph { font-size: 12px; vertical-align: 30%; text-align: left; width: 20px; } .submenu_glyph { width: 20px; vertical-align: 10%; } .dropdownMenu { font-family: Verdana,Arial,sans-serif; } .hostInfoHeader { color: lightgray; } .ui-widget-header { border: 1px solid transparent; background: transparent; color: #93CEFF; font-weight: bold; } .ui-multiselect-header span { color: #93CEFF; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { background: transparent; color: rgb(150, 155, 163); border: 1px solid rgba(255,255,255,0.2); } .ui-widget-header .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-icon, .ui-widget-content .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } .ui-multiselect-filter { font-weight: normal; } .ui-multiselect-all, .ui-multiselect-none { font-weight: normal; } .ui-multiselect-all:hover, .ui-multiselect-none:hover { text-decoration: none; } .ui-multiselect-header { margin-bottom: 1px; } .ui-multiselect-header ul li { padding-top: 4px; } .ui-multiselect-filter input { border: 1px solid rgba(255,255,255,0.2); padding-left: 3px; margin-left: 3px; } .ui-multiselect-checkboxes label { color: #93CEFF; } .ui-multiselect-checkboxes .ui-state-hover { background: #3C8A3C; } .ui-multiselect, .ui-multiselect-button, .ui-selectmenu-button { padding: 0.3em 0.5em !important; text-align: left; line-height: initial; } .ui-multiselect-header ul { margin-top: 4px; height: 15px; float: left; } .ui-multiselect-filter { margin-bottom: 4px; } .ui-multiselect-filter-label > input { padding: 2px; margin-left: 4px; color: #969BA3; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default, .ui-button, html .ui-button.ui-state-disabled:hover, html .ui-button.ui-state-disabled:active { border: 1px solid rgba(255,255,255,0.2); background: transparent; font-weight: normal; color: #555555; } .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus, .ui-button:hover, .ui-button:focus { border: 1px solid rgba(255,255,255,0.2); background: transparent; font-weight: normal; color: #93CEFF; } .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { background: transparent; color: #93CEFF; border: 1px solid rgba(255,255,255,0.2); } .ui-autocomplete { height: 300px; overflow-y: auto; overflow-x: hidden; } .ui-select-text input { width: 180px; margin: 0; padding: 0; background: transparent; } .ui-multiselect { padding: 0.4em 1em; text-align: left; line-height: initial; } .ui-multiselect .ui-icon { margin-top: 0px; } .ui-widget { font-size: unset; background: transparent; color: #CECECE; } .ui-checkboxradio-icon { display: none; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid rgba(255,255,255,0.2); background: transparent; font-weight: normal; color: #969BA3; } .ui-widget-content { border: 1px solid rgba(255,255,255,0.2); background: #000000; color: #969BA3; } .ui-widget.ui-widget-content { border: 1px solid rgba(255,255,255,0.2); } .ui-menu .ui-state-focus, .ui-menu .ui-state-active { background: #3C8A3C; margin: -1px; } .ui-menu .ui-menu-item { position: relative; margin: 0; cursor: pointer; min-height: 0; list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); color: #93CEFF; } .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { border-top-right-radius: 0px; } .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { border-top-left-radius: 0px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { border-bottom-right-radius: 0px; } .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { border-bottom-left-radius: 0px; } .cactiInstallSqlResults { color: #fff; } .cactiInstallSectionTitle { color: #fff; background-repeat: repeat-y; overflow: hidden; background-color: #ffffff; background-image: -webkit-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -moz-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -o-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -ms-radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: radial-gradient(85% 145%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); } /* New Checkbox Stuff */ .checkboxSwitch { position: relative; display: inline-block; width: 45px; height: 24px; margin-right: 5px; vertical-align: middle; } .checkboxSwitch input { display: none; } .checkboxSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(147, 206, 255, 0.2); background-image: -webkit-linear-gradient(left, rgba(147, 206, 255, 0.2) 0%, rgba(147, 206, 255, 0.2) 60%, black 100%) !important; background-image: -moz-linear-gradient(left, rgba(147, 206, 255, 0.2) 0%, rgba(147, 206, 255, 0.2) 60%, black 100%) !important; background-image: -o-linear-gradient(left, rgba(147, 206, 255, 0.2) 0%, rgba(147, 206, 255, 0.2) 60%, black 100%) !important; background-image: -ms-linear-gradient(left, rgba(147, 206, 255, 0.2) 0%, rgba(147, 206, 255, 0.2) 60%, black 100%) !important; background-image: linear-gradient(left, rgba(147, 206, 255, 0.2) 0%, rgba(147, 206, 255, 0.2) 60%, black 100%) !important; -webkit-transition: .4s; transition: .4s; border: 1px solid #7F83A2; } .checkboxSlider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 3px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .checkboxSlider { background-color: rgba(255, 170, 0, 0.5) !important; background-image: -webkit-linear-gradient(to right, black, rgba(255, 170, 0, 0.5)) !important; background-image: -moz-linear-gradient(to right, black, rgba(255, 170, 0, 0.5)) !important; background-image: -o-linear-gradient(to right, black, rgba(255, 170, 0, 0.5)) !important; background-image: -ms-linear-gradient(to right, black, rgba(255, 170, 0, 0.5)) !important; background-image: linear-gradient(to right, black, rgba(255, 170, 0, 0.5)) !important; } input:focus + .checkboxSlider { box-shadow: 0 0 1px #2196F3; } input:disabled + .checkboxSlider { cursor: not-allowed; } input:checked + .checkboxSlider:before { -webkit-transform: translateX(20px); -ms-transform: translateX(20px); transform: translateX(20px); } /* Rounded.checkboxSliders */ .checkboxSlider.checkboxRound { border-radius: 24px; } .checkboxSlider.checkboxRound:before { border-radius: 50%; } .right { text-align: right; } .radioSwitch { position: relative; display: inline-block; margin-left: 5px; margin-right: 5px; height: 24px; width: 24px; vertical-align: middle; } .radioSwitch input { display: none; } .radioSlider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; width: 24px; height: 24px; background-color: #FFAA00; -webkit-transition: .4s; transition: .4s; border: 1px solid #7f83a2; background-image: -webkit-radial-gradient(50% 50%, ellipse cover, #000000 1%, #04335b 35%, #000000 65%); background-image: -moz-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -o-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -ms-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); } .radioSlider:before { display: none; position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 4px; background-color: white; background-image: url('./images/cacti_logo.svg'); background-repeat: no-repeat; background-size: 7px; background-position: center; -webkit-transition: .4s; transition: .4s; } input:checked + .radioSlider { background-image: -webkit-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -moz-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -o-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: -ms-radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); background-image: radial-gradient(50% 50%, ellipse cover, #ffa254 1%, #04335b 35%, #000000 65%); } input:focus + .radioSlider { box-shadow: 0 0 1px #2196F3; } input:disabled + .radioSlider { cursor: not-allowed; } input:checked + .radioSlider:before { display: block; } /* Rounded.radioSliders */ .radioSlider.radioRound { border-radius: 24px; } .radioSlider.radioRound:before { border-radius: 50%; } .radioLabelWanted { display: inline-block; margin-left: 5px; margin-right: 10px; vertical-align: middle; line-height: 20px; } td.center > table { margin: 0 auto; } .ui-menu-item-wrapper { white-space: nowrap; } .ui-tabs-active .ui-tabs-anchor { color: #FFFFFF !important; } .bb-chart { } .bb-chart-arc path { fill: #A8A8A8; } .bb-tooltip { } .bb-legend-item { fill: #A8A8A8; } .bb-grid { fill: #A8A8A8; } .bb-axis { fill: #A8A8A8; } /*-- Tooltip --*/ .bb-tooltip-container { z-index: 10; } .bb-tooltip { border-collapse: collapse; border-spacing: 0; background-color: #161616; empty-cells: show; -webkit-box-shadow: 7px 7px 12px -9px #777777; -moz-box-shadow: 7px 7px 12px -9px #777777; box-shadow: 7px 7px 12px -9px #777777; opacity: 0.9; } .bb-tooltip tr { border: 1px solid #050505; } .bb-tooltip th { background-color: #161616; font-size: 14px; padding: 2px 5px; text-align: left; color: #FFFFFF; } .bb-tooltip td { font-size: 13px; padding: 3px 6px; background-color: #050505; border-left: 1px dotted #999; } .bb-tooltip td > span { display: inline-block; width: 10px; height: 10px; margin-right: 6px; } .bb-tooltip td.value { text-align: right; } /*-- Chart --*/ .bb svg { font: 10px sans-serif; -webkit-tap-highlight-color: transparent; } .bb path, .bb line { fill: none; stroke: #E0E0E0; } .bb text { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .bb-legend-item-tile, .bb-xgrid-focus, .bb-ygrid, .bb-event-rect, .bb-bars path { shape-rendering: crispEdges; } .bb-chart-arc path { stroke: #fff; } .bb-chart-arc text { fill: #fff; font-size: 13px; } /*-- Axis --*/ /*-- Grid --*/ .bb-grid line { stroke: #aaa; } .bb-grid text { fill: #aaa; } .bb-xgrid, .bb-ygrid { stroke-dasharray: 3 3; } /*-- Text on Chart --*/ .bb-text.bb-empty { fill: #808080; font-size: 2em; } /*-- Line --*/ .bb-line { stroke-width: 1px; } /*-- Point --*/ .bb-circle._expanded_ { stroke-width: 1px; stroke: white; } .bb-selected-circle { fill: white; stroke-width: 2px; } /*-- Bar --*/ .bb-bar { stroke-width: 0; } .bb-bar._expanded_ { fill-opacity: 0.75; } /*-- Focus --*/ .bb-target.bb-focused { opacity: 1; } .bb-target.bb-focused path.bb-line, .bb-target.bb-focused path.bb-step { stroke-width: 2px; } .bb-target.bb-defocused { opacity: 0.3 !important; } /*-- Region --*/ .bb-region { fill: steelblue; fill-opacity: .1; } /*-- Brush --*/ .bb-brush .extent { fill-opacity: .1; } /*-- Select - Drag --*/ /*-- Legend --*/ .bb-legend-item { font-size: 12px; } .bb-legend-item-hidden { opacity: 0.15; } .bb-legend-background { opacity: 0.75; fill: white; stroke: lightgray; stroke-width: 1; } /*-- Title --*/ .bb-title { font: 14px sans-serif; } /*-- Area --*/ .bb-area { stroke-width: 0; opacity: 0.2; } /*-- Arc --*/ .bb-chart-arcs-title { dominant-baseline: middle; font-size: 1.3em; } .bb-chart-arcs .bb-chart-arcs-background { fill: #E0E0E0; stroke: none; } .bb-chart-arcs .bb-chart-arcs-gauge-unit { fill: #000; font-size: 16px; } .bb-chart-arcs .bb-chart-arcs-gauge-max { fill: #777; } .bb-chart-arcs .bb-chart-arcs-gauge-min { fill: #777; } .bb-chart-arc .bb-gauge-value { fill: #000; /* font-size: 28px !important;*/ } circle { stroke: #7e818f; stroke-width: 1px; fill: transparent !important; } [id*='_edit'] .tableRowGraph:hover { background-color: rgba(200, 100, 0, .3) !important; border-left: 2px solid yellow !important; border-right: 2px solid yellow !important; } .tableRowGraph { border: 2px solid rgba(0,0,0,0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/main.js�������������������������������������������������0000664�0000000�0000000�00000027615�14136337723�0022213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������// Host Autocomplete Magic var pageName = basename($(location).attr('pathname')); function themeReady() { var pageName = basename($(location).attr('pathname')); var hostTimer = false; var clickTimeout = false; var hostOpen = false; // Setup the navigation menu setMenuVisibility(); $('#navigation_right').unbind().scroll(function (event) { var scroll_position_x = $('#navigation_right').scrollLeft(); var scroll_position_y = $('#navigation_right').scrollTop(); $('.bottom_scroll_up').css({'color': ((scroll_position_x == 0 & scroll_position_y == 0) ? '' : '#93CEFF') }); }); // Add nice search filter to filters if ($('input[id="filter"]').length > 0 && $('input[id="filter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="filterd"]').length > 0 && $('input[id="filterd"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="filterd"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchFilter).parent('td').css('white-space', 'nowrap'); } if ($('input[id="rfilter"]').length > 0 && $('input[id="rfilter"] > i[class="fa fa-search filter"]').length < 1) { $('input[id="rfilter"]').after("<i class='fa fa-search filter'/>").attr('autocomplete', 'off').attr('placeholder', searchRFilter).parent('td').css('white-space', 'nowrap'); } $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); /* Start clean up */ //login page $('.cactiLoginLogo').html("<i class='fa fa-sun-o'/>"); $('.cactiLogoutLogo').html("<i class='fa fa-sun-o'/>"); /* clean up the navigation menu */ $('.cactiConsoleNavigationArea').find('#menu').appendTo($('.cactiConsoleNavigationArea').find('#navigation')); $('.cactiConsoleNavigationArea').find('#navigation > table').remove(); /* Hey - No footer available ? */ if ($('#cactiPageBottom').length == 0) { $('<div id="cactiPageBottom" class="cactiPageBottom"><span class="cactiVersion">Version '+ cactiVersion +'</span><a class="bottom_scroll_up action-icon-user" href="#"><i class="fa fa-arrow-circle-up"></i></a></div>').insertAfter('#cactiContent'); } $('.maintabs nav ul li a.lefttab').each( function() { id = $(this).attr('id'); if (id == 'tab-graphs' && $(this).parent().hasClass('maintabs-has-submenu') == 0) { $(this).parent().addClass('maintabs-has-submenu'); $('<div class="dropdownMenu">' +'<ul id="submenu-tab-graphs" class="submenuoptions" style="display:none;">' +'<li><a id="tab-graphs-tree-view" href="'+urlPath+'graph_view.php?action=tree"><span>'+treeView+'</span></a></li>' +'<li><a id="tab-graphs-list-view" href="'+urlPath+'graph_view.php?action=list"><span>'+listView+'</span></a></li>' +'<li><a id="tab-graphs-pre-view" href="'+urlPath+'graph_view.php?action=preview"><span>'+previewView+'</span></a></li>' +'</ul>' +'</div>').appendTo('body'); } }); /* user menu on the right ... */ if ($('.usertabs').length == 0) { $('.loggedInAs').show(); $('#userDocumentation').remove(); $('#userCommunity').remove(); $('.menuHr').remove(); $('<div class="maintabs usertabs">' +'<nav><ul>' +'<li><a id="menu-user-help" class="usertabs-submenu" href="#"><i class="fa fa-question"></i></a></li>' +'<li class="action-icon-user"><a class="pic" href="#"><i class="fa fa-user"></i></a></li>' +'</ul></nav>' +'</div>').insertAfter('.maintabs'); $('<div class="dropdownMenu">' +'<ul id="submenu-user-help" class="submenuoptions right" style="display:none;">' +'<li><a href="https://www.cacti.net" target="_blank" rel="noopener"><span>'+cactiHome+'</span></a></li>' +'<li><a href="https://github.com/cacti" target="_blank" rel="noopener"><span>'+cactiProjectPage+'</span></a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://forums.cacti.net/" target="_blank" rel="noopener"><span>'+cactiCommunityForum+'</span></a></li>' +'<li><a href="https://github.com/Cacti/documentation/blob/develop/README.md" target="_blank" rel="noopener"><span>'+cactiDocumentation+'</span></a></li>' +'<li><hr class="menu"></li>' +'<li><a href="https://github.com/Cacti/cacti/issues/new" target="_blank" rel="noopener"><span>'+reportABug+'</span></a></li>' +'<li><a href="'+urlPath+'about.php"><span>'+aboutCacti+'</span></a></li>' +'</ul>' +'</div>').appendTo('body'); } ajaxAnchors(); /* User Menu */ $('.menuoptions').parent().appendTo('body'); $('.action-icon-user').unbind().click(function(event) { event.preventDefault(); if ($('.menuoptions').is(':visible') === false) { $('.submenuoptions').stop().slideUp(120); $('.menuoptions').stop().slideDown(120); } else { $('.menuoptions').stop().slideUp(120); } return false; }); $('.bottom_scroll_up').unbind().click(function(event) { event.preventDefault(); $('#navigation_right').animate({ scrollLeft:0, scrollTop: 0 }, 1000, 'easeInOutQuart'); }); /* Highlight sortable table columns */ $('.tableHeader th').has('i.fa-sort').removeClass('tableHeaderColumnHover tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-up').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort-down').addClass('tableHeaderColumnSelected'); $('.tableHeader th').has('i.fa-sort').hover( function() { $(this).addClass("tableHeaderColumnHover"); }, function() { $(this).removeClass("tableHeaderColumnHover"); } ); $('input#filter, input#rfilter').addClass('ui-state-default ui-corner-all'); $('input[type="text"], input[type="password"], input[type="checkbox"], textarea').not('image').addClass('ui-state-default ui-corner-all'); // Turn file buttons into jQueryUI buttons $('.import_label').button(); $('.import_button').change(function() { text=this.value; setImportFile(text); }); setImportFile(noFileSelected); function setImportFile(fileText) { $('.import_text').text(fileText); } $('select.colordropdown').dropcolor(); $('select').not('.colordropdown').each(function() { if ($(this).prop('multiple') != true) { $(this).each(function() { id = $(this).attr('id'); $(this).selectmenu({ change: function(event, ui) { $(this).val(ui.item.value).change(); }, position: { my: "left top", at: "left bottom", collision: "flip" }, width: 'auto' }); $('#'+id+'-menu').css('max-height', '250px'); }); } else { $(this).addClass('ui-state-default ui-corner-all'); } }); $('#host').unbind().autocomplete({ source: pageName+'?action=ajax_hosts', autoFocus: true, minLength: 0, select: function(event,ui) { $('#host_id').val(ui.item.id); callBack = $('#call_back').val(); if (callBack != 'undefined') { if (callBack.indexOf('applyFilter') >= 0) { applyFilter(); } else if (callBack.indexOf('applyGraphFilter') >= 0) { applyGraphFilter(); } } else if (typeof applyGraphFilter === 'function') { applyGraphFilter(); } else { applyFilter(); } } }).addClass('ui-state-default ui-selectmenu-text').css('border', 'none').css('background-color', 'transparent'); $('#host_click').css('z-index', '4'); $('#host_wrapper').unbind().dblclick(function() { hostOpen = false; clearTimeout(hostTimer); clearTimeout(clickTimeout); $('#host').autocomplete('close').select(); }).click(function() { if (hostOpen) { $('#host').autocomplete('close'); clearTimeout(hostTimer); hostOpen = false; } else { clickTimeout = setTimeout(function() { $('#host').autocomplete('search', ''); clearTimeout(hostTimer); hostOpen = true; }, 200); } $('#host').select(); }).on('mouseenter', function() { $(this).addClass('ui-state-hover'); $('input#host').addClass('ui-state-hover'); }).on('mouseleave', function() { $(this).removeClass('ui-state-hover'); $('#host').removeClass('ui-state-hover'); hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); hostOpen = false; }); var hostPrefix = ''; $('#host').autocomplete('widget').each(function() { hostPrefix=$(this).attr('id'); if (hostPrefix != '') { $('ul[id="'+hostPrefix+'"]').on('mouseenter', function() { clearTimeout(hostTimer); }).on('mouseleave', function() { hostTimer = setTimeout(function() { $('#host').autocomplete('close'); }, 800); $(this).removeClass('ui-state-hover'); $('input#host').removeClass('ui-state-hover'); }); } }); /* Replace icons */ $('.fa-arrow-down').addClass('fa-chevron-down').removeClass('fa-arrow-down'); $('.fa-arrow-up').addClass('fa-chevron-up').removeClass('fa-arrow-up'); // Hide the graph icons until you hover $('.graphDrillDown').hover( function() { element = $(this); // hide the previously shown element if (element.attr('id').replace('dd', '') != graphMenuElement && graphMenuElement > 0) { $('#dd'+graphMenuElement).find('.iconWrapper:first').hide(300); } clearTimeout(graphMenuTimer); graphMenuTimer = setTimeout(function() { showGraphMenu(element); }, 400); }, function() { element = $(this); clearTimeout(graphMenuTimer); graphMenuTimer = setTimeout(function() { hideGraphMenu(element); }, 400); }); function showGraphMenu(element) { element.find('.spikekillMenu').menu('disable'); element.find('.iconWrapper').show(300, function() { graphMenuElement = element.attr('id').replace('dd', '');; $(this).find('.spikekillMenu').menu('enable'); }); } function hideGraphMenu(element) { element.find('.spikekillMenu').menu('disable'); element.find('.iconWrapper').hide(300, function() { $(this).find('.spikekillMenu').menu('enable'); }); } setNavigationScroll(); } function setMenuVisibility() { storage=Storages.localStorage; // Initialize the navigation settings // This will setup the initial visibility of the menu $('li.menuitem').each(function() { var id = $(this).attr('id'); if (storage.isSet(id)) { var active = storage.get(id); } else { var active = null; } if (active != null && active == 'active') { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); } else { $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); } if ($(this).find('a.selected').length == 0) { //console.log('hiding1:'+$(this).closest('.menuitem').attr('id')); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false').hide(); $(this).next('a').hide(); storage.set($(this).closest('.menuitem').attr('id'), 'collapsed'); } else { $(this).find('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true').show(); $(this).next('a').show(); storage.set($(this).closest('.menuitem').attr('id'), 'active'); } }); // Functon to give life to the Navigation pane $('#nav li:has(ul) a.active').unbind().click(function(event) { event.preventDefault(); id = $(this).closest('.menuitem').attr('id'); if ($(this).next().is(':visible')) { $(this).next('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).next().slideUp( { duration: 200, easing: 'swing' } ); storage.set(id, 'collapsed'); } else { $(this).next('ul').attr('aria-hidden', 'false').attr('aria-expanded', 'true'); $(this).next().slideToggle( { duration: 200, easing: 'swing' } ); if ($(this).next().is(':visible')) { storage.set($(this).closest('.menuitem').attr('id'), 'active'); } else { storage.set(id, 'collapsed'); } } $('li.menuitem').not('#'+id).each(function() { text = $(this).attr('id'); id = $(this).attr('id'); $(this).find('ul').attr('aria-hidden', 'true').attr('aria-expanded', 'false'); $(this).find('ul').slideUp( { duration: 200, easing: 'swing' } ); storage.set($(this).attr('id'), 'collapsed'); }); }); } �������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/pace.css������������������������������������������������0000664�0000000�0000000�00000004016�14136337723�0022341�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������.pace { -webkit-pointer-events: none; pointer-events: none; -webkit-user-select: none; -moz-user-select: none; user-select: none; } .pace-inactive { display: none; } .pace .pace-progress { background: lightgrey; position: fixed; z-index: 2000; top: 0; right: 100%; width: 100%; height: 3px; } .pace .pace-progress-inner { display: block; position: absolute; right: 0px; width: 100px; height: 100%; box-shadow: 0 0 18px lightgrey, 0 0 5px lightgrey; opacity: 1.0; -webkit-transform: rotate(3deg) translate(0px, -4px); -moz-transform: rotate(3deg) translate(0px, -4px); -ms-transform: rotate(3deg) translate(0px, -4px); -o-transform: rotate(3deg) translate(0px, -4px); transform: rotate(3deg) translate(0px, -4px); } .pace .pace-activity { display: block; position: fixed; z-index: 2000; top: 25%; right: 50%; width: 25px; height: 25px; border: solid 4px transparent; border-top-color: lightgrey; border-left-color: lightgrey; border-radius: 18px; -webkit-animation: pace-spinner 400ms linear infinite; -moz-animation: pace-spinner 400ms linear infinite; -ms-animation: pace-spinner 400ms linear infinite; -o-animation: pace-spinner 400ms linear infinite; animation: pace-spinner 400ms linear infinite; } @-webkit-keyframes pace-spinner { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @-moz-keyframes pace-spinner { 0% { -moz-transform: rotate(0deg); transform: rotate(0deg); } 100% { -moz-transform: rotate(360deg); transform: rotate(360deg); } } @-o-keyframes pace-spinner { 0% { -o-transform: rotate(0deg); transform: rotate(0deg); } 100% { -o-transform: rotate(360deg); transform: rotate(360deg); } } @-ms-keyframes pace-spinner { 0% { -ms-transform: rotate(0deg); transform: rotate(0deg); } 100% { -ms-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes pace-spinner { 0% { transform: rotate(0deg); transform: rotate(0deg); } 100% { transform: rotate(360deg); transform: rotate(360deg); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/themes/sunrise/rrdtheme.php��������������������������������������������0000664�0000000�0000000�00000001500�14136337723�0023235�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php $rrdcolors['back'] = '04335b00'; $rrdcolors['canvas'] = '060606'; $rrdcolors['shadea'] = '0B0B0B'; $rrdcolors['shadeb'] = '292929'; $rrdcolors['grid'] = '545454'; $rrdcolors['mgrid'] = '6A6C6C'; $rrdcolors['font'] = 'C3C3C3'; $rrdcolors['axis'] = '2C4D43'; $rrdcolors['arrow'] = '2C4D43'; $rrdcolors['frame'] = '060606'; # RRDtool graph fonts in RRDtool 1.2+ $rrdfonts['title']['font'] = 'Arial'; $rrdfonts['title']['size'] = '11'; $rrdfonts['axis']['font'] = 'Arial'; $rrdfonts['axis']['size'] = '8'; $rrdfonts['legend']['font'] = 'Courier'; $rrdfonts['legend']['size'] = '8'; $rrdfonts['unit']['font'] = 'Arial'; $rrdfonts['unit']['size'] = '8'; $rrdfonts['watermark']['font'] = 'Arial'; $rrdfonts['watermark']['size'] = '6'; # Only supported in RRDtool 1.4+ $rrdborder = 0; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������cacti-release-1.2.19/include/top_general_header.php�������������������������������������������������0000664�0000000�0000000�00000006356�14136337723�0022273�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /* +-------------------------------------------------------------------------+ | Copyright (C) 2004-2021 The Cacti Group | | | | 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. | +-------------------------------------------------------------------------+ | Cacti: The Complete RRDtool-based Graphing Solution | +-------------------------------------------------------------------------+ | This code is designed, written, and maintained by the Cacti Group. See | | about.php and/or the AUTHORS file for specific developer information. | +-------------------------------------------------------------------------+ | http://www.cacti.net/ | +-------------------------------------------------------------------------+ */ global $config, $menu, $user_menu; $page_title = api_plugin_hook_function('page_title', draw_navigation_text('title')); $using_guest_account = false; if (!isset_request_var('headercontent')) { ?> <!DOCTYPE html> <html lang='<?php print CACTI_LOCALE;?>'> <head> <?php html_common_header($page_title);?> </head> <body> <a class='skip-link' href='#main' style='display:none'>Skip to main</a> <div id='cactiPageHead' class='cactiPageHead' role='banner'> <div id='tabs'><?php html_show_tabs_left();?></div> <div class='cactiGraphHeaderBackground' style='display:none'><div id='gtabs'><?php print html_graph_tabs_right();?></div></div> <div class='cactiConsolePageHeadBackdrop'></div> </div> <div id='breadCrumbBar' class='breadCrumbBar'> <div id='navBar' class='navBar'><?php echo draw_navigation_text();?></div> <div class='scrollBar'></div> <?php if (read_config_option('auth_method') != 0) { ?><div class='infoBar'><?php echo draw_login_status($using_guest_account);?></div><?php } ?> </div> <div class='cactiShadow'></div> <?php } else { ?> <div id='navBar' class='navBar'><?php echo draw_navigation_text();?></div> <title><?php print $page_title;?>