pax_global_header00006660000000000000000000000064142000771170014511gustar00rootroot0000000000000052 comment=a50721caa7c6231e04a4c4265e6e8a1bcb839ae8 lxi-tools-2.1/000077500000000000000000000000001420007711700133055ustar00rootroot00000000000000lxi-tools-2.1/.circleci/000077500000000000000000000000001420007711700151405ustar00rootroot00000000000000lxi-tools-2.1/.circleci/config.yml000066400000000000000000000033601420007711700171320ustar00rootroot00000000000000# Use the latest 2.1 version of CircleCI pipeline process engine. # See: https://circleci.com/docs/2.0/configuration-reference version: 2.1 # Define a job to be invoked later in a workflow. # See: https://circleci.com/docs/2.0/configuration-reference/#jobs jobs: build-lxi-tools: # Specify the execution environment. You can specify an image from Dockerhub or use one of our Convenience Images from CircleCI's Developer Hub. # See: https://circleci.com/docs/2.0/configuration-reference/#docker-machine-macos-windows-executor docker: - image: cimg/base:edge # Add steps to the job # See: https://circleci.com/docs/2.0/configuration-reference/#steps steps: - checkout - run: sudo apt-get -qq update - run: sudo apt-get install -y libreadline-dev liblua5.3-dev bash-completion libtirpc-dev libavahi-common-dev libavahi-client-dev libxml2-dev git meson - run: git clone https://github.com/lxi-tools/liblxi.git - run: cd liblxi && meson build --prefix $HOME/test/liblxi && ninja -C build install # - run: sudo apt-get install -y libavahi-core-dev libavahi-common-dev libavahi-client-dev libxml2-dev liblua5.3-dev libtirpc-dev libreadline liblxi1 liblxi-dev meson # - run: wget https://github.com/lxi-tools/liblxi/archive/master.tar.gz # - run: tar -xvf master.tar.gz # - run: pushd liblxi-master && ./autogen.sh && ./configure --prefix=/usr && make && sudo make install && popd - run: PKG_CONFIG_PATH=$HOME/test/liblxi/lib/x86_64-linux-gnu/pkgconfig meson build --prefix=$HOME/test/lxi-tools && ninja -C build install # Invoke jobs via workflows # See: https://circleci.com/docs/2.0/configuration-reference/#workflows workflows: build-lxi-tools-workflow: jobs: - build-lxi-tools lxi-tools-2.1/.gitignore000066400000000000000000000002771420007711700153030ustar00rootroot00000000000000/subprojects/*/ /subprojects/gi-docgen.wrap /subprojects/pango.wrap /subprojects/gobject-introspection.wrap /subprojects/graphene.wrap /subprojects/mutest.wrap build .DS_Store *.swp *.tar.xz lxi-tools-2.1/AUTHORS000066400000000000000000000014401420007711700143540ustar00rootroot00000000000000Maintainer: Martin Lund Contributors: Robert Scheck Jakub Wilk RoGeorge from EEVBlog forum dpenev from EEVBlog forum PeDre from EEVBlog forum BloodyCactus from EEVBlog forum crispus from EEVBlog forum ralphrmartin from EEVBlog forum Dmitri Goutnik Hydron from EEVBlog forum gsocker from EEVBlog forum N0NB from EEVBlog forum Timur Aydin timber23 from EEVBlog forum Uli Köhler Mete Balci Heiko Jakob Sam Harry Tzavaras werwaswarum from GitHub Mete Balci Martino Ferrari htro Thanks to everyone who has contributed to this project. lxi-tools-2.1/COPYING000066400000000000000000000033271420007711700143450ustar00rootroot00000000000000lxi-tools is available for use under the following license, commonly known as the 3-clause (or "modified") BSD license: ----------------------------------------------------------------------- Copyright (c) 2016-2021 Martin Lund All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holders nor 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 HOLDERS 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. ----------------------------------------------------------------------- lxi-tools-2.1/ChangeLog000066400000000000000000000411131420007711700150570ustar00rootroot00000000000000=== lxi-tools v2.1 === Changes since lxi-tools v2.0: * Remove scpi run commands from file feature Retiring this feature as one should use the Lua script feature instead. * Fix memory leak in screenshot plugins * Add extra features to the SCPI text view context menu Add "Clear all" and "Save as.." features. * Fix printing of sent SCPI command when using TCP/RAW A redundant newline is removed. * Improve SCPI send button state change * Fix appdata.xml.in * Prefix SCPI messages with timestamp, IP, and type Allow prefixing SCPI messages with timestamp, IP, and type (REQ/RSP). Add preference settings accordingly. Prefixing with IP is default. * Rename from metainfo to appdata because of meson * Update application meta file * Update AppData path * Fix psu data log test * meson: Require dependencies * Add doc section to README Valentin Belot: * Fix memory allocation and GUI update outside of main thread (macOS compatibility) Changes since lxi-tools v1.21: * New lxi-gui application with many new features Too many changes to list here. See git history for complete list of changes. * Replace autotools with meson * Pass id to screenshot plugins * Do not exit when screenshot plugin fails * Rename lxi option '-s --script' to -f --file' * Add lua clock API Add lua clock API for measuring elapsed time: * c = clock_new() - Returns new clock * time = clock_read(c) - Returns elapsed time in seconds since first read call * clock_reset(c) - Resets clock time * clock_free(c) - Releases clock handle First time clock_read() is called on a new clock it will return a time of 0 seconds and the clock will start running. This clock API is useful for time stamping data as it is retrieved from an instrument. * Replace Travis wth CircleCI Travis is no longer free for open source projects! CircleCI seems to be the new king for quick open source CI. * Add Rigol DM3058 to instrument list Sam Harry Tzavaras: * Add screenshot plugin for tek 3000 series Uli Köhler: * Added Rigol DL3021 to list of supported devices Heiko Jakob: * Added screenshot support for Rigol DL3000 series programmable DC load * Changed screenshot dg4000 regex to also match dg1000z series Mete Balci: * Added Keysight MSOX 6004A to list of supported device * Added Rohde & Schwarz NGE 100 to list of supported devices I tested discovery, a few SCPI commands (IDN?, MEAS?, MEAS:CURR?) and screenshot with the power supply R&S NGE 103B (NGE100 3-channels model). All works fine. Martino Ferrari: * Added Rohde & Schwarz RTM 3004 to list of supported devices htro: * Added Tek MDO3024, 4 Series and 5 Series as compatible Changes since lxi-tools v1.20: * Fix handling of question commands in interactive mode Changes since lxi-tools v1.19: * Add bash completion for snap * Update README Add tested instrument Keysight AWG 33612A as tested by Timur Aydin. * Add const qualifier * Update AUTHORS * Require Lua 5.1 or newer * Include test dir in distribution * Update Travis * Fix bash completion for run command * Update basic-tests.lua * Move test directory * Add basic Lua tests Changes since lxi-tools v1.18: * Downgrade to Lua 5.2 * Update Travis configuration * Add Lua scripting feature to support automation Add run command which makes it possible to run Lua scripts to support advanced instrument automation. To run a Lua script simply do: $ lxi run test.lua The following LXI specific Lua functions are added and made available for use in the Lua scripts: device = connect(ip) scpi(device, command) scpi_raw(device, command) msleep(miliseconds) sleep(seconds) disconnect(device) See src/test/test.lua for a simple Lua script example. * Update README * Update AUTHORS * Improve regex of rs-hmo-rtb screenshot plugin Include instruments made with "HAMEG" identifier. * README: Add sponsors section * lxi-gui: Fix snap build * configure: use pkg-config to check for Qt5 * lxi-gui: Cleanup Qt5 configuration * Reconfigure R&S screenshot plugin to BMP * Add RTB2004 to list of tested instruments Dmitri Goutnik: * Use QT_SELECT value instead of hardcoded QT version Changes since lxi-tools v1.17: * lxi-gui: Add X-axis title to data recorder chart * lxi-gui: Fix data recorder chart colors and csv export * lxi-gui: Add SCPI 1999.0 commands * lxi-gui: Add data recorder save data feauture Add a save button which allows to save recorded data to file in CSV format. * lxi: Increase default discover mDNS timeout * lxi-gui: Optimize data recorder plotting * lxi-gui: Fix arm snap build * lxi-gui: Print machine type during qmake build * lxi-gui: Remove *OPT? SCPI command * lxi-gui: Use elapsed real time in data recorder * lxi-gui: Print SCPI command requests * Add screenshot support for RTB 2000 * Cleanup timeout handling, etc. * lxi-gui: Reduce minimum window size * Add support for adding custom Qt qmake arguments Add QMAKE_ARGUMENTS flag which allows to pass on arguments to qmake when building lxi-gui. * lxi-gui: Make sure to call QT5 qmake Changes since lxi-tools v1.16: * lxi-gui: Add input dialog for *ESE and *SRE commands * lxi-gui: Fix qmake compile flags * lxi-gui: Start with SCPI page * Add configure check for Qt5Charts * lxi-gui: Cleanup Name UI elements accordingly * lxi-gui: Add screenshot live view * Update README screenshot * lxi-gui: Add ID/IP instrument table header * lxi-gui: Tag as BETA * Update README Introduce lxi-gui and include screenshot. * Link QT5 Charts manually To avoid build issue with snap. * lxi-gui: Add data recorder feature * lxi-gui: Add settings * lxi-gui: Add QT5 source files * lxi-gui: Introduce responsive layout The lxi-gui application can now automatically resize to fit any window size. * lxi-gui: Add 'Open in browser' right-click feature * lxi-gui: Add IEEE 488.2 Common Commands * lxi-gui: Add about details * lxi-gui: Add screenshot feature * lxi-gui: Add benchmark feature * Split features into separate files * Update README * Update lxi-gui * Add keysight-dmm screenshot plugin This plugin supports Keysight Truevolt digital multimeters. * Set default discover timeout to 1 s * Add experimental QT5 GUI Can be enabled using configure option --enable-lxi-gui Requires QT 5.0.0 or newer. * Cleanup * Update Travis Changes since lxi-tools v1.15: * Update AUTHORS * Convert tabs to spaces * Remove experimental label from keysight-ivx plugin Tested with MSO-X 3024T by ralphrmartin from EEVBlog forum. * Fix keysight-iv2000x plugin Fix header strip and change image format to BMP. Improve regex. * Fix image format for rigol-dg4000 plugin * Update completion script * Cleanup Dmitri Goutnik: * Make code clang friendly Changes since lxi-tools v1.14: * Update man page * Add support for using raw/TCP in benchmark mode Add the option to run benchmark using raw/TCP. For example: $ lxi benchmark --address 10.0.0.42 --port 5555 --raw Also, cleanup all port handling code and update documentation accordingly. * Decrease timeout for discover to 2 s Changes since lxi-tools v1.13: * Make screenshot plugin only support Rigol DM3068 Rigol DM3068 is the only DM3000 series digital multimeter that seems to have screenshot support. * Fix entering interactive mode Regardless of using --interactive a SCPI command was still required to be provided to enter interactive mode. * Update AUTHORS * Remove experimental label from Siglent plugins Thanks to Siglent who helped fix and test all the screenshot plugins for their instruments. * Cleanup screenshot plugins * Consolidate Rigol DSA plugins into one * Update README and man page * Support writing screenshot image to stdout To write screenshot image to stdout simply use '-' as the output filename. This allows to pipe the screenshot image directly to other tools for image processing. For example, using imagemagick to automatically convert captured screenshot image to JPG: $ lxi screenshot -a 10.0.0.42 - | convert - screenshot.jpg * Cleanup Siglent screenshot plugins * Update siglent-ssa3000x plugin * Add siglent-sdg plugin * Add siglent-sdm3000 plugin * Move siglent-sds out of experimental * Extend Siglent plugin to include SDS2000X Changes since lxi-tools v1.12: * Update README * Update SSA3000X capture command * Add completion for benchmark command * Update AUTHORS * Fix get_device_id() This function was missing a call to lxi_disconnect() which resulted in some instruments being left hanging when capturing screenshots. Instruments that presumable only allow one active connection. * Add benchmark feature This benchmark feature is useful if you want to compare the VXI-11 request/response performance of your instruments. By default the benchmark sends 100 SCPI ID requests ("*IDN?" commands) to the instrument. For each request it waits for and reads the response. When done the resulting request rate is printed. * Fix screenshot command when using plugin autodetection The wrong timeout value was passed when trying to autodetect which screenshot plugin to use. * Cleanup * Fix Rohde & Schwarz HMO 1000 screenshot plugin Fix plugin so that it does not strip off the PNG header of the PNG image stream. Also, the source files and functions of the plugin is now named more explicitly according to the name of the instrument series (HMO 1000). * Fix Siglent SSA3000 screenshot plugin Changes since lxi-tools v1.11: * Update to new URL * Add snap status * Fix redirection of output to file * Update README * Cleanup configure.ac Jakub Wilk: * Use HTTPS in the configure script Changes since lxi-tools v1.10: * Update README * Update man page * Update AUTHORS * Expand tested instruments list * Rename screenshot plugin rigol-1000 -> rigol-1000z * Add various Rigol screenshot plugins Add the following Rigol screenshot plugins: rigol-dg4000 Rigol DG4000 series function generator rigol-dm3000 Rigol DM3000 series digital multimeter rigol-dp800 Rigol DP800 series power supply rigol-dsa800 Rigol DSA800 series spectrum analyzer rigol-dsa700 Rigol DSA700 series spectrum analyzer The code is added on behalf of PeDre from the EEVBlog forum. * Add authors section in README * Add README.md to prettify GitHub page The original README is still preserved because it is more readable when not reading it via GitHub. Jakub Wilk: * Strip trailing spaces * Fix typo * Fix grammar and typos Changes since lxi-tools v1.9: * Add support for mDNS/DNS-SD discovery Add "--mdns" option which enables the discover command to search for LXI devices/services using mDNS/DNS-SD. * Fix Siglent screenshot plugins Write correct response buffer to file. Improve .regex match expression. Changes since lxi-tools v1.8: * Update README * Fix newlines when redirecting to file or terminal * Rename --dump-hex to --hex * Fix missing error message when no SCPI command defined * Update man page * Remove --dump-file option The correct way to dump response to file is to use pipe output redirection. For example: lxi scpi --address 192.168.1.210 "*IDN?" > response.txt This way it is possible to dump any binary response to file. * Fix missing error message when no IP address defined * Print errors to stderr * Cleanup Siglent SDS1000 plugin name * Add Siglent SSA 3000X screenshot plugin * Cleanup script examples * Correct default SCPI raw/TCP port By default use port 5025 as described here: http://www.lxistandard.org/About/LXI-Protocols.aspx If a different port is needed use the '--raw-port' option. Apparently Rigol is not using the recommended port for raw SCPI commands. * Update descriptions of the plugin options Changes since lxi-tools v1.7: * Update README * Add Siglent SDS 1000 screenshot plugin Changes since lxi-tools v1.6: * Update README * Cleanup * Update .regex for Tektronix plugin * Update .regex for R&S plugin * Update .regex for Keysight plugin * Update man page * Embed instrument IP address in screenshot filename This helps identify screenshot files when capturing screenshots from multiple instruments. It also allows simplifying the APIs used by the screenshot plugins. * Change option '--model' to '--plugin' Lets remove any model vs. plugin confusion and only deal with plugin names. Each plugin includes support for one or more instruments models as described in the plugin description. * Add automatic loading of screenshot plugin feature If no screenshot plugin is specified the tool will automatically try to select the best plugin by matching the instruments ID string against the regular expressions defined in each plugin. Each screenshot plugin defines a .regex string entry containing space separated regular expressions. Each regular expression is matched against the instrument ID string. The plugin with most matches is selected. Note: This mechanism is slightly slower than manually specifying which screenshot plugin because it needs to retrieve the instruments ID string first. * Improve description of Rigol plugins * Fix Rigol 2000 screenshot plugin Remove trailing newline in received image data. * Add screenshot plugin for Rigol 2000 series Also, make existing Rigol plugin only apply for 1000z series. Changes since lxi-tools v1.5: * Add date-time stamp to screenshot filename * Improve command handling In case of a misspelled command the tool would misleadingly respond: "Error: No IP address specified" With this fix, it now responds: "Error: Unknown command" * Update README * Added screenshot plugin for Tektronix 2000 series scopes * Improve scpi response output * Add --raw and --raw-port options to scpi command One can now use choose to use raw/TCP instead of VXI11 when firing SCPI commands. Simply append the --raw option like so: lxi scpi --raw --address 192.168.0.42 "*IDN?" By default raw/TCP port 5555 is used but it can be changed using the --raw-port option. Warning: Using raw/TCP is faster than VXI11 but does not provide any timeout/control mechanisms so if your command somehow stalls it will stall forever. * Use new lxi_connect() function * Cleanup * Make screenshot filename optional In case no screenshot filename is provided the tool will write the screenshot image to an automatically resolved and incremented filename on the form screenshot-###.. For example, screenshot-000.png, screenshot-001.png, etc. * Improve screenshot model listing * Increase default timeout for screenshot command Transferring screenshot image data takes time so lets increase the timeout so we do not easily interrupt a good but slow transfer. * Collapse Rigol screenshot plugin Support all Rigol oscilloscope models via one model name. * Add screenshot support for Keysight IV 2000 X * Cleanup plugins * Add screenshot support for R&S HMO1000 series * Add screenshot support for Rigol 2000/4000 * Create directory for screenshot plugins Changes since lxi-tools v1.4: * Remove -Og flag Not supported by older gcc versions. * Fix various bugs in script and interactive mode Changes since lxi-tools v1.3: * Add screenshot feature to lxi tool The old rigol_1000z_screenshot tool is retired in favor of a screenshot feature in the lxi tool. A new lxi command 'screenshot' is added and also a small screenshot plugin framework which makes it easy to add new screenshot plugins for new instruments. Currently there is only a screenshot plugin for Rigol 1000Z series oscilloscopes. * Update README Changes since lxi-tools v1.2: * Added AUTHORS file * Use new lxi_connect() function * Reconfigure default timeout to 3 seconds Changes since lxi-tools v1.1: * Increase default timeout value for lxi tool Increase the default timeout value for the lxi tool from 1 to 5 seconds * Fix timeout for Rigol screenshot tool Timeout is increased to avoid failure to capture screenshot * Fix typo * Cleanup test script * Fix crash in rigol_1000z_screenshot tool Add error handling to avoid crashing when connecting remote device fails. Changes since lxi-tools v1.0: * Fix missing src/bash-completion/lxi An automake rule was fixed to make sure that the file src/bash-completion/lxi is included in the distributed tarball. * Update README lxi-tools v1.0: * First release (stable) lxi-tools-2.1/README.md000066400000000000000000000305011420007711700145630ustar00rootroot00000000000000# lxi-tools - open source LXI tools [![CircleCI](https://circleci.com/gh/lxi-tools/lxi-tools/tree/master.svg?style=shield)](https://circleci.com/gh/lxi-tools/lxi-tools/tree/master) ## 1. Introduction lxi-tools are open source software tools for managing network attached LXI compatible test instruments such as modern oscilloscopes, power supplies, spectrum analyzers etc. Features include automatic discovery of test instruments, sending SCPI commands, grabbing screenshots from supported instruments, benchmarking SCPI message performance, and powerful scripting for test automation. Both a commandline tool and a GUI tool are available. lxi-tools rely on [liblxi](https://github.com/lxi-tools/liblxi) for all communication. ### 1.1 What is LXI? LAN eXtensions for Instrumentation (LXI) is a standard developed by the LXI Consortium, an industry consortium that maintains the LXI specification and promotes the LXI Standard. The LXI standard defines the communication protocols for modern instrumentation and data acquisition systems using Ethernet. Visit www.lxistandard.org for more details. Please notice that lxi-tools is not affiliated with the LXI consortium - it is an independent open source community effort. ### 1.2 Motivation To make better and simpler open source tools for managing network attached LXI compatible test instruments. ## 2. Usage ### 2.1 lxi-gui The lxi-gui application provides some of the same features as the commandline tool and more but presents them in a modern GUI frontend.

SCPI mode - easily explore SCPI features of your instruments Search for instruments - using standard broadcast discovery or mDNS Screenshot mode - easily grab display screenshots from supported instruments Benchmark mode - measure the message response performance of your instruments Script mode - program your LXI compatible instruments in a powerful clean cut Lua script environment Script mode in action plotting voltage levels from a DC power supply to line chart and CSV/PNG files

### 2.2 lxi The commandline interface of the lxi application is described in the output from 'lxi --help': ``` Usage: lxi [--version] [--help] [] -v, --version Display version -h, --help Display help Commands: discover [] Search for devices scpi [] Send SCPI command screenshot [] [] Capture screenshot benchmark [] Benchmark run Run Lua script Discover options: -t, --timeout Timeout (default: 3) -m, --mdns Search via mDNS/DNS-SD Scpi options: -a, --address Device IP address -p, --port Use port (default: VXI11: 111, RAW: 5025) -t, --timeout Timeout (default: 3) -x, --hex Print response in hexadecimal -i, --interactive Enter interactive mode -r, --raw Use raw/TCP Screenshot options: -a, --address Device IP address -t, --timeout Timeout (default: 15) -p, --plugin Use screenshot plugin by name -l, --list List available screenshot plugins Benchmark options: -a, --address Device IP address -p, --port Use port (default: VXI11: 111, RAW: 5025) -t, --timeout Timeout (default: 3) -c, --count Number of request messages (default: 100) -r, --raw Use raw/TCP ``` #### 2.2.1 Example - Discover LXI devices on available networks ``` $ lxi discover Searching for LXI devices - please wait... Broadcasting on interface lo Broadcasting on interface eth0 Found "RIGOL TECHNOLOGIES,DS1104Z,DS1ZA1234567890,00.04.03.SP2" on address 10.42.1.20 Found "RIGOL TECHNOLOGIES,DP831,DP8F1234567890,00.01.14" on address 10.42.1.67 Broadcasting on interface wlan0 Found 2 devices ``` #### 2.2.2 Example - Send SCPI command to an instrument ``` $ lxi scpi --address 10.42.1.20 "*IDN?" RIGOL TECHNOLOGIES,DS1104Z,DS1ZA1234567890,00.04.03 ``` To dump response to file simply do: ``` $ lxi scpi --address 10.42.1.20 "*IDN?" > response.txt ``` #### 2.2.3 Example - Capture screenshot from a Rigol 1000z series oscilloscope ``` $ lxi screenshot --address 10.42.1.20 --plugin rigol-1000z Saved screenshot image to screenshot_10.42.1.20_2017-11-11_13:45:47.png ``` Or using plugin autodetection simply: ``` $ lxi screenshot --address 10.42.1.20 Loaded rigol-1000 screenshot plugin Saved screenshot image to screenshot_10.42.1.20_2017-11-11_13:46:02.png ``` #### 2.2.4 Example - Capture screenshot and convert it to any image format By default the format of the captured screenshot image is dictated by which screenshot plugin and instrument are in play. However, it is possible to write the screenshot image to stdout and pipe it directly to other tools for image processing. For example, use ImageMagicks convert tool to automatically convert any screenshot image to JPG: ``` $ lxi screenshot --address 10.42.1.20 - | convert - screenshot.jpg ``` #### 2.2.5 Example - List available screenshot plugins ``` $ lxi screenshot --list Name Description keysight-ivx Keysight InfiniVision 2000X/3000X series oscilloscope rigol-1000z Rigol DS/MSO 1000z series oscilloscope rigol-2000 Rigol DS/MSO 2000 series oscilloscope rigol-dg4000 Rigol DG 4000 series function generator rigol-dm3000 Rigol DM 3000 series digital multimeter rigol-dp800 Rigol DP 800 series power supply rigol-dsa Rigol DSA 700/800 series spectrum analyzer rs-hmo1000 Rohde & Schwarz HMO 1000 series oscilloscope siglent-sdm3000 Siglent SDM 3000/3000X series digital multimeter siglent-sdg Siglent SDG 1000X/2000X/6000X series waveform generator siglent-sds Siglent SDS 1000X/2000X series oscilloscope siglent-ssa3000x Siglent SSA 3000X series spectrum analyzer tektronix-2000 Tektronix DPO/MSO 2000 series oscilloscope (experimental) ``` #### 2.2.6 Example - Benchmark instrument request/response performance ``` $ lxi benchmark --address 10.42.1.20 Benchmarking by sending 100 ID requests. Please wait... Result: 24.7 requests/second ``` ## 3. Installation ### 3.1 Installation using package manager lxi-tools comes prepackaged for various GNU/Linux distributions. Please consult your package manager tool to find and install lxi-tools. ### 3.2 Installation using snap Install latest stable version: ``` $ snap install lxi-tools ``` Install bleeding edge: ``` $ snap install lxi-tools --edge ``` ### 3.3 Installation from source The latest source releases can be found [here](https://github.com/lxi-tools/lxi-tools/releases). To compile and install successfully from source you need to first install the following dependencies: * liblxi * libreadline * lua * bash-completion * libgtk * gtksourceview * libadwaita Install steps: ``` $ meson build $ meson compile -C build $ meson install -C build ``` See meson\_options.txt for which features to enable/disable. Note: Please do no try to install from source if you are not familiar with using meson. ## 4. Tested instruments The tools are tested to work successfully with the following LXI compatible instruments: | Instrument | Working features | |-----------------------------------|----------------------------| | Keysight Technologies AWG 33612A | [discover+scpi+screenshot] | | Keysight Technologies DMM 34461A | [discover+scpi+screenshot] | | Keysight Technologies MSO-X 3024T | [discover+scpi+screenshot] | | Keysight Technologies MSO-X 6004A | [discover+scpi+screenshot] | | Kikusui Electronics PMX35-3A | [discover+scpi] | | Rigol Technologies DG1062Z | [discover+scpi+screenshot] | | Rigol Technologies DG4062 | [discover+scpi+screenshot] | | Rigol Technologies DG4102 | [discover+scpi+screenshot] | | Rigol Technologies DG4162 | [discover+scpi+screenshot] | | Rigol Technologies DL3021 | [discover+scpi] | | Rigol Technologies DP831 | [discover+scpi+screenshot] | | Rigol Technologies DP832 | [discover+scpi+screenshot] | | Rigol Technologies DM3058 | [discover+scpi] | | Rigol Technologies DM3068 | [discover+scpi+screenshot] | | Rigol Technologies DS1104Z | [discover+scpi+screenshot] | | Rigol Technologies DS2302 | [discover+scpi+screenshot] | | Rigol Technologies DSA815 | [discover+scpi+screenshot] | | Rigol Technologies MSO1104Z | [discover+scpi+screenshot] | | Rigol Technologies MSO2302A | [discover+scpi+screenshot] | | Rigol Technologies MSO5074 | [discover+scpi+screenshot] | | Rohde & Schwarz HMC 8012 | [discover+scpi+screenshot] | | Rohde & Schwarz HMC 8043 | [discover+scpi+screenshot] | | Rohde & Schwarz HMO 1202 | [discover+scpi+screenshot] | | Rohde & Schwarz HMO 3054 | [scpi+screenshot] | | Rohde & Schwarz RTB 2004 | [discover+scpi+screenshot] | | Rohde & Schwarz NGE 100 | [discover+scpi+screenshot] | | Rohde & Schwarz NGM 202 | [discover+scpi+screenshot] | | Rohde & Schwarz RTM 3004 | [discover+scpi+screenshot] | | Siglent Technologies SDG1032X | [discover+scpi+screenshot] | | Siglent Technologies SDG2122X | [discover+scpi+screenshot] | | Siglent Technologies SDG6052 | [discover+scpi+screenshot] | | Siglent Technologies SDS1202X-E | [discover+scpi+screenshot] | | Siglent Technologies SDS1204X-E | [discover+scpi+screenshot] | | Siglent Technologies SDS2304X | [discover+scpi+screenshot] | | Siglent Technologies SDM3045X | [discover+scpi+screenshot] | | Siglent Technologies SDM3055 | [discover+scpi+screenshot] | | Siglent Technologies SDM3065X | [discover+scpi+screenshot] | | Siglent Technologies SPD3303X-E | [scpi] | | Siglent Technologies SSA3032X | [discover+scpi+screenshot] | | Tektronix TDS3034B | [discover+scpi+screenshot] | | Tektronix MDO3024 | [discover+scpi] | | Tektronix 4 Series MSO | [discover+scpi] | | Tektronix 5 Series MSO | [discover+scpi] | Note: Feel free to add your instrument(s) to the list via GitHub pull request or simply create a GitHub issue reporting your instrument(s) and which features work. ## 5. Documentation ## 5.1 lxi The lxi commandline tool is documented in its included manpages. ## 5.2 Lua script API The lxi-tools Lua script API is documented [here](doc/lua-api.txt). ## 6. Contributing lxi-tools is open source. If you want to help out with the project please feel free to join in. All contributions (bug reports, code, doc, ideas, etc.) are welcome. Please use the github issue tracker and pull request features. Also, if you find this free open source software useful please feel free to consider making a donation of your choice: [![Donate](images/Paypal.png)](https://www.paypal.me/lundmar) ## 7. Website Visit [lxi-tools.github.io](https://lxi-tools.github.io) ## 8. License This code is released under BSD-3, commonly known as the 3-clause (or "modified") BSD license. ## 9. Authors Created and maintained by Martin Lund \ See the AUTHORS file for full list of contributors. ## 10. Sponsors A big thank you to the following sponsors that have donated test equipment to support the lxi-tools open source effort: * Siglent Technologies - www.siglent.com * KIKUSUI Electronics Corp. - www.kikusui.co.jp lxi-tools-2.1/build-aux/000077500000000000000000000000001420007711700151775ustar00rootroot00000000000000lxi-tools-2.1/build-aux/meson/000077500000000000000000000000001420007711700163205ustar00rootroot00000000000000lxi-tools-2.1/build-aux/meson/postinstall.py000077500000000000000000000012141420007711700212470ustar00rootroot00000000000000#!/usr/bin/env python3 from os import environ, path from subprocess import call prefix = environ.get('MESON_INSTALL_PREFIX', '/usr/local') datadir = path.join(prefix, 'share') destdir = environ.get('DESTDIR', '') # Package managers set this so we don't need to run if not destdir: print('Updating icon cache...') call(['gtk-update-icon-cache', '-qtf', path.join(datadir, 'icons', 'hicolor')]) print('Updating desktop database...') call(['update-desktop-database', '-q', path.join(datadir, 'applications')]) print('Compiling GSettings schemas...') call(['glib-compile-schemas', path.join(datadir, 'glib-2.0', 'schemas')]) lxi-tools-2.1/data/000077500000000000000000000000001420007711700142165ustar00rootroot00000000000000lxi-tools-2.1/data/icons/000077500000000000000000000000001420007711700153315ustar00rootroot00000000000000lxi-tools-2.1/data/icons/hicolor/000077500000000000000000000000001420007711700167705ustar00rootroot00000000000000lxi-tools-2.1/data/icons/hicolor/scalable/000077500000000000000000000000001420007711700205365ustar00rootroot00000000000000lxi-tools-2.1/data/icons/hicolor/scalable/apps/000077500000000000000000000000001420007711700215015ustar00rootroot00000000000000lxi-tools-2.1/data/icons/hicolor/scalable/apps/io.github.lxi-tools.lxi-gui.svg000066400000000000000000000131001420007711700274130ustar00rootroot00000000000000 image/svg+xml LXI TOOLS lxi-tools-2.1/data/icons/hicolor/symbolic/000077500000000000000000000000001420007711700206115ustar00rootroot00000000000000lxi-tools-2.1/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001420007711700215545ustar00rootroot00000000000000lxi-tools-2.1/data/icons/hicolor/symbolic/apps/io.github.lxi-tools.lxi-gui-symbolic.svg000066400000000000000000000040511420007711700313120ustar00rootroot00000000000000lxi-tools-2.1/data/icons/meson.build000066400000000000000000000007341420007711700174770ustar00rootroot00000000000000application_id = 'io.github.lxi-tools.lxi-gui' scalable_dir = join_paths('hicolor', 'scalable', 'apps') install_data( join_paths(scalable_dir, ('@0@.svg').format(application_id)), install_dir: join_paths(get_option('datadir'), 'icons', scalable_dir) ) symbolic_dir = join_paths('hicolor', 'symbolic', 'apps') install_data( join_paths(symbolic_dir, ('@0@-symbolic.svg').format(application_id)), install_dir: join_paths(get_option('datadir'), 'icons', symbolic_dir) ) lxi-tools-2.1/data/io.github.lxi-tools.lxi-gui.appdata.xml.in000066400000000000000000000044761420007711700241670ustar00rootroot00000000000000 io.github.lxi-tools.lxi-gui CC0-1.0 BSD-3-Clause LXI-Tools LXI-Tools is a collection of open source tools for managing network connected LXI compatible test instruments.

Features include automatic discovery of test instruments, sending SCPI commands, grabbing screenshots from supported instruments, benchmarking SCPI message performance, and powerful scripting for automation. Both a commandline tool and a GUI tool are available.

https://raw.githubusercontent.com/lxi-tools/lxi-tools/master/images/lxi-gui-scpi.png Easily explore SCPI features of your instruments https://raw.githubusercontent.com/lxi-tools/lxi-tools/master/images/lxi-gui-search.png Search for instruments https://raw.githubusercontent.com/lxi-tools/lxi-tools/master/images/lxi-gui-screenshot.png Easily grab screenshots from supported instruments https://raw.githubusercontent.com/lxi-tools/lxi-tools/master/images/lxi-gui-benchmark.png Measure instrument message response performance https://raw.githubusercontent.com/lxi-tools/lxi-tools/master/images/lxi-gui-script.png Powerful clean cut Lua script environment https://raw.githubusercontent.com/lxi-tools/lxi-tools/master/images/lxi-gui-script-in-action-900px.png Script mode plotting line chart and CSV/PNG files https://lxi-tools.github.io Utility Network Science
lxi-tools-2.1/data/io.github.lxi-tools.lxi-gui.desktop.in000066400000000000000000000002421420007711700234120ustar00rootroot00000000000000[Desktop Entry] Name=lxi-gui Exec=lxi-gui Icon=io.github.lxi-tools.lxi-gui Terminal=false Type=Application Categories=Utility;Network;Science; StartupNotify=true lxi-tools-2.1/data/io.github.lxi-tools.lxi-gui.gschema.xml000066400000000000000000000045001420007711700235430ustar00rootroot00000000000000 1500 Discover timeout Timeout in milliseconds for discovery of LXI devices. 2000 SCPI timeout Timeout in milliseconds for communicating with LXI devices. 8000 Screenshot timeout Timeout in milliseconds for communicating screenshot with LXI devices. true Show sent SCPI message Show sent SCPI message. false Use mDNS discovery Use mDNS for discovery of LXI devices. 0 Communications protocol Communications protocol. 9221 RAW/TCP network port RAW/TCP network port true Prefer dark theme Prefer dark theme. false Show SCPI message timestamp Show SCPI message timestamp. true Show SCPI message IP Show SCPI message IP. false Show SCPI message type Show SCPI message type. lxi-tools-2.1/data/meson.build000066400000000000000000000027131420007711700163630ustar00rootroot00000000000000# See https://specifications.freedesktop.org/desktop-entry-spec/latest/ar01s02.html desktop_file = i18n.merge_file( input: 'io.github.lxi-tools.lxi-gui.desktop.in', output: 'io.github.lxi-tools.lxi-gui.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications') ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file] ) endif # See https://www.freedesktop.org/software/appstream/docs/chap-Metadata.html#spec-component-location # Change appdata to metainfo once meson it updated to support it appstream_file = i18n.merge_file( input: 'io.github.lxi-tools.lxi-gui.appdata.xml.in', output: 'io.github.lxi-tools.lxi-gui.appdata.xml', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'metainfo') ) appstream_util = find_program('appstream-util', required: false) if appstream_util.found() test('Validate appstream file', appstream_util, args: ['validate', appstream_file] ) endif install_data('io.github.lxi-tools.lxi-gui.gschema.xml', install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') ) compile_schemas = find_program('glib-compile-schemas', required: false) if compile_schemas.found() test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()] ) endif subdir('icons') lxi-tools-2.1/doc/000077500000000000000000000000001420007711700140525ustar00rootroot00000000000000lxi-tools-2.1/doc/lua-api.txt000066400000000000000000000203321420007711700161430ustar00rootroot00000000000000------------------------------------------------------------------------------ lxi-tools Lua API ------------------------------------------------------------------------------ Both the lxi tool and lxi-gui tool add the following lua functions in addition to the standard lua library functions. ------------------------------------------------------------------------------ Function device = connect(address, port, name, timeout, protocol) Description Connect to LXI compatible device Parameters address: Address of remote device to connect [string] port: Port of remote device [integer] (only used for RAW connections) name: Name of remote device [string] (only used for VXI11 connection, best use nil to default to "inst0") timeout: Timeout in miliseconds [integer] protocol: Communications protocol to use [VXI11, RAW] Returns device: Handle of device ------------------------------------------------------------------------------ Function response = scpi(device, command, timeout) Description Send SCPI command and receive response if expected Parameters device: Handle of connected device command: SCPI command to send [string]. A response is expected if the command ends with "?". timeout: Timeout in miliseconds [integer] Returns response: Returns response [string] if command string ended with "?". If an error (timeout etc.) occurs the response is nil. ------------------------------------------------------------------------------ Function disconnect(device) Description Disconnect connected device Paramters device: Handle of device ------------------------------------------------------------------------------ Function sleep(time) Description Sleep for specified amount of time Parameters time: Time to sleep in seconds [integer] ------------------------------------------------------------------------------ Function msleep(time) Description Sleep for specified amount of time Parameters time: Time to sleep in miliseconds [integer] ------------------------------------------------------------------------------ Function clock = clock_new() Description Create new clock resource Returns clock: Handle of new clock ------------------------------------------------------------------------------ Function time = clock_read(clock) Description Read out the elapsed time of the clock since first clock_read() call Paramters clock: Handle of clock Returns time: Time in seconds since last call [double]. If first call it will return 0 and the clock will start ticking. ------------------------------------------------------------------------------ Function clock_reset(clock) Description Reset clock so that it stops ticking. First clock_read() will make the clock tick again. Paramters clock: Handle of clock ------------------------------------------------------------------------------ Function clock_free(clock) Desription Release clock resource Parameters clock: Handle of clock ------------------------------------------------------------------------------ Function log = log_new() Description Create new log resource Returns log: Handle of new log ------------------------------------------------------------------------------ Function log_add(log, ...) Description Log data to log. This is a variadic function which means that it can take a variable number of arguments and log them. Each log argument can be of any type. Example: log_add(log, 42, "hello", 4242). The resulting line in the CSV output file will look like this: 42,"hello",4242 Parameters log: Handle of log ------------------------------------------------------------------------------ Function log_save_csv(log, filename) Description Save log data to CSV formatted (RFC 4180) log file. Parameters log: Handle of log filename: Name of CSV file [string] ------------------------------------------------------------------------------ Function log_free(log) Desription Release log resource Parameters log: Handle of log ------------------------------------------------------------------------------ Additionally, the lxi-gui tool adds the following lua functions to present and manage data via the GUI. NOTE: These functions can only be used when running scripts via lxi-gui. ------------------------------------------------------------------------------ Function chart = chart_new(type, ...) Description Create and present a new chart. The chart is opened in a new window. Parameters type: Chart type [string] The type can be any of the following: "line" "scatter" "number" "angular-gauge" "linear-gauge" The number of parameters following the first parameter depends on which type of chart is requested: "line", "scatter": title: Title [string] x_label: Label of x-axis [string] y_label: Label of y-axis [string] x_max: Maximum value of x-axis [double] y_max: Maximum value of y-axis [double] width: Width of window in pixels [integer] "number": title: Title [string] label: Label [string] width: Width of window in pixels [integer] "angular-gauge", "linear-gauge": title: Title [string] label: Label [string] value_min: Minimum value [double] value_max: Maximum value [double] width: Width of window in pixels [integer] Returns chart: Handle of chart ------------------------------------------------------------------------------ Function chart_plot(chart, x, y) Description Plot x and y value to chart Paramters chart: Handle of chart x: X value [double] y: Y value [double] ------------------------------------------------------------------------------ Function chart_save_csv(chart, filename) Description Save plotted data to CSV file Paramters chart: Handle of chart filename: Name of CSV file [string] ------------------------------------------------------------------------------ Function chart_save_png(chart, filename) Description Save image of plotted chart to PNG file Paramters chart: Handle of chart filename: Name of PNG file [string] ------------------------------------------------------------------------------ Function chart_close(chart) Description Close chart window Paramters chart: Handle of chart ------------------------------------------------------------------------------ Function version = version() Description Get version of lxi-tools Returns version: Version of lxi-tools [string] ------------------------------------------------------------------------------ Function ip = selected_ip() Description Get IP of device selected in GUI Returns ip: IP of device selected in GUI [string]. Returns nil if none selected. ------------------------------------------------------------------------------ Function id = selected_id() Description Get ID of device selected in GUI Returns id: ID of device selected in GUI [string]. Returns nil if none selected. ------------------------------------------------------------------------------ Function chart_save_csv(chart, filename) Description Save plotted data to CSV file Paramters chart: Handle of chart filename: Name of CSV file [string] ------------------------------------------------------------------------------ Function chart_save_png(chart, filename) Description Save image of plotted chart to PNG file Paramters chart: Handle of chart filename: Name of PNG file [string] ------------------------------------------------------------------------------ lxi-tools-2.1/images/000077500000000000000000000000001420007711700145525ustar00rootroot00000000000000lxi-tools-2.1/images/Paypal.png000066400000000000000000000300701420007711700165060ustar00rootroot00000000000000PNG  IHDR:RߠwSzTXtRaw profile type exifxڭWr#E1lěA$努wZRHdQI1ۀe+ML斳+|IW~;Wˏϯx ? {[~֯_z(("ϓX= {,V-}?>_癓r?|w,do%o@Џ'Gϯ,$_9>sN{znzƅmOyн{-;{JW_T@ӕ#GoUǻȮ{'q Br}q#4(6}fiYf5; XyUW[}M+λV;ēN>N3wYUsϪRU\ NjF|dzmQhhbFSlB2OIYNq;{{>VΨtQ9}S?jKl3m0W4J }">Z^=po/k"3/V1}lQL }*爭~D ԹJ`yzz_u0sΡ+EXn j,%M=0F_](>b`x Ů=!sPXc0P\ahO$a~W0?ǫtU:O*'x|JI>^#$0!2`Rq?ώ2Ӛa±} תi<;;T0:ع ܍MP6fl!1~&"muĊXYAG):GmU~ vL +3{:9(ϫ_[_u0N~2 ZK QY%QѓDȨ!nSU}MFqc"g<;z7;9m7] (cQ.]|IϮ&G[i#giaCCT2s="yb>Ef6IP HHzB#}ZzC;%ԓpc'Z.ld]AV(;6$P/E߁5]wa>@&PY&f\Ak 3+F 2= A+ޝ:C Cκa>c*W) E˻hlаQ, B>ݶsl `n*b -ZpD;CĀl܁F"t_¯ ` C?=>sD+C `8))IgGF2~0uGo|78::0GZ[cFP|Rfo 6Gc#Sz~% okA+FvH9,Ķ!̋]ŃP+ōeuNjdE >xhgn}20lRcE>F78!>Th\#T갍אQ %Cr|@ vbȹ{ư"l@ Y:R&Cu*Yخ8ؼyn* Ba^zdlBoXՖ3XΌY} a!qCͳ+u M7bNGlO_&7 ۴:iJ rTg,1rsfdM2*)q׌ poM" vw\$zRZDmcfVrI;C,;Fo6eǘwk:-FX'a-p%ԅLvԄ)uAps{2=8Y3Nh5蛛#G+-٥ SN¿@XB཈$Pp!LfM:rBB\KCX2Lbf+i,+[7 &2kvyHLAHle xĭSLdv §v4DIMw&}Q,I fH =Ш$#&PMzV-űرUsnaps\qR:\8QxmЩgi䟻<}0ÿFKGRX֘ʵTfxl/֞HJ{{#^&B}j6!<¼"tSM3EGj'L Ky낣=c93m7\[g1u9 6+2im/{d0}K4/yyF鎮x\[7`jk# XРAGd֐! fMWXF?= u\F3KJiJw -].fB OȌWT#ǽF\mcX Jh#MI-:]d.ޏY$&"Mu,"5ɨmaӋ6*F“7 :pÕ.jX"jP]9\H.A^$F,0<$E>zy'7Cَ4|-IbC+Ix^ՎSDYRY#j]> i-6$߷뇌1dG@%uF`XMHD&9}pl:d ႙kiA5It@]I: s}'YF̕lq<+?G0#M =H<^^Z?" BP{:O5o2e$7juАOp3TF:eeiJlpTbpS:<}z.;p_1C5* :0쏝RL*[<< @٧:?xm0]kyE \f= ͂!.7 Ҁ!IX:V(z<:p@Y銰Op5`P,CI#pח).@4"cP}vc:r*ԤFz5U/_P/;qɳ i$}$Ť~ҙjWCh\fyGoZ5`';%G[.--J8H<=$(ބXeǕ` j?y Gg7yyE:zl}|.o/-[K:q+g⬀=DBp` <]|v-N 1vqƖsՙ{/d/O?'&`ʹ|2#Yz ' #6@zU3( $&>V*OW^%/xe~'dx6ŴwCoS_:;0*zB ;p>u!Cz&4>MUG3_^tM?h,$AV_N*piCCPICC profilex}=HPOSED2TDEt*BZu0y4iHR\ׂ?Ug]\AIEJ/)}w^f1hmq1]^@˜ATf1'II=uSxߟի,DYf6Ԧmp'GM #8\xfLb6fES#$NBcg\e{r2i #E,AUP:)Rt~\ J`X@dgk'ƽP|qkhq'@[J$"G@6pqҔ=r|2dSv -!蛲-гͭy MJh}>{³r> iTXtXML:com.adobe.xmp օbKGD pHYs B(xtIME;$ IDATx{PUU?ppG.)JpD"3y)*KoԉI3{+dKFJrb:8 r;bGpؿ?'";gYg^Y2dȐ!C 2dȐ!C 2dȐ1J! ®]\A0WIII wX{_4 oUUU[ZZappp IRQ*=c@)z߱cO?#>NNN;CpVVKfffFF333\rkNS?^ϟGөC SY8ØٮN0\h s `(5՟xp`]#J&Ď}̙CDD:"Ξ=KWWm^֟g͚5:u .`00 ,_?,~zX9&,>Zqqq̝;E[oq!<X^#뉋c\x~d5[wܸq|{RVV&-[0ef̘ѣG~:;wdĉ,XT~WPT44n}wr rss%+YZZJ}}=;wϏŋSQQիWL& h0++Ղ7o jEy\ϜǯdAid7>chcee: @ˤ͛TWWsj;** 6`aaA}}= .IJv3!,K3]khسg&zJKKywٳg-[0}tyh4Fmm-cڵAMdd$Н0r]NpALZc~:k,T.UTVjl߾;:)ΎqƑ]ɓ'KUUU# 4,i~0m_R^գ`o>A 44y!<?~{YXmmmTWW0)Smضm8::SOVQ(Ǔ";v,XYYQWWGiiJ,4Xq@|(oǏKKKIOO禮 P__kuww'$$]vネ Jш`[sNEdBqq1o&/_&99%K0|735tҦ"2O,+lZ`mBcMwwӦM.~gʕ+e֭h~)ϔR]]MHH޸.:GåXz6W^˗YnJi8Fo3GAaݷfR]ZpXw^PP'蠪rΞ=Kss31sΕf}yy9]]]8::j%Q?K AVã>*u֙=mSStuuQSSÕ+W8#"ʆgEEEI8ząyyy5+V466(}󊋋z*'N4>{!&?EEEJAS\\_344TE!TwYڌqtA]\\$1Z[Yj RXX;ömhhhh4[UU%믿&33I&QWW'SMLIIARB@'m=W@VV֫iii"|Raz=3f]&(/V/--Mzu,_"go4r/bL<777j5F;v [|7?!#3V=7 h$Q`0pA֮]h@5c@?-rС{CI}4^;hvWM=ڌFՐ+))JZl2Ce˖*juRR! ޕJGBJJ[:N} yGsۏ{F_|(@q-C 2dȐ!C 2dȐ!C }{ǯIENDB`lxi-tools-2.1/images/lxi-gui-about.png000066400000000000000000000667321420007711700177640ustar00rootroot00000000000000PNG  IHDR$PgAMA a cHRMz&u0`:pQ<bKGDtIME4I4ǩlIDATxwxlIB ^ VP* W)"*A@%$Cʖvl&)쳻S,p̜Q(Nr!]ƫ^.G-v| PoSk !TMj|CMSq3ܗB[Rq>O)OBQ&KvxrYW!/*\[ 6m 0tBxl6 CnIIٳ(4LJUÅ`uP' 2Ps܎B ǦX-N Ү]111SRRhlvv^W!pNѠ 00'p ͼ&.T5:; ^Mj qf N ѣ 8wB$$$PlݺeJC6<-mC̸ PKȹ9Ou]vٗP\\,1 &>>'PԤMՔ9mU=zx& !b0͔866ajjJCZl//P v&WOWrZjڵk7 ..y O!F[:s12^Y- \=? FGGO(((h4{V; 6$..0EQDD7ow1F(,,wQ HAA^k4,WZ.0(Ot Κsm۶W5 '88nݺѬY3 O!:0j_`-q9m JO)E{Ëv_zX1OI- O.*mJp !tDDDJqq1f3e2қǘyPڀv%%%JÆ %<.t:]jv>ھ{fM@z&rlE#gB*.((E6F#z>;Ns`3ygUZǮ4j40T>RBxysgզj Dףj61 +|l|WzsuW9 w5R6cg+'!pJh P8w\e骿[]fra=]L$OIBaDxxx "//UF9fb^{)zmڮض;? P!@i? O[ᄄT2EDfev!o. BQZ儆Vȴ2Y)*5Bzw1 V[*ՙ˹SjҤ =˗/gѢEq'O2uԋ@4 EEE/5dJ5kFpp0X_q7OrJf3~;h8wͮ.WŔ7ߜ**)t UU1 t咯gʔ)r[t:~myڷoOZZGaÆ4i䢭Gra,Lg&,Mvԩ/.::O1b:t~vqi߾=O?4ooڴhYr%%Fƍݻco`0p>FߦI&XPjBCC8q"P֭[w^ݻ/Y8={6lْcriϟOHH^z%}]:u*ҬY3?~|}ɶpwWD-fi={,Nĉ4lؐur봧O>@UUmFQUvڱo>>sTU뮳^feؼy3]v5@+b᥄kѝbFimhѢ裏իjՊ֭[sA}YTU*-Y!CǯJVV5BQ:ĢE8}w[Ѹ&##1cXCJ.7LBy]NMueωZYfDFFxGyGWunZ`22)) (LAٳ:~ǎ{Z%H͵kַ\`4l0.]ҥKiݺ5fm6›v}vӹӧw]e4}eII )^U,jnݺ:vh7s,_|KL&aZwêJp1TUm۶4hЀ'Oz=`ɒ%̛7n\ffˊ^8C=D߾}ׯ*O?4.Qwr|LL M4lԨSNeرdff]vU Dh4tܙ}Yy+33ƍN`{)z۶mHKK#-- (=o(-+ڵɓ Q6lhxAqp-??ŋ?~|w>|s1:d}ʉ'˭loh4L&֬Y;ܹsQڄ(*YN4cǎeر?~F1y -R-Z <<ܮb߾}\~tܙkPNyԩj*HMM%11{gZy͚5pi0agΜuv;y$-[{aϞ=,Y߻֘>}:m۶e˖|7:t\7oκuOηw^lBϞ=Xn5"///;vp Zn͇~HZZ}u[ҹsg{9l?HNxٴi 2UUٿw]c0޺ԢE 8 ͱc2yd7oqUt.*2 ؟]f &;Njj*f?m۶M˖-ٽ{7̜9'N^gv[d קO>r#%ϨQ1c)))4jԈVZjo0{lBCC{hҤl63~xmFƍiԨo.?a뉍d2΀[?qlm:3x`x LFPo}( `ն\gOZqSu?[# W] "*&""͛7.[+7r]]_n]-[ȡFwfzearT!q1z =7*MB!d2Uyyy֋.'5P!MQQ(((^_UH !Ν;Wh^^^jXB\tEEE BBBs]frBqIXΉ;w@z=:9lh4b0(..i!ZCnU^x*d2U&sU<BIU6BN8A~~!Fޗĥ%ZݻWBTQh$776$@BoΡC$HFʪ6rQu #BT=RB!| *B@T!B P!*܆ BQ\e_ݷotM'¯.ڲ W!B P!B!$@BH !>B!| 35.pCQAJ#*=UUSBjRzlE0՞,Y^=:vHV+hܸ1aaahZQF\֭[9x IIIdeeIjMTT;ZLTTGo߾.Q1:K߾}QU4-[g}FAA""Q( >+Wr7KxV3P~}xjL&4jGjPUFW_}En[EEEzjy*իg kxjRՆ,P-)j믿gy,!* PQY>|8ݺuwqEvr5ה5IHTTy111+l[ z}Qz"GRU3<#YoߞQFIS$@E*EؠAw1pKTTIG[#.8Zj%BE&*,UUi׮! 88&MHx*MTTYҧOCɵ^"rlk5wqkNjJUZXX $&&YTTERUUIVz NQI !>B!| *B@T!B P!B!$@BH !>B!| *B@T!B *[9HN~i7Ezb6}qVM u&HqZU˺ *,8EQXi72iLJgBT%-(d̥,KNw;]Foi,]k{v܍]uz;w=N0jXwt|^`>9ncj PQsI H%f+LЬq|?8PǠ+Qb0y,äŻ?Wu( ,^{?uEUꞭG Kx03Ũ^4ӳ)S@d9Y&N # }&DU"*j%EQ+iY*-Gi:5aΦhVm9@S^/{tFO}Yk]Mĺ =Lʉ TC_EgBT+xE3toOQЬ痰q^e ٔquh֠L&3;Af .֎}Uzi\ ỮѧYñ,&L o?u#y fUUp(̴nZ3! PQ+f䒚y@=-^mk&9-7MLr!s,OGm].VQdz=/_}&DU *js΋ rlC`PKF7"D៤FrX[o&3ZŻ wx^ >|CuIXQ}ϵm LR4L^Ԑʢ(Ч{[.k\sovTUkO[q[4'o":[@ZCIAT:E%<Ъɥnmi鹆ob)hZ'O^>vH_tB/4,HHVQI$r/ rT7*=̞˄ͪh|mnۭ%*p2="/S+Du$*jE?6|PUo˨*WtkIu+0%oM|/Ye'4бQEr'<@•]" :V3ʔGrYV*?n>yb3^Uz UN&qذ@BC8.p}hDEa]}x@z} q)IZd21ogdb0ӯkKRrg99؎^;y y8 Z+~ۍՉf7͡Q!4oput6}:‚%)b)Or8yŅҢ]$@E-m {_ݲ vq~*fZˠpة ')%* piZ#DU!*jE䃩^R~OEQU}犣"#_XsS=w:aN-V!! PQ+*yu5i/02Ls{T |b{^ UNzτL %?E#*j5I9MpU/>58Ź@U%6!8˫%)}ѫP?vhx{(:3j~^7^M۲qzW QHOUaKJ M*-%\I Jl#xɛHlkwI9g f6mSމ K܁FK-DU!mʊ^M_{+tABM w8I_.dCH|0f8}:5P@/?n>nU63d@wEy iϝ$*jBOdAntB+,2slN&~-5Œ'^ʄ'UpM&,}y|h#UUeLګQg>=t{K( *r'8( ;RNsW-֡NThՕv9䶉ҫyYEQXy/wO]S Ф2nXНU:k-< l6tZ/+,XsfSB ʸ]]ե)ݺc?\ p{woeDh7lNbG3lM:VkzD%*j܂BddfNaԹ*t?rux&P/ót6wdP=u&s׹XzHLTޥBTYF+**p֥ z:CBS0?p8-!bB廉*z:wAHԙlL"V96^:P\+j4Cq G3 y2 QzQٜl:6*XM8{Ajߺ)cv*tgm!t|vf6%&<=yP.^j5Nd@ÂYZ=E.ڥyT:4O6M*ب0|V;q{ϙ]OPF B%@E%*j ҢQ%]墚nmҭMrW֒ZVh}6{[\. T(cݪp_ޑ5)'*j, PQ#)-b7(ڤnqjBTuhC'OKu5 ۅ_6wQjبp}KTXZ4 !}E!@E`0*l@Ӗ$VAa1%f3h JTY%zg VCpP uWv:M%`6( Ze&5٬2uo YőÉ n2j~!i*;gs "JbhDӣm#.ٞέxZE,ߴ5%Ss9zע`hQm3.4r9ZFjzuXPp u bެlswg{I$9U cBh  c[>][$n $@EWl0֜њ."Bx g<&3ʧ cϩ28\X<~v f?Ȉa} q'3iOj6_חoڣsrk^A!7g Ҿew_ot)Eja1Y=xt̬7iWhrThwS:8٬pn~7.<5^mixLF:J &b!MԞ_n6<\mmaa13F_'`_.kSQ@)-q&$]N[x[boӽMC:jl7Evl&EQ ee{.l̰.s`GBCh4JJeĆM5TUݹsM߬%&&?~}:%iht:-K³a)OcXNuډB˘4{Ӆu;#zTU?y{vunkFv\ѻc n?jZddΒkBI6 oUo ?u}g&B5* Ǒ :{?E'M  ;y8./3}^hⳟWs\ux~uW M}`_ۙOvvS|7o4kѳ]2ԍ[@PØl`d󳡁mZϫ &JI~jn߾LxBiuPy^,DM!*jS¥gzx@( s60P;z7禫M%:2 4Ȉ`~_n'lSUFЋVM]6vhِ`'Of5 f~|? 5ݻm2|1/dPPXl64Z)=3s ԮV7? ` w*Z>yrLywmb=[PXBҡ3vEѬAlNveW1I=ʵ[bW=YE>K|MBTwRdb TND뙔 eSl0E+i-1qÐބOєh)lL1wv 5 ҫ[4U<&@Uqٻ(B0Xy.YW2o]m682.~ -o)ʐ>miߢu<2MӺy^ NoS󷪘UDСM $@E( 9b$F/o6uhi ƣYj;Q{F?v]?1z-3'J`_$v[]JCkβx5vWvJdR'uUziQиxYΟ*-a˞M2)BnA쵻Ma075y!j9*jE׉p۹]H\&xwO~Yˬջ2V3֠VmsUm~~;i6/ۏtFpT&Y}(Eu4saUp>@m1@˄`+;0og{#ѳ6X/ޭ ԣ*H/`WCʀ HlP߇YKBT*E%F% > "h7;#4\:hVr.cPbb^G^}7^Q( t*:<ȘW2U2@3&$9A- ?)eP h.p Zm韃LfNf%<-m5Kc{Ӻe4&\Q}6>}'!K3hdϞ=lE)PjU*J K8t2B4 4M!(@rK/)HjE:ƄӤ^4EAEu{1m٬:]BjF.陹+,F(D,!AD/V7ڵCY#DyűaÆ>@`66/ewgڥ[1$POfˌw O%&<֍.׋W6^XN:ԯSC_S@΁ !>B!| *B@T!B P!B!$@BH !>B!| *B@T!B PQe)hw1#D&*\A~z= )> ;Xoc ॗ^̙3<x2m4{9Zlk":w}ѣGk.MT͛5jTڧ*ǚUXf O=C ^z >}Yf1c Z$@Ea:UUyiӦ M4aСtЁXt:yW%%%>}7~z9Brr2iՉՊmZJrr2wfUU *BQEAѠjh4zՑv,lmZT?ՖcESTwsC,Z5I`FT8Zq)I#!B!$@BH !>B!| *B@T!B P!BI 1DEEO?qP,YҥK//z/\!F#~=BFBdo16&\!.?}Q5jĮ]Xf aaalذrx믿?yꩧHNNqƤ7XHIIaРA^GQ>B\$o999<ԭ[W^y^z%^_|a8z({aԨQhZoٳgy뭷 c| vڕݻw?MB @Ν 7W\#GxwNhxg/hkע*PB"KOO@QfiE'~zz=&_iғ&\!*FsU[IOOI&֓3gsw1B P!B!$@BH !>B!| *B@T!B P!B!$@BH !>B!| *r-/$%%j*F(niܸ1_5[ne 6ߛ!D&*%֥K>3z>c~inV?­?oP!.6mCzjq7p$$$PRRbʽ/… 9t=ׯQk)@g(*6,g{d>}6>}'cÆ }m?m^҄+BBT!B P!B!$@BH !>B!| *B@T!B P!B!$@BHOBJJ cŊ7`jL8-[tRZl"/ѣ/ʲx fΜt\\\;voȮ]իeT7AAA ss-Olo\>2mN{Mm㯿Gѹsg^uׯme]u]dggH~j*{i}ƎҥK^c_5nĉ;wɓ'[]_r-Iu/I Ԇh$//,V^6l.EѴiSvř3gh4H~石b ~ĉ3gD߾}h4<,[m۶W_YҦ1cưfl¤IXl7v\^Y|9K.ev;w.O<s_}<,^$>sbbblۛo#<7Lrr2-j[\탊m}Ǚ3g;wdѢE=3g2bl63anv.2Əϛoiz( <K,a˖-v̛Yܹsy5kIII̙3N:yu,^z%nvFArr2Fr ARR3g$11>ॗ^?dͼ.OXߟssNVX1cn#Is:ݶ*eIay=z:l„ ,X۷0zh ĨQ1L̜9|ر׏ >UUiڴݺk08z(O<]wseʔ)eӇ_~rq͛GBB=7|37/m'Noa޼yiӆnmq\nk~xWꪫHJJ⣏>B{57ÇX?udd$}+cȑ,]xoę oն9+eI:( 77`ܹv?CΝKrr2C1aϱc3f QQQ\uUq}1a9y$&M*N߿Ǐ_pI:wl7߂ ػw/L>EQ>}:'N̙3xweuTrygݜ={/uZCGN8/ :tz|dffr)>C \zYz5999߿;wz\7F)ϱvqVr>}3g7o|4EEEvߛ4i(ݻ:;wҬY39Ve񪪖Yrbbb6lݻw'::X\v8pӶ+;ޔzI p7F:خ2H/zj|I~7N:qƍlW ogy#ۭKouV7o^f\bb"/:L|޵k6mbŬ\ٳga(g< _ߍ UF5jh4L&th44 f버믿'7|vgӶS|Vexcj}<[> 9?7x{|@i#_!l˱FII %%%ep7U)ldbĈݛ[nO?M61rH8y*anY[I Uir9rн{w0VKfҳgrcǎDEE1uTRRR(((p-rTt[=1pנAy^}UF#o&={dذa=~8Zۗw1gxx;=m(BΝ-DN8Aaa!W_}u% 6o /wɠAW^ܹsNkоvV~w+.\͛ǛoIW^!-- 6PPPyx7ԩuԱ^ӧ {!&&nmu[.n}=<^OTT_?󙖖τ t܌ V\믿NӦM c_SO1p@bbbxꩧ eɒ%^SNѷo_֭붹CԩS^xFc%++F( %%%L>cҧOZ- tСB3֫W`zEaao`q$$$wYUv;ޯ5h%xX~=_~% G7شi_5-L:gyKr5װn:oPmf~_;]^Ϟ=ٲe+믧k׮;v:uʫ?VƍСC̚55kC \~z^xVXA׮]{1 ^~4/_+r6m>cҥ$&&r}YUoyO>}:*;v￧]vΈZ,X-[;y'Mn ^38z(Bv;Z_R@P0w=;٧O OUIuetرB*Ԧc:w\~'fϞQ\\6l&hn>lRm^||?k׎cǎ?UYe9B>r%ЬY35k͛e̘1L>ŪU*1BH^9iӦ?XJe9B9*ƒsB!D#*B@T!B P!B!$@BH !>B!| *B@Trh6 ־WrëKۼ[yjAb}*U~Z} Z]w5吶w=?8Sv^e;wYw[wy: ]&D%*D9d"70q-z kٓrZ쑿1\%AꞵEB83!)-yq-zwFG¾U3ivB9@8:F@kGҰ@NcIu6}i^#<wX֗~ȿHan'v`ǜڻu4{6{;{OgoZ;Bөu L"Z&=e3dG|9iͺX:|,QpZ}=|׎$i44ux%8Wss+ZGLe884@eb,.EkBHtNLbv^o&))%70!49K s^ [I;HAf*[gOBEaqjzJ I;H=^ !#5P!l2=I?-[kpU{hkٛ b(<0F. %=7rlbklܾ_>Hۻ}n#*E d2ƒBb;SU/:(=HqA2 T?zͻѴ0.ƆcZB8'MB mFZѰ@o0BUIK@߂3ZGdb,)~+<,]Ө9釬ΖYoHhߟȺ.d{BxCT%;5}o'6@)mmz2']j6͏tIZDh'a O(ZRw.=cuꃈmcI!%9NXN . !#MB(-y=9{8nxͨfi6go0uQw}K։d4n !pkdDNW'( ilfݸvܯع'y~!w 3JawK{]w=O>N>BQűaÆ>@`66/ewgiB!|!MBmS7W|!UԯzBT+BBpBH !>B!| *B@T!B P!B!$@BH !>BT;l۶𫀀{9{f͚O?C=FɓYb[laҤItth4 \e˖q뭷z=oF5k#FXUO˵5sLƎt܌3=ztOXX6lI&o̙ׯ*~ٽ{7?wy'#F **?<͚5cڵ 2n^zqwX?4hЀkG}{ݻ{G|.Rr{DFF ԩ_~eԩS|^}URSS/Ώ@jL"g֬Y$''3c 4iBff&wu Cev6=z ҲeKE{;襤G2sLmvsm1n8~n3III<v9r$˗/у e˖U1&^zo1m4-ZW_ߎ``ƌ 02իÇAs1۷Ӽys撟TV93JJoVBCChݺ5!!!l߾:M\\3f`ڵl޼? W^`ƍ >1cШQ#;Lz@@VbڴiX+VзorիW[iӆٳg[[~nݘ;w.V믿X QY$@t:t:۷GUUf3PZJHHp;||<dƒk7Mvv6筈UoʘˢE{Z_|a7ٳg8q"c :]РAW\ xw9~8=/b%$$G1p@}| ?o'|ꪫO*uBBTNl6sZu\ 8ry}~mkXeee9NFFyYpC]r~-w}7mڴ~lܸnd"((QF1n8E!..:n…L&TU/TUŋ_vÇINN P76m;geСXFýۛoݻYhu%5kf־}{RRR<΍7h}}w)cVV˖-o/,3}L6[o5Vdj.?00J)ETͧ~Nv0`<?0N{ bvf3 ƍ#00u2b~gb×2N>Ejժ2ZnMVV&]Vffs_={Hkrƍ/))=zЩS'瓅*\7w}<  K,_v:O~xGHOOdbL6W^yKϮ]<ۭ[7NJ:u0 z\rxZ+gΜv:nҥ׏+Vp).?gĉN>BQűaÆ>@`66/ewgiB!|!*B@T!B P!B!$@BH !>B!| *B@T!B jaQTW& Rb]$@w}kײvZٰak׮eҥn cÆ 4iߛ | OM 3f _~9so~1x`ꫯM>p<~'ON:.VՔdU?@jnٲe.ףG] )q~~Z ({ʕ+Yb}۶mhZ&LUXt)oe\~KtRozj^x6nԩ?3+W_cǎ{Yr%_}/v8f̘ڵkټy3ƍNj*>V\ŋN￟1cƔYU6m+V(?)>uoug߼'¿ZM|8paÆorWۍ۷/]tafmРy饗ҥ | W]u4hЀ{b6/`Ĉ0x`>3 D`` ~)#F 99={_حvY'rq"##?>˖-cǎ$$$rQN~mnFRSS1bǏcʗ_~ɣ>Jrr2dgg-sqq[.SLo'==#G2f~wy|;Ou֑Htt4Xq9rwwo68vh5c2=qꫯnc̘1r-L&3vKϷJII Z<ݾ}{LĉIII7t:`p",, ܕ<'''Gy|hdҥ 0~Oi۶-3fzY:W JyNݟW1 n~7Lhh(/Sg1uKOj5Dxx8$&&Vf:Vː!Chݺ5cN}vzivAԩ͛7w[֭[?d~ޤ$ڶmK˖- AQe.۷СC-$$`nJJJgɒ% :D$!!\t_5 mڴJűgnߙL&EAqY"##ڵ+7vcȐ!֖+o7ǥU_w<?LzU&qqH h޼9G^zz>#rrrLg6[xdԨQ9]fFF?,^|Ee./cQXXȌ38sWy4jԈ cǎ.q3qDN<ȑ#*ƫJll,YYY<ҥKn/̙3Gy &駟v8ۏ˖-[ #--rsoKEߜ퓠 |A8@zzz%*|Zb3]nyiϿGgӧ}ArrVRիӹ=v R>86lL|ڼ,߱n,Mw+8NVX"j*<<^zfʐ}RI뮻P;v0ydITS_=k׮uyA[m$&\!54j6?9F `]jq̛7e˖ѯ_J[n@@@**kaKpkΝ;3vX5kFAAv^sz?c"[`6I߿PT@Lt$qM0#^v̛JIaȄVP Q,NơeC$6 dͶ9os.+c6БD%BFr}[#7 2dlV/Ϟkm59s?j]Xt)w}7NwqD#Z 駟2flB@@[Ai$Vڀ@( ,`׮]|.{9/Z['Z,z2shtzjoƒBV}ˠgKd/i6v@qA6QK ˌا&v&>k+a )(?sPy>=k6kٛ:;;f "bqDV~gh{Ct:G+.0ǺoGs*(]GHtCFEddiPHQh "SN(Ξl&q{EPϹtNcӨ5w2lq,V>(s9r$=1Y;).bг[9wRDaBc{fZ} m=LHT|铁>A%!! *>fٲe_ާ!4h-SXXٳi۶-ݺuv~|l6&dMޙ#D7jgWC4rD&"i'Юg@u0ȡim(1qjzpSRCnC9wjКwLdۜ)-jv,~V^Ab8 V| Jg}>Poס>+y@OwW'#Q8;͓s{+hт޽{cOp5ܑOvyBOn!Cת7mvDK$Y7-tEײ>ߋ>(3>NC4鄢hP 1;ӀT7OmQUv]n|&݆(㚢 C5@QhuDoIqAY'MD>8?4h->(N'V10݉>8nF'GwЊz,oED=>Tl GqA6[gIq~*yNFFcƌaԩΝ;;TL& 2>=P'RjUM\sEBQyٕ ?CnTE!\D$ۦnwE.bFSG!lX!Deh4g.] W|W;~6:TpBNl69NWew4@ DW/ͻ`())BqPRRtfO:{8 (m{+!DFF:.\q es]fub;vl6/fy!2`6;vMjGڎsWu|} Bqt:HKK(YO5Rq#˻m Z:Z '''?&&&-44bkB!ŠhoJ(mmσqv0O ik9==h\\ܹE!Š鈌`0|4(>0-!" wWMcPVi;̱\ƦFFF^<]!D Ǜ u{yI !DPFwOPqM@2u6BጻZiMeMBM'B8㪳wOx=ȺIENDB`lxi-tools-2.1/images/lxi-gui-benchmark.png000066400000000000000000000777421420007711700206070ustar00rootroot00000000000000PNG  IHDRt"=gAMA a cHRMz&u0`:pQ<bKGDtIME4I4ǩ~IDATxy|\u,Li6}IӖnBPBQ/ ע(\q,Ŗ ]tMMڴMf_gfY&$gNz>33gsf ;~-,Kpu@?vܿy%(h.ۯ{z镳t|_ѦzڧH8B۞vz3t0Lfu2+{ -pY{=NFwq~ v=]Oowp*n_I 7Y{x=ܞ8`H]7S]Ǿ^}׺Y 'tY^[0 -޴zB]ga-Y.uEO=k]:=n0 nDp{zzBCU8K t hC, ^Yk 74u: u.ڑ"?Y DJo׉u}'|ҧA0Y`}8uhU0 w|a: uI.)ug={r ,|:vwt\;..zWAsVq  d@`j8e Pmzz]9k'[y#0O\gC.w:y]멇ck'@ppu|:72Mhثx-N{::pœ-=vI1}{cccGr@^VUv]Cjmm=TUUݻߗԤOeziO^gC5;O cpBvx.BC]y~vYcc 㕐Wl]0 uu6O@n s~ ֪"vr)))ijffCT[:q~u?O Z?aV]?7o޼a NU>O.Kc222F>|=u\ t:) Cg }SWs]% vL>aÆ}0`xNurӊ#̝v.Nrp8:vI宎ے:tYxC/m111ɝ];gON%FG111j@B8eWi"ǝuZV0s}g}Gܩ@ol6*&&Fv=xmVkkIdmkܤש k?8ƳQf)>>^KC jiiQSSS$ajPi'sf49JX@q:JJJ{Nr2*3uT.칞zz =pe *:̅JJJR||ɔYfnRu\=dkzZ=-})x㍺kdvhƍF(uWw /`t)t*!!IHHkO]w˯d$Cp ;C_|222zϱc뷿nѧp[l򕯄TUUg/l) YYYz衇*}:|%": JLL|A+66}/iʔ) ];b|>r|?l())In;EDw7l#[ (7^Yiv:pܣ75.GdHҁ}xo{/}Ko~c)n6=sڶm[q8c= 1}.r8p菵_i̙'qqqjnw/~ HjZzgo߾~?ժ:xnMPK$]tE:ղeW^vyz:s]9a]Y__6ou?[$z ^Kt8շKVr赏ٕ/XVz?;5k~i]r%u[{=x@hٲeەٳgW_ _W:3ب"YVM޲e֯_|7c=9shҥ:~HRRRtOȑ#vURRwyGo/jɒ%Zbj^ռy󔗗3fkeD) 333][[)))FWEssxrzO4?G_W/kT:H|y7.jdΟ 1y|maa1]:t$ s=۽+ĉ5jԨޓ(I'\*33S˖-SaaZy<Im FvM73իudZO2CСCGM:U\p1~ӱ%%%ھ}?3F~N?>uYgun 5w\} &2QNNzhĉڴiSXUyyv{9iԨQa<n_j~^|>]{FL@i[o;w%99Ywf͚?۶.{:nقp4%$I19?&<95ުٱYa_~ZU74<٦['kXe$Zu77kI>Ԧf jux8TݢNIN%X[Uay_Tc,%iZ<ɩ_Ԡll0⣂tNưa$4666п:tMv=m>adzW5uT7菰tܬx@+W 7X, t*...ow _,YtٳG/>H?ZZZt饗j߾}WT}駟.á?%&_xjɒ%zzچp =zjkko>ys߯%KE=}vsg+==]{գ>;vֻj*>|X]ta(&&F6mҋ/BhΜ95j(~=aPGǎSRRR/SRRt-NSLLnݪ U|Wp8tg_ 7ܠ38C***ғO>+V3Pkk^z%Kphjnn?OܹSr&OGӎ;4tP]5kuqZJ[?Vwy:xo,V#F=ܣ[Gyn:577kҥiر:3TUUzJoF?՟=o኉?oI~h„ :xI '[>N;2jw^Ѥ#QZ\v{G}6'^INqy}Ң ?֎2揋-U߶|Kr+t-Ta[Z553F5MelXM*>1sirigYx0xz"H=z^y?ѫ={?~>^ -:vq{JR箱QoZZZ#N8ߍ$g?Yg]VSNUMMMJ.K*..jo[?^o񆒒t*))I_{|=ꫯVII5o]wuz? g͞=[]wjkk KvUTTiOwܡ#G^8e\ǝv=NWݻW6mgG*//Gǝ[?ϕ?~{x㮞M.q}r zE?[Y:MtjJf^Q?yF*oS*WGmП4Ty]ۯ~_mТNm;m Im!RyuRtD6&@W]SS[+VPnnj]}zDGѣ%/p0a-[&ק 3ڶm[0}+_ѭ*Iz'SOەc[|7:묳[nthUss_,YS~I?3ϔ… }=cǎ+ӝwީnAӡCdXTPP:z 5=zTW^y<.]{7oV-Z7owܡ[nE_. csfϞc~p?QK.ՓO>+BvҎ;`M8Q~_K~h ^gwq}_-ܢ͕… sN}lW{ tWTT+_<nv]~ J}_M7ݤZ{1Y,=7nFvO2Eo4vU~{'2Y/ֲe˴{`O7ԛo쯟])))ѵ^+ϧ˗{UW]o}[Q([4\C+++bŊ`~6~[C|WycI;\c;6V̌iqZ<٩X{Jegu^qZ8u/INZ^-̎Օs593F m_HJ\/ s495-\?x]ߎ2䌚KvMaZN*;vc<0ڒ%Kp8twB'Zp?ħ͛7Kjn`oСCڸqcXN2e$i͚5]^'S[[gIlJ]yMJJ?nw;v6 ^Çd-YDz'AWj :!a۷o׵^]P[nw}n/|?r٣M6-장뮻Nr:kuWnЊ+4vXImxICg=O;ϗvDŽ $I6lrw{n]~zg7.8iK/T&L 8aS]]]z$%%;$=#Q3x$tCw=t:?/lֽ{Jx#aN LjkI^Ԡ2Ls8dTՏׯo*'ˡ_]#.}*U{ϯfxG?a3/sVhΝ*++ =+і-[e/_W͝;WEWnnƌ9k֬QmmJKK{褐o~'%%UX,AWM8tTWW'I?y„ Ǐ΄J]v9-^Xw~_ݻOxo H ^_߬ᐤHﳲ} X---_+RӧOb NJrJhUUU=~GiӤM*,,?yР袋.O<1ZCy@b:t=;vlGOSu]Z-;`f]dQUO~I\6{C*=*,wo>tژXY-һ{[Ku᭡RZ%a: \~_NSZpaXٳg+%%urss\[UU%߯z˲O~vl?}ݧzjP9I:u@o$mڴ)؋'=}7%%%|3a<̙3GWAAAz|'VU>Oo^bĉ{|oຩs9'x>gyf8[ fdd{Gʕ+= )껒(ݮJ4c j߾}[8~:tHtgpPZZnv~~_v/w* Guz zVJjjjpR̽kQ'P̃> swu.޹֮]B͚5K<:KV=`7|?ڵkSO].YD>l3335m4y<^ =ݘ HR7nϞ=ڼyϟG}Tk׮ѣU__VƍUVViӦG՞={4yd=2Q`W\D͚5m:tH>n&XBzkaPfkEW^{g>yL([4\Cv@:3qD{ u]я~](Z_.\^zU{5a]1**׫>w^ҟ74(1֪/C Ӭmi&]83N@Ͽ4^\ViT.?-Av_21{lI%B._\G矯ӧ{O;OG۽+ǎӟ'UTThҤI?~ uxN_eggk*-- m/#G;#ǣ,{pۭ[oUVȑ#|r8oŊzg/˚0aB=ǣÇ볟/V|[Z`֬Y n=Szw5qD-_\Ç7޶mJKK/˝Kv]V՚D]vZs9~v+xoSBBZ;WѷmYF eۃ׻Eڵkꫯnkҥڻwo MEEE9rn~uum\@LEE*++ugk;K^D@Oz矯;ʪ*~ݮANbX\)BC哛vfv>[_c|65/{K_R?A=ѧ7ФIt]wiҥF)kƍ'Y>cY,͚5K\r ι\.-\SC"{k~mذu访z7N׾!hY>nӭު'|;ݻ̥Y%%%u&l_jhСC'OR$$OȽm_-t[!9}VRیiæB|IqtM'\ӓǏ_{NK.=Z<w!Gި*:NgĆzד ojkk?Iӟ.&rt]w]Oj[k/n|>_TDZSS|>_{37tnLJ}]]KK\h:U}}vYmː|>y<nFm @)%u74k.L> ̉i덪*jW|s6->;hw `0@%z_S,ޗ.LSQsse@'I z_S,.LPw x<3 0!˳:esM]5|9׫jtrMy<3`P37oKknn&N <L@&EY.Gx om[ۻw***p0aÆ[ "It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&e7bb(--M9990a9^GѾ}TPPr~~tnk„ g>ɓ'bСC+˥kڵ*,,""@@7VRRRtkZÿZphʔ)ݻ;館L^"ttfiĉ5lذN{p84{l 6LVҮ]r>=)@@'v&O˗+--a.ȑ#~Vv]1pҘVL+"ba.`ذa:5m4]prtte˖)===a.`ȑӨQ}A Dll<̓f.&LPNN>e1ydM4IzͦYfiر9P111UJJʀ/##CƍSBBѧ0)Tffbbb'NԐ!C>uIرc49r222dٌ>} Dff111Ȑ4&D@m '''pˀ~pj" !$G@m|ngq@ 95s# Enې`,cG0!< Vjmm5#OTTTy@zUYYO`B:>QZZ=fee?ΐK@DYY***4\۷OUUUF:FRSS$pׄx^nwԤ#GLeee=:٣)Shr8ٳG%%%']s(''GC Qlll6~<ZZZTQQ;wj޽EŢdM4I'NTfft:Ad|7nZ[[Ң:Oa;߯J566jܸqzY]]wyG~a֞KKKӥ^I&)&&&l6%%%iȑ:|p\h?HjpNjرcdM8QN~YTrrU^^[jΝn[~|>.%%%tMǏ;C-[D,kŚ:uj>sժ#F3Tmm-3n'%55U^xrrrp8 rlJHHиq4j(q$n[}***t饗*;;OG{o҈0i5c -ZHv{[V?Tmm-C/Dr yKZ{ySf8e?^MMM2|>飏>Ree İxtA\Ro;&sZ5j5'fQ܇`% i>}z_ڍ?^cƌў={z.g{r\ڼyl٢lh„ >|xk\.***T\\;wz) 뮻."CA: aX,2e%'']NDv͜9S&MҦM﫪XX$>>^111jmmUkkkzẒnAC hkA%&&Fgu-[vJ8N-^X999zwm6566~~7t"@Q@d K.Df:7 ==]W\qN;4ZJWsssDLjՐ!CtM7)33_qш; oeIX,5qA5oܸq馛wձcbHѸqtUWE|eVqq}Gtjj> & 0̙3GӦMӖ-[n:ԨeYf /l]ٻw>%@8fSVV.R7nPPNSgyf̘&ﯡEqqq>|,Y~qFUWW:@;.\iii袋tgjڵkjkk۬V㕖~JJJץ!Z[[v s!,233l2;0ׅ-]Tgy {n9rDjjj ;l6*!!Aiii\Ǐرc:P~_u1?J@ m8%K4m4י|X,K VUJMMUnn^T]]ݮbnt{䒓<<~UTTWiiK2@PBB.\3gX$|>555AMMMjmm j|`oT||k%ͦ]JvZv]$`s81cfϞ~?WSS*++u1BUUUSccc3>&&&*99YC СC5tP5JFR__M6i9 bVUcǎՂ 4t~=S}}t۷O1T`SS***TTT$IJNNE]/444?֭[UWWgt9  6l0-\Pcƌש񛚚TRR|ݻWǎ NW9r@dР>HׯWee"@T||rss5uT1^*++}vرCZg111:s8)544h۶mZn***.A:,ƌ%$$1\.߯7j޽jjjXSL2:}GT^^nt9# t:5~xeffK---ڵk֭[^*>>^sN*Jyfm޼ap" #FK(jjj͛qF9r$ϛ7Ocƌɴ|>;>@۶mSmm% ҢM6WuuuP^^l6@|LxTRRu֩@FG:l6[{\.6nܨ5kKE)##c >"SjnnΝ;a? 6hǎ7,  T[[*7ڷo[Zxq 5VرC7o֡C":( `ѡC4m4ŝt[oFo6c ?޹>OƍU\\& 0 Bn[{UvvrrrdXԎo[Zh8r>Z.! U^^7*%%O~[ھ}{ ͛7O#Gj52H555`N:^ eXtjرa~Zvm 2DS||ajkkUPP۷jhhGDAri޽gYf)!!_vء~///OCe޽[?~233#zm_`ʒ竴TMMMjii5Q@Çk˖->}NaÆp)++Ӯ]87nOX?f\R555ڳgbbb#F(33S#FаaÔd3^WuuuԱctaN.Kn[D1@>O*))ѡCon+..N~_---x<[qfٔ!CDU￯*|>y<AǎΝ;edZeZ$nnox\.| l:@P Tz 3fPvvbbbHv&zz'ZH 4'@tjJOO7Yre&uΝZڱc wN z5kRRR.%jʕJ:@TZ?FUرCg@T"BVVL:xEk֬QKKѥ)pCsȑ#.%kӦM:z(`(ŢI&iĉQxuu6oެfKK:4sL >R^>?~%Q@0jմi4~xѳ4jYYvI 2df̘ K jmmՆ T]]mt)@0DLLOqE2EEE*,,d9)ԩSjmٲEF@Xtӧk̘1Fk.v]a!bј1c4uT]NPuuvATtiӦ)++R|>vܩ2y^ l:Z7nN T~~.^!LzzOC]Jծ]TVV>9 0 bbb4aM:UVk9zݫKע7*6tP͜93)x<ڽ{7s"]\\&O]J;eee*,,Tccѥ':@>|rssgt)A.K{QYY~':@ ,S0j(Ki***Rssѥg:@Z1bfϞU9&%%EfRFFѥSRR] '@v]F̙3j&FI߰SJjjϟDKiϗ2NqC&LД)SdX.'A:zѥ:@ĥ*//OR)))ў={z. "t*777)޽{u1K btX,JOOעEj"mݹݻw] ]mO?])))Frl{4"ntSjհaôp¨% !!A~&Mui˖-jhh0,N =tӹuX,e]nMsQlleg:Il0af̘at)aE}_Ըqd3h`>xwyQ9Բ;6M3gرcfmݺUL0 z'fNe z#99Y]tZM4INt08C8)))):쳍.#"&N#Fh͚5UUU"Fl6,YTK-[L_4i$[ZlȑZpeDb ֭^Z;v. vJO/X]tFLo&@L9%$$DfYFrx<*//WAA*++v%-bn ;Ţ, 2D a!r@t?HjpftYgE|ȡWqq V޽[EEE?~McjȑY,M6~UXXÇk6mO~l6l`@]lZp 9߯"rEn߯ٳGց4gM8Q_?81_@Х &hʔ)Aڵk?ޯ|>UWWkrJJJѣv]z tN9N-X@vPzrSLdإ@"0c 7.k>|X;vD(ݱl1b.\)S(--m@3p\ HMMiԈԤ|[III;w̙aÆt'KKKx@89seRm߾]RnWvv/^c*11q,;?rJJJ@h'++K3f̈UUUڹs#^bQzz/^%''ʎjjj[`# fNȑ##LUIIv Cbbb4oR}}}D5j.";VNs@Wjjjիn:y<Cj N:gϞ#FD4\.+???b8N-]TgqNgD{{?nC ^:e &Lkώ97F$X,/VZZZ'm ϧݻw_Vmm|>a/@9s222"nCCvڥCt[C %\C[A`( rEfRvvvDZ`p8ҥK`g~ :v옡 `ҴiӔvi&VUYYY5vXîڂ\KKz-hܸqm񨤤D۶mVkZtf$ۭW_Ç#6 @Abh„ :ujDn v>MoX4qD-[LC 1zjhhкufV ]! ӧkԨQmUwD}6l!K`xeIIz-F|1t"@jդI4eʔu1[Csss5bCx<͛ak7t0kkllƍu>fiܸqJLLAך5kt> ``ɓ5eʔzuAmݺm$&&*%%%⋛wrB7oG};6'@Lffrrrv!qqq|>jkkUTT 6^9`Ӕ)S4~xgT;$@ssʴuVܹkEAjjњ9sf,Sr3xR~~"9` v]cǎUNNNė8x6o|>߯ɓ'+---"mnk׮]u @# 3g*###wމ5h={Oj<ϧ:h*..> [F:8j„ 6mZ޹s6m6 >Ͻt.K㏵{nUUUE:8Y, 2DsUBBBDۮ;/SرCÇ… |>*++sN޽[%%%,E8t:5e7.m_^eeeRwSS֯_/ݮsZZZgm߾]EEE,Etp KKKٳ#:c6ƍJ{ќ9s4rN'tqڿ٣|3 ` )ph9rdDxe1h2:{s'Ζ:ע!蔐it{Qe t4K^,cxSL@EA1<K^,cxs]Z4d܍FWY@gi6h2:55(2:oM%@EC17>nt'@9$'.۞-CE]/R2@et**$U󐬕ۍ. fܮw23ԬWֺ}F`Sͪ{..;ޖ:վmBeۧڷ-oKѥt_pL5oKZ]5o)O1KV N_:W:ףg..ꝇ7S ,>|&'@zvKrnT;gt9Lzd7>tNj[|{8abs/m%0kuZw>.LSC{mn% gtIbZf `@vQTdΗlVrheWN@9$ז-OLV\3ʖ:VJȔ?6MI0Tf$w,RQykJWsGN@Rօz t@gLlS:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"Iٍ.I~jjPee堪񨥥EMMM7 oMl6rAn0JLLTmm^%)!CN]v])))F40SnW||e)@04 g?:at`R:0)L@;Paaaa=68Nv|ͦZrL>yyyzꩧotͳH@!@?۴iN;4͛7O7xbbb?РO+V03ٺun:t@񨾾^]wݥ,M6Ңܹsnr/| zWj*۷O?5|7.t0Z[[r$ICw}}mܸQŋ_۵z`w߭~/I&"O<z]sgjڵGQqq.\}Fv dȐ!7[jݒJKK>9?VX+V(//OvumiaSRR?ir:zHjjj ?nI*//211QNSGi|YY222"ъ@,//OǯnFImiTUU%Iկ~GyD?뮻N\s%I>갎SÇWLL}]֪z5--Mz%''Gtj-:>ߟ5C~a|͒_ײlٲZz'1cfi׮]~bmذAo~mol:IRrrr`@"@? ^'Ћ/'(&.rUWWޘYVYV|.aX:}^n-\PW\qW6li{ݿ?vkȑ:x`Lm۶- hXCg.jǤ(0mۦ͛7'9t萚u9tII~ϟeMMM0aB~ƍo[W]u.]Ç_~mڴI/>)S>>D+ 'xB^xƏ/˥뮻'ͦ#G*''Gبz!C`~/| 9rF*ZO>|`577FRl-СCFs튉6[gLLl6[p袋~VFw]YF>D#\[vvޭ~7{LMMM#Fرcz'sNI<{GO=^^}v=Cz衇[GK/nONNg?Yu]JLL}M?Z`VZ7xC?x928ds=ZlYq:~ZO=$i˖-zu+==]ׯ#<ҮH@4H ٖz,![BnOlSWTT}~pq8ڵk=\]I6l% UVV7lذaZ~}ZI^I{'۾?xǁm\Yt`RL&r4i$Q:0)`ct |tô]30MMMޜ<.NY:jkk u(ǣZS zUUUx9Nj2;ǣz`[NPQQat QQ0L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It[_| UXX۷n]DZg4i$B￯{N6RRR|r-YDǏWzzjkku_֭[#~8˂ ۛ7o(b-YB <<l?ܧ孯0peeeuOIIկj޽}N{RRR=5\-[Dq.0+Wj񒤇~X. LeذaZ~}ZI^I{'۾?xǁmq?OXsZZZ=u{ 9rDw1y|9n ";&M$I^x!gdd>>˵sNOL?C.8p@;wԴi]VҮ]x`}ޮ & _yM{'Y?zjJjtREq.fҼy$Ix-kkk{nO@GՑ#GTPP+Wj߾}zWL̜9>+VҢ+vjkkK/Eq.0 7n :0%{PXXvVV:v"y܁n-nÆ F:0:˓b >8 6N^{M?I?u%oԤITZZ/_|b 9uT :TڹsW]]mt+//O999*((s=;wޓb׾5\Rt7;_.Bۧ/l6wyZ|ƌ#F󩪪Jڰa?nvm۶M{n!ChĉׯSC%%%iǡ 777]SSG*++K]vrrrp8w^mܸQ~Ďғ';nsSLQlllqVV~iޛ\]zַu-YYY/9s{~СZh.8GJ_ꍋO?N;4zh 2!;vL^+wt`+"ثz ><]RR믿^ַڅ%K+_x {ェ?ǹ䬳j74 0fjƌ:}zZ`222'ھ}˃m<#œSuu "ivޭC)%%EGVff֬Y#I***;CN;-8CA:t޴}mY:0Hff;W^QiiiqRRRp{ҤIl /Tccc1z8px^=Zz*++\o2-_\Ǐ$/f̘d]~&IK4w1^x'?Qcc222|G]vI{gZgl׿~ߴk7&&F6M/_?rժUя~tB=i7T([M@d1)  &&F/=+ '8zxօ^y_9+Oq.;_R۷oÇ[oo[vgٲe~`8vkM6-}wޭ}{jll$UVVjŊjhh8L_uK.D_|222ڽޗnzzzBעZC ~u]'L":|I7tn|RYY^~eYVY,͝;u9nK8B e]~Wwl'333=a„U1T?z)''GRP_چܾz饗k׮^ԗvϟLeee'& |GW\qEo[ZB{~mv>vj&Mts9NSN3%09jԨdJ{??Zȱc?X5[gޡ7v39Kկ~龡 5k> n՝q\NFcc˃. :vXlȑ}p{O>?jZ`N;4͝;WCEz֯_iNo)g`XBzkws=w}W>/x-׿KLLl7oϞ='}8UPP H-ҏvpue߾}@wG 픔edd_ pPVV^u%&&Jj [$vnܸ1"!,vkѣZzuq &s%''Kj 7o>ǹl=JHH8aC{njGyDچF~_m7hv*--ME'Nl7ggqB0o0C{bCm[`Am7";vؐm-YB <<l?ܧ孯0pwv577w~ӟ瞓tboG@uuN8N's-[}/96;:uj.n#uyhӦM*//WZZOÇkr\f\rF|WEE222NVk_V\)mUViذaimmm`W{L˖-SSSۧG' Qϧ+"8$k<nzvadkZZ'w2rn566s$)55U {nzǂY,pj%%%uZgsskz ٳGvˉhz[nעE$-SE2Ov.w<θqtС^݂/"@Qn۶m:t7s՘1cU\\{%''[dZu]z|r?^&LPLL˵~ڱcGرC^zNĉu!m޼YկjժՎV^+BwyO8޽[o}Y]uU#R5\s9Gyyy԰axta޽[ӟNNt7kٲe7nUXX48pWhʔ)z6mt¹V@1Nvvz-Im g͚%ktYf֭@:r:Kj áR?\2) {S:Dt6]r h'777o]Xii~iIj7i :̚5KRۂo`=3F?P*))QSSn׿6&`P;w%gr &E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)L@&E"It`R:0)B9s#\نL2h{PղK @gM%'Z!7d;dtI10,lC&)q.CR:gՄ9b2IΜ.@>ע!`Fѐe t!It`R:0)ݢMEJׁ=A7KY-51#:@%iKS4<٦\j*wC>^WPZBd~E==t4<٦ǩ­pL_[ngtuD * KIbc,r%yӁ~fvH}ǎjxM,NּHXWolo\Mҋ뢙:p#i{D+ *s٧iv|GVn;絏bSfMРz$MUQv5\nYf1Kr+[=\~}y)' ~A~Fu^q.IWUcX.է=k3F:/ Ug@W`'\gt̥>ccux-œ鿟 cuDMΌQ'ĵ褶.`6Lz[KZ$㐥s5d_UO}  jjblm>]#,'!o"ETr@b% *d9ѧ*ViIjw\A[s꾋ӴEX[a,HTӪcaV:@TNMjbQQGڠ>n jqdkۛfmK> g5xګcK@tH ٖچaZB <<l?ܧ孯豀53>~6l֯_'VW'ɶ/+q`kt`R:0p]s=",FTg.9z rìaxyx(2~Ç\6h2/DCye Fa|'0B5weH1:^EΜ>W!\BUϜjcUSW/?qm+C].WŴ|!*- v|>_$:Nvg%岻rIrmq8F~`!˵EBSh&u :O>IʵN t:UYYVGvuQ}c.{zNRZ||џ! x|JKKK~eW=p]2Y1:Z=lbb{nWbb=V?v>INzzoQQ,:>o <_[[ې~4!!aIkk$yXV\j܇^Gݼ&Z0g yW^^^2lذn[,cfdە"m۶,Y\ u6!J@w_'4I'>g@׭]wѽSRR~n$>>>3m۶-̅ȅ^GC'u=ܲN: tpzB,`$y[,U΄),'PLcZ8%''fvlԤ{:t7ܲ}$.ý=qIG(66vj,)/zn\wRM֧!.CQkC/؋xN]wt y.p휭[Ƕ:h1hZ#qQ:J챽,}}tO=u uBCYǡ]n]Cbp sAci'kѧ U Tv t-;&l iȪ{:z@^HpLux=4C.DcӉͭa3\8=t[s `v,2z; u6yIwC/; {:uvdQpΆ;4esg ]`<'sXDHvKUw~u5eW3[>7v %g-.&]`а=t@,uBH]"݁vy\wt]gkuܯv:H5:k岻:\롽tt&̮ = r=M~d(n;4q8e'ux?ᎏ{BiU j]I]Ag=v=ױE u:̤-Pv3\yK'.x &0&=n\wO)I"P'gR;Jf] ^8_mנl_wncmD]Fp e Ahq(MRA6b%=WrxezBV{Yg:=u^S9fӺlI띏ftZ[ T.]*kTRvD@7a8KVs{}+GNԲ(WM*puwW=vƫ ;G7]:)Y|Cgɽota%tEXtCreation Time2022-01-29T11:32:04 CET)%tEXtdate:create2022-01-31T04:06:48+00:00r޿s%tEXtdate:modify2022-01-31T04:06:48+00:00tEXtSoftwaregnome-screenshot>IENDB`lxi-tools-2.1/images/lxi-gui-preferences.png000066400000000000000000001127631420007711700211470ustar00rootroot00000000000000PNG  IHDR gAMA a cHRMz&u0`:pQ<bKGDtIME4I4ǩIDATxy\TUg`D@qL%AE^MfhiHVoOM KMߴ0p%M]DAey|f9 Ùsl$-_iADDDDC(az,oBVs*ŕ+j{Cki9b֗e?""""©TDikYC*C-ev,ᵬDiڗݜz9MHiY掀> [ړrx.\eskZҶT"""Co뢖K*S\YuonXܑTg%"""XZkeyVȨ9RFM͝&`T""""挆4Zksɢ./)Laa@[2o@DDD$.%H B1 }aAZ"""">sGHK\KZFs.EU\X-*;2V""""q).XZj7o,,0%ZEXd,""""*^'U(䵾ZAZX Mٜ&"""ST4<^3)BCƖH @nHO[N """GAż..OQLȋh\qEV""""3d4C -~C\َ<%El7*ll/*J Y/AᡖH\ LjaSmRl7 %_=sV TkqhzS=r3[ސT԰|u߷R7՜*˳ͳuR}+O""""2Oio o@ -HlVE=#BGXkQY roځ!UѺuZj}ƦT** <ξɓ.^x@rëAV٢B+Pp*P0He;՜SuTe0Ukݺu7gg GVVj!%""""kJ尵B@VV/^< 6Fb JP|XaX˻^o! v:tiӧOa'"""2=RRR~;yG yêuКwka'W (&BeqZ-jjZdXԩ{{ʲv?Q ;;jݽݻww#7O-??UC*0ZS EUUªNUm ;;u񈏏?К>jVV+` yϻSQE]K0m֭_rss fX%"""^z=Z-JFᣨOQTЛsv~K]x^ @ @ӧOjݧDDDDdaZO>(<ϛEݜHE] [.lz UV]Je`EDDDT}edd@T6hժUWN {}ŒevUQIQS utt,8::`/} ̐)I*t"0dDDDDTakk}uFÚw]y/u%ŹDDDD՟VM-^*N^*q%'kSRw""""LBrHZ999*՜A4ZuZͺ@Z܈k9Y`Q%dR,tT*-lmmaooLdddX2E]?cYY%|eE`ȲJ%juQ*HKKCfffy޾L?3W_غFBKMyoJDDDTJVRհ+O ˄ŝtb yvUeZ.XDDDDTJ%]}S ` Y r)Q'5ZL&aɋVQRQZ~=ڷo ~ 8}4V\r[o7ހ-bڵ>d""k"LKK+o5͓eVU"hsjժh۶-zUl"GT+Vi4DDD7>}?#233ѿ\~j׮3fSNEtt4,Y۷o >/rT*ELL lB@t:lڴ 6l{g@8;;ҥK/qb}"(( 6Djj*_ӧ&^lll~-42dqeA*дiSPxWV1uToPh޼9~GѣGS2:t(nݺ8tӧOٳgqi,^z*9ooo<~ĺ[j?x~GY DՏ\^|={6,Y&M`ѢEhڴ)J;"KJX.jQH$h֬z Ai4 68oool۶ _|`ƍڵ+J%~7t͛7͛q1\de>ĠA O t:8uƏ.ƍC"իXc" bjQ0sLchD̚5 媻ʓbn+ׂ oKRSSMjڴ)7oaRZ./Sz ''Fϝ;ptt&a՜?x"00/_ƚ5kpkdDdZYYY* +UiFjj*n߾իŖ _ŏ?h -OY{o#ȥ[ 0ݻwGnгgO|=z4Ο?_aU>A uvv… ѨQ# 6ĢEbV"-Zw]h۷oy!''B1gju_6l`9u ={`Ϟ=HHH[o͛3U3ZEn;w1/^ /ĉ[ XF9w=.] <<Gƍ,Ybg?ÇhӦ qnquw}<FC\xYXNNNyv>chjHH 4k֬ĺpW"c̙qơYf%*>wž}P~}백cukZW^#O>)DT䝛Z^zaҤI&_'''cĉ^՜+DpYCpb%| ٳg׆gǞ={F罴 U Zm]eff֬ػw?T:<³B#kYgxm[Uݨ*WfN`""""t -IZZUK*XY#DDDD@ff&>}Zz>}Z5(HkZZVDDDDHff&rrr`gggXȨiJDDDTfdd@PrxAj,UV"""jJӉ+V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V"""" 5}|DDDDT + W\Abbb5ͭ""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V""""5V*V ^߃.P۷/agg۷o~CXXfؽ{7A@ǎhUd2ӡ+=a`-]]vӧOqd2xyyyndff"66ZYYY/,, :t@ΝT!ADDDkL0]vŞ={0{lؿ?:~qaĉ˗?@PGtn:3gSW= .`HIIԩSѩS'"11 VZA?C K/T{wŵtUJ͚5-N>mV[r%~m$''ĉ͛i,3tPkׯ_>#O +VR,>%5j|}} WWWe~+VoLRJHHѾZj8pl;vIYZ :uڧ$999t&u:99y\ yu| 8M6j׮]5m3U} t5zo7.J{B"/dyYQ'o;JR{:88҂?6ڵCXX֭3gO>e߲]IDDDDUk)=y[n\.Dzea]&!..гgOc3|5~Jkam֭4s[y&_.Z ɰw^6m`̙}6`̘1U:vX`˗/SN?>ӧ_m9eĎ#ԩSѣzYfܹsXd yrG r {W厭vuV[< 1]AD֮];\}}eJ%/&7ox{{>/P?4ǜ25َ;ck7Jjx .]+W`…ؿ?njFDTm⧟~¡CoZFT"==O>-`׮]8t`ҥ 'n߾mv#"pa\t q݊+0drΝb4iqD"#uVٳK.;@*bرضmgmܹmҖ ,\`kkiӦ!""vBhhmѧO\QQQ3kڴi߿? hۅ[xx8z-X~=0tPlٲQQQXx1Զv s=8\zڰaOPdJbǍ y6sU "qExzzMVcѢEѯ_?̚5ܐٻwo|'9r$كǏ&L@b̘1V\.Ǟ={ХKH1֭  Faĉ&m Ʈ]0~x={da<,,ży0h ܻw6l;}A&]Rۊ;9>W"J%^~eؼy3˸J &ݿ...f!*8%@$L~\G"-- iiim666=z4{=\r@!{аa0n8TO?ҥ !ٳpqqAӦMqԪU ѣXv->s|_f "##};wիW7nD^qF$%%"##1`(m%+s,qQH$'' o,X)Sݻptt'O*S̝+ڷoJoC*VSܹS7n &&[l#Goĉ @Tj^` P .q8x 8={8r233ѼysHR,^ظ\.R4y, ؼu <==m9]J:>W" l@JJ ϟ+WGذa\ǎÃJU*J@ܾ}W\رc5FV{,, 3gDݺu#||ǻm6`طoΝk~,m%_>[lÇ V[.JD˸d-[?;v,S\x!!!&Ӡ,]C Aڵq |7&eN@@5;*ɳΰ,ɳlxȞ=˟6<;G'&&Z,F777k7D`ԩdXlYOӦM5+QSNk79;;#99ƷpJLLT*5dUhtyg<}ay 9%č A["::7n,n8DDD5ʕ+r _ůj$""111YX:SϹ0YXVV@sa`%""0FѷjNBX5+QHKKchZ-Ҭ݌a%"":?JB\r:V,Z!""@Z$k7Am)DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$jU)yzzZ DDDT%&&Z U k)ݾ}M """Q8%DDDDDDDDDw"""@* ry'5 ZYYYh4V=zCDD$2 j՚L.C.CP -- :M18%0V_rjͨQX,LR1Vsr*ͨ1X,LPX T 9WV""" jϹ01111JdkkÇO>WqU^/_6)e˖pttD||<كpرc1a GTTŒ;v,|||0eʔmQ(6[nN<իW[TX:u*Ape[}b֬YH$x zm.!*}xѤIHR?֭CBBI9___ >ӧ_%GX+Qpp0uya4iO<~ؤܤI0g=z>Ǝ~>4)w)}ҥKѳgO|Gf3Yw\pTvuV[< 1]ADU&Lc̙3gX|~~I]*Sر;vv3 a$2 })Sp@rr2n޼iR СCd\ƍujZ_`Ŋ/\6Fob`„ cXb܌ ]p!ҥKOOOܾ}ۢeVT T OObˍ76m2 2z[nڴi߿? h+V`Ȑ!rx뭷`СCeDEEaprr2ckkiӦ!""vBhhɭR)Ǝm۶a߾}Xt)ݍw s=8:wp>>ׯ.\XDT 8:u*t:q}ZZZ-o\j2f2I `CA mq=x䚢7oƀкu5\%a՜yF]Ν;H$h׮qL&q@ff&4iR.ʩS0g?ݺuk/UzG_#&&;w6]67onRe JRg{hܸ1ѻwo 6 rwf=^^^_>w^zY= 󃋋Y呝M6aT*; 44pvvFpp0<Ϝ98p`;?\\WWW(JoƢsz1n8̝;>RRLDDzݻ~>}:;X QU)D&֭[5j<<< qM,X{5)o߾xW1rHd2ܾ};wX{ml߾ܹs-RN[3gDݺu#|;y-ZSLҥK!p1L6͸_>[lÇ V[KV{ð<ˆל@DDDDJՊ }AzWbո|W&Q z=޾n:}`ʕܩӦMCDDvڅPŕ=<<AAAX~=87m۶;wFxx8<۷cҤI&m~W*bرضmgr<ӦMC1dDGG6+V!CL[o!<<兡Cb˖-ŋdvnؽ{7|||=8`q,QgCDⓑ///rݺuacc8:????~ܸ7oޱT`ǎ5kf̘a* | F={LƮ]0~x={!((5ĉ:uꄅ ^1|@VcѢEѯ_?̚5 4hŋ&L@b̘1V\.aj<,,̤ޒyaРAw6lwww B J'ŵ$iwyÜφg˖-h׮ϟ]⣏>ڵkRDBB~߇EU<-\'ODPPsaÆ Ưmll0zh{r ܑ֬YHrZЯ_?=)))k?Ǘ_~Yv;wsÆ xаaCH$r=ziiiHKK+p\tR}ݻaÆaܸqƑO?ҥ |fBÆ aooƦM0ydB*fm/a+J%ڷoFMKKPx{{HLL4LHH\\\ =ΒEI}bNϜ98p`ے YÇ3f瞃+{6@^н{wԯ_ӧODZcL.h2DUTL[naԨQ\.͛7`ݻXnΜ9Ʒ~ \X{W0h4̜9uţGUjt'O=nݺٳgy-Z)S`ҥd8vMfܾm6`طoΝkI˪>)_5>#lٲ>Ddd$Zmے Y BV#>>6l0?KbȐ!]6N8oƤK! $y^< ˒<ˆٳkótbbbA pssvS:u*d2-[VӴiSoJTԩc&T8ggg$''6RZkWnnn @@YxZygSHX@ <X~8p qFP sX`ʕXre믿_aYGXHXHXHX,,u\yX,,++MJϹ0YF[5j %Y+QHKKchZ-Ҭ݌a%"":?JB\r:V,Z!""@Z$k7Am)DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$jU)yzzZ DDDT%&&Z U k)ݾ}M """Q8%DDDDDDDDDDDDDMnEP@RAPRiŎ deeA ++]@``%"""RTUlmmMBK$T*BB@Z'O@XKj4V"""gggЦM4k Ճ ==G\\Ν;  HOOGrrb`%"""QJS z=z聀B:88EhѢ^y>|7ntpupp >|AU5+!^Cz7 ͛7/BWhkBBUꜜ`kk WWW=Taՠ^z=z4\]]닜Z JRzqjY888^3ՊPTV믚͝;3f(Ǐc˗SN=vۺu͛7mmm1flݺ fǏ`ݺu0a,@VC_.j~/\!aՠVZE5RNBHHR)4h.]`ɒ%vZYYY0zb'E7oܹZj^Ǐ#G ..]EDDdkk [[[yUY௿Ы( ^0RZ'OҥKr .\hԯ_C ?Xh}2 })Sp@rr2n޼Y6[T*z=ڴic۴icǎYƍ77BJJ4d2&M~ {Ň~h}Ŋ2dY}&H0blݺ{ҥKnlرcm6۷dܹs}pB>p+WDTT0g|&u1_~E~v[[[z4ou7oxUEEUdj5-ZìYpxxx ((AAAhԨ&NXd}7o {aÆ pwwᅬ 4hРxbˈ_~999رcf͚3f˫zЩS'̜9GFfff,(({'|#GbϞ=Ʃ&L@`` BCC1fUVA.cϞ=ҥmu놽{Yc׮]?~<Ξ=}3 ځDD5^ zq+tMEv*2nnn8z(/ȝݯ_?])))HHHڵkXd};wիW7B"`ƍ۷mۚն"O [f ytҥ .Ĝ9s/Ǻu늜dkkc,lll0zh̟?W\Abb"vލL( 6 G\\޽O?ҥ /rIe...hڴ)9bgfDFFڵkıc ˍ_}9::u8tPlzZm uVTh;@sXEƍ-[po8qR/6P*f 7`gggu;w ݖ%K $$111 {b޽hӦ  %K`_L6hRW\)w5hJк Wzq\p7qٳ#G͛Y۔C! gΜA.]pIuDDQEVdTyX+QZZZ#jx)Aɓ~a…AHHD1cƔJ?r֭ׯz-?rΝùsЧO8՜gŮP( HL!''4ك`Z \1yd\ݺuþ}JUiiieޢp,]v >>>5Y߮];Aם:u sѭ[7">>]v~(ܒ%K0h 4mڴ:|fBÆ aooT*?@hh(`$&&c̙6|9998tOgr:ho]f+NS*Qff&ƍSbP*ٳ>j5wɓ'nٳA),, 3gDݺu#||@ܾ}W\رcq]߲e ^yd2n¨Q\7ob3[d f̘KB"22/̙`|刍Ell,4 -Z)S`ҥd8vMfRݻo",,d}y>}/nύ*̄N>]҉u +h4zF@5;*ɳΰ,ɳlxȞ=˟6<;G'&&Z,FPFJAW^y#DTcSd2^yt"u:tvL&3`𚕕2h<_pssCtt?T:<³B>ð<ˆל@d /bbbVF3ȴ4HRܹ"N߿;wB*V'O*j:V"+ٳ jLddd@"`֭c>-- [n5}XJzz:T2VJooo,0Ǐ#''  +H誥GXlnqX*ݻwѩS'$%%Y)DD V|W8xXHTND^_hͻAb`%"""Q{2VqaAc`%"""Qc %^DDDDDDDDDDf-%OOOk7Dk7Ja`-۷o[ DDDD5 11111111NWDDD"RP( i1jʂFvSj@DD$2 jAUr9r9 ҠݤSDajPnFJDD$*a PTnFJDD$ MRgVyXDU?JDDDDJDDDDJDDDDJDDDDJDDDD۬F˖-xٳnE['Oի]B^Gvvv/cEڼy3;ݻڇNDe [nom̙׿O>2 ~); ++ Я_?L8>#Eswݻwxpi,Y}&HyfH$ܹs[.X: {nݺqPT>?zIIIp{$$$Xc Z&McXz5A77}Y`h4,[BŽ(GA@@LT*E3g@ȑ#ڵ+|MP5jrBW՘8q"Kj‘#Gp]$''{zz"660/_ 2Q~)|||hpMHR4i 64?&&999hٲ%^z%>>4h$7nXiGۈ4Qi8qYYYhҤ ԩcw瞃Z޽{jWF1h ٳo&Z7oqfo3xgϞŎ;#FMy7h|Wx)nkkkRp}(J,Z͚5C`` vi폆*k%7n6mdV #J}v8s /^ j2~]ru,\۷Qn]-Z@\\~"ߵk㑙 ^ؒ7ē'Ol2RAY~طo5kGÇՆ7DQ-Z%0a1c@Z7o {aÆ pwwᅬ 4h'N4,SNXp!^{5?χMeлwo|'9r$كǏ#''wŬY0l0DFFO>AF˗/GDDn ߊjZƢE ̄_~5k8Pq+VosaŊPصkƏgϖؾc*O"> ;ӧLڵ /^D˖-!/_AKGrrq.lI6l\t_뻺qA^6m͛KaUX+ZFZEQ(6lϟ8ܽ{~)ѥKc;wիHNNƍ!HqFۈD۶mM.>%ٹs'\lذ... Fʕ+HLLݻ1o۶ qqq _[auss\.ѣG8ia~'={>cӸ}͚5ĵkאivJsLiYޏôm5Bz_zǏΝ;֮ vBsqիxH$4jݺu^/J 6mbX9JB˰իupB s`J:;;"ߧ,h4PT5hJW\)t_''' 2_|VZ,7n@LL lقsgϞq,򴯤}ӲU=NR6mڠcǎL8;;7߄^ FUajӦ G/dݺu7|Ş[Th5wzܼy8( 2 d}NNNT%T*aaa 1 Z(o ɓ'Gvv6.\ŋͯ*kJڧ>!>}@'˗/Ç1p@hѢBTzmzx{{~%?qߏ7bʔ)i&|w& Uk%ڼy3 PWw܁D"Avd2+NhҤEwd2ZjU`[V舕+WE]*nԩS3gƏnݺEP_^=ƒ)OsDD0- ^^^8vX;v?.\{b͚5J6mZkoӦ Cy)v \Pԭ[dL&3Y^f K㏥ζm۰yfリJ{n߿k֬ѣ{ի -- BCC ggg#11 v 0pww\Wrr2>YfaÆG@@T*=zprrB޽ ՟???:堼VV-P*h߾=4 RSS -?n8 ƍ=ߜ?ƒ)OyTԯ_(,U-8y$j׮ Db<@Raĉ_A&MZo 0uTvoooL:=z(qpM4ok֬e0gxw,g6m¦M*!•?F߾}ꫯbȑd}u-Z)S`ҥd8vMVmGa˖-x!"## ^sApp0[r"66nʕ+1~xL87?nm۷c߾};wnojݻwɓaoo[naEuƔ)SPN;w&L@NNNQR ;ƒ)O5Mnڴ !!!h֬> Qe;|0tRt#Gv2&ho0l0=zݻq^zEn3\)4'\cڴix7СC4jZw1\j& E@$:ò$ϲ!{,hA ܬpψvSS`!!! ȑ#٫JzQ!J՝. 6ϳ쵐0,#ϲ5GXr_۷o׈J,fnUCg%Ҙ1c""#DDDD$j DDDD$j DDD"P\u3< DDD"e&P)3< DDD"h8bWhZh4k7``%""4*@"--ͨQxY+"""tx1T* r3-&ZYYYY@DD$2(N """"Qc`%""""Qc`%""""Qc`%""""Qc`%""""Qc`%""""Qc`%""""Qc`%""""Qc`%""""Q㝮JM ""*.11MRXKnQ)DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$j DDDD$jQRTP(˫?HNNQmjʂFqD"""dP.drr iiitnR)DDDaPnFJDDda*aPTnFJDDda MJϹ0YGWk~ΕDDDDDUcb„ 唔={V­[LJ$DDDvݻ7222x L</2Zq}`` >C̞=N2/""˖-CTTqW_}xyygϞEO?Ů]~~~>QQQ ) zdggW{D&a޽;lllc&ڷo_M4T*n:$$$Lhɓq kwX+٩SDwwwL4 ˗/Ǜoi˪m۶FRRt邽{=z!!!xpΝ;CVk׮&qpqqm\'JѶm[|駟`̙~fff_O4 իzjoooHBS.u ;>J`h4,[ޓ$C AΝ1w\rL6 |̙prr„ e\|kƄ SL^7 (J_~v۷B%Jj4>CzвeKrz¡C=zl>nܸ:ѹsg;vę3gS㺖-[B"Dzz:Ӎ#t( #G_E\\nܸ;w?Ftt4 W_Ŏ;+W`ٲeر#6l ۷ & ** ǥK|r4innnfrkzz:>}j0Zʲ rrrd2wn ;wR4/::$֫Wvvvذa4iwww6???=zdtfuܸqشiJ}z!CoETT֯_֭[KR;۶mþ}tR G>}rJDEEӦMC1dDGG߮ϒ$ NNNzq]ll,>|___2%%@]QT&ߒUU V3f̙3rq/R)Μ9HGA6mAcǎ8~8pcy\_|&o߾<גhϟ/ӱ޽[~aŊx7q9Xj0a"44cƌ XjFk.?gϞ[aaay$++ uߓiӦ RRRX2J/2~gl޼en *5ad~~~8~qyϞ=:uI^zѣA=LN:{, //9 7_~A6mj2^"]vذaVըUVG"A Add$RSS -O?ٳ˗k׮ٳ'v؁aÆaܸq{XDDt邃֬YJad111@@@> Lfr-^z%PTPTA.]`kkk,jqqB"_4Tu;v,0ڴiSf;==0!;v k֬իWxbgϞ~} .quYYY Ϻupy|q%\~'"99WT8!%%W\qFGX+N3p|hҤq ۱cG>|ظ|Qhٲ%#˗m}I=eqMt (*ZL 2 d ''!Obɒ%&n`ԩSmNApVqa2x#Vty?&' vBǎMgϞ-_-[G& z=+y8y~ڵ+Uؼy3 `rBTQ W 07:88,j ׯ_ǝ;wS d2Sw+kNի>?.t_sYʋѣG4n* ]vΝ; ۷o`ccc\#74 @})ppwf=^^^_>w^zƍ899aܸqGTT 44pvvFpp0qĉbLHH\\\R,E׮]ѬY3!!!زeI|1n8̝;>RR472SN/\]] &^z&7! 8deǏիW1vX_HOO71}tI=z(4i@:Uٕjj^1W_}#GL&۷ ٥cʔ)SΝ; &/h"L2K.L&ñc0mڴܶm|||}v۷sεgFDT͚5;;;;ܸq֭39VRaH$:t .4 1vXӧx"BBB% E@$:ò$ϲ!{,]7A _f̘aFDDBDduԱv*3k|rmrHLLT*-pȪ Rh< ^ y<2,^sJ@M~ """20Ua%""""Q+Yݘ1c"""111YVvs< DDDe&P%\yX,Lpjn}N1VSZiiinFZ 6jDDT1t:?~ JBVuZYYYY\D$ Z-lmm"""4M8))MEBB"XU K);;M ""*YXKA"@"""*, ?X:nUAtZ f2PIR<}!""*ӧƓXZ:O}pY=z5EDDDTȭ݀ؼy3RRRн{wW\d2\|+WD&MеkW|_|Q^=L::u+/`ժUxYf]? zN֭(JL>=z􀋋 .\ŋŶ,8ZF*`ի@ɓ'iӦ믿鉥Kϯ2 ׯ:… Zv JSb&?b5 oիWoԨQEll,\]]:VX~8x ֭LDDDTa-TW^ywիW/^D֭ѸqcܼyXƍ8p AСC#GDLLLкukO۷oG`` T*>| 7n4Āp-:sKLLD>}q:/N<#FGs{ŶYX#""* ^|E!11| @(ڵke333nϞ=&MyaÆaذa&VhХK1[ v&e?~lV_NNt:;EUV?$0DDDDZ}gϞ&zmX󲷷deeɓ'm۶aÆ &咒Ю];… 9s&\`a+b\Dˈرcq5O2֭ZƤIТE tݻwcƍ8p Ξ=_ rrr]vCqoqm&"""* E@nYgXY6)έYcXHlΪQܠ Iݝ0c%8P ]+I7 _@rr1f힪qxBņUM; ?SMȠwCFb`%"""ӷPaEUn[Zmj;sC ZjV"""/VМܰt|qjYqA :={n>sX+->}^zHOOիWzj\|nE) zdggo 0x`lǞ={;v,&L񈊊BXX4Lb[[[>|:޽kQ o>*}vq~A{=4-o@h6SY5k% F-0o<ܹsj /Ǐ[ir˖-+WL4 իzjoo;uBBB ѺukrjY1S{Um;`lylW K-DZ[5k%dӧL3gqMk7 4CERRq7 ԩj_|+V/DrrP掮:~y5 2V J"J!Ji eEy1p@4mwŋHRo߾]6Μ9ŋ`kk?@nğŋlllw^;@ܹ3}]4iIIIؿ?_O8=z􀭭-_bGTT {ڴi߿?` CXXXfܸqشiIX5zX%  Ν3qqoC[nhܸ1_ }8p ֭'Ob޼yHII)>666xWWW$$$`عs< ?.z ;;;=z""riU掮Bйk[^?']UرfŒ3Uy xbk8<ϟ P3 `ժU刊{666ڵmѣGªZƢE ̄_~5k8`!((5ĉMԩ.\X˗/GDDn ZiѢΟ?_wqqgwO0rHٳ857ży0h ܻw6l;}A4ݻ5k H|'hԨY{ԩfΜѣG#33""R7p^W]ϫ-z w,U8JpB̙3/"{[EDDҥKHII ₆ BP`ذa?>p]|pttD.]p1rjת/6mGGG4l SN777r=ziiiŋjB~vZ !!k׮E``I;wĕ+W }VQV-㨤$ <<<H[Gq$&&b,իW7B"`ƍ۷mm6m||>>ׯ.\O^3fL\Ѡyf#jM.Z.W,_GR!,, '|Wfekkk7,@DdqO*fz$,>ʚzޢqJ=xkwH$kθN&qqq#Ge˖ɓ'GqBCS0g?ݺu+hL–Eye͛7c.* p=d2㴊ehժrJ\~Ν;`r)gThW?P:yZIT*>3t7;zm=[o@Ddq.U\ (_iD>>ؾ};ۇs疩o>c*F L۷o\ҩ̙`|刍Ell,4Y_nݺ+Wb8q"o|]s-Y3fҥKjiBI? DD$I8 }7,X!H Hǩj]S! y;]U E@$:ò$ϲ!{,hA ܬ""jE?ە>w޿N A!'S^[u,RIX.i7!{+ҔVbb| Rh< ^ y<2,^sJYگ-wM"lg7 #VXȺb[{,XH >1.2JJ @r{Fa`%"""Y <`rG>sGXHmk.i,4Az!Y], DDD$ ,Zv#1!".1C`f״C YLH\W """qN迡o;hTJrgRH` wNDUƛ $p9>Wcx$?A"W@z(7rtr1Hάr\=@?RHʐw[&N݂ؒnH2Z+OB $ 1SKv\Zꆥih@D Z Ě8H$zn@eX*V"""\-w5zBeҼA5z| DDDT#$7DcP>V"""Q Y+H UJDDDDJDDDDJDDDDJDDDDJDDDDJDDDDJDDDDJDDDDJDDDDJDDDD[@DDDU\bbP0۷"""SHXHXHXHXHXHXHXHXHXHXHXHXHnQZB_ P7lkYr vxt@UkĨ7VKk^HάvX DDD$j}gUШjnP^NձВud\.͕?S/ 9NvO8<銈DbêlIDATudEŒީud;{C!T#1Nذ"ǪQv-u-X5M]乡w]5+YW+hjnX :|>8O,8 W=7Y ZƎǏ믿}vL<*uKRcϞ=MV1(W=߿`ٳET(52:7X"wΪ eYpBQ5OdNBHHr9ZnP?.WNj/ÇC}`ʕܯMڵ Ʃgѷo_DGGcƍ%S{%0i$oػw/>C6L>۷oǡCO?O>&زe ~$ F[bϞ=Xt)N;v,mۆ}l+LIKjiп 2&}~z8p7nD۶mz-X~=0tPlٲQQQXx1̮piU掮Bйk٫0Z ݻuصkƏgBBBၠ QF8q"`ؼy3v9}{{=t 3gѣiܖwb֬Y6l"##'QFfL&üy޽{O>ȑ#g<~0a"44cƌ XjgS._غu+M۠A,^Ο?àAp=lذx cNDDU+zj~^ld1ZD"BCCT5k 22׮]Cff&jժ~aڵHIIABB֮]"7w-#66Ǘ_~iRf۶m3xnڬH$=8=Ǖ+WeSݙ:I&Dы n!xO'(",ϋKݡI<˹fI$%3WfdV=VTUWL$6U]5=g}l6v=cz400g_Vooy}m}Duq]pAnݺؿO?T:v-cvޭa j޽m=вڮn|#G8  ̚T3V,ƍ_K&&&y\.WneYz+:::B?'1eYN<fժUzuwhʕ?6lؠGyD|>;::?ߝ-M7ݤ>kddDwwiIjsiuuuIs_uZqlKYb $\_cdY,˒mG٩]v/Ю]4::7|3vGэ7ިM6ߞʷ+JSu9P(ΤIUܨ>%*IRë%qxDbHsg HryxxX!IҝwÆ Վ;+$dd265r?T* 1R֯_6F6H#~K'4ͥEH>.#F`]٣zJw},ҵ^7L&}饗^߮UVi͕ѣ>UV顇-ܒg;tvܩ[{_^кuݭ_t߯_|QׯիeÒ/뮓1&V8ƴqFź+fmpU?$#M\xg!Į]4;;{N\s&''ĉ =7г>۷X,j޽ Μ9;v'ГO>o2>7w}Wvmۦ͛7WU_ymٲE;wT:֩St)j۶mz駵}vR):tHs꫋kF f순[Jrdszi9Iɜvi+YUW7+5Lϭ{xm[mkڵ>.+ν]9qRNv!/5 <+J}Oʳ$5>>^OrvZִBcoUi=1/{\c2d}sS]]*Vm sšnxV8w;iG505c;5]%%~- 2ѬehrΖ?2AtVju LLtb8'O LI&.k+Y~JuuiX@K14zX_>VdK+ 90=C0cIs7lY:ğMD`gQiխrԷAj]ǸVV##Xrrhusu.fdJ5'ߗ*au]藹пn$q*K,+mB7zcX81DG`W7U;45!۶/ǨpjV m{\aH^ cT,}`+To"&} `#K$G`M\.#\\ kB֘?Rl6P6UTM]IXcr,LO,C333 XP*455Td GdY٬}J`V6o+!ЀL&CDR&a(Op+BAhf533RTV XmkjjJ333jooW[[4~ mX,*+˩T*CXmk!6ȶme2e2fh"oPuVG`]ohu{H G`] ސ'W&7 A (@cq;Z- F`@KXLf֤ XTT r@XhiXYyr7-Z!۝Nҿ^m?N/Nevg a/۳t_TGښ`)T͆BېlK*NLLYGG&&&~/ XoTT`uj\mfX$]]]mAU  ͣV}Q%[+7::AOO pIrVŵj_j%I&`i% JVqn [f4_إZUTF>kкcѯ(#өgKjEԄVZÎ T^WKjU_V+nuL>)-@^T$5h_=6ؠ6hjX@wR}ThM?+(Jl=C$id*9T8A*U Z]-Y;5nTW>jjж$RUh}QZX'f?5'5ZƲzZXohզVx'N ڗ4 R@S,$jX$!XRK򍬈 QR '[;t1.3~`55}zT@IBc#u,'Iu! mA5%tEXtCreation Time2022-01-29T11:40:49 CETl%tEXtdate:create2022-01-31T04:06:48+00:00r޿s%tEXtdate:modify2022-01-31T04:06:48+00:00tEXtSoftwaregnome-screenshot>IENDB`lxi-tools-2.1/images/lxi-gui-scpi.png000066400000000000000000002274021420007711700176010ustar00rootroot00000000000000PNG  IHDRt"=gAMA a cHRMz&u0`:pQ<bKGDtIME /8|IDATxw|SOvI[Z: -ClA+[**7"*(nQ!E]tPg?jr6i6ʫ9O<&99_k["le;::+ѵ ZYKNN@ ;=!YJFtYsK4>>e2YpMM jkkV՚;/~ BbHRd2䔔|;,S;Tx;&Yf\`>3N\o7﩮Bu)WWWǏ87NϹ37M$tkY:gaRg1_6555g"""""6WWWZ 蛓I`Զdj5T*JBDDD7 Zjx{{/p3]jQ3gOגD2 Vin8+{ZEEEt !v.>k%pK P[i&95H///Wp|B0T]]t\^r( gVDϰ\hJ;NI===4(_kW$Du3G圐X,ADDD7xzz>@ ˗~X4لM2 /ذQ"TS[[ۨra&s 0zr99'&!m """B*5 ˻`>kH`aI$s C۶Gغ c"""Z D+ 4̣;ctiiHP2 BVm\1GZ}~8:c"""2& H  s(hZjաgjWn6oY5AJo8M5<܋7ȮD"Z}Gy999v1x`6Z!C૯.T)SFpp0jjj-[`Ϟ= 8q233UuB(n5k`͚5Ͷ[P4[׆ пٳXf .^1rƶqahL&w܁Çol{/wAnj?D\a묬jZoM|noRٜZv".XOhOK._J\bX[oX4Էo_lܸw}7Ǐ'U)((ʕ+d Brr2:wܹPF,^M7R B[n&;v uuum݆>}ˬ#2dn&^zY,{m!00HJJXW_w܁ 9sׯ~[oͬ^ȑ#Q\\lp#!!EZZv܉o=F{ EEEVW_A >> ۷/ƌZ[o.]&zzz~Ò_(JAV[޳(ٟ'OZUж Z...m5u'/-I&S!9.aDžPkUX3I2לӧO<ڗܜ0tժX󫓟9s@VzӦMM7݄bŊ2K* //...XbwD϶vtRgee̙3 E||< e&MaÆ7 wq.]blȶnV&?r 0 O<ooojٳѨ%| ^ D_~;wFnp%[o2[6'_hZ&v!ϻv¹sdÏ/xѷo_=ɺl#r 5uk_2R1ǤZ6{ .D$* -xpMNBVi!/UFøXWdEx"ã\&Dj~V.ǥkǽJxno rN-GH-@>)}BxK/RSNEyy9/_nj_J]v{ uJ%^}Uܹp@ wމŋC.6ˠ~$2ll?g1>>>pVX BBBP^^t<쳆mXd FJ͛7>3ٞ 55VٳgMGܽ{70n8>..VT*'… J8p z)A^:3VWWk׮ن#Kab믿L&СCP(uVpwbޗh!2lp)xI7wBZkuH+ > L_=D "Bexv'\.WB t7noB"… -I0H,Z;FcT*Vse#$$=~7pIe˖aذax"<={̰~ʔ)EJJ  fDDD`ǎpwwرcgyzSNEVVp7gř3gRk!??[n\\\P[[kiҥ 틴4ǩSpY2dΜ9 >ׯDŽ #00Om:IP(/ T-[`txWp)|w8x 6l؀={зI&]vELL ɓ;o,'"330`yhZ_(..FTT-[cBVcذaHNNٳgq-'@YYKՆ.\lذi;ou-_X#55GEBBx \vͮ>DNw`;N\vgsuw6ZX.h汥eBQü/1o'b|K'L\Ta2\`HwDH_x2Ƈ0 \$Uip{:{wⓇ08$S0c}K bHwʮF$+4jGybN*cBGj8z[Q*Xx1x {ŽދÇc(,,4ܹuDt:wtN2$s?8fϞ n:ݻgΜA\\\u) ̝;?<0uTL:o|aذa믿c=JTbڴi_G={믿o1tP`РAM_XXZ>,|A|Ɂ@ ŋm67jS~~>&NZ 7 P!Cȑ#x'SOӱtRs=/`@vv6VXavR øqڪ~aӧOǩS_aذa#Fc}X>+(( j3W_}~۶mC .`ȑӧ>3 2$k^55 sN>6{[_/X\o!$++ ?Z-&Lŋcʔ)Xp|Fɾ9t}***?oH}… YʷtM<6ĹZXpg+FcxޘC p}L{qwBUp& =$q40J!qIeS ͭT.vs "1?VTT@&5SIII>}bȑ>|8nVHR?1L`{7n4tظq#._l.ǎ'0>_#GXٳg _31RO=dMEDDa8qIYwwf뿠^ٳ'pؾ};0b1)))Xv!vpww7l Ү]ce/ عsg'0`Y;v,^ \{ ?0z)<#k7bV ՟+/pYtxL<={F5|yxx`W^yno F-ZdgN{/,QT:݋ŋ#,,Ij⵵59&tz'jp"_–?T JU |y* I4_\ߗR4zn/B+3 4 >}:RRR̎x#0sL%:}4N>o~!bcc!pt: AAAm#Gyyy8|0m}Fwww79LV &h?Ǐزe mۆn :u2o w}hBfכcsn6 >FŠ+0sL$''7z> `8=tGeg,_g᯴:h3ڄP*ظq#f̘8QK71jnsbcc… Xx1]~>DII 'b-G{]kC[y1eA9tZH>>>Xt)uf#$$,X&s|W KJDJZ\|~!RdqZBe SU8] uPRRoD:"kt:d2fkֻwo7{ʠPUU_~b-2r=4f,[ 7o9ٳ'QOh=z)))&egI%%%t$&&Z'߿?222pEM69BZvŋC {>W]nͰ=C5i>hrM?Lˈ,YsZbmּopڽ{⯿j@W_Emm-~3;qI;SEu///äN{g9X `FHHpQrO?j-J ;4orkHRTY ++GnY} w!n&]V!D>ARgrjU/ 9:pSxx8FaU]شiJJJ DbƝ>\XlܸOFLL /^Wٳ8t 7bϞ= CEE/_|xW~(J?Z\CĥKзo_|ȑ#Q^^͛7On+8x ֭[gX;vZ!..uuuC1sLTVVӐnٲŪ6M{Lbe{pww-:233vZ̝;K,IbDΡk%]t֭[q$&&Bf(7{8ѥu/_ŋ q ,ofBUTJTj'FO%*t PwD 6{AWC,q>2k}:s6a%zn v@ D7_~Og<6vXbĈѣG>|81vXm_|nݺ!##.+C*̙37nĥK=z //,j72D+Wk׮Pػw/Z X꙯ 'QQQKduuu={6vލ]b„ H$[O?EN裏"22P7EV#//cƌQ^^^z0V'|+0p@x :֭ݻc„ ҥMb}Qddd 44?͖qqq X Q*{1;eeex饗 ƨڳgKb}8w=z6mڄеtTN=pӧzpD|Fc|n9GSO=erheII |&AgMD >3N߄ o9jԨ$}aL2驱js3ԣ3r-[`Æ t_ڤR)Obʔ)fnd#G4OTӧ!зo_}ݍ;W[[Az틏>Rƍ TA'@qUL>Շ\sy'0{l]~aХbԩnuswwo򚰭RPYYiuy???oP}_kt}3ey%Κ5kwu LAA~G]Ϳ!lܸSLAΝ[ï>6oތ#G6h`HRHHHhlZ}av1U:GX}ITVV38BGDD:XzS~Nm ,u3o* Bp ֪ɚV5BVꑺ֌u&tDDDDDtCPTթT*( 5&tDDDDDth4BL&D"X,PX2V Z:m" , +KuZaj@DDDvDlWf6;,]㡩m1DDD:>KΑVЕApZJ#8NLVCTںDDDDm:I] Ҡs***9!Z [7]!]UԻ aC: teif\h4(--\. ϩspj*#sDDDlU R$M$"""""DŽA1#"""""rPL興:""""""n\GDDDDDdS>>>Vw%t(((h9v\9(&tDDDDDD bBGDDDDD䠘9(&tDDDDDD bBGDDDDD䠘9(hVjm""""""B!b1D"R[7P[[dVEmm-lvG戈ZFu3l1#"""""Gd:fIDDDDDr'tDDDDDD:L興\)طo_}ADDD'ODvv6ná* HMMEMMjk.޽{QQQ\.JBZZ233m=DDDDDtۄ.""(**2, NC^^Ά/zGBTBPu%SNñ~CaaaxxxxΝJBhh(PYYb[w݀˼<aH$; eT*Q]] DyyykBԠyyy8|0Ri|A(4%믿PPP \]]mUDDDDDtۄNRŋH$dP*HKKAkkkQZZ ???Pڵku@Rڵk*"""""AmB~… B^^ [Rťt0`p!6:ݞC4BC,&t:F˳ѫW/tsѵkW޽JDDDDDD70STgl1\n6h4jrL戈63֖JFaaҥNp [w ri d2=P(&3]d2xxx.[P[[tu*J#000{1???\N:޽ EEE!22MfqK\ooo[o:dF0FF7Q~/@jj*RSS}vT_|GEZZ̞=bww#''6mjqgmƍmXD8x c8x rrrlٲVzE{l{Gsk_ hӖ kcMx'|:kc7k3g4gM=mknCDx{?_5^~ 3gfΜ dffbժU Ylv튣GG@ ͛tRCDW^yw4 ֯_I&a˖- &L9s ,, yyyؼy3֮] ~޽{v;wV???,ZpwwǥK~j=y_ub̙8p }YHOOիߚ}'OƊ+̾և~h2''+ BVcɒ%HHH#;wDmm-nuL6 K,_|Wb͚5Xz5\gy!www$''_ڵk7oT*ŤI:voߎ_뛫5b1+ԩSo&߿IIIv~Xf fΜ<-.cl֬Y7onFxS 0!ӦMoÈ#xb>...rl߾{O?oWFXXu1 0l ѣG8px1}}rİ7| xqi̚5ˤ HII둛k<ذa~7\x!voEvv6~w|G e|Iȑq2ݻ3`>}}qazǏGhh(f͚"33?֭[gv;v/** |r9d2bbbp1??gΜ+WqF;w#Gl+8}4 ;4FAMM jjjK_l3tذa}FBBB,dee&eϜ9X Ӓ ҥKb{HNNF\\gu=-ѣGdee!550_ӹsg̞='Oߏm۶᭷=cu=/ā͛7_ע1s/^|]e7;lm?۷o͛o$@ 3<7EXk=-#^N[|.m5#qw^޽&-\zjcM=OK-DDJl4eӦMѭ[7̙3 ,իW _<ܹsӧɲ4aP\\ ///wɆyyy(--5zZ 0h 4}݇4٧O\r1lѣGkcƌѣq뭷:ΐhyyyᩧСCH///? OihIgΜk׮\=mk5""ge ]QQa,HO?ϻҘFXNZ6YoX_GůjuGǏEEExw'`ر DRRl]]<bʕ1o< OJIIAUU |HLLDNNN>mH>xyy^Cff&j5>F#PUUe@{xZzJ7oƣ>jr> 2Sjj* ֳuVTWWgO0i$deeĩX~=v 1ziZ9~ O=y֢ /_6yNff&ju=@̡}aґ_\cbbO?԰L,ߥcoLNNa]hh(ג~^d u+V`ԨQZP'>S8-}]O,rrr|b:⵬šX?ƍX,ӧ ˄B!Ǝk%mt ?cMX'"!~W( /zݻI޽{###z+++Q\\lr~ɬǐ!C,SQQPCB'ѣO1tPNÕ+WLk>wuv]2j8qΝ;?Ɛ!CпsBC իqa\zeee mkΟ?c=:\]]WW&۸q#nv~z*.\`%, 7J/^ɓ'c„ `ɓ'ox,q-4:zZzBФٳgb2r\=bnnn~4h4fO@HHHuǏGBBFmL4 xgзo_쬱i&<ҥ B!{9/rJ̘1O?4w޽{c֬Y׿ŋC*K௿2/0{l 4zC=ɓ'fkr ֭[!C 44F?ܢ:z(xDaa! iZdffbذa x mm݆sgEUUf؄ p1L0:sF>|8VXA!..UXd xpuuE޽ѻwoʬ_7|3Ν={⭷ނܶD"|G?n Cʕ+m2ug}D̚5 m۶Y]ZGyFBxx8LqƙGÇ )J\|T*P(pejrL:[n59gͳ:ۼy4Hdh ѻwo9־ǚ~nmoe}hm6i)ִ2~G4h:wfmXS5Ӓ} C.ھ};g+/Xp!p<8qD?b޽(--Ŏ;p27oRٳ1|( \p<`„ #G yyyXh^~eL8_5݋?!H+V`͚5R*0a-ZԩҰ|mב#GpBݻg <ؐ9soĉP*[53!C yf.[pu5<Sg}@'O'hQǏN:5}a;w.ϟ˗/㡇2]բ =PWW˗/'/b(??8^xdgg_6\z}Y,\o&|||pU{sZlCNZzW\Ej*:tn6abb"zGy66FDD`̘1HKK3$&ּǬmzM}g?;@}.iOseƍk׮ŋ&u߿cƌ͛۬VkbaMQ=9?f/Knmw6=Ν;w:2l:#'1p¯7;///߿[luSlg""":"""""VLBDDDDDD9(&tDDDDDD )\ǷZvDDDDD2=˥P(D=\P*G޽w^( $5[M7݄ HMMEjjjmwdd$bbb/\<Æ 3lW߾}ѭ[F/))wuUUU|B1ZlֶK$DEE! r* iiiNbccѥK?pqqA@@d2J%233>}ѣꓓ>} ;;EEEVՓ˗/|||GJա}U7,C]] ˔Ja@HOOGff&b1p-BkX]]N<ٮ;w* Ceeɶ9;Ob1$ jjjjMuTVVа^>|8QPPd2?zJ!qqqqTUUQ{777(Jdee!-- ::t(rrr4xyysθ|2.]dն+ TTT$ǵkנ ˴Z-˛Zö!44www$&&8peee^+** aaadP(x"rrr \JA  ++ .\0)..6IRSSWWW&tDDDDtCs"##1j(7ZW[[Ν;C$Y|~yy9222ЧOG8!cnݺ!...]޽{qYDDD <;@II ȔtÆ CEE\ҪzӣG'B4"==PڵkpwwC$A$A*ƪGtt4\]]P( NswssMPFGG#::ڐP* dddy#''/" (--5S(ኊP]] ooFo:t]#""""Gv55HQQv tƑ#GLjo߾'kI=Md刉ALL:Fcj ˌGXP*CVVQXXhZs&̄p)sڢa2]^^OOOeI$Fk׮ؽ{wsnv5GբEEEHMME||Cd2...ɓ'M&Di \hL"""">Ph&Nj89<\.o?(63CGDDDDDD1#"""""rPL興:""""""ńA1#"""""rPvc8x rrrlٲFe;ĉHOOǎ;0tv)cSСC]0l0[w%9)Mr9JJJb dff-|r :O?4n68p~)ۼ5|rl۶ cǎř3gqCDDDDDd M.]^z |  Eb#GڵkqadffFnn.M֦e裏xpFEEOn$"""""'d ]sD"B!jkkMԠo߾mZZǑ#G j5N8ۺ 9lBWSSǏcƌH$¤Iн{wtܹMXC,Ÿ{8EDDDDDNa:?>jkkqqcԩ矡jۼLs*BRA"غIm݀둙{nnnpuuEaa!>3\z4{n mUDDDDDzNڵ+ [@.7ZwIbr-8uꔭݎЉD"ooo555|2_~Err2`a֭zڪޣ>Gůjn0w\o5k\]]ۺ; mB憝;wGDD`̘1HKKÈ#3gDDDJ%ߏ7xUUUUk۷ ,ܹs1|\|=222lݝDDDDDdF0FF7>eee vT*++QXXhXT* ɛ UUU^OVWTT $$ކ&[jj*"""ʄlnϡSTx"$a--- jP;wH$j􄗗̮JµklUDDDDDtHpuuE^^ ˗/#??pi 0wqJJJPXX\C)]B @ ʕ+-  08tjkkmUDDDDDtۄ.77iiiDž(..X&aAΝh9rŇA^v.\0)]b݆9lP?e1V"b())Attt_O]EErrrp%t޽e2GDDDDD6g#tZriB//~MF@HFcXg:""""" %ƵkPVV:txb;B,FN ЩS'Fhr9""""""[pڵkڵ+zPBTKX+ jAAAIQr lE@ft?N`LX`XW}_'4FDDDDDJ.7[IIIP}_ktaX~'E!"""""1#"""""rPL興:""""""ńA1#"""""rPvM:BFFvڅaÆٺIDDDDDDvnD,_۶mرcqlܸn]ۄGÇ{… L>M#""""" vG1>>(,,u󈈈]ɓ'ox,q-ԩSn]ۄn1w\o\]]ۺiDDDDDDvn}a6m~=222l4""""""`mݺ[nu3ݎQӘ9(&tDDDDDD bBGDDDDDz˶p gںIDDDDDDm={l1c %%6mD"ATT ˡRfv}qyxxΝJBhh(PYYb[7]&trF¡CLpvNDEE!,, 2 /^DNNկ%Hpw!..pidee||| OOObTWWҥK&%ЧO+WҥKrJ%fئbNMMEDD\]]]&tJ6I`gH|BCCӧOAAA0`QZZjk~!rpjkkѥK 0 %%%`>X,[nSLs***Tdee5TCCDDDDDmO?3%`:enB4R%$$dVuuu h8|T 777᭷ނ7.\ s3g&JKKOF,X}GYYÖ9r$w$n(..6̘1VVm!""""Ys*?Pә+hk^`͚54hQVV'N`ҥtR裏_m~ڴi;w.qek8pCy4||{{FcmBGDDDDDdl99tDDDDDDd bBGDDDDD䠘9(&tDDDDDD bBGDDDDD䠘9( 2$"""""j 'tuuunQd2>Lj:""""""ńA1#"""""rPL興:""""""ńA1#"""""rPL興:""""""ńA1#"""""rPL興:"""""" իWm"""""" 5ƄA1#"""""rPL興:""""""ńA1#"""""rPL興:""""""ńA1#"""""rPL興:""""""ńA1#"""""rPL興:"""""" ]``@DDDDDdw"#"""""Ƙ9(&tDDDDDD bBGDDDDD䠘9(&tDDDDDD bBGDDDDD䠘9(&tDDDDDD H$uZL(y:eN"غ DDDDDD-&Jm'tbI9DXlf- PWWFc% !J"$GS$"""""aBGDDDDD䠘9(&tDDDDDD bBGDDDDD䠘9(_M.[oűcǠVq뭷/((@ZZZ;wA.ȑ#0Cբ/_V\pssRDJJ ***L^K$!22;wX,FEEQWWg,J1tP9rնnM<3ٳP(Z Pآ J၈={qqqDuuW^5ꊼPHMMEeee Z[-ۜ/// 4Mͅ'bccQZZj8OH$(--EQQQ Ȍa  o9x$∈nDHJJ Z y5 bBGDDDDD䠘9(&tDDDDDD bBGDDDDD䠘9(`...Dn hRP(Z<}\bzj5Wĸ:'96wT! zȌB lD"xzzvH::k C4[8db1:uĸ:91ΉquN-k[D΅!ܯCxosh\rXHø:X̸:!91ΉquNƕɜc ?ǖغ suuND"Z\ϸ:&X̸:!91ΉquN9p:}SaMVj*vb\Wĸ:b7$eّo&&Md6ƍߎݻC.#77;w֭[ ebbbLbf:֬Y8L<lwqm.^R&L1cdff/mNxcoܹ~ڲ 5{n˶doܳg._CVٳXz5m]li_T|ovT*[wSk&&B޹7Vd$u+/|GsPu5 u3oH3o߾شij5jjjM6K.&nvt:"!!b}֖;p~7o߾xrJ S[kߍ7+HrJ,ZCff&BCCfRȑ#-%/~itgϞEII bccѩS'[oi.z -l_}a߾}%''ۺ[=;gΜNСCtR[wj87ѣoZ]t")nnP[ Ui d^Qpi8BgVaa!:yA(_ƾ}LvmHNNFii)HZ H,]Ą W_ٺ[>>,B!^z%_g̘bx7QUU JzqbȐ!cKj?F4<#PG5O{~[n}݇Ee#`֬Y/غ;BQA`www|֭PVVfns8\W\;#t$ҾG')".dn C?fh4h4_Z-QYYi( K}2H$(//Gyy!w6"<ԪbdmH@@[WmybvZ>|qf#li`tm LF'K{y|/-Ö#hk}$Q򇵦03#""F{Zkb֬Y52om9sV.Pxx8F(;wFXX$ Ν;&4vĈ޼V[Ւ4#88_~%͛h[oj*M9|ֳ͖Xؼy3[osC< ,Yb HG9 >=&"krOTt#NG(KRPb7|~}3/n6DMy:T%<)fÇ1c t:d2`ĉa}PD!==x""##brG% \]]m-N?̙3j!ɐI&!;;6^zUqmR?s'NĆ tRٔ7ɓ'cРAػw/lbrXnV9pu78g$@*9awկ//|O!(8ϰ; :g7#!𜭻®: J%; &TEEExGh>D M@-T*qq}&-,,5|ؾ[Z[j$''c߿?ƌoCT*żylNR<Ғ&ǞcXz5GS{ǹiӦvV[yFX^>·ϣ&D2Oh xb@cRV*AM9%&Ԡ#dM%&&[[Β8HRNN7##:}AHH_ҚmBB:Zɓ8y$+lڴ @ v`i?lIll͖gܼy3PPP`.r gx tp WwԔ]n9R@q&1TW"rwPBoP[>3yH!-$ r :6ѫW/trt=t:֯_o;aTUU~X,ƒ%Kh^$vذa2dᦏ-/}@ 0<+--e2g ͏?RXVTT@(|csh45(: B Go#d@!iSPBYtpNN]A ,TFUbtxk[ʏ=cĈHKKܶm Ν R.] &&2 ֭ùsl75k֠O>֭[q%TTT ** ;llLb;|(JwP+ e+//k׮Eii)\Xle޼O? J~sf-)KX|9r9ں^Kb!7i1տ?zO? EYhjJ!B4Ƣˀ TdGшeiCMMrXt!y=]/&t-?ȑ#?~< *nDhZȑ#ؼy3Ο?oMTVVb֬Y>}:ZL?09rlBoR.++֛yi.ٳ0h DFFB  -- | ~g[o K57-]%e"jGEdd$222l7Ď;탦 )ۆˀ  1i*IAuQu9t">ۑ^w!P"{/w(<>=t}Mmb7[o-?=D}_sIn48M4C.Wĸ:'9Y̵u:LyI4@9 _F7MFybBGDDDDD䠘9(&tDDDDDD bBGDDDDDlЩj[7ZIX\Ǹ:bǸ:.91ΉquNM.PbQ+ClЩT*[7Z1quNsb\ꜚݡTW[7ZbgNP&hP(,g\Zf\Wĸ:Nv1C-Q(':ٺO;'hP^^l9ձj 1ΉquNs6aR@2 %xo}_`}K7_KHHȬjT*  !EI h4(JTTT@5[qu _ W¸:'91ΩqR jB˵vzȌB ~>FϞ?P@@oÛ&aG EWĸ:'91ΉquN?dO:DDDDDD bBGDDDDD䠘9(&tDDDDDDʮftuu D"Bfh4TϨXlWo7Zf\Wĸ:'96.)"75ꠎ'C4[8db1:uĸ:91ΉquNsji\;]r7cpø:X̸:!91ΉquNs6 +߼H$z1b 1ΉquNsb\Ssq(6O\\\ljbǸ:.91ΉquNsb\= p\MM^ø:bǸ:.91ΉquNs<#"""""aBGDDDDD䠘9(&tDDDDDD ,vH,cȐ!x뭷0qD\z:fPW\;v}饗{F3d,[ ϟc=fnܸq9r$w\\غuǡcobҤIbgy{/ e^~e1}wpy<&ƍo$;wdL[bk.b$$$ 88jgϞիmrhkT &`̘1FMM 233_bVCֱ?1csچlӪ*cƍ8rB!xƵ 4OC⮻BDD|}}QRRSNaӦM؎M6AV^^^شitbRPTT}^ʕ+!6҇z3g6Z&Hj* E^^222p[wCkۍ76}jjjL P^z {_VX&jILg̘bb*Jm-^c) P(oѭ[7xyy搮79r$#pHRhFyPK,g͚i蘮Z xבD$''3mxѣqi&G.Q18B׀FFPj(..Fee礥aժU{Z>'>ᰰ0H$;wն #GÒ%KLbkxgM_x7o6?F1]niXGb16oj:-- Ɨ_~{bǎHMM5zּgu-^^n0vXɓ'M1T<pX]'v 5pa̘1:2 )))8qbHD"1ZW_AR~9s&***O? NO̜9Z2 4iRi#GnƓch>7mc9yd 4{Ŗ-[l]zcT*ܹsĉa,]0:`M=t-^mp!lٲ111/g2k5nݺܜ9sp!?nT'v ЙT*q1u]P@ooo7:Ԡ ?&O#117nltCd.pZJǏwm1'On1MHHMdϱLLL^urr2fϞc̘11tPHR̛7zS,9mӽ{cƌAii)>Fc\x-D;%%;vP(Ę1c 555-,..Riiifoݺw.\ZQ t:!!!4c`F57o[KEO<'O⫯¦MЯ_?~!`K~NNG?Dnn.{q~♑ٳ'qUٳ{D"xeҥ {9t:_lk׮aΝ 駟)WUU~X,ƒ%KеkW"֛JF 1短i``z>u,+**  NLO>&,--e2`2ڇtÆ / %M1 ?$ ^~e57c7Ƕ?еܹsT*ѥK@&aݺu8w|8pΟ?o_={֭[q%TTT ** ;}][okx6hTvڵ?5kЧODGG+lNX|9r9ںnbkעW\X,Ftt4`Vc=C#bij?ǎ-܂SO>Ƶ^zBll,K\x{F3_ńj#G`MIGe*++#`[:dee5,Rcc\Wĸ:'kshj5n0zs興:""""""ńA1#"""""rPL興:""""""eNVۺ J:q5;q1ΉquNsb\= JuWĸ:'91ΉquN;'t .2[jFBaq=j5Wĸ:'91Ωv'tP^^7h4(//oXj5Wĸ:'91ڸv'%%%puu D"Dfh4T*hW.nԀZf\Wĸ:'94) ®:Wĸ:'91ΉqC.9(&tDDDDDD bBGDDDDDjK^z~׾XIDATv]վ1ΉquNsb\/[`H$፫l$2C$ ...(//Fiq\>btԉqu2sb\WҸv8o^Ǣ4qu,bquBsb\Wdm\;:WWWyH$cŌb\Wĸ:Qlйغ JMŎqu\sb\Wĸ:'{:Ḛqu\MŎqu\sb\WdyBGDDDDDDÄA1#"""""rPL興:""""""eiYX,Ɛ!C[oaĉz*t:`͚5۷/N+Wʕ+_c󌟛5_}U9ӦMCBB:={WFvv)Yqqq6m\T &`̘1FMM 233_bٳ/_6PV3@9}71iҤFӸ8L<_/cݍ2Ο?dݸqp{Ů] 6իBzz:6n܈#G4* ꫯoߏ#F0O>z+"""PTT[W^53NCAAN>>Ȥ`sNlݺ%+S 5зo_lڴ j555¦MХK&wo(**B߾} /`ʕ w1tPt:yt8s `ذaxwl57^xO?4t邳gϢԩ௿¾}o>dffRRR Ο?;pt: :K.9FӍ769m@ h|ƌI$\-Bll,򐙙Pt֍1o#mۤ$ݻ qqqXlbbboժUDFFbҥ8p &LʤVų>GLT>#P(www|w֭PVVf.rj9r$#@VR)Z-`ݺu<f͚a?ho1lC> P^z ɯֈapò~!66Q3f`ؿ?|MTUUB!R)B!c*VBnn.^u$$$ 11&Z-͛cǎϚ5qmcDϞ=w^ꫨ@ Y_~\brss5k֠G5jf?zKFGƕߩGh4h4wZŨ4Z p=4Z}vt(ÛxD"Ayy9m=N L;kP(2mLB@ >EEE֪C=dlƌAHR̜9x7L^GBR1mbpq*77 00Ъ16D")ST*l2BN#99]v֭Rc@hhU]j={%?m#j ƵyLQ{AVcڵ5k|}}[TORRj5BBBva\v 3f@׮]a_BX͛7jj4#88_~%͛Vp9s-Ftt4QQQo4DsΡ:V֭Ǝ 8yd6l@AAxƵ4㐐H$\pMX}v5^kK01kØ1ct:d2RRR0qD\rEG$I_ {=HR̟?bSLAw^l޼]sCP*xq9`ĉذa.]jɓ 1ܲe7i矘9s&Z-d2RSS1iҤ W_AR̜9駟LUv0קbm6:t[lALL ٳQ9BUVA*b޼yc\NS1 }??F"""0rHhZ8qE]j9{%?ק#e< Rcǎ?{wԙv ZQD\)6ZV Jnue3.Xӎ6uiA.TE\ *@͙` u$''9'x'Q]]mP;5HnݺաBǎéS v.&&gq/D'ū#G"..&L@ddd_ZڵkC3ǹsSO޽{}fΜ~غu02@>}ڜ'c~t466"..UUUHNNǏ#++K@|̸WTTh tpmw!T*a\tI:oLߥX޿Ί)WXЀv>$$NNN(((;ʕ+  WєZ9HϟsNlݺ#FH$2)ݝ1 O`xg;@.c׮]:\v * AAA۷EyolQTT///bʔ)VmʕHIIARR]ؽ{7rss퍁B*320RǰD,_;j 0tfR[nHMM5P ~3jrgΜA@@@cTTTo>D"`Ϟ=8pIb -呖7n:]EE222 Ϋ;w.BCC1`r\~]y16@Q1c`Μ9ػwދ*455aŊXjk窪BBB1zh5 o 6˘Kdx掫1WD5a4SiW~+_LcƸv@h;h=W$롯2qO}b\jy233H(5*_qSiq_?ϡ#"""""U,興l :""""""łF#"""""Q,興l :\nEvR(zc\m1qO}b\j!v/d2PWŸ'>1qO}YʖLP(PWWy6r1qO}b\S[q,/@*r#! RW"W;ĸ'>1qOƵ3H,@sPYY 777ҋDP(dFhW*67jA.3vqO}b\jLkg-Ϊ̃qO}b\jWĸb%bAGDDDDDdX(tDDDDDD6ʪrɟ-nl/k{]պ1qO}b\@xzz J"Q+HR(6׌+Y'D0qO}b\퓩q V1mQ'0E"0vqO}b\jkgxAƍ988MmH$b\jWĸڧY,^йXz Ŏq]}b\jWĸ'k :].^ø.Cc\mjWĸ'>YC,^Q#"""""Q,興l :""""""łFY,VL" ""˗/Q\\ JXnPT(--ůףXk>O<bcc1p@׿}v(JTUU!776l@~~cl2̘1C'!!!c_ 1UOd9rDg㏑W^yE'x&L>۷[Y삹bV[[Wb˖-8}x4M:eeen g |ghB.ŋXv-n޼i& g'''L6 qqqECC_4?~\뽘;col9BI&i^+KСC: 8|0<('G>|8n \xyya֭њ.++ 'N&N/GGG^/Fpp0n߾k׮_~ךϞ={{nܻwQQQ?GGGK7] щ-[ڌ.T^H$yxj*vputs633騫CHH>gVV~G[CCYK,e2&O pT*"##GY9xb,X>>>x"*++ ̿b̙O?~@yy9w}VX̒ӣ 'ODRRb1,YQg+VXn?cرcXljkkbZIIIAII w^tCAAncpBb{8v^+W...:1U0`O? 1:c:ہ.3WFQQD".]h 77yyYS,QWWҥ ???xyyݻn*vqDll, 0|rGzJzߎg-ff|l5k֠>cƌ>]vYI]=  dT*QQQVǁ~~~prr?w?<455r_LTBP@$ 1-//׊&L\cc#PoR@&YY9cRp9WaMT9?!J!J-L6~ pvv* ߎg-d5Ǧ(((USLtsX5tz 0?8֬Y\#11=z!rƽ{|g}CƍacfՉC=5r8!C 440h bΝZәP3j~~~8 ./Νkf K( DTa炂HR"-- III2d̿bj>Mu)rۗ. K=N:x=[+!^Tܹs ͛7OYp/n F3.]3f?Zܹ'O / ̷/,L8ܣc3;vкѣ: ׺TK7ͳXΜ9>(ӱm6K7]8o L>ӧOlj'b 2vk%3z|б3gϞœO>jпJ6lKa}1꽞}Y /_`Wq9<Ο?;wb֭1bD"o'XĶ}VA :?Rpp0x6OVjunmm-;L2>EWZҥ $ n߾bWkKii)>'xݻw. n/J^2?cc 6mBhh(p2"XVWWK.D 9((999BL$4UUUPT̿Vb ۷/Νv튘d2퍷z * _}WӪ@_|0tPl߾W\Auu5 cǎaŊ´sAmm-v튰0Y~=222wu!((C iu;XrWZgb̘1xyf.\uU5gL-R"O?+***e!X~=PXXD"\Hct̿Ϝd>6l@TTyAAA֭֬Y3rdF`` qFdgg[zU TSScܹ ÀԄ7nlӧO|D֭[ꫯK@FFijjjs"44 \. dy6m˜1c0gݻW Xr9sv횥W~SQQo>( PPP={?!0sƒܼykCW^vĉ:@TOFjjo.g2i1ؚ'333\7M}w興l :""""""łF#"""""Q,興l :""""""eN.[z We(vb\jWĸ'k :LfEv2;v1qO}b\j!v/ꬢ%( }qMrqC}b\jWV\; :J܈mBT*ms:նr1qO}b\퓱q K/\ TVV ...ppp"Q+ d2{"ZU"͍Z匫b\jWĸ'SjK!`\jWĸ'>1d*rIDDDDDDcAGDDDDDdX(tDDDDDD6\g ?[Z^~qn}b\jWğ-†R,H R 5JI"Ãq3}b\jWdj\;U k[ -mH$b\jWĸ'c,^йqApss1vt...^j'Cc\mjWĸ'>1bg{#l0PWŸ'>1qO;tDDDDDD>,興l :""""""łF#"""""Q,H$1}tCR֭[ÇT*JKK믿b(..=z 'NԚoBB^y,]Ԛ׿pAT*b#::hjjŋvZܼyMeԱ^lf̘됐aZ\z[lӧuO`„ 8p \]]QTTÇc¼fΜ"K2G<[Nekӵt,YMb)GE~~r9}2g|,Y#GGDD>cW^zPg:99aڴi/pu`(mKS`` 6lHIIuaغu+K׽{4iz-deeY9fغu+r9六[Gk,8q8q" ='(//ñxbZ bJ'OJ… QQQ-T6/$$D'[lщuff&QWW|' wttĪU"88oѯ_?ҫ0W w޵t,u.\X{ǎ6^EEEDXt)#|Xcر8~8-[Zҫ0W<֬Y/njg}v.󑘘]vСCn g޽{0`O? 1:|_oooƢχ\.|HTsp'3Wc&BDDPPP8ud2oooh>ҵkW8p@?( ( UTTq}AAV^ 2e _"vttT*T*ts4R BH$ĺ\oIR {4'R~kJ%d2WaxSPPUV_cby>;HHHz,>>^f戯7Ynlly 1WS ooodddɓuN&!33&<Gu,~3`>G30}V,D"aW*fG}||&Y裏"==n*F3.]3fzǎZ[=z reOCK2?k̙336z;wO=XqqqBrreee>}XzUOCKKu^v-}0g|޽3gO?hlݺUg%u1G|sssꫯbȑÄ  '''$%%YzHjLBBBУGc]h>JySQFa8,Zhhh@CC333!Jq-ddd ??_x}֗OOO~@899 'Ã{̬X'''^^^ Ŕ)Sk.kנRw,~iHppp:5255f`n߾>,yVc\qyܹ[nň# CBڊxM0УG7NuBA4o111ǰa8HW_}[lњF.̙3u]fU|`$Ι3^^^$&&bÆ ˃ | ELLp*=ZZLL &MoooGgĒyr W;S5u񭨨7|2(((y1"+dLW<}ՏqErjkkqYKMph.D4ogxxx1hfU!uۡ>ټJC_e\mjWĸ'>[dffPkURҸC#"""""U,興l :""""""łF#"""""Q,興l :\nEvR(zc\m1qO}b\j!v/d2PWŸ'>1qO}YʖLP(PWWy6r1qO}b\S[q,/@*r#! RW"W;ĸ'>1qOƵ3H,@sPYY 777ҋDP(dFhW*67jA.3vqO}b\jLkg-Ϊ̃qO}b\jWĸb%bAGDDDDDdX(tDDDDDD6ʪrɟ-nl/k{]պ1qO}b\@xzz J"Q+HR(6׌+Y'D0qO}b\퓩q V1mQ'0E"0vqO}b\jkgxAƍ988MmH$b\jWĸڧY,^йXz Ŏq]}b\jWĸ'k :].^ø.Cc\mjWĸ'>YC,^Q#"""""Q,興l :""""""łFY,VL" ""˗/Q\\ Jprr´i0yd qp1u0|pa~eee(,,Ŀ//ƪU M_HHN\l"uX`|||pETVV"88:Dzz:O>:eeeԺ544X)lR&a .@R!22}&o\g!6ׯ_ j޽{gܻwQQQXf T*`(Ʈ~+d|GxGQ[[ . qqqn`oa ⛕9rkƎ i=>zh^ JFDGG[zmQVV'O"))IP>>>EAA^|EC JRg^WFII }ƎiӦaΝ&ϏOׅ B,ñcǠR-aFŵ"K.Ett4bbbtt\EEE^ucMLLLD]]K.ػw/养wZlUϟDڵ jRRRPRRGGGٳݻwG~PPPvC55vmgy'Nį%Kh޽;*++-v~cj~߳vC=}4J%BBBB~={RC=\v @sAP(pa"111*DDD ^u#tz( ( {J%***PSS={$=~Xz5`ʔ)p_#(J( D"!娭7Rp9WaMT󅣣#R)RtD\ԄRrhg\P|۫~+ꫯ_u35k0_Tpqq!C@8ȑ#wA!;;[k7222pIQv`Aǀc͚5X~=ѣG@*;v@RRj333!ѷo_:q}衇␖$!Aolt3fMG y>77/++ ?tl۶MdWc̛7N 5kF5 j>k*C̽8ypꫯ,v~cj~j^mŷeA7|pƍuPȩϟ,b1bbbP\\W /_F@@kU)<΀z={O>$W^Q & ** XpD"t aΝSO=\9rH899!))Ik>hllD\\3gbm]{jiӦ...HHH@||<^z%,X@q5/C5~>gJ !gf+SskW3K. !!!ٳ'ӧOcڴi6lFr A=P^^.\ k׮ҥXzm 6444"?;v_#F@$L"!!!prrj̏LV\ϟ?cΝغukqHNNFQQ)S`׮]^5255e戫)d2RSS1{l kGh+0oa:t(zb=zG# `_v }UTɓ1c |L6 'NĀ~N0УG7Nht&v H$K$͵qUUヷz * 7ny'6m$$$ҫ@D,!ޗ̫#s$ ˵ʸZmmm-GGG,Y=z׼YskΧFϢ 999Rr"sѐJBDDp+))a=A#t#/DUU !Hxwޭ3GpvvƆ ݮQ MCNNΞ=1c͛_pշ`Ŋ*-KR"O?+***t~g_{jȜ9sPSS] cyk׮Űa4\| <\,Ü2Μ9R WWWhll|l1 B-|]?Й3gO#::Z+~,ڡ| }Q@$!??{tRĭ[pi {/3?:q(((0*6m˜1c0gݻW7ou_vW׮Y"rgΜA@@0܋~ϴi4ѹu+߶b\mCkٳ׿s_ZFMM s3g`Ĉpݻ'<ӧuwit&ph)xL}_q_}s=3T1p0mwWƸ'>1qO<Ը4nи*tDDDDDD6bAGDDDDDdX(tDDDDDD6\."P;) 1PWŸ'>1qO;t2ҋ@d(vb\jWĸ'>YC,^YEeKQ(1vt JBTtm匫b\jWĸ'c$^@\\\`EV( d2DDb W;ĸ'>1qOƵ3XՖRWWgUC'>1qO}b\TV1䒈LǂF#"""""Q,興l :""""""łF#"""""Q:WWW!//o޽;F?v'''DFFӸw^S~ DZ\|ppp@@@z!H$TWW#77aaaT.]RDXXΞ=a2d.^wлwo(J֭[z\S׮]1d /_RԚF:555uZ{RQGxA֯_?CR ;|%ŐfC=ҥKE.]P__>|8$ \\www455A"iŋR0p@ 6 999:߿?!z~ŋpuuq]xmm0O >wA~~>Ѐk׮i-u"""""g5 zRxxxk׮4h***VйCP ݻhhhZ}}=jkk:JTUUac]t{P^^H???x{{Ikt=PPPB۷oW^Z1DDDDDDj ۷tݻwGѥK!77@CC<==QZZD2dԵ6GyK.@^7oč7CaРAwԄ*\t ݻwGpp0N8B #,, q֑:uᣏ#u5RSuu5khh;zR HgggTWW&WWW444@Ph.]\\ I$ږ=zЀ.] J>>>/OO6ҥ}onnn4h<==Ԅ_~E8JDDDDd (o߆+z=zHx޽{(((sP(пGÊ޽{{q;wݻ7\ܸq忪 .\۷Czr'++ ޽;ƌݻC,C,6cǎETT\\\gt<Ri4tJ 95CV[޺u ݻ7 .\59^zΝï L֡8Y:\۷ocذa(..Fcc𜃃X ggg¢L8.]C]r(JtըDee% ዾ!2 pwwC=+WhKCC._WGE=PUUgggtEѷ/B* jT)J\p@s!zT__gggH$rA&i}mmuזyqSO[Әc(..'Ǝ T펈Y:yX^uu5n޼/\\\RG.]н{wO<6&ܸqÆ ͛7QXX(5r.]BMM0Rӝ;w0x`h WT_93 @HQQT*~ 8JBuu5Lj>} bܾ}+ݻϣ &=޵kWxzz E sJKKq e1Nnj-[^&w.UUU(//7˲ugv"E7J~_3<<!"c<:GDƲ|a񂎈ڇbAGDDDDDdX(tDDDDDD6#NNN6m&O>}7n@ZZ;~?z;vӧOB08uazȑ#x:e -˔)SPVV3Mmm- e>}ZMg*XxDGGMMMx"֮]7ovJ;R8ׯ_GZZ?5k~۶mzꅴ4`ƌB7u!$$Dr9rKtZS ^sZ\z~ot^L;Z}0afϞ6sQZZٳgC&M7|Νof=|!Gr([Nfv!nM&WȱL-~̫;w3 ?t{~g& ;ĂΎ/All,jjj=z 88-[0o<ݻuuu6mB}}=>9<*++?P\\ uB}v"nhhкzaOꫯ"77]KTbɨÅ 0l0DEE_~={vٗŋ ŋB=p>͛1o<۷OH$ؼy3? ??^&!((!!!O?~ot]01Mx2ȕ*G~KuD6H$^{ ={8;;IB~zaHϮ]0o<8::"99r :Ǝ GGG>}k֬ݻw!q ۷NNNG]]v܉_ ,СCQ\\+V_~Yg"ST*;wpss3y:ggg+Bnp|‘Lܹ ##탳3P__ b\Rl~/{uwI~wكӧ#>>_}U [aȐ!t[.aQd8EpR\\5G BUV EUbn8w` Wȕ*|{d {wFBbҫNvR޽{Rرc=C!//OuHII/?OxǑt0z>mXz5 ]tIХKtSNō7p >oJ%~TTT ~!}YtMk]&'))I ˗a"oe˖!,, ٸq"""_`Μ9iӦ/_FAAV,YPT 2fիVMKKCzz:cػw/>W_}0{0w\(Jk޽{b D"|70`K.鬳iruu)vܩu8zβ.88aaa8{,.\JW^y 9s&VZdHHH[5k,N93x2|r.T+1Cz9bCw[^.pq Gj|J (?gD"<.iB2/j';ƂΆ;vL~NN^y5 qqq0a쌅  d2l޼?Ӯҿ3>J={K/?ܨQk׮e"]Ԉ-enq],?n/G(wvqy\ v rwVyߣ PAdعs'nj*>e߲TONNSL]Lťy0߷>+W"%%III:#o˖-Cbb"{9=z www({рhgjeoYsݯuH;[u1גB(Fqy6,** &LiH*c>ܸq­vABBP;zc=&uPu6"HxDFFb}kÇ7koi&m֦Sa7nW\e/**_޽{#44c=_5k h"!X,f"ܧpSsthWY Fur9inJ#R@;6u,Q>>>裏4__~%PXXD!Cvm|y'''NBXX֯_cǎ_~5k̲Κ礴( |駨nuΜ9cb8c;u  6111J:G"[H$Xb\]]QQQv=4իWw 4|rrrP$''رcCuu5e ]h }ٳ3f {9l޼Y:N嗸}6!J[=o̲kJII~н5ֳ o6Jpzghh(Ν[~)s٭>N*')qRڻys?]Ԉ\1O$)ꇶzZnT6%m EQcqDNNqoAYYпcٲe&]|\/m6^ut})<<Z7gggRqś)J,\?|||HLLlrgΜ[=lE~~>JJJPQQ_ |r.ha^}n{uԙ>))IGFff&^z%вkjjjŠ+>o=_~ex{{:Rj*455_mEF5(Q =GrFvW"%bzJt~@ xrڀ=]B]#I#?\4SiW~+_LcHO&"CZ}|BD)YzшȆTmnsooodffPkURҸC#"""""U,興l :""""""łF#"""""Q,興l :\nE "P(>|BD2/WL=Ȭ!_Xd^"!r PhvҋGD6 :U'"( }! YVם dZz1,_T*0"2HP@*9 "ˍ%gQGDz)*^ 4Q\\\`E""+P( Mo9f>H"rr.AdU "+kGȜU}ө3:|BD ֪dC.t,興l :""""""łF#"""""QVuK^fZ2Rj'D̡#YEvrpp'%H$ R) O5%Dd`C.0-mN|BD09K: :777&L"2D"O%Ddmbҋ@D6P`>!"c19XCxA=`Dd C9\BD`  :""""""łF#"""""Q,̤W^b oMk?X,*'''L6 qqqECC_4?~֭CHH9rK,bÆ [NxyD"ܹsyyyذa[]>JR/ ԩSQVV3Mmm-^-[F/+p=T*ͿY}v(J<dnXy!::x"֮]7o=d>nmO< &`puuEQQ>۷]333;h| &`(,,i28xv`=??-5CFU*Bnn.6n܈|'< .^3?hXYŋ#66555x"z`8p?#//OHTZ󋍍JBSS:2777|g:t0i$DEEaѢE8wkԄaÆaĉ>|8q=i^Рu?332 AAA '|?Fʕ+z Lk׮A.FTbɨDž 0l0DFFo߾3gcA~[}cرCAA]'O ?ÇcxoBTsGcєbhдw^( ;QQQԩSԡ bAg̟?r@7R ž?>k.:tHg~"111*DDD &\^x :HD9shu+W...XnәƐիW"K.Ett4bbbHTbfkDt邽{^^^{n -mk1vX?~˖-Cmm-#TNNNnWR$={V2(Z]5k֠>cƌ>]vs֋c؜ֶ)%%%%%pttĞ={н{wׯi:+ HM6EO,|@ccM oooddd{^MG>}pIXBx_ɓ'֭[qQݻV9::b֬Y'|"$_J7"77?0ƍd2|8q"<<lܸaaapqqЋVtVرcZsssꫯbȑÄ  '''$%%=ߐX|9k׮eϞ=bDFF"22/_ƦM~[Kн{w;PJ%6lؠq̙mOOOGcc#PUUd=sKnݺh`AhѣG \h;]{vi3>}}+?~YYY CגH$BnPQQSuv{s??u)nӦMCII \\\xKX`{N:SNzÃ]XYعs'n݊#F@$7a3Z-691;88xUU{97+4\XXJaÆ AShh(4 T"ddd5Urr2PL2E#`ʕt>jw7zf{kЗ cpww7i*Y|0<778p R)<VXI9998{,ƌ{7o$̚5 ]tQt^w5 -BVV6oެ3ͩSPPP`|嗸}[yG"O?+***er{Paemk~:֭[ 2۷oǕ+WP]]AرcXr}kJJcҭY`d2ggglܸz!"S09[dffPkURҸC#"""""U,興l :""""""łF#"""""Q,興l :\nE "b(g0K!_Xd^"!r  :lr}\BDV.,/@*2qArRO"2csIgXz@PnnnpqqDbEDV@.C&Z\BD`j. Vꬪqv190!DDDDDDd:tDDDDDD6bAGDDDDDdX(%/ LD-'D́?[<==,HD"\\\ JP( N|BDa.!"s05trɄIDmH$ls:"2\,^й1aQ$ >|BD`.!"sh+tt...^"!r  :#"S'Dd,"2k/興}X(tDDDDDD6bAGvW^ban!""kb˲'''L6 qqqECC_4?~֭CHH9rK,bÆ [NxyD"ܹsyyyذa[]>JR/ ԩSQVV3Mmm-^-[F/+p=T*Ϳ!}v(J<dfo/S1334|&LٳgPxж}J%7"??@^ϕ+W"$$O=*++2 ׮]\.Gcc۫e;ለɓ'ۜmC޽{P(0vXDEE!88SNESSI˯T*1yd… 6l"##ѷo_̙3Cێ[[ӷ?~<""" :X0ԴڦS-ۄayN͘el^2gjOcv37bccQPPC.hT*@SGbb"vڅCO$!&&QUUy /C"==| _|1gbaʕ(** ֭[Ǿ}t1d(**H$ҥKJJd:*J$%%ٳ—@H3][ۆ{Aѯ_VmKbb"]t޽{///ܽ{SAbuMWsh]v ;r;ᾳ3,X4@{O<7|ejϞ=ݻ7;m455r6OOO,^dxyyeLJJ'bnan1Gnd 㓞ޮvj+OkZK0= }odxC@JEZZqA\t]?~<ĉkL{oJ~#%%%Xx1o7@PPOӧĉXb0b111(..իW4wo߾f;"سgܹw"""UUUzzH$?bccT*Gp:_"vءuoѣGx駅'Bb8p|I`zǁ#44gϞERRT*^~e$$$`̙Xf ;g(J3gF-[lc]]V^e˖!))I6͛u֬Yx"~yaطo>ƍ9s&}Qc۶mFnmd,[ړ[w#|}}ѧOod;Xq1xW1rHa„ oHHzr,_еkW{RRR̲gϞEqq1"##˗/cӦMY?í}ݻZͤT*a=n3glt466"..UUUHNNڳ;f<2uTL:U9]{;s0?d2:u 1115j,V2<ɘV^R3gjOc?~3qyܹ[nň# 0a! -69988xUU{97+x[XXJaÆ RShh(\l#33REEE.od 2e0Gʕ+q%|(--mXo8wR=ח Eǐ+W"%%IIIvs6d2RSS1{l iRKٿ?vܩ枹Tǔ̃[cذaz[P2byN1P^2W{OE#22R AAAZ{*%ZD$ T(DDD 6U_wBBrvvz/R)\Y.-- " Y:8pXhISLرcQPP zj,]7on.M6m$$$0rHb?~4ҵƍq bW\1jZnQTT{̪u?ۆ$ ˵rf>|8nܸ|9}uu5bI{4-͘[E=r DFF?[}y6a )i2%wV{oL~##tG}z*ܰ~zTUUC ޽9ݻw?si3g駟Fttܽ{ׯpM3F}]>>=z4233K/uiڬԤunӦMCBB&NTK drk׮ESSf̘޽{cضmݑF8s nݺe0+2s sK[ۄ먾Bmm-Ξ=kj-OjR{\{KYc۳|cg"OH_ozg3J_na>!"S09[dffPkURҸC#"""""U,興l :""""""łF#"""""Q,興l :/P`>!"c19XCxA',DdC "2s 5 tuuuVQ娫< ̡\Y,^T*e$"r9Ri1!%Dd B@ee%*\.L&3z \*;YUb>!"s`.!"kgC.t,興l :""""""łF#"""""QVuK^Zj偙OHs @xzz2YD@*BPZ\BD`j. V1 "Ht'Dds 3Xsssc$"H$}\BDV.,/\\\,DdC "2s 5 tFD03OX%Dd֐/,^Q#"""""Q,興l :""""""łxzL~kƶ;C7Y_iӦ!..hhhבǏcݺu #G`ɒ%@lذu ϙ:/sH$;w.0`#//6l@qq+ L4I/^y,]2SNEYYY ppp{R4ۡT*O@&=4bdddʕ+HHHyą k9y!::x"֮]7ovz 0{l(Ъ-IDAT 8|0s??i/Srm*JTUU!777nD~~A-^ŋѣGyyyBB՚_ll,T*YL9>СCQQQ&MBTT-ZsεkYYYzv+W"$$O=*++2 ׮]\.Gccۣ#)JL<p Hs̱[ێ舏?cǎE]] v_| )<<8ydO?>|8Fo&Jeaca}pIXBx_ɓ'֭[qQݻV9::b֬Yʕ+)%% ~a7άlLjk.a#G;;;cHKKÿo| ɓx7ؿ? {h"ڵ ?#v܉C,j]v~ջ~Xx1ۇbɒ%Kz!J!J[ێ-cR~PT__O>DrRqF={wވ7)>Xj`ʔ){gAs??LelNi϶ԄRr{P]RO-((T*/ҐҥK'N@MM W_}eu2dΝ;صk₦&Kk ݻ3 1Z j}_|Fl۶ eeezgٲe Evv6nܸ|;w0dڴiy&]#G_Gvv6K.!;;GFbb"R)v-p9DFFGii)nܸ,bW?> L8Zcb1,YDTa?Vmm n5зo_8::ŋy~B``N6mڄqa޼y8tn߾mtN:\}B,\pAhW{s?ژ:>\~dlN1e[{gPSS޽{cСHNN{nߋ4,:PII /^ '''üx7ӧc8qVXR-b\z@sd֭7GzԩS1uT<<<Xv]l@[G:'MݻwV?~YYY H$BnPQQS̙<t^14SL֦M !!x饗`v߃?ϟΝ;uV1" &hrlyttɉǫsaܸqDLL /_W^yEjWPT6lpH$/>3aR۷/<<<,楊;]5C=^_P(<V\K.>@iiָ{C a Ν;[ www֒oo[[k׮AR!((H8(i Xr%RRRk׮ծprr o|<=͑PNi&ɐٳg#((H<\?[ËtHa8 iɐHkꪪ*X,Ftt4R)!JJJ0l0'Ǭ}Z9c\+.]///8;;O?S((..Fll,f͚j|Y?yVBBmۆr=8p?7ob8y$w#F͛Jxx8bccnF-[<ӭ!R?=x饗Dcǰ{nH$!77Dݱcr9ƍׯ7D~~>r9֮]&̘1{ŋm6#!!Z?f*qܺuT-mGbPSSDlذyyyðap-|8ݹsFX,6I bbb0i$x{{xWeNcaDii-g[6m0qDHR,]Tg{=D5!"c09K: :JLDd\.T*ms:"2\$^P(\\\ XbdFc>!09K:Ue:j"]'Dd%Ddb%bAGDDDDDdX(tDDDDDD6ʪrKQK<0 ib.!"sOOO&K"!HHR( 3QkKL%*\2aQ[$ <==ۜ a.!"s06ttnnnLDdD77731K%l|BDb.!"s|a{r  :""""""jtDDDDDD6bAGDDDDDdXБի-Ddg[Ȟ1=,Y srr´i___444HKKDZn:}#Gd~`` 6lHIIuLH$̝;aaa0`ˑ 6X &M^x .]C\SvWWW888޽{PTgP*x' b1222p$$$<鉃… xƴzL;Z|0afϞBqCZU*Bnn.6n܈|O,c޼y/r9.^k͛'[b? Ǐ֭[_j={aҤIx뭷e<2>fwm۶ իPSS3f@P5gvoүjkkqUlٲO6͙_m_-^ŋѣGyyy—\BR Z_L9>СCQQQ&MBTT-ZsεkYYYzv+W"$$O=*++2 ׮]\.GccÒ Zxx8"""p6gh[Ӵw^( ;QQQԩSd+JLS$a26[$)MSǦf~iM4&011mhQJZ!ɝ{?p7{{w{!w~>~]ܸq'NIQF!7700)ZUQQs"55Oшd\v;UR~w/wuW_Eqq1gtuu,YɄbܸq=Ocf_zuQX,$&& /˗K宜}X_πNbbbFf9 "HgK.EYY>C dff/:;;ǣ}O~L8?a_k֬Ann=[[[*W- ʣ?i QSS#dഝߚ\II ]vaذa=z,]Tc||X_ˀd2[nEhh8$$vNQ)S &&ҙˌ 1rHTUUaƍҲ+V g̛7o<ݻw㥗^BPP!''ׯ_ǦM{rS.|ʤ>#CBBrJر׿?'OsF Vo[۷{ 駟FYY:;wFO?** ӟp"++K kbϞ=ؿ?}YDGGpyj׮]1b,Yr;o~kV.]fs], ffn⏱bѣdi}WTTx=SZG6ֽX,x'<6ͧ1U=ի3Ϡeeeĉe8p۶môiTnK-|>15 :yٌ8رؿ?ܹsGks7Ä 3ŋ(++Cxx8BCCaZ| X[[oi_6mƎgPQZZ\ۇXbhoo|III8y$^{ /ZdgggϞӱb 3åKYF#6oތc'"##C!22Wv;wmymݺÇ~׮]È#0qDiww|}YL&J) T-[':tsEJJ HKKU"N?())eSO!++ gΜCg1S߰  MMM:u*z)//_~zdggcСNu/(>>?0*ĸ'NHeTBֆk"88Xcկ b…8r6n(5a4 .૯Sa0j(]Dڵ /^3Ly;"RJJ|XXJKKq Z^^G}xw\L$Ԡv?OE_ttt 77 `ŊŌ3p ̟?_ڟ8DRR?]X|9v;j*,\С59={^HNNFhho]yuuuaxQXX47<?AmmӾ.Z<***.r[z0_l aȑؿjˇ/┻#p&ֽ;xkIɁz$vnooG^^A˱d޽6m`m0n83uuuNswqA1`} *Ç;̟>}?1}t̛7> B1|pttt`Æ z=gKJJ|kjjp!-- غu+*++Ox{=x'rJ?nz-ZH랯g] D~~>ƌ#mgZ~Nr(YfG?0tP=]2n޼)VGNlqX`,X.227>cTWWK(OkhkkChh(d,[ +W 33ebXp1dffbƌHHH>s\al:ł7|Wƿo|^wH<`ٜ굘v:u ƍU/UEE1oqkp Ǐعs'z-L6 AAyHFFt 4Huygg'q#-- ذa~9 ݎI&I W_իW@¾FBdd$_.GE> *WZyyǵ ޺uKM6֭åKqj9ۇ;w:j ƦMPRRB={a5łR<HLLtǓ+--EDDG-Mc c=tl@ff&RRR0i$nar\a;驓b]wn{S2%_׫""::IIIxTcm5( Y,L=9ngg F#222`61{lJ6L4Iw#z8 uc 7P^^PY!!!(//ƍ1zh$&&zŋBff&,ϙzU<&?$^g.% E_~1}tF|/`!}Ƥ$p$XSNESSxKFkk+mۆ#FHG{[dBGGè\zFѣw;5[asɓQYYJZqw"j?zW[n#,,mB? _N477d2a„ p ;ӧOǰap駟bp믿Fss3F;vfrxwBWWy3g8߹sPTTS"==;wę3g0rHi6 Ѹr ׿bx'6$&&bСxάƍ\K̘1O?4Q\\TǎCcc#L_ϟU}S#1c ^8{,̙Aoj}݇ŋHJJBQQ>x\zw஼ ڵkz ˗Q]]{10slX,FFu5 /┫#UM~~>oߎ̜9aaa(//GQQ_҂TUUaذa6mZZZfSRR ]o&*++1~x̟?_Aс3gѣXls>& ӧUD{lHOOǹsj*444fa˖-Z#F`ڵؾ};"""cJZ}Kju8Zvv6Cl6cOϣnVw3- ׯ_GMMq"N?[_:_ۿa=fWb+]nn.*85Ȧ$ [&dcgiyHJJQ=m|#99'NPz_iB|AosfdiAn h@1LD[[nBWJw-v~z"6qpC(.7ׇ 1͛۽iI$""""" FC 7=-tY~qMX0*S.s=ɜQLxbSLLLWDDVznc@DDDDDL& Jmm.7Iڀ("W_:l#OV72bFmmmuÇ??dȐ9vVDDDDDDwpev7z9y::y x'j UN\Q.^x`0|1 `hDPPA}pV9UwKm$\&8v;efT)MyqYQF>|xjHHLј`xDDDDDD͛wttT4g+M:]/ꔭx2+:W(szכdNV&t2wӮ^'SS?"""""ҫZM\L=IyVm""""""UNkW .N ]!]%uwRK75$uz9&wDDDDDo$pz59qK:&{DDDDDW^[7ғy?yW-dm*GDDDDDUk<]$L\?QкNݴN˵*o:w۸KlGDDDDD$\jIENDB`lxi-tools-2.1/images/lxi-gui-screenshot.png000066400000000000000000003346001420007711700210170ustar00rootroot00000000000000PNG  IHDRt"=gAMA a cHRMz&u0`:pQ<bKGDtIME4I4ǩIDATxw|}^' @AF*jՊ՟jkkk[ZW{+ $8sA@ ?#sqsp8ϥ F9w_C!B!N6Q߉±lqٱJ!B!on^Oˏ:mKDzB!Bj|Ǹݑhݱ$ !B!Nm);pw:ay_+0B!^yOu}mAk8nG G[\E!B!=~_C]oHˎno5N!Bq:vONowkay_[d<B!qsGj;;>eYO-k} ] }kuk7̾vB!B/iGjv_u u݅&VzY0[L,.B!(ԲS`-y{Y6mk B!BvB]P՗z s=I B!b-xu`wNݶc.PK.izb)B!BqI!B!;m~< p58M7˺Vom ]Os40n g͝v`4 !B!u\VӹjsS= Bt7]fVc2@OM:s=#**јp8p:n !B!ĩKѠ0 FGECC;whnk뮫fw%iy .ymmmB!B*((`_~o񇺎a.pc8殻'^z t\s=;<ƏTpp8>B!Bqܹ\.N'#***>m{.Cz?n̅ 9ǃB!B^/NeC\uLvܨֹ um͝K sB!B χ&22rd^[[{[ậ\yS_OajyO[[nkG|JDz?Soxw߇"il6c2(NUnݎfCB!pݴyK/~(p4Aݙt׭a.p[srrEFF^fZ<Ф@1E>e)(4qh Ζ>$!N+ZL&2{h*c. XB!EXXXdVWWWF}uxStN4. ?vU((hCNXXʝt:aaa}B!z ftl^Vv \e皡%%"}B6fӘNl6a!8N C. O;1  t;vi3:ɹ1L}X!ĩv<9c舕.{<}B(wdh4u:w qHOc!jFz=:NOzqݸ\.zwmnyT zk;gwOB!┢j 'GȖ` 88N{{񘆭;-g>ǏTO !B!b2 =mL&---=e3m}=v#u|ç1B!BSBPPQBCC >]f( {~ o_~͛7ʏ` ++;@g0K9sIJJpo>^y.]iy1k,0TTT/RPPVWWi&qu.JKKcƌ!'' bر|}ޗ`c̙$$$p8(//woz4 -ǴٌF KO>$O>d~}uwzilld۶m<ٳ焿FÆ (-- .89'ptg3k,uF#gfժU{4}{gaƌ}'((FC[[)oT|n=hV؎G ]t5bIL$nޞ=9sORXnĈ<{NVX]wE\\\9t?aaaw3{lV+[n%&&#Gz0a(..FѐŐ!C:oʕ8N Ɯ9s(((ࢋ.O 1f=;i$bcc[neݺu=w0m4Z[[ٹs'g7> ÇK/.rMFRRN>3}].\șg… >|M<Ǐgڴi1: /W|O^ /GfQRR?NAA3gΤdR1mڴO=xj'd^Rt*_~r4IJqaZf)qq3j)t3bd˖-'V`lNFFIII}&$$Eh||'onUTTk.rssILLdԨQ5J]sb0m4~ѿ&LC=‰lVoHn7}nY}8x zO?hRSSٻwodq꫽.~-_ߧIH]?so}ݧ^| w#F`֬Y/2Q-rmڂ>IW0$kpfDUX7%.L3(L5'[y͇m"kqv^nnzNiai"2XC.]j ύLvWֶʚ8Ub-}"ɄhTtk0kijj{zٺlf} On;_}HQOmj`o.&6 ,O~„ zb>s{=gy&y睄pBF^gÆ <X-t|1 L0;Ûo ̙3袋HLL2~߫W+f3wq&Lpoowz='N$""~ixש+>??G}7|s=Ǯ]0 ;oc&r&<>n1c`Xᣏ>駟VƦMxWwy۷K ^#))gZSM_>ˡgŊl6fΜHMMe„ 444O't2d8SЉly+^2Οg.z!;}˾bYEKrwngv>Nkx,:mbR8kx& ^ ҍrǘFF˛"{qaN.Jjh~2LvAvﮌņiO2PRbdfJB#zwx㥸fyYx1|ڲ0d V:nEwNz+W/_|{キOٿ?Vy-[ŋs=7}vZ233;u:p\~4 ӟHMMeҥ3c ~wͣ2Yp!vppwRSS{GPPF˥ĐKii)Çn`Νڵ3;wR^^θq_… ψ%667|OFýދ`W^/ >?l޼{oFm>ڮo_|1---$$$c=_h4< 2O>PΝKhh(z PVVFII vmlݺM6#0e7|Cvv6MMMqqq1 /~͛ٱc]t߿QFqwzٸq#dff#0w\n7SLaΝl۶1cp7믿>祗^館.䮻"99g} ssc~y?},=ٽ{7k׮eڴi Buu}i'5r==vR;}z=N^KƄpɘcϚzabhw6ЧM<&LzVsqH]cabS|\W L0ɍ/֪yj.r?|1{lbccy뭷u رc2dol6N{=>l׿5\W\͛ٸq#SL!;;z|^zɓ'c2VZ.B^/v?O(,,0e6n… ;u CqEv;),,T]MM r뭷r5oC( o 2]v1sL9΋/ȤI::e]^x!3d޼ylٲ_o~)~i/==)++/2|.R.͛:C'zr*;:5ԁ﮻:Ŋ|!>p|N~|-S bf3Luji1& GssN4]ƥhtYzoHla +޿{\GvO׷ t A0Nl7R'L#~l۶M6uT 7|<쎤cG˿.WOW7o !!+R W]u_~%UUUl޼On#F0sL8 &L`&==իWXMja 55 D  9@r¢"?O> &0ay饗Ԡ sN.׳vZ|W\~q*c!?^WTTeFE~~~[Ν1,\ko뮻N-DtEqEu.44Trh۶m;СCX|yvmݺ/Si֭[_v۶mdddی?K.l|577w$¸{pʔ?zjo~kΑ>n/{Nvp8Ns@.`C e^[+ c)H1-v[y}]k'e1tr ԴxxgG|`K#5 Qh4\l߾>mc4馛|h_W^y7xѣG-->|RRRX @h`{Smsk\ ^|oǻL6n\J1Qv6; 1ҁxSLV:!d2u*m6u@ކ|>---;̟?z;SSjOYYlˆ#] \vڥ7>MMM|>6l?|Y?#}h4x<-[Ʋe˨eBcbIx뭷|;}~rxPw}] %= EQYYU/?˄G eeeL>^x(,,D_qF5X_/Ws:8^cȟ}d2a?~<:.&].)vw)l<;CMNN䦛nuߧ'xj m^4=;M'1|Yd'5Zl !ԤatOϽNy [+&O?ϧ8V Nxx8դuV"""zP6//^xJKKǶ$??yكj%++KC):%L0$***7n>OB~9l}Q@ժskYJrrrxGٵkYYY<=ߵk֭c̘1<|7$''¿#.?|~_zjl6gvݺu߿\r!&OjU[ KJJ1b/Xn/rׁg橧`bb"\.kb_\uUɓxW׺+V0i$y.]Z}jZ|9 //-[o+W\q3QZZSO=-}_|Z1t},}?xQw\\*vbx<^|EØ1c7|O?ߧYN1t.@Aqq1swwCz@)4\_յxxae 5--:bWyF^Z݌~VbpPXt_6tZgfGu#>g/ױt F0Nx<*#Gt[@>Om?>̚5K-1n8rss93INNfImm-=555dff2d}ݧ78+BFnn.P }G\\n+VrJn7s嫆^{5z^x[t)::s=۷S^x":U̙æMԟ9s~Y~<Թ2ofO?W_}EFF'..O86;foԵn9DQI`1)h~[3x_a˖-~~K!N |iӦ /{9%JK 8L#U論=Z:ҁ !Ǧ\>q:j}t:4 niVx^Gp\CѠ;-|^ǣsxEX>EQ?( & ~u5 :׋VE sk4L&}zO+Z uJ߇GwSrrON jhh(BCCh&O̙3 i{EQbƌ̘1DCC. EQ aʔ)SSS ``ܹ̞=CBSS>Ȱa8sȠJLL ӦM3daZeܹL0Lcc#O4gȑ#4hmmmbbbȆ 8=\bcc)))q=NÙ={6IIIu|65s9QFQRRfv_<裼znNsS^^ |߇t}r)~Xε^K~~>111\|Ō=m۶1e."fsCCC馛f\vey晘f/guw K,?OƢ=z4\s EEEFnfd˗͏cg֭[ǥ^ʙgd,8Mpgz:t(=III(EQzzhh4]h4jσ<.B:u*SN%((H]~rWPTTDQQN}~|xŽv\'Ъx=ӉtӃ ^ߟBXt)eeet:FAPPf^{^/#F --;wO2 >shjj'? 6l ,,^z{;Nz-***HOO͛73j({=-[x<̜9?P[[˼yHOOgϞ=lذAA&22+Bqy$''Gee%Fłb&VU?t:EFF A P{9X,BVmm-v(**"66N^Wqڴi曬XSMFCll,AAAzT1h , 6t: 6 Fdd$6Xp8TUUaZtDDD`6aDDD(gϞ#ZTs8 Xªgr:!UNz;m3tPJJJhjj`Ϟ=$$$`6ٶm}z~FhPxhllcvd2t:iii?DkktBWf8F#TUU( ]tǏg˖-dddt:y avF#F{Gaa!g}6̈́Cqq1̛7,V+|G\m۶1ydz=꫸\.llڴ3gRSSCYY:>.%%_WcZٴi !!믿ͦ>̬Y`L:;+V0{ln7Ō3Hnn.k׮#88kd˩dڴi  $$ۭ^v:v9VKrr2lڴL+A?tk׮N&55>BHVVW_}5|'ܹh.2=\\.zc̙XƧ~ʕ+IMM+ 33Faa!|W&113f0zhT{#رfn7>)))aҤIzVX/~3~_'s}-ZZ[[y'eȑ\{TUU1tPV^t͛x<477yf "//cǒ@ss3<|׸\.^z%t:ͣ2́c~ grP'= \vڥ^m^hf+jjq8=VFaȐ!̙3^zIfv1LXVEmaÆǖ-[WΜ9s())ajL!8ϸꫯp: 6LP| FbŊ8Nȉ餩I~ˎ;3|>{e޽h4Cjzn7DFFf#)).0Jkk+Ɯ9sظq:Ҩ!$$Lee%, )..fڵ~#"":u*ZUVcTxq8_rcLxx8Z׋(tCR>O=MN'k׮^Y]h4ɧ~ҥK X`G??_v;QQQvSNmm-?ƪU(,,dԩjX[p!|TTT0qϥ^?ӕT<!1߆!2jBrh= fA)EQ4h_~9iiioHJJ"''#GC]]3qD 뉍e̘1 >Yfnݺ^9*c[ol6SUUE~~>466cMv቉a͚5dgg`ԫ q90adᄆBx rss9r${!883tPFA~~>K,uuuu2}trrr')) 4 &L 33Lx<4551x`Ԗj233 %==ÇGAA֭3o< СC&//JYYN$|t:l^x^444̰aÈ9m+] 3 b쁖jN!?,4:,$++ Dss3;8_~Ikk+L0oNXXdffXhQ.QQQvۇE_5k`X:u* deeAxx8֭jÉbϞ=]#GRPPnWrr(,,$440HKKL-"GHHFݻwsca9󈋋c^+V鈏gvz=:tRn7Ǐ'99dǎQPP@RR鴶rA'''\oλ˘1cؿ?&Mbر :P~i)**bԩnxVZ}v !<<˗S]]Mtt4.Kxg2HMM%==hZZZعs'DDDP\\LKK zs9MJJ 466r!|>i7;܆BZ!.¡8qʚ~NCcpLa }v?ͼÿ^P4( >}*6OU!DOF#& ѥ ef`|ZબnӘ5^iLEOZ-Fe%!8vTcz=z֥H^d2rp8rEQtc5344mx^F9nc،F#:iqނ>eʕf;~{c ܧmCwDq0R0W x0Z K-yAQ3Pc7!-uB=Q9/} s Bj6^G5q3zJ&&-wNC A,{H.W#B!8H ]O`ԥ01!zZu>/ " LԖ !B!NBם@xĤò,mG(}Z_`/{&=W'B!8MHécKj|ķaoqC0CRh4s#'h$%%v<Aff&)))hZZ[[ @5NfIFFFmqP233%66@KK :!C0h bcc }1x`1L0L <<v]} dffb4{<6!I||߻u:  NM&t:v;fYT*66LBBBhoovDZZ鄄kA$; 0]RRn1 1 l7h (V൦2dXVLL h?sU@Qh0mW;]P˂D+Xap29NU'!ɠhHNNcʔ)jIj@JJ yyyƒhGB^^zu¨QpwR1bΝ^'&&CUUaaa\h4bccIoX8q"لcZ-ƍcذaƒKKK 2b, (BmmQUB]tEL6bȜ9sp9s0|p"##cȐ!466Bxx8^{-)))lܸQ!CNc޽ƒǠA:t(QQQbͥ8rrr BNNqqq 60T4̚5>E3gF||))QFիllܸVO))) 6m͛9pʛϦMشiw2MNcذaPTT7|ݻl呛Kii:ѣINNf8VZEyy9^xa|qB \#F`Ĉ3`rrrX,h4ƍǔ)Seݺu[ul93ԋQF4&OLaa!6ݻwb ***>|"7af3֭c߾}̘1Tٱc˗/K..abXHIIRRR:u*۶mcsy鈋#..i 6ѣG3h (((UV6m԰vZk\.guzFс(vbZgAFJ!6 /+EŒaV:PF^ :P` !io>ݫ BRbXDDD0l0HKKvn:*++ikk[n!11+Wޟ;w._^N{x`s8).22dؼy immeڵjx5j'Ov}vJKK`DFF !D_|L4;vtckW^aٲeJuEpPVVѣ/&))͛7@cc#vDFFdbSZZٳcΝ普o6(P9|pJKKٺu:5\`K2zh}iZFajk`aa!uuulڴZ}n)**Rl6[zBI  6ӿ޾iT r#^is9`AŰy l)75ÿ͒G`>Bqܸ\.JJJHLLqdFTT111륩 ?䠠 t:?я!**O>Dkkkcȑ\qfV^ƍx<8.2 ,^xN/l6~V^Nx"88JKK nBCCj<gǎ3i$EalذGJJ C sN 5k0sLKbbbHLLd;V۩+x||<Jq47nZ[[1 uZVV{v2r5z-χntb62n 33Am6bbbǓطo:?^uu5sC !**7|χw*aw |~PV^RRosٿC(0 u1W?>,z~n;Ag0NB@(Bff&ɬZ Muu5_}wFף(ZPGcc# +ğ}֭i&,YBee% \{DEE /@UUMMMdee1sNǧh4RYYIkk+h:}Qq(du*rj]!Do<.F"55V CPppzh4ɏ~#jj}aXHNN&66fq8Zbbb:t( ߿/|9, se}\QFc`zx<;\HHÆ ]vu;}v >zV+&D47p[BbpLӾ sNMc}S ew̙ Zr8肣JUnERo3+^4%! ( iiiL4bllfa2l8<k׮e֭1uFUwŦ***b+&s璔֭[/ƚL<?P6P|`|WDFFre:GHHmmmꗤݏf3VU!Zyy9Wfٝ aX8pziذaDFFhj@qq1sEQVZFrDkk+L0FÚ5khoo VilhEpp0ϧ7bZTjhCaVVǏͤIhnn ˅``0---n<˗/gruױlٲӶU{  swW.n88&ظ?Q-yZF փqUw\1˟SaBqRT~qVZ~0 DEEBYYAAA$%%0tPꨫSe۩`0W^"f0 R YFuu5Z"##illU(XVjjj0LjןjkkYbIIIjXv;---2u|$''Noyw0ʹSWWvV l6l޼s=v؁b6`ҤIDEE|rXYY$$$0f2?>?\" Q@dd$MMMv>?ݻwS]]Mee%uuuOll,߿1l6jkk\^ ]PXɔK|^8?{h6\N"+ <1q"(_vsU!X[uV"X.&LMjn:N'gy&;wdƍdffr2e"##Yv-{baѢEp5pz->l"##1LDDDS[[Kvv6SLc\.~!111s98^{5JJJ8묳[0444aF#w .jʒ%Kرc\pL8 ؄h544裏b0+'?7 \. ذaFt:fťn:\^^?O)++#** ͛ٴi{aʔ)dggݻ)--K/fzYv-ׯR|p.;w2m4.V+|="??*OKK iii\ve444`XXt)6K.BBB_< d `p[.X~ǹ?onN;->qĕ*8'ᕀ:1G-m)0wh,kLீa8cyLl/owԛrj fС:DRSSIiimm%##|>n"|?fvMVVۍcϞ=466Mff&ZIcc#Řf222xt:_gZZjZkR{TVVrnV?HKK#11MSSEEE:NGll,.KOOnSY/F8x`jdgg?m6:ΏqXV\9hGﳺ!&jK9'/_Sd:?A:=} 8|ݞx_p>UeOK9 LW _@Fc<_rU1 tzxD& 4W'_Γ !B!DB&й{еP0%''c59T>/+OBP L$ٝ?MApk k3rUX P  υsDe[m}C!B<&1c0}tF#DQbcc1cSL!::nY3 2}tz=MMM8Ĕ)S9s&TTTr0̙3iӦa4)//_EQs!++zup&Mĸqz#..i\xx8ӦM3@؈fȐ!L0aÆbǴiӘ5k2ulN###>\l66aÆ1k,x<-$$q8lF&Nԩ:t̜9ժVVBO`˟t.trxOG:6A.2 uo(?Ok+>_C( >|*** ?ga <Bb`Oa%0ES 4.́?Wg3-x.oQhaG!(V% !Bz=444Ԅn:222pl6\.QQQF::tښeٲe ( ؽ{76M U>fL&YYYx^,X|i&B֬YnbƏbA~XYY")) <o& 2 IJJl63zhKKR餽vk֭[?>SzjZ-\.:DHHG+np8 $$r Á^Wˣ*v;ׯ'55Pn&~mN9Ax-t^|g;;rtbO`rջnݐs&__bmP__d_3_B!@jQ},j"##`ܹj'xNEozX.8@BB<#444p7O_yNtĨC<HBBBxNChh(fBKK ˖-g?޽j~i?׿5k֨]H͛Gaa!nEvZ.q~ӟa.Z-)))裏z 橧b!CK/NJJ cƌaرDGGk.^z%"##9t"1Lt:LBCC{=asJ~n`w̞_hPɡ=Olwь e]2=NH]5lmM? _T!B ZV(:wss3oK.e\xQVVi{EQPEhyr8c׮]PYYɧ~JMM [n[n26mڄnŵ^|ڵ?LppښQV㡽דDNNz.u:zNv;f3AAA8hlld„ dee#t:>|8cǎ'>TtCׅ>}?NcᘚP_zV>ﻢ*^'_[aeEW0'B1nX,X,cTT{EQ4 8"""#((Tbbbعs'dffh8q"ٳt >fFE`0n֭cܹh4, #F`ѢE444KTTAjihh 88z+K/* FPۍP?/h5 v\QYYIbb"L&bbbhlll6(rd2(qFRSSIIIA0c o+œ9s8Kx~wچ9*6@u<fk/P;|a?×W+B!A]]?<=8N|I9묳n K{{;?t<.S=)mnnc h9@ĉWԜT\\w4fya[%vV9gO9X -I?/B!2 ԤPt:zuwA& ^nTCQ"""l8NnVQvcsp4 ---꘼ޘfé봾(FfzL&._OHHn ǂ---Uvvf5FssQ|.==cy- t=) (:#ؿ싿[ u:;ixзۭ9z_B!4"76GP/:O77[?19aXx!B!iFݑXKG6/mK?yyp(ʗKjB!BN]_DBK|Oh,P{/D$ ҿ7OɤB!2Lhhoo4N`2 ڊT LޮJ1`ZHLsssB+i vZvikkCu:@A\smmm])Bhh(FvukZimm=0*[K|*B!DZ-YYYb2aժUTVVjgĈ$''cZYv-0rH _Ɉ#jEEElٲb,L8'|á>n49xݬ}M'OS B! xشiv:h4IOO緿-. ۭTܹ|4 AqA6mڄ^gΜ9݆+V˼yXr%F΂ W_磩˗Bxx8vСC:tH6>><:=b!11*ƍGMM _}UUUXVn֮]m,Y”)ShNv, tǢt| dM X~-B!3NGVVqqqc0X,L&rss1L~ !))D"##پ};v 60a>lf3TTTtylRSSyXp(}ܹnb0b~.Cu.66Yh8p&JKKX,f4 DGG3a-[I" tǪtqEt[?sB!BD: &0l0Eazeܸqt:Xf >3B9tk.FŜ9s¼yL΄ ;rzz=EEE㊢HLL wV DGG? ^\.ZEQj?QFp8[tœm'CO/B!$<] hhmme<<]ǣ( Kj2ydqĕ555'yB!h4f3NKR^VU[߲q] \.\.޴Z-^;NZ$pݝ @0deʕf;~{'pN!Bv?֑붅vXt?/@˱(B!B PB'BqFu8N=e !NMB!N ƠA]^]]M]]q^r\XӻPPPc>ٹs'---"N!$jr{뜢( :ޟh>]yL8?׎;x衇$Љ"N!$2 =|><.po߾ッdf3zرcOs:!B(0Fӵ6ᠪt`ljj{_AAAƞj#++_DDAAA\.ioo?2zEQz>0(vyp|"111L6$ټy36m^hh(#F !!Ɏ;())L|>ڨӱeffݻill)ryfxu*^|E># kh4 4D:h42j(al޼pQPP@hh(`ڵ5L3l0f3gٲe_HRRRw(++ ..nۢt @'B^#Gb2/ҔJFFk׮!CfcÆ TWW놆Occcq::d EzioogӦMTUUu:'NDv 7nݻwcX/]]`ݺ:lBxx8#GDө˜N'_3sL~_w tF'r-_=W_/'O7 ǃ륱w}~[v%0k,nV\y\&4 vloo}) \DhZ-a2modχj#o۩Znq=/SL=#t tC{%77^jgEr=\:jn/^?xS( fEQعs'wuW7G?o{ n&Fi:n֯_݁EBq8NF#n[˒Ymr)JwlQ ب\:fEQ7655Q^^(DGG3b(**p8X,éb޽FgϞ:hz!]wŮ]tt:Fwf3< 6ml63d\FEE{ǻˠAX`q:+86lXKmp\h4RRRԿNcc#vC}g̘1Ǽe;x^nʽKSS:l6QtorJ !!!\s5̙3瘎KqUWq7ܬk֬gT*J*++y{l=k%<<~r.2ϟy7hoog|Ԡh⋹illd…=V%66V˿oezk.>SpP^^~NaBQWWb!""N.EbF[[:dǃj%...W;EFFa۶mTTT[v{@nzcvKjFᠠTjjj=3g?^u[gDzr-DEE>ՊV%88ӹwݻEa4Z׿fܹ[{uEI"66n 6 ݻ t5-))9}444}܏HZ[[ٴi:N=7VkEQ^^tޚYz5555ǼKEEo,""YfӿWEQ9s&z+o&nÇwY^xAڸq#!!!5Jf͚ȑ#yyngq?hooW_EX~.2fϞh@(׳tR߯>߭FAQvŇ~)HūӍ:!&##AQQQIHHFN!rQ^^СCIKKc۶m=?::AQRRBEEzt;fhEGTE]]2Kuu5$&&|T.;;V˖-[>Omh4$''3{l֬Yûᆱvqz455nn7Vb׮]1###]P8pׯ痿%۷o /v=fFBCC 6iZFd׮]ؿ?L4.%99EAzq\( nq*B͠At ct ֣EJJ ;w6zBCC1`'vx< 555DGGsAտGKYYӧO'::}uh4X,ZܼyX`/:̓(|^/Di45:!`T $0VСC (Dbbb@fBCCiooSAj8Σ?e֭<󝖛L&ƎK{{{}l`_ر9bl6JJJ(//?)Mj j餪}\#""HOO'..GEErc4ឺ/Ώ&iZgHAAs`07rK8v[o%""x@ʅ^Ȍ3wUbP^^Nuuu{JLLd̘1444PVV6 >N4 tB! l`ZzjQn 9Off&C 6t: .븷tN<XC}}}cuzRQQ]wſ/1|p~ߪ.PTrئI&1zhV\Iqqq=.{v 9N'eeeWG{{; VUUuVbccɡmۆFF##F <</f38K_~ Z0jĉ襤0fظqz`ڵ|>v܉dBaۻ\ioo-n6233:t(C Gj套^7 jF ]}\zx^jkkyGydEBqUTTCRReeex^1޽ۮC^ժvwD y=^pji@ұNHHzmvԥ^//2gof\r%TUUuWw$3O?'V@D ޽_Z p8`00dbbbX,nCQ\.C Q'8)<88X},zz}]OwPPP9sꫯeࡇ= NSpx:ѣGV%//߅`ѢE|WǶ6~m-Z!== pUW@MM s=j'rWS__'|-"N!8q: 4V")) EQz)nܸq 2KU㩪e˖aXƫh4P__ώ;89kƎ?ϬYxט>}:>ͦ:?|:,Yf O<˗/?'Ţf{BU *wﭵUm53ʹ؈"((M';;K.wj1zƫi.VEQ7{M7~__z3g|8N-lݺUGavލaʔ)L2~rCQV^M}}=կ7o[lOo@'B@CVzKKKSI|||9˝N'_u;v`ӦM߷㡶/%KPPP9˩%##C-$ӛfx }Q\.uR+$fjvJKK)++;i/{/%RչNW<˴bСCDGGviii!66ZpQ{{;QQQ455;N"##{ބ1gNʿ/>^Ml65wlikFQ^Bs91c0aV\smڴɓ'>ޑaŊψvO5BLKK QQQ1 2d&nFBBaaa(/~l6|I~i Yt)7of̙3E}Et:P^^ObY`V6y<BBBTVVJff&_בֿ'Rdd$>(/ 3p9ڵkꪫx73f v;v0w\ hooYfoVsmzjy#^@ҥljj*zCu7|CFF=\.v;.Vө"Pp_Bq߰픗c2HMMTPn܌` 22/r\j0l,] oIDATPfϞ}ʟ ѨvfΝ&I/9CSS񴵵eǶm(**"<,Bٱcn0|p~_PSSOO !**u˸́JBq9N+Zzz:nt=ikkKq:HII!##N~kN_j1L\y8N %K׿5FQ.((訊ihAAA$$$ž={jAQ ZRnJyy9qqqp8ؼy3%%%DFF2|p"""0 RPP`jNBBq,X.Ry7Xlz^ |V0o<̙Cxx8͛76laaahZƌCbb"|VUz HLL䬳nj*?.++[nE{z1c0k,mƆ \ZF#'++ϟ#r)B'994V61 ձg ),,$11Ca2X,l߾)N"--;v`4K1c/f7x_L2Ea6wx\u`{ DuղN/K7McI'N8-ٲeY(;Hf`2 <|HΜ9ϙYgM8~8W 0Ҳ#Z:"=WRRBIII3fee9=ki|9sD/X4>ot|OsSz=;v_2=|0۷xX,W^y_s=|_j̗eL&?lQQQ+--h4?#$&&}'|M6뤦k.v{xMɧ~8~p9Z-dggrHMM'{復w}w֑tB!uсnbP__"M+F ltww=Bss3*RSSW|qt:Z `dd$⼯@ Z9a|ӟzG?_j؂ <|k_clܸGmmm8s΢/-{ BFF\|7hbbbbΕt8+~l׊ȑ#ɓ'89y$f~?9sAN<9bqïگMznddNGGG*o}[1_җttuu\x1|CzE˿x8<7oܹs$%%¨&/txdvy7ۿ[^_L jfcL{YsՂB!R--i@`"l@r.Ѥk-jf2>iyN9jȠs-jh4ۏo9wN#)) Na4QTTXVv;vZ-&)R77},|+:o`0L&pݼJӱk.Ξ=ML~GVଁL?sSBIEGzx͜Z9 B![[[W'''gI^, 6m^v/zt]ܼ$B!4MxJ-SZmNsɋЯv__sׄ/ B!1EQVE֕nš( oJ7Cpݭ+݂a\ !ĚK.Z~VgTBpݛ_X,-f>JJ7C!nH_l53&؏VB!V w!B!b%H@'B!ktc0艉h9B!>`0`0tSbH@'n8is]tSB"Y}dtSbpEQʰZdmEfQP/ž z>^/ b&&:˨A0\&7hӱZ?l6ZZof@,DGGq{p8o7 {TǀSKfl(%IA^z1x=N[jw=^ﲵ/&&۷ix%]!1;J0:)z*#7{}qCtt4mm,[bcٽk'++CttviByn7aХeȥ%hH ¨S8i: ^/yE#:! yZҌ5`9;RR),ȧ+WkY+-;we&: z6%::uAp\|!nێ;FQZYPzLW1wTXw/Yi=蜃h}Nh ZĤ]siiQ@CCwf-h4e 7m{l6S^Vp+}b^$zFudC RU|/N ܚCa{nf5;F1hM 5FCqQ!6TFadd=K/O U+(-)^Z(g߁fHfFh !>8q]MJLb|>~ʮ;(+]GvVWlL FQ(^:~RBJy` :`T-xѹll}?Au:] IÝ O>kJ0z|Zy8aph۽!5%];c/{ʊrΞ;GSsKxX #|?!V>(ީ7<ՏF]#:zFshyJ֛cd]Phh4qۭ<ԓ[˯/*_>F嗿ze|23O}ݻvGR*3|z߿}搛é3g8[}( y457HLL䱇$77Gp\.;+LZSy$9cu]{ ß7uوj:a`l:>kJAG?VG\pPXX@fz:Lɡ@ @rRO>(i gV,ߔ!X:4j7fT?4YMa*Dx~vʹ.#wzXț6lsj\R%;;.P^^FbB^o2زyP+W.=l"66fmvlJFz:3cbini1  t\|CSs ~ܜl3o۷b1[HLLuh4 ΢Ʀ&;+M@b꾈,"6EoDћ罿`t2GyvZ Z>MIQmqE۷Ƴ87mGfhhnǂZZ[tFuEAxohd=wd§rםwufFO>AOO/-h5 Τ&JN!MzFuhƬWxņGjpjq5G14N dC82F#~_դG 9y4lP;h4XQdgeqYFFGܦuڧ>A^,- DEY0L|shl6nN#=-UU l455S}<cIIOGG==\NRSFEa1[u.p~TFFZ~c$%&_L9) NyъVI_ кlh^$$}EoBћ*(9[־~sਬ(糿)233fH(L&#_l6c2H'##M60<>P((]]467Qũ4 9Y$&&R}<nCOTd?|grY_Y'nS9 !c@3&s3ѺmD߀&%hMn񙠉s?KL nFή9FRHL$>#v::ijjYSՒKtL .]fdT'].7IJJ򫵜>}--l޴'Oq=w |>,mJ(vW !n7m@ͭӐ$4j -$)M`hxVb )}̮Zd^}Mg\.7ߺ{۶v9zIJ<[ž{];[6o> :;o%ZZhkks &lz= MM|jЮ( BvV&nnFFG9v|)سSλӟ<~_$F F%f^Q"?)ێ Nc#̱_fh RVWTŋ c2*.23tq1J(X{4 tzuPP&<;C`cUrWĀN `n=EHkě~yE0008vQQ^Ɖq8 CG'=QQdgrho\K[浪JZ[B?yrNzzz9p>gq:dfdjAQ[S+Iܼ]\~ 0wJF{ؙ%ڤm 5F<^dn8LF9+~?;o喝;y7h4PRTāCm6EQfM ۄB!ikkt.jZ|\) Llmk{ ˜E7V<C1 1 F.dAo]p ĕ>5a|`(Dm}=M-8?$&&@Kk6}s--xx7 ?9Y J0$ R}J?Bk ) w U/M:^<|h@Ӫis{w~_oj@׬H||JDqpvǃY{$%&m¥K:|'>Μ3^A{GG.,bѠڟBEOtF"k(3ʇW0h>(mAO?$$S^_w(q?!VM`1(xF<[$npSB&YM ess ==޹^N;nrr^'9)u%lPEEYEtu088Hjj QQQckY{}^#>hIJJ`49\(ήNn\!V?E#7 ,^ mnzzƊדQb2PFb>RkZQדL麒IC[{ݤCyY)wbn7ͭj$=XW0Jm-m~<M ޠ^ nv3˺i>?źu%qˎGK\l,eeرm䐖J\\fLbHJr2`pt~(sQQ(z{ccf^<&&ںY+} !4Z-!K{{` )!޲iphw (.,dlڸ\u~˔S^QOzބG[DG[Õ2b!qx3*r5hY15/SWWgϝ[yc9_| )++\t֡d2B]RTyg+zZn+ePc ?!cSzf;QRT| G񐖚JyY)Gb\.GyCss M-&G465qI22).,dmA^|Wnx7欰9[1N㥻@eB8~hhldfS\fux}^^xe)ɼsffI\.zzBnN~~~RmX&(£n>-:} (c VCB!~$$>o188 66FV4W_駞d ۏ[\'(sVTNju 0^/P=za_q0)u0\sEU&ġ xQZ %;`FK4 B*ƾ{*:÷JS^Aճ! z=x}^ .{Su7:06dO`hiѠcRDC3}Q{#cB >p}*)lj],Ⱥa}%9kR8u+KQ̱1cIBh0GO{]҇b##hZ{!Ϣ(K\Y6m۲k?B!=b" &0s?aa`1mG稆95џ9&qigEQp{=Es|G_o,"+MB*XN>Õ?xC܄$B:qq1䐛IO?._rj[Ԁ.VF!EUE)wvڎmd@ ҇%bz=1吓Igw5xtfs-x^[thbTH[G'-mGF +}X&"↧jLO[غi=i))\o>2JmCӬdqm(-.8z ݽXN!jHclٸԤ$.3lS2k z=y9s. Tu OWKHk!tBF!=-[6RYVdd4N fhD[IL\KI&59>4!K0~o׶͔a44208D5hF!6Jb| 奤&'H(Fw_?(N$BBC6) HMNm[0 DY̔h/-.mzRtzdtN!ָ`00}HOI[1MDDQR^Q^Z#{ l۴DZ-~vu%↤jjAE5)!Ђt:)ZFCqA.YiA,3O{g75GQ4 :P($BS^Μ@A^ ֗R\^l6_XWT@nV&Pل^ŹDQ}4Kq I@'u:2>:J{g7.:{`c60O&2  EKgO@Xr3Zi즻O& !*H#;3ann]tuAb6cMd40N<^/==tH#7+B{G=׈tBNll ;mu:9smdeV'K\NGrRyX ٺ(N1m>yKMNf}:ffn ?T U$'ͼo(ӻҧBq[u6vN@k{'ٙ$%ţ_AOJrDGGS˖ F9'[zj KIq!K (h4$űyC%I +X$BP9lZOiq!Z$AWo1V+y٘MW`6YW\htJZj2`ISK+N mC$'.5Yz: 3O&i+(?hkTch4u&:zp*]=k>}p8p81<ó_ !ĵ:i)FL3# M\oϏl"+#uE`j4uxh•tafWo;>2}u%&ʓ?@RbJښ&*dZ'?IEE&|M^~ez{hg?˃>Ȇ |\zz{n^w[rss?}GFF6SNǏkwqGٱc111rQe5OHH0h4jkky饗xsow}7yyyr9~r%Q,/å ili֝شIۅB!8~,GQGx..6n߹[68n(:T\3\RKo>¥GFMrpnE:!Ċ}48d[wncce9֨IۅB!z9z GNQ@0A'>.uŅܶs;7o 91aZ`K9uKW1n\R\FN.^;%[" VIYI! r4BܸNo{;6_W'>Att4###MHtt4<+}+а DqA>Qˤaة3[wM> iܺs1I3ls9qӵ҇d㿻 sg?w\#X\NNGyIIxЭ"YYYɟ gBtwwS]]M0\vt:9rȂy6l؀(S]]M\\۷o'>>;wswN%jvm?3rͥկw!y^7M>OvS^^N~~> ڵ3g,5 )O<`6jjj0LTUU<_:.\zo|pΝm۶a6}\._f zu֡j)((1tiӦp`yy9'O)QYYI\\/_^oc6)/`4&u@v:KkGפ`n`0Hk['GO%'+ XjMB\,q|~<^J&#-DJ yPs*^oAu}R@jNVF)II+}B `ĺuz*++ٸqc(++5%%%_WpWl`P0yޜ隣#'3ug̠pR`2IW;Ϗw CôwuIb|e%|c?K._`f`|](-AQm#uvNds,tDTT{ >|/}K/??8wqO?4.]bxxxjַźuh4ovZf=''ڵM}Zn_ʢ6G>/}Y.\0mc?8qqq\rԩSF#`2xزe Oy饗?3ضm7xx'9v---ϴ4~?Ϗp@O(_b֎rtt6mDBB3nLRRҤ9_mذ!<ѣռܾk;UeX-s[nhni'8wF}S3Y|0y;66wm''+[:w2]0oX}F|>R,ʓ/rjݼIu:9Gbjgmw־qN>(KNbl477~z&eLBbb͛7Çᮨ{nҒ"Q rZ&[:njhnm3JcK+y98ܽcɳ9|JyS-;o{]y=$'%yC%O^i z=nnT( }?roc{S_,tDFFۿF|;`իG?;w{no޽{G}GEEUUUvmNUQQG>4 O__ӧyˣ|p6)((@ /L ~_~??h4|#M6-☘Hwww_>|gĉKBa*y=nxbdAhNCQFx:DYIecۯNQl##>Wï|N=ylTElL4╺9G:y9&UjAo./ -77AjkkyLj%55u!??I뉍?ry7Ǐᮨ7[g70Ȩ9gP )G-3Ts:]k&?zcfɇ vnD\l 4H/g(-! ͯk{trٸ\zV%==[ 7ޘӧywP2#Vɣ>JI?W\7 &&={>0NJJ[oE;3-%rqp0uV>ݰahZ<ȹs禥|>_%g1pxGԩS(–-[ wxzoq$6~NݻX,3ktt&Ed2Bl2ޙ8\.P fHQh4 B/9B!ܹ oy?[20~n:ʯz>B!uE<QUQhq:~EQ[}y$㕷epضҧAehiiAQf3)))zv( 6l >>>b4 PWzPO(8!pևmv^w?8̰M^t=pW~Az|i*3"1T+p8ͲpWz9vfCGxsnfΝL&FFFtwGGGtCQQьSi4~abbbB奈=tww8lBaaa{@M)e =^$997b4茶>rnx<()) Xa4ijj=bgpL\\[l]^hfll,!--\ ##iNhZ:Zzq88N.7>Z鈲1D@ٌ^79AQ|>?N;^暭n:KwoߤGNwGwo`+OR>򍤂l>ѧرuPao{؋mrpƱS4ibEy<77HMMm~~~իWq\dffwYll,)))h4o3AbA?5 Ʊ2;  eC%ѧXWzMR\ϧymB x-?0SմuiX3$rX,lܸPS/fnMGGeeeNj%33^f`O@Gt1@^^^8j(QWWzzzQ''''\0;FQQQ$''7 :::fB?f,9r1>=Nwܲe G(Iqq1IIIN$HMM%..CErr2c6qݓ^qlԤKP'Μcp^tT%E5ab1JRBEj$%ēlrm= 8\R[ߴҧ`fKqܼ۸\.|~rټaM파Nh4<}ڶNGwO./7b7bgB\+`7Ft:҈a"==8-%????qZttcRQZByI ۣ,fHr?t:HKzqۗԲV|:\.~q9]<}dgeuSC6nlzp7oD+o˫o M \f'*`6)));u3͓p8T󑑑lԑ(PNG||<P(D||.`0` :::p`2؎SSSjdff+!//PG4fft:g<ťU-?>Egcc#^OdxxZAT$''illl߾|UTToxwFNvlf]Qe%E ✡h4DY,Q\eghܨwhcpi:k݃ gxÉf]P(IHH ** BLL ZݎWx]II .]8cbbdpppm##t=VkրPs#Gy M|#33`0HGG'O Ot >>~~۶m4֑>| (1 t:B(NItde{m\kv t:Q*Jef33&YUeҶDLYF`p܅wNE(! X^._Ozzq9qDz* Dv -؍[rfΣ[Q،!8tDG[Y_][76kRy7Z02w( >W1h ?u@OZJs׀t^'*J-;>25U2L $&&:N#::N֖Nǃjjb2&ԍfb`;޳ 粏x7&&&o6k;G5 bihh  Xj:77LFFF룣! CUUFϕ+Wn:VKl6Tmbb/XPYF!59flv8sFWe<:hfMu:_Js[; ~;sn9rraF !yMMMB!V+R( IKKfO{{{߈h|:ӯQ jMa~nLQ6WUj9q-FFnIJH[7QYV%BǮm[0 \JK{\nx9s{:.i׊t+lx(ʜ~\,Kx\#ch4f3:.<§V}bo( dBc2wSjb:x |Իn3`h4_g4',u磷NBBIIIAQ,RSSdhhGGGl&ݵ5inn3оX&JK[ظ$ä2'DZmF2hlmߏd$593ұX̓:}EY,T#594:+u !l<OJJ !99v|r%&&fZ0^y7(6TA?$&ijs&2hjipߏl"-%\2S#(6TLzj*r]ng bЭQ, ͚713Lh<b ZłN 1/;7G|>ߜg!#trvphX¯x'LE ϓرc:NGzz:III?~<<2x1 KGw7݌: ۸T[c'4ZNGtTI &'5**b0784ٚ~u uEWO/^ڐU`?3R)71+Msb( @ 7\ 5eb9۱a||\ bL Ƌjd⹜O0ǐLnn.ZP(Dzz:iiiB!:;;U=BQ ۶mP(ɓ'%C:z8]}F˨KW&;3DU-3_( ^V;x3XQs@eώ;/Ξ={"G^v;;wիf#nc٨fݺudddDt:ywx&TƗ%xf=r@BdIrr2`p7mDttt8۹s'F`0(#tc]AQ`f+tl&n )㡾w?BO_?Yl(d2rE{neڑnJP(<4[41H8 RI#i.KM# 32xi|sab |Cx.ǏqvNl _N f2rc(mmm1DEEp8'777xZexOJ?ݸq#fAZ[[o֋pp.}C~,f ^WMD2"HQaZ:饹(A7hUGAOAn^'tdC}s >YDW.-~> 7~3{pυ qzBss37CFFq?/^_"{C=h[[۷ovB555stvv^/111餸lFGG'-B@ 6LoeZcQ3.ŨA@hu na[饩 D_<΍h0PoƛzV["kt@  Gf Fc8n!AeL, x<IRf2`#z?&i`ib4] cˉs'm>2 g܈#fʲ>╷ޣieVKQ~.=d~k\R+St+LQ~?Nٌ^'&&fEcbb#4v}U {{{ÿSRRf RL&SJ `dd`0nh ??GFFp]E:ggRRR]]]:>^j8644FFFL&fmgVVjSׇIOO/_, ihh/icxx8D^^j9CZLfR0"rRt=j.]ȩXfڽMUh4YGOٽc36mb6Ɗr( ``}Y)z~o@0b᤹@`hFᶝsD-j֭b6|ߝ+Wf}> l6oEtr%g FGG^СC_w7WwvvRWWϧT'M:\Mvv6555 ߿XSt6 59 V܅K=UMttܶ e^kSC!vo–1Lj?SQFCS3#PYS<֍4M:νd4^(DU`}RR&T"nHJJ @x$g>iii3t𼬑FGGt h4N+?Z)J]{.0<<{lfӉ(gڇF!==FC0i^r$>>JbbwM҈5<Ctt4V---_]㧧 .裏Aaa!V5M .]tYQQo͖-[Z(‘#G$Fd4j|x z:{8qGOd4ɦ @N6s)zdf09`dR06))I8N\+TZӡ 6oɇgsU%F>fLfppk et: z=NWO &Dߨ\Ovv6DGGh%:nj%PƖV8( z2RH g pF5ƹ4@Zj 6Ȋbߜ?l߼'C} _)0C65x[Kӂ:NU^ӧ#/@rr2ZM\|{6]]]ѱS&Z-h47ByH:XVkTQDN6  WtLJ->t:tvvRTTDBBYYY\t)ⶩDN'ͺ܆ Ι3[Pf҂ F!33PN۴il߾^V~L ';FJOWu`6q{&wnQ+uded`Ku%zIٙ锯+^P@#MgWGNadֈJJ'1!~lF&%w(<'@WjLO`FGw5l2efSgq씤DbcdlbCy)y*0 4[ ϡ ;tV0?-*1 i1VR70dقUvSSS7nq;@ZZ|a  ^lt*^ϭnx2>Z7> ))iRIP+4qPFFFh4O*?і-[?<6d Gx<;īWyffȦpe1̱bn2B 8?N0$&&*bbbgddPVVliGΆ':u*\Gٳ iXV}p~npp'NGff&;w8UQQAYpԩ:O/뮻x#?xx^ܹsB!)++jN[ ??BF#.\Z[[Koo/PTTD{{r˖- p¼GA1|2yyydggsmCoo/}}Ӄ`0HKK  nJ~~>zJAy_nw]=pęjF4 P˵RԂUwbLFܽ۷rE2Sy٨|-{`4)-.FKK{ظBM罃Gt9.RFFGy F#Obc8{u;^!ւ6jkkãs]]] N 466rb۶mؿ,2j࠱CGW`X3 i@Kuj(nэl.eiĽwfM=y|>mv.8&ui9*%E<*J5:x;t}dAQ#?r#Cnv&W0 \܃dԹvkt燐zXnwy'ZxΝ;;5|To\ee%O?4\p'k|c#::}cuuu\sI[?0}ݼ曓rwnfR'ONYY۷o[n ׄt2z!t:6W^yerQ[[KKK lܸm۶1Lٳ'<zСIsv;gΜa֭}Ii&??@;6'_PcGG.\ࡇD8ysMHH`ǎǣh8vt  L)8[s5sEY<FCvF:&pضqymڛО;6`)-)BRú*J1Lu}9.5&ɇc]Q*J1RY ettukBLZ[[r {/%%%䐒g,uFGG[n .;tt 0^){"?s8}B(dz!/;VKGwOx^cM67W$=-܍^eŅt:X_LF#M-mֻ;tl`n⹲|=䱹JxU*J,-Z&*0^&|_h4rIn>Q\\Lkk+ޏ=IMM+WK.::w^>яRPP7MZf3wq_W0 ywO;~8;_"?O%33gy~[oűc&lkQYYIvv6_җh4Q ~w~|4 Ur⹼r /@TTϟh4r=Ol^ʻ;OSNm?Nww7?ikk#==<#(±ct:OMff&iiiX,g \G}vbbbY:U&5%sl}0'ϞrSZRcÈ[]`d::7Ag]QYDY,LFzx}?|le?I(S|t5ʂh ܌!''EQ0ʹΘ 2Ёz`XիPFZ*) g_PYC o>߿b`l]9ٙDGEa4畷F ##8z#3=ufgbZND&*ayٵkO>$wqաh(.. ūo1iTFѐ.$Nrr2z>PuVz)Rs)//rsMJoouQee%;wի/yfym_z GNN[n`0o}o粧_l޼{|TTTPXXn'?I 555?&77 >ϱ}vIHH[nj7zzzpRۧDSSSuۑGLvncۦ*QQ|/_fcZږKd4 + ;8B ~wi,|IOK%1!~UUEoo魯]]]3ΛOTjjjM7++.&;w`ce9Q O?01tjxijm' -+lLFcx[ .=䡐аNe1ԣբq+}kt(WW3PUUEUU%ihh矧cO:Ş={(..˓慍OOԧ>G>nI|2?/~1t[o'>~p+sqI#|㺻wCGG')++2|?_O΍ Bo}V{1n֭['=^x!P_|g?Yv98C?8x>6jjjdƫ_δfM6a|Ibez6Vs]4q"7m{$ yeCe9M-  /Y0rx̍Sׇ"(U&._~<<M4u}wez= ]l߲˜]u) qV8vzR90//&9)qK5ի|[??*o0xKSNE*?FCiq!yC6{֎Np*xa.\{dSU?Qsu-2ͭ;UM *ʸdg{VZ_]  蓏b49z 炾om7b] t7BGرc;}5lX=2SLl1WߢOCs+Ͽ*m7p뎭rmw28l[Ob4(-.~ȱ8 FEs&>胔aKTrWP(Zp:]0w p:KBxi`01q>t] L,V' @gw]=@ /G;6o{v*JK(aphxE 8y<]FGepFFl6Gw_3?xݏ[Bs`f/\&zev.5Ɩ:v 芤$ st5bc2[p ,3qq1t;e`pMIX$Be`qE!=55PרV-=wxyk8]n>b-4?8,\WO/Y*FFF|ap:9r g^G(02-B  9Y+,•ZZՂX%E<|GFy >ɰ~o익>addNqY=)%%B,`0>BjryܱgKzy{INLANW_[wPT>:ϥ|xQ X U!V@ Nzj };Α  Cc/_Tu lY^k4MtBLL&#;ld*))cz`HwԹ E=έ}vWfN!ĵg6uV*lA]2(?~ꋗ2xܺ;wcUVv 7FKEi {v'ٴ;o8RH:{9ue( WBqjl\_]j}#pT5;l[9z r_ɳٲq=y9Yt> ՃB,t2}|W`c  Ok (9X&:ݪ[@!egRV\e64?0C# lw";+łNČ$Be0tRD0J-`!_} FΈKttn'j#12:.k KH"ic.uc- bQQؼteOjyݽ}+}8B!IL]۶P({ǭ<9VٚtbN!j_qn!\O!X>K?YH@'K+ !tzqIK!B!X$B!B5J:!B!XdbM )!B&s>yBܔ&SyM=H@'X[niXf;~i!+* WW78IB!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J:!B!X$B!B5J Kd݄w6H@ 0 .k&=@chrڠ޿X?vNF8v~|,~-@uF=Mߧr?6Xh ՌY}ss=S!ļh44((ʵV;XNЭU:~ > жmԏA^ԠŊzo;X@.?a)=p'y`5ㄶxcm`y/Pˁi위x;e>K| $je;#E @'i4k@7=?<^ < |Tk׵g<9"Qo'< 5jssP? !Uee%7)**lkyyy^ !H@Ozf|>jR4.wہx NOC" |eԀf9QO^r^d#|ֱ}}،:B7e¿Ӂ-_=?Xwp#Ѝߩp5hv{aԛ"B!V\tt4UUUFB7n$&&e}?FÞ={(//~.\. ̡[kR?TACmgxzx5k\ADZԑ-CF ? 9 v-VjAH<ϋ&p+_;wyN-g34)j療WQq.өSSڱcͿFm~0{PG:*bٍP__?-RՒENNβF@A6?h풀n-)ߨ# 3}z3͡^>HM\j; @1?܂:*MA d>  N<;w>>-`y%|MŌ/3BM~3j@|X܈b,7 5X$5Z/cnS!600ӧ#>OIIɲT߿ݻYHZ 5E(RΙ )BM|)lۀpIk_G6n>::8Qu^7GPo E{耿Bۙ=@>2K+jp"}^ds&#)ǣzE-B#bUl444aÆI'$$^'Xb۶mjPWWҧ"jZ/>JD(ӱ:? j/Ȉ::_cǭ@]'򅳂z cv^kE}u31?ߘ.3EM{ s/sfhC+jm. jb@'9]ل:j);ـ3LƗH`xշ|B8NՒ@||<~۶mի2nh|kPK/Wk!QGjgxxl2^l5`k$N_`~IPH"su;]׺@zϩa13`z0j9ÇhDVY_@=6GxV|EA]. t"Y3,#bUQ~jkwܙ.OQZZJ\p8hhhXSqÑn LzPGg]`{-f(u42kQy jX׉_S H\FM:Z:jH#KG8#bztuu?}uQQdz۷O{kDժuξa3#3(byj u9B4F;!j%r8OӸ6 ΛQGjbFCD79 B䅫m#QOϲhgln|C8ߵ 2TiUt})@e&;R,bU333^}zVl㗴|pڂ~SNkD:z1=@QP3,AV=`ӃOj25"P:~ SۡEyY.GK?SDoal–hP)+k,.u&vԑHߵ"노sB H 0((( +ky-{tG]CЉի,c!ѹF1QQ%:#-S:L Vk /=,}qH&azꚆlЍ9ZlLf:/FL#d=G b<91/MDN>V()ŵ-0n;7;jK!^ lii7 lٲeҲ0<<ɓ]İtbYGOz=fzʤ:2wh׎De TB45Z"_(Y]fɖ# 9(t\#LS+@jPEZn>|3B(B7:P[^tqYWM]n'r+4BRSS3mn` ??iA`0䭷ZCI@'V _wtbujʩ}O ]_8{r950Kz>#K3UB4-qt"<!P of^aϣ 523s۵B2ZQԠus!kF(9ׯ'//ozr3ZlٲeZAnZoJ,tb>E/Oix 0]O]UDZ|"? o3\~>S ~kzTmc5UKTfjKBq566r…i2UUU$&&N Ea߾}A\kj%!S/YƉNeR $jwj&ĢT[[̜j9nEkڄ:osy ]zx<tZJ233ihhs?=&EQxWo Љaje2R vD2StJaȝBJ3"͗cK9UpcrY9(ц)ϥUG AK,K-\ʂU (Tkp#W+V+ӠSFPB~Z[[蠸xsUUUdggi4iQv;ǎ[C)H@'V jZts,ltN S/ޗXA3tZ^t8CfZ#oD^z<,"D>|5HHdKvLNYޔtQivԂ( 5L&爋[>jkkٿ?s]w:tÇؽ{7{a8|0ٻFA#{e{MZlْܻ/N8⼎:qqU-꽭ծw.r{GI`@\Y ;gιrWy昷G@%s3gcXf wygCq.baԩSa]UUEEEf^oPVV6 W̓N̿?&ƋJOD8-eL99(t%*SqT@gc%*Qko[FTc?c$TYj*Ɲ0v[ }-0B||SX񪪪x7x<<{1o89BAAz׻뮻bN[[u礤Ĵ +޽{f۶m_eLcc#CCCSz(~E)++#99ވ߽{7)))a T~aܐN̯c/x,2t>³qt3tEZ<v-=\N73aMp<v+p*s)A3/A5H }nf.3%4$cXn»NfLZZڔ$f2((( ;;,?+VWTTLiqqq[`vvBrr2CZZZ@nn.8iOv jjj 7wL4nJIIɄW_ v<6$|Fx]+0qc<,`?7װbT"}0efO]W`l:%"/-͸<8=Z Uޘ~p8wعQC55<0 Uޘrj1zh@xVF]X;Khj@!Xh0S CY֨[O/wMB`X}lusܹq)((㆏gƍaOyЉs;ca}3k=D^ ZVS:"eba׷ 6g&:і!zPYFܺTTI`TekcYN4 j>|tq?u!.0n 'uEpۋ k0MMM {544PQQ6|>tutcc#---|>:l~q+]6泥s0@0c-Ekk+CCCnz{{pݍ=Ӄ ϟٳٳgyyybq8nZjyyyaG}]"G1^%7LDхʂf~v, ]{m^ĸtft!lT%cPy.C7 BQ \Gcڴڨ.ԫj>ttLo51my,j>\ Ƀ>ɓ'cZs@iiiLd$Y{/yJyq:U9}bJ]lSS?9vX۩]9~8HrrrLp:%H@'5on;%=ۘz5;4TffF]>C-`=V"*2e79̞\Q'Ä/'OB* ?^6bVq@7SݕQ̐۝Y2ZXP-n@PA~yqY y:f@e6z)=8^p1o02FFF8pǎy;#9(ujXSS3ҹaYTzx<;w۶m0۳g OJ.\@uu5bH@'ޝm_<&dLc &tltމӅ*Ί0q '<6nUQ\%t'fh\h s170^ C~9&`3ð, 6rrMuvlmѣ8q",[lX,qz^^˖- SOgf-ٳO#]yһ.Vë́7qb٦vT`z)ƅjN1Ꝩlil;Ƣ6'\XBxP"%2"Yj" j|jEeBza 36B̛&.&$$$j*Ǘ9ܹp#<"tb\At3UT~ ad0 2)=>{0.Ce C =c-Ui: /'Q@)92P'.+#!'}[QY"B-.TBqx<>}vE~]w]ز=zT9&;E- nԘkR(9 iPehф l:wɖbܥxTP,P[1^ 3y^~*Π\Z@ԊZ=3:L!eرc={6UV9zujf͚^y)N̍[NvC #/ QfӉvۿ0^l:1y :Q%zrQq* )ҾP9t.03Jg%><Dž%J6PhY2Lhp[dB\jkk 6 ɡ<\./hl8yE5,tVT.5-n3n2Q.aPYhUm݄7bQ1dB\vFFF8y$n7l۶l5(\}asx7‚A1$!_Q_3+ ~m73yȥg]Pab vUg゘u_opF3ym9Ѕ[~ &QgBj&4Q <}5gSG!eȑ#ڵU{nRS_ݷooKЉװ̽4Ղ@X;MA5}"؎9hvTֲlx ǙLGPmCm&Όp']`r&.(V؅$Y3uWJjP RB+-*BqY:y$ϟ˴-[l))) [Ō,!b',u?ž7-aTn"ݨF\J@e:+ {=*_ \ QDz m}..TiT״nT`GnɌ ׆AN1oqvPe(XPs#҅j4aB,Ncǎ]Z,V^_OFFFc^~eYnH@'eO<|E1ZƒjYukpV~E`tNXgyDNG@ͻ w3ߟnԉ5^TvR!|g ̔[пTP-aܨ {raP)BڡCp!|}+{w\Tw;+ DDP)Mu | $F'5hO kP茖߿C^eg>ߣ؇ATE>5<^?b3[2  PLY&<@PYJ!~uۨrș(,V*pZΠw>AT@'vI.\Vvy7sm͟/~!F&] Z@e,P&x%ّbT@ T +*sds|YԢe6Cm>XP_ gjF--qP-b\wٹ>QLlm0φ*9p7@@_fiΖܨ jm#T5tF^BeTB\n7gΜm& M?@yd&eńĥD_CeQK YqI{f`?ݨG4V=*و:Z2SŒmnk^$ $jن02 ܌j A `'j_6QAb+sI{[Nx ?'W7-ǣxTPqTr ^BSA'VU7a\Zێ9C&6ΩGer磨2I~*,Bp!((xGe/Љp>I6YP'I.+=:WQWǾ.D|tp":*ٶ\DGnA'fr>Bձw.p5jnϤQf)5tJ1sV YTPAzr]5gn{B,G;v`2E ~rLJ.3HG# \pJs*Iw|a ERfAe Mgg焿ꫯpH$b6 dYwڋ;vjM=*ҏc*8j^]7-Bi\L=?l]3ѽO{jg~C_CV]`7 Z-Qu:*xn@ɾ 2D|g#A5q6頋5/s߉[ !̛oIuu5n7/+LJ.:ɩ,gzQ.Txԉ{:,< Vb3Z>xQcw2+vNXW LF-QF4FTkTptx0 2mqqt#ˉ4_n7Oy{&łlF3]׃x~|x{_O_l&5%;n];SUY祶⏏>AwOτj-M6/˯a.fvV+GTٰ1i& 5 !.IIJsWeP$&Ą6o\m7%$%&c'x9s.W䋋qmغ n75uxc D4 JYI1w~+7#7;AΞ_b߁,!ގբƇ3oCL=nuW&c$&$pOB<6./7}stǃl2JIq1{vW_{?)'Ok0XL&6mX_ذn & ۍdkí7rY(n纫/?iJzx^LXg{kh`gŅ|r՞+?yT-7}?p[KB,v |3$7',~iFqQ!^yǝ'}:Elۼ<3 E&7WsV\i񡬴뮾[n/~9)*(z)(gx5<|?|aJk6~pmp߽k&CCtB4w{MzZ*>]Ǥi޶㡧ֶ6zzzilj J)#11ߧ1l;Eg?Ŧ q8=_͙sIINbv*kʻ=o1YzGrr=#N|RR<9{k4(.*CwFrr2W[Gry\f|'~N \s;U|Ckq?IRSS??q=XVoYrw3<T0- DnN697L8UFT8Y"%Y,J'?uW_𑣬YĄolfwp C}CQawrjj9s|pqq6>PYQ塇[}z(*,_'mҪJ>|'xM(S))ɴ_?nʞ+vI/[5Ws< j|a#;;dmV+eelx^:r4B,RW p=}׿)8N\?9.h/~ /} TJI $W._ƺILL`0׾-UFU+m&n7O snCGȈ‚|6oXGjJ|=N{G‚ '}\A~i&6,kBJ _]}%=?=l?;;]۷IGgO=|0>/~=n̿~q8h}CB`ZYr7rq`0rM~q%lX_IʥfJ)ϟqEb2hikoBDC:񶗗CjJ 'O~BGgל=FΞf232[7 #=I[[{vΞ;ϩg|$$$}}qq6njzygJvFFF8u,ΜA4JKJXlɜhSS[@A~>Ņ>f%$O>N9H%BGJrGK~>\ϞW_ KM:},/#-utb23x?SgrټiCr7]<܋a0'Nj4Mz["jjn"EN+϶8yK#x;v$z!៿ /:ne|88sRSILL oXXr\.Ξ;АWqnvv`>sj|iI˗.cjuTrsl>fكdw!DT:z_!O_otF51*p=bi_[b9y |VukVǰW^n7\{uDع]commBmeTUT1V/6:fcY'|̺5HJTq{,\N9N~.|Oǧ@lw0==dL&F,zzzhim3||wOIId0m a6)('7;;f*+HJLvs9څ౧$$N^^AZZ"ZW..*$-5̌t0LqIC#e˂LfF> BZZܾQaf5?>4b1Yxn7'N X$bf≋;8Բ]Ww7.Wڭm,Ldٌ륻7≉fppχf#!!eaNuv/5P^ZBIIQ +3Bsk+8b%&&P/1, dxXUW/5a3ggf`4uQ,?Ʉ㡷wdxHg#q-LgUE9eeflRs3 r=!&#,%9, n.GK* 傝](%%8L&Uj륫;}>jFB|<>Da.]j" #7FYRU؉kf ӑDiI tD膇yHH$/wvN4dl6VRn]^ I}EjKKˋ˗- C22"bqNyVZR̒J5XPmV5ppqNgp@7L{>o\/ݞ`jg[xvk{ x>R f8C]t| j87w{{l6cZ1L$%%a,Y GI`|0L+^wG]q&<ZZh؈#==ܜl"kLq 5MX$b٬VVXΊj>é3g;qqqX,f.ׄ ^o6 Mӂ9t~ $Z̖B22⠥޾>L&EEϣZ,,$%9!.pX!3ũ@u˧yցͭ+&MnlRBr|&x{9&>^|X\%-`6)+)&++|jeҥ$&&288DZ?'- 脘GElݼ̌t8r8٬M=8 XRzZxtA򮭫 f3?f_s](MfbL$;<>;ظ7\?.[BrsjpPNyضeOx<ɌIMFp׃ۈLA9A<Ғb - j223U;AB%l'Vfm64AY4L9AM]u j]EyyLڸYzU[288PH@'<)/-=WMgW}~,ytĤYJxWT5ԕ o҂z #dWw7 LQAII~gUdefv{8|8Bys4̦ȧdiqaL&D;>QuiifBF>7؅!%E LJ ֒# bNyU{`ۖx<^D\s=x< ;vS]S˥eOLHx.^ju†cB,t 1Ǭ ֭o$55y`P3عn0 3ͣA]ghH]y4L$Db1ZT ^A^jj먾..h4+/-%/7̡G&l .sX,.`18χAuG">Vv>l-ɖ3<:;LIGU=;_M\]bTUlC H9X$b;ne%tuws/7#6v0oտ`;22봴j@HxɄ=ގVt]l6\^?}oj`)))v▛frycy[ruTuA4^Ѭ_DuRk{rsrصc;9Yq|5}x':ΜBm-jrlHJJ N oa$v>ʗė ,[[ATUr՞+&ׯ]͆uk٬a,qNLIqQXw~YyۃCü+NFz:]sY_Xώm[ʤs^u]؉S_i[֓ı'iA\,߄ooi|n㕽:&%wAo_M-TSTXq}}8u<)ϧO_Obq+{y<uW_ǕWbͪ>o-mdsˍq סiG_^BM6obӆ ٬Xf >߻'x4,>tb6y}^ze/;m ? ˳/ȈkWsw|Ry9o"';R/?OkN>CBB^}&ή.ß{Cy7b66_? zZ;:(㶛oຫ]xyf|8suYv ۷n&>>>IWW@@:!).F΁lwXZdze֯]=6:z`@788ă#ض6EgW7frz}|G?ٳ㶧:|?"nzV,[0 瓙GYB244DM]]d=!۔=NNXdgrs1y >)/+Cﻏ믽 KVV&yXf|9 ʊ26_ǎ[ΦBqQ!YYrPu[IYI1EqͬY(,'=-NGqmP[KOoYK/\6bNnaN^彯q+⅗^1K2<Nwwxc~Ϙd0\git]|\]c3_A{G''gz8I@'bőW\>߻!be|By$p n| BDA2>$䭗B  4EB!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BE2; ! Mڀq`uXFY Hk@ Ћ:Gs@;cT@G3@ }t`Řc-:5|?fWi?vux¿_ oC!a24mm^ f t"z`%ZT`b4ϫN}p:2 5*N:``-TͿ?O3Y?w"p@=/cvH 9vcǚw?M3O FӉ x_B!j*onq s 7pI|ټb*&bf4ߑ~ƞxhhh_Pww|_QA13| vTro+,A;*~ 8 T_hl@.pߣ@4 ~a~4] D^H1*TV5؅~C}/7`yrO?mI``HRZƸɃ}=KB|##77q?III p΅VYFFƜ?gbb"?B] \oX̡P%x*bxl*xz2x^G}LT~ *xXPTd۷ y[T\Y nҀx"CWrAK=ǖd7)O :Hr)r wC!0~z΍U^^Nvv6&E Ȓ;QsQ'@*[q*x+$u+R Ȅ4&*Y]+>Ol]%qʏF0><*[jMQs;Ϳ5χ ׾5_r5>OC4]:ߊj(58!O? {c&}5q2 }n?+?w G!XJ*++'ojgrt˜!Be*p+q Dc}5gffdR ^G3*Csk x&T5ioɷ;Tfk!T`o *EPٛ[QYAYTp3,"vp,ɐ~aTcx,c|obՎxP <Fs5>bGuobb5!T㕯݀ C? FO !xۉq|>4Mw#<ܨ0: -C+sc 6$<(GkPY̍Յ `XO!<cQ *V~:|%3lאz6zT`38 &T闀 ߇ ̮AԅQ20yVTY4"FeǢU|XT̍uY *ˆ,qB!an.([l!??L1{$ᬨBnoZV|epmţn ݍ gT0ep߇xCP!R_EX7Q-CK<72DRPsCEu> Us36.0Djrx/t&ECn|K`Q1"<L!b]q,YdmgΜgw&ku1$Q':Q}QnMTz Bڌ"Z9`N7DߢDCKDPeIFu^T`4΢{ KƐ=ygF@l⍨: +' c * }?Peܗ{ B!ngɒ%deu{O~"..nwmI:1^Eh~öQQp1n݋:>öP>AL.*#m~,Z;- ,~Pпv|htPsRT=եB *6z<۪֜ྒྷF96}}w0;B Zq+8to---xLemD*ӋGeB290_ܯ#D^~u-ysBn:%6&—Ȩ@eTR!<ٱc˖-wÇ9rݻ'F6n y'ՋPЉlgzS^* guPը`*VݨLVw2puǤYׅ*u.3 ,oFPMYAtp,ΡP{ޢs&NdQK][= 5Bw?ϥKu'xwụЉ,PD?k,*g~ WZOxWIz@EhCR0*Q N0vc20c-g d%Ie*?29qիB!4-_K FFF8u}}j!'Oۋ/ڱcyys%M%Fxŋ:i=9m.^윴P'i!Qbݠ~;~?Urg:q@qFxvT)C+*02j.t9=1cm% B51yHb|; !`ݺuTUU6^U422… –/Z\{2nI@'F>vsa4z%i0+ruS'sa)\(D'7 ]#ng+`k !,..e˖?~ۿ?--ۃ?sw{;!N2 nw['PNt=Ua.a tϻ1ՠrпh32Ì=-faøjGxu#~Lb*@}^;CB̡"***Gs[oEG{p;v2/mENĨH'S/SuoTOa:j]PD^X:P%64AGSFQe|#Rh `e9f&,8+b, 29p>B|_QB9zj.?WzǗ455Q[[=~rzzz:۶m̑N2ޒT@w)m5 BOZ5Tsw;As1vc}pstRe@IIIb,S/1_+:c,D3)4a\ żCc8#"qHs茞ϨArX cpQOCUo2|O/ۈűpBˊi\2,)l\d߾}8OL&wq| (ƙ-ͷ}F΂ɷR,: Ոe,3sf"C)K%<H7=/+=]< sW&jQ4qX&ϙ00z?BYƲeѣ477Oا~:a w) (FDÃi/L#2:=.Iif"B44tb$cItB1K,YŠ+0FOt]رct?iʕ+D> Ĩ8"\N79g:33$BHl2{Vg>dlms5L\n 3jԽs&2tH@'b,]+Væ'crid* h ilݺuJWJss3v/~ddĉ<裴j*nJJJb30tl6{nL&SXN (O gsles2]@ca@~MKkPY|~!cybۘMTvNt<6;(DZwN/?0|$>>sZ[[پ};GϏy;999x<)ͅqS _xz{{ٸq#<@؉d|>{婧bhh 6| }T)=^̾r֬Y^c^u\. WR5M#??rjjj^$k O03[VeL?3Ў:%I="<0C#E3RƹnbHs&~.tvT#7 *.X,$$$4Ǘ+##9+;;;KMM%33sJSQQ\+??J۰X,`n6$$$OۘvӉcdddZSnnnX lٲq QWWGOOleGGlڴizvqqq\wu"C'Fy0Ggb096dˌ/q3:R ^ƒ70m: ؈ʊ:GèebXol6ǝtNb nd2aLLd6}lZRPP0T"믇=jr5˽INTV6-M@0L̡ZhhYއH>.\jRep~ ƺQʱŨ@o X N_2"N4rjIԼEޅ\8PnTkQk"4%. ###twwt:JٳUSSҥKcچ륽v5Fc @|>zb t]3gs汮At]>czMN&ptuu100@rrlWGFF舺{,Y$IRRW^y%%''lٲϛlfӦMl6< x=g6,$c|@*ZV3SgZBn`"U~69gǚ ț ~/~NG:e]|$Tǧx$yQAM(;?-L|5"#5TQ_χ_?eQ(7&~oMu^^z%>FqqqL3^}188hb.aÆӹ뮻ZTȚ>`Tc\8nCZ>QSx nODe3L-8^W5? 714o5oQcjr>E(oygqĿm'*^Wt]ȑ#?~|Jo߾)+z<nG믿>x#x?6^op_n7'Oܹs1ov###<1vesż/Clprʰf3餧svnf ftbG[:霪T:>uB;tT8Q\g4^0eBC2eQ%sFHAO5q,sU#s78mp{< ЭU7MoÌ[^Ae\%>@q'*ZҡJ0w5[1^6YGyQD-g@K\6fvu}'lN [k*wsz3’DII Xl6W\q|š=+W$2TTE*ϻ:i@:Nw\K]"~\YQDwx&Pp4^BQ\\̺uibaS*&&:1JGG5,9N+!e0UߏfQ%kFNnԼв@5 _h@湜CM!lqLi LM80nB9Pi*_q/K%P DD}1zь\:jn)rˁΞ=;2[v,&&&m6^x~ (`RRq uu~c $uBiaj' o/B2~?20&SQer]<to9%v9<̔ox?3Q9V_8\8Zw7vՁ'Tw:f?P%cPQ"TiyB̃bFayկr;oKLL[onHɥ1)nw5%<g:\DŽ l:m;녽=grPbu 0=:}8cnT:0^Ixr/ TYLdtT,TC=2f31M59~F>0* %TjqwB!IRRaK8;ٳgOMM o~r͛_$ aX堲!Jfc6.HAeB3#>#CLEiK.FP =Ou* n!{bmlY**K*73WGq#t&<Tпg u"^"ϣ I)8Et*A N6K;bx /ĸrT,T#h4Tky^T@757*@/H}r /EEYf͖F炍ٌAA,w1 5/g b$''SZZJB2 E[[==3Sjz9zhl޼yΖKxN~Lx.T4kـQzVFjQY_YF* }nATfo|TeediVԢ+ =Z{̘uC3KfT]LPn³u6bc%7*|> NA* ~.gӆ;ZGdԅ 9;:OqlB1 ز%|"scc#uuuӞ?7?vj)lQD"7ju:̈́: * t2伇@-&s ̨dE7P^ b DzI_-C\'0ZR};%DP '>I\aTFji:ׄ"c [POcyPv5XP'(]]V`? 1oH؏5],TP娛QF?;QG|P; !֬ ]WW7c^z%1!!A0YN ,o|?T4I95Aߨ(Ѵd-+|ײW@`lRcP'QAP'!uq7?#7d|0b?7m &rk *[CW=1kc{.TPbG~l3;+G5A1&Yߏ"T/y /3=:T;_0U_kƿQ喳lI&DͳAer~B`2̤4쾋/R__?X )iIIIܹ'xbeC:al\ *Uy3e^T Te5| cDݲ3+*c5čPAe2<݈ʶ,%Ȇ^?>@KPY :T d Ma,~ ^F߉"F5Gb8SUedT ɰU9fbcI@'"/*@+g|)Z`w&E?'jh9'O~ _gBOKP叓}&T@yh L;HR.OQCmb[rϧR/0D7G 5go't|QA?|v`15AIAeGe0x\ *x.,֫*{\?w<㨠 T1n L= 9EJT?ʐݍ*+Mq.TVjLTu92 Çr2ƹD4Th2QQѼ*Tkw2:oe>w-ٵDlj*F}2QrV!fiǓ3zuqE.^8ϩ:ϟqYVVXK/4߇  )Tw2TyZ քՏաN_ PP X5GJo!Tv(V^ԉ[PQI:B5j~{g*<)r> Hgw f >Tpd>T TpUϜIMQ$DX1?ͨe$`vaTAEߧu|?*PImhW#*[ g3@B'xb\pp8xf%hiiƸ}>]]]\v-y9yӘ6?fMݹs:ޅ ѶSfBNQEԉado,A v16#fT T`W jQMAQ'ó9GCR@uZP: Rթ UVj@ ǣ}qPg! G}ԣ|?a|UEhcmNQ+ .^: 5ܢBAUU4 Ϭ۷uvE  c~ϘdP'G?szEPggAq`~N~D E{4;B!Ĥ)B!B,R !B!"%B!B,R !B!"%B!B,R !B!"%B!B,R !B!"%B!B,R !B!"%B!B,R !B!"%B!B,R !B!"%B!B,R !B!"e =>%np!F{7JBR 7np\ @I@'&d2IȚmddx-#&ywA,`r vlⲔ7߻!Ĕ:{7,gb{7'pB\towA)}2>1[t]]4EB!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X$B!BEJ:!B!X,B6MHHH )1!glII$'%ap 108>jDbbχ`>ő=Ύlp8M5L&HJJfvfxxw!sM4IH```ᑑvRRCQVHH?>p:{\)))qL&dcfn:TOGgWBm-S~񔗖p͕{ضeEEx=[Zy5r-PVf&))j|hik te٨(+{;o')1]9~&M;{U|o?6[axdM(cۖMr׷/b8দp-7<@qQ!N IFz:K*j.~~_p^7ly9|w܆=.a/YWepp0gcf>iz|>/##4%Eܾkͷ}xмuqq6s;yo`7}r&QUQmDbB74mZi:W5p݌84lߺyeCZZwyt:q\ddliWcO= j `yg>݂lfhhK ֭Y ^w~uسkXfLf%\s;\wyȱy qq|p a100W8r섌 ,%dzaZw߽\ 晝.ZWYt |5X--b,䳟8M--8yzv;\} ̑cini%55WQY^]J_?himd>qbZ9}c`pnD^nGwx$d2b2w߽lݼ^N:3gl^˗aZ>ωS ϹPVZ¦ (+ VQV‘cB%117f||(*_wTVϡG'fc%ZU+W}VN97x5CF?AK[;ii[RyǝήqHII泟r&M3uÔeFrsG?DgW7|LJ5Weú5tuus)Μ;O|+Wr2lg>Qy+(cu锕p̹Q]"tI@'.;)޵>V-_NSs3&(|eKuǟ~ڿ34<dffOw;(-.w/Wp:GN.;nO~Ï>Έܧ>k5/v۸=|u$si gΝ< |CWLOKe維 OKO6r5Wxyy׮^EeE9ٌjeӆ /6> ! HMM=yeJ/]"..‚y n7zIfxxM$wy;K*+xϟ|8dV._ƝLQau |?执e_x]|ӟ`ͪ]w[q'/.}}7Oćw?{_GGWWԯ33#n7008y귴 e>Uwc*[U?ׯV¶-yC4> 1˥X-6mX>q*xm|G?啽sdffpǭ7i|l]=׿KYb9UhbR6oXs9}o^toLvVyǭ7࿿}U_w7iYY\{Օ1˗k6V+G'sHMm=7^w yhڜ⨪ 7':[zl\\)!ĂbZپu G).*ս}o9cϑɝ߂45?!ÁAikkW}KMM$&&j`T5VnjN'Ͽ ϿJ0xe+m[IOK:y$&&0p?zdob2a]1ukVuF, 剧 suw&nƌasntIYp6>[7m$+3SqYN\V h&17Ï>N[Gnj=U{vog_s|Ku:::y5{׎2Yb񴶵sI{žA8P>PRRLqQ! 5u=~2lj~\ݟbRn7G̹aw x<STXbcR*8 IDATZ,<}c``‚|J}B,,L<^/=_'3d*l6^g_x)l>]^~\m?/7˖biniS=}op%vmJVfF 1͜'J].zяV+ev9tXM9u\l륬‚|,/ [RYAyY)cOrq(.*m,!ftp8x1C_k0<‹3<2'u֭Y ˚+hj}x|>edgezغdx3|9wn_rrRT1--Ғbꢡa70I]}fVXNRRɬZ% r^:mL&l0dG4<2COefʭ7 m9y4˃CQa+/X[@Gg> 232;aػoad 8l6K*LOx;m4^j2p:cxh̚U+c>ukWS^ZJ'N^KM}bI@'.;u <5M4-t2{ǃl&%98:Dkutjpp\.7 l6i$ޮ#ǎ70*;iYe&NAֶvZZ#1o΋,/#>>aƏDlMMmj9tM-ʚ}B,L/Գ74ʊr<^/g .mx< )uwo-m45nc``nLlViZ*8:|԰Q  lfgG:2{!ayIe%9QY^-/PSWǁoގز9'!ftB ))T4MpDl:.a]M&ɉ:##'804l=..4B;r0]6)X,EfIE_?}tR*n /bV+gWsN.55 )*/! IIt8sC麎b$'!9dt]gxddܹPFYYYl64M?8>t=fQTX 7G]p`ׂ9/o,*,ghmkKM-\.(,jbqNdgcM؂\Hjj02<2seb!=- Ōc`` ~\b6STXLMM f` dggyത2< Μ ̺5IMIB`d|xP+NZZ6$ n  R߽y9lX,221Lx>lEXk65Nii2޾~&X㴳Sq99s>zŲ~u 8~=f6[GRbtX$"I8N v7X$$c1SvM/11Ŋjjiq:!5DbBtK4tΟ n:鈳0a0BEyEttv=v6uiz)B̪1sІ&^/Vx,s=w;woRrՊբ׋&|Xg2fٰ1?|C3<;:hnm f >lXm˦ PI@'D h5Af @fݎ? &[vnl6aZ}>o`=I#>ʀl6y}^]iv{Wcm.dgeR^VJBBj4B㥦<ƪ rlb"χYl ^o/6[0h/>f|%>|Q6uN/PVZB||X|9Is۰E~q u=X}a2Z-Xv$N4\c.l*X0i ~ddH6X^7?Nj/0>جhs8>,[ *mp89scbzG'O6xkχOvd҂Ve:OƤi6#}|z𪫦i+^g`c϶Ą HINRs3M-aWUWՍYԔY?B=y<5dB{}`d߻f)}tqf2M2>h>H/=?v2|A!)1|x-mac3Cu֭YMtbN8]`k[4|/;:M&O`6f^o 0 &&5u}zpd|^o0xИh7&sX9 ,/d2qaOSZ 55Y@1+'k4-*?0.x=ڄ6iqÈϋ7D0zqd%tzGA^3Gy̼}m M8{z~=457rHOK48@F"#zq8LtfiAg؀n‰ܚ:s:Cz, Fp*9DYi Vڡtoq:^@p!)ꂙ٬C9N&̦I=Ǘ@l6OX:iZpޟ?$Z, Dqt&n5*+)ϟ3LTpv8pЄK PI@'D ::;W&]LJr2vZ,VՙdJOK%ޮ&wtut:q8ju, XT`J4N(nZZ* $&&BGffd'wu&D~~ym\‚|caZ}Bw;-5uߵX9[N޾>\.w0ZCFzZa{g.p|4Ͱۥl"/7Mk[p8!5%DR=]]7Sf3EnۖTnj1ܼi JbNtvud,f3,V+III==xnpX-lyKKM%y-l__?Brr&Mhy<54D: Ԕ  L  Ϧ4 @EvVfUKsV*x{b2&V+II=}npX\[3TFzZ0wIxfR#tf<9.òu#}KZjkbScX]}hY,HO ?xlrs s/K*+IOKcX$"NARSRZ,dgX,dgf`Yq=rp780HFF:)dfvRl\.㴵wvZ,rqJ s847G ^mΞp0,,W<>겝(,ȣ Sό[.{/֯%>>eKr\u "wj%;+j%+3Պ墷/Ufph4HKK3̜,lmU뫙f**8y8YYȈp_͝bZIQ O_;Γ<7n PXb9 X Kb!NΩ((d2aÀ.!>5Vi9{>xů.NnNņ]QAYYL&.6^'8(8u믽6nXO?k8PVV㥶!9t]\t Pٯ3LT\f}(ϧ Pݟ2<+lI)lݴ_|I:!ČuO]Lf֮Yi$%%%r24MsCWw7M-QPGQaa@WR\DfF:&=qڭmȓ<Vh6(/+%>ގۭ7ASCvVM&*HLLq9().X'O7_GUy9IIvl‹/*Xt˥RR)+- lK;|; Ğ+vj}5rIJY|6֮YEQao<4nP?xHpM]۶։R4n4Mr/Da8(//#3#HiI1ElV.r9LeX,frsrBgWwϱ`5$$BIMMAGħPSwzع}+-mm}/q*Yojur1n^7;V޵ppuW]i ˯F]f&'))TTn0 5u459tEe 33q:\jnwc tu9B,& bJk|+4^C* eFm^zL&[6od OJJdϮX Im]=;8}CCd}f*m=W$';<=.6RW߀!7';oe\GeMӨ,/nAuyף>sl6sŎ;R4M_ٞNa~>VvZ'8^)*( 55U+ѲKm̿4߱? ~Un^78K+z= Llfӆu+#:6Ϝ0pbvl6׬Ln&>o|CCdsχ";;˖MVV&x^TUϵW_IbB<$>==m[IMIa*lV+==Xf5_(+-t'XĄ֮^EvvEt}dgs߻wy;99ٜ>{7z@WUYm7HiI1gΞ^{]s%EX,;΅ں9+kq;g$")-c܉`_4&B-.q328;fo̖M*z};q*x/xEsqM۷wQ?3d2~#R ")jnnkS{O]>ڽV{NjwXX]xj)  B`~G2a2- 0y֬yoV\y޹jniWJu5םwܮ\?Va^_iSh|8竽CLW蒅s/?NmԬ.ܙ: C-r\;=kruvu7O6hjnV^~Λ1]%EE*/+?W{GJK+_M_s ZbԜ ] M(+G>ֺQ]}}c{ztq2 C>خO5gsp:vR~]AO(N5ۭz%%ϑpq_s(`Pʙ•,6sy%-<-MdW]ݲlEk־>8\}Dk:l7\-oixt:UXX wf>ܹKxOQvhڗewPnr_zeqή޹+tiBy;:dTlkhמ=  =?^S%I5GHMMc:QV[ϛu﬏9(3O0TR~~A].܃&Z ?"]pWL{nWnn UWߠ_|Y!Oٓ&jz4-b.{z{{LwPڶ}^~O .!d֭z湵{ٗUR\ݡVi*##Cg//2٩׽Ӵdesl=i:::p8TP,߭Ҿ N}@8\S+Xmj֌s/[|t=jkiJT9~}ۺ91U~RxPC?ѵJ_s\>R_w>)mѩ/z.ۭ5/g_X*V^V^}+{QŴ;>Q[[~o_~cЯCQuyWn:/-UIq `P[~+WiӖ9 [ͫ!ݮֶ6U:$_z4H0;3CWW;:W_{]s\)־mGl=u|ڶ}XB[n7Jh|˻Ukk hK4lP{W=FϽW~^k}'  ؤ_Iy[j^u'#'Uk4D ڸi\zYZL6ZZ[Uuzݺt9+IJ[w fz8 鐔p ܧBeee*1+3+Gs])oGǎ9bٔwPgZJVTaaƗjBYpu5̅3 C9*))҄2媥UGjA ^NS*)*ĉeJOwc9zL MIlrUXXҒQ7Y0x-n[yCjkK.33뺧W 29]ޛjoMusƌIS\A:&)yVSё0l6rsr+)utvtj\IͳƗVuQ54654PNNƕkBysԬ#GAI] UR\t:UsjSccӈGl>L(/SgWԄ-jKֶê>y2ݝ\` (X,@E"Et`QcnbS Q0&Q"Et`Q:(X,@E"Et`Q:(X,@E"Et`Q:(X,@E"Et`Q:(X,@E"Et`Q:(X,@E"Et`Q:(X,@E"Et`Q:(X,@E"Et`Q:(# yQ8-MXDiUoɳ!)%UB(xݝ W1{N.{ 2G4eNsun#w8K aʒR[[@4:\#(Ja0Ra(777͐4 km9I(&bn$N 0f>9'/IucHJuchwuΝB566^ӊ+dV\S֞={$Itu{UUU>͛7ONS7oc=T|B') mSS]{ cn(K^#)`JFQF]_[WP^]WjR` hԄ|C/R=peO; ?@,y|AWEYv1hIb`?:pơB1¾aa[Kru 9Wjx'Ur|;^1:,~b-[j /=x Wm ^.҅eI W\ݨ{.ѝdynm|JszzSi g=3go7߬{O<Ԥkv3f跿ϟk7=ܣyiʕ7( ;)]WfhQKFL*J*v(x-m\w̍uㅃ+.{M}oj=?|ΗwX[@*\ZTQ>=n6;~/wxulM{gw$[ONNݻw_̙Kjɒ%Kt:uK͛oQő+Iծ]4k,eddh*w͓$]oVV8tS>i =ǧi|CZGvE tf9c^=fwqH=CvWnꯕhDlξh ]: G>gKNq LPwA{y{wyFߋ/}vm߾]?V\ .@6M3f/~ ݻW? / :vݺu5k̙ Z{%IA477'6#=tS:{Mn96gԥ%E'zqdS\緛U{79.p%$ILp`_|3x{"vdzsOCVoMҔ_bUSY|NAǜ 2sLl/,7E`Ps̑n׆ s2MS/ٳoJ*++%I:ʁh:9٦4ܩu>̠f7`G}G MMk_ Yv5w3~eyVYF!3(~j2/+VKC~v ﯕU75̩'Rx5,CEjNqɯ靿{4PԿkK= 'w{5unAi1_c7VzTYrZVր>;=Cm=e_OsccGHx^@f̘_jiiÇe(k׮$H/(;;[^x iiiѶmtUWn?X6mOh4i㏧g~ǘ1uv֧OX`hgW?yE)o[d8ge>) Ej4~pihw44U/_ {ߨ9n&ZJ 2e>l8p@?OzjIvZKjںu z7d۵~իWvkٲe].cUbI-^/[[[*++Q PVVjkkWIU])Ums?マ?4xp[Gz{h}[[[gAAAWp*`v]yx߾}%yW3Þ7" z/EK0g[g*))vݟ|Jf"0+;^ԣ. oA:Ī[:[ "cc-**:{Y0%;v0^ .B'nwh.LU.|}h {~䯫lon9) v)##C999r8=zG{_RW"CuehpIip hmgGij:.MR &}&==}nT F4nkllkuua 5sxK"xu t; y.t#s]dJ3AP]-4IwBZWMkm>hsEHȠeFY x攋/Qkжr~=J߮#a:O+q^'$`(\\F "SOOm?)z F!m#_'Bp c@khz9)v.4*v独EFh!,`&Oƛ0<^WAB#\X|G[o>G6@*b zoxa.^SsJR0TlO>AUb-GJbuLҖ g&8gP=]`#7ˈl(64Qfu# sM=J]cU {TJR]lKTIX tuLP$kcUmmNvl}`WOlPB uCo?8)qƒHB]2 9&>60' R~S/S%{ _oxE[7*UUI' Nr2]u/]Dn?a}@5PhD.  \Ѷ 5%椡Vd7Se :kDI<̊ZHP`hV${۩*sƂDE?rJ:USu,Cؤ [<?w%tEXtCreation Time2022-01-29T11:48:28 CETװ%tEXtdate:create2022-01-31T04:06:48+00:00r޿s%tEXtdate:modify2022-01-31T04:06:48+00:00tEXtSoftwaregnome-screenshot>IENDB`lxi-tools-2.1/images/lxi-gui-script-in-action-900px.png000066400000000000000000006773141420007711700227170ustar00rootroot00000000000000PNG  IHDR {4"zTXtRaw profile type exifxڭiv7{cYa9<դȖd'$ͮFf_TSl[lCϟ~:ϸ{S 'ϯ_@S:|0ОZ_z(hFk(?es#| }E=w,Do%WsMпބ~…6_3! 2+SV>~zz={Rٽ̟{~|sCa~?d{Ϊ<]C}< !m?we'5;9OZnt)F=)O*)j~kHf_w| -P$Ϲ{vo7]qw tJ9Իq+Ww>(}2n+xɽjKun&@{'&م䲳q3Pi .%ɩ^=k}ϯ,BԴUب+5SH1SI5s1s^B%\J^C5\KڛopL-jkwn?ˆ#<ʨ>)gyYl/'V^eVnSJ;.N8O9?̓֟}G͔.,Y㭥| 'I9#c>:2^ +gQ3<]sVy3\^ M371 v;'ի$?4̗yxRg:3f>D|OOQ3Vr;kX#!y^͔13M9j4b+j)3 .Mǹ$[u<|5[:m](P {'ēbyvڡxϦX!HjFmv1ǡvmE;g񨈲ɽDݩ/~pk%R~8\u]JTq:Aڜ 9}'=[y"p[.AzHT?~mȩoO odv&L9Xb/n9¦x Cfs)^=T.z<ya9iڽVnKT=5"&e6B$f*ET2|0\ƀ()Ux\3T+vnFB'*Vfkp&3w|KQJ%4 .HcRHNv' ( S T+­@}!Ef\m)LJ^Gb+=ŏ5k3B=}]=K͠o>iST3*%:lh(iayJi6!'s^(:>]tm OtƕhPle';>;g@|ojQ<gHfbyU౗? =]hhaolk2@{#M`=E$ɫ%3ȭ}΄ТE ߹:Cʴ\.q`xdXўR@k%g}CDRjȮI܀D2JIcڇV~0d%''6[{̠x/md@!)rM 8;>,[UrͥvտnRA8m ;ڬ[~+L1cY' J}g?մX j, %(ʈzPN1!`ozӨp<%Sf Lj7\HFaQTA4Jِt0np1H",áF:o`,BP!^e45 mS8`e-D:7ŐN`666 TpYEszuoޞHv<G y)أꔩh^긟Q2 ^$zlh/: ,lF i`<a`ŭ䉼[9""h"v7=y]tR iKCD 5`1umQH<.@jdORY<BfNØ>͸}<z.HA@V轕;ge@<(Fn;d!BPw#gm%80wSLJ׍;aţh4Tkι= E(W M@ 4[WKB?f)ҰRLNKPp< :kh +S oPR>KuYY RIA_N`2-N0D`ϥT0}& iAo(@)cg8fU[`y)A$G_)"0.TxZMj )x^+$,cE Տ=h!euZhAr*{-):GiJLg` b2zPXNF7|Znz8SJ /b.Mi@bG[ϊYFGCP_"Ҋ&/p8na&ZZ^W-E+k^+93-|MVH 5V@z(o]Ƞta6IMVVZ^Hm*ML,E"y h K"@^/{kD']09 :ɜ4ǃ-EBq*]וEZgT*xd+tA+p# 6ѬZ K֚ ؎˾N:_`L?#LLѐmݭ05'ܢ\>unǀ;6*TDRyx@>A3.2:'up3vmm5g2pĔz̆捰B4i}L.F Di9 ZcVV} ۵X%_/; ml6SU5F"%;j<+-V<,t!\H~L 3BHQ, *\.s&mC'跎&p-J s ZiG L>Ԣ2v_2$zV]_)sW^ӑ[jYϸZ6whm?};?>?)>+7=ŠQ\mUx ,U \d- FJNZ6(ZC5-ݬ Dx?iM@RȴU-*GF G^M DEK7ӬFM_3&&WѮ ~j$g@D<&*BH3SI:@FdyMVED&)N{̵;ZͰS¤ЍHL4NWGxu>t'}D{xr.gizw-O."<䐦d* Zhp ?k I@4Ű I ,EQk$FW!T8vYsP̟|0E~"dnSPopQIHrP_'צI.XuAP AF Y 55T&zC1޵kW{5VƇ-z~u_\d~\t!Ch0GEN+(taxF{4L:Y{:+T$f}m@6pfPO{7[j_Zevә݋?ZX^)Q(Wt U}<,& }x/@=T2h!BGL7z0cW<깃D4mɊ狆Zeqgږv/@YQ-x]bGԾn/QV[!HxO@vWA0/_s1/W$_ _JQF,fhϋ\|LOۣ]],E$Np܅" )t]:J|DPѓǜ9sbzԄԮ?r`QY -lbmHNZNuqP%=}x?` HݬTtX[ o}@7 GC"#cK^h rS@Y,?A){AD~;oe x`pxdDDWX"c( %D𫴑ңC;9B;1] qB_h[Zks=xvOmT|r4 i'WT#DmôYM{[:NՍwI" <~` K ɅL:U$3-_BS)5G\ A,ҒXs,@|LA5Z)xtYUNSC;R%qf5 dv&:yH ._41/AKVv"^e} hƏ/}Z {$]Ջ +Hj#6ɬi ɵD<6xį ̐~F^Z|ȔJn!Êt6`dQ@] ) YJ*U΁X_a+Yoq}Qmhp۔mg适A$ƫQ#́uTBBkWa=#49]yH:B:Q%֩Mӡ \'avPI(p0N\42$o>qxZ :mZDA:w20(?MtT5!s!dGE[$B݅3L˅ DѸr^@5 İ`w]&f@JmWC3y'}i`ĸQGNF,ihbIwkYk6 @'#pfB\ |X@[%@ӒUEjEV #nނrd ` : 2EOɠv~ AX2 E=j|"";@u],NxYY 8܍}Rw8mQ%4pj"IGhC xhe#J`*ey:ަ0 ^{`xdT+dgSH"htlcVن&>@uǢH.!| ho3Ith^Ѕt6pjzfTzn:eRw̰^=𞓊PI6<$̚IR oT )R!!Zuq46m̽>hi[ `UW}Oc!!$KJ4ڪ/!:[hњ'U$СMZ6/;f2{rKjD8tӷDExw}5;ƈbJ:Zш<;%n ޟ ҞjD< Σ WKAY[puwnjub CvĴh&dQWF7c@M@J˙oJMxZo?!tO(1)>$w:) rPwpC1A8NPP`dZLD2L4c4mv6xHu.E.PЅ8.y R5_fsԽcە* NM@Swt3}f(eNG8Ψ>9sCm[+N<#=h`݅^w< N<ǍƂDmD7_7 \gT w5jxMYT9 a_=Z8c$Y\:87=J \)QaP2^6mJ~/_wU服}2:LDN%m>.[xL @A)f1u7/(QP@X.HK'i]A 7q@g7dbzF*Gr>:>HIty~} Bqng1I8䍾BUA ,ȣ{BPYG4}>]ތoJ1)]=Fi6ܚd6[SZyPU bGB_/p'O|J*:Lv31B͟r2_._5~L@ksHд Nu*75 >|dtHm@ JIju>@Nmg!RoN9-Ϩco# PԜHBMfPz8{hhu?\;k?~W`NR,* 'F XJ@E۝+ ꐫ^/IZ!;;ht(M[eK+$G\!$16ϔGNg\U5yGPM%lU+co:Br'TKE贔Bݩ+xch;q"tC 8T=vjڝYԉhVZlum7w$Q#% (^#¤3+i%Gjbά|QvNMmiw ,:1W(CAHcYm5y ^&Ҡb)LN?OQ6ϝB\uЪ!X{]1tbZ,9"dU$u XD:>fkgVŽ~~VN ܃=v4CJ8.sae<ň;FEoo5gF|ۚ?zU*:(@J9Bhj3 bd`4 UOB^h㧶K"^GP΂_mR{AօmjE:*H'IP:Ф `1xw{{ (.+GXŤSc/.2u_\d򆿾g h u\_JR.5ʤ~hƨS*(/}RQKkJ1lJ0|yǻȏkgYcj?$@ 샞$b}oDe0-ϤeYZrC:^%_K`gt2a;.}޵!5xDZT^}uזxOfO'L:}漆Yifu-(Flj_>cQgB~"!$ɴ>z )3Gtw곢 nVEF*?n\Wc[dYֺ@ə[|ns \ڟi@).l>e׻Gur/:}"8631^miEY-we<0sK@xDMuJ\Bh Xh zpυm2<kۑ&5o1 1ô77m>qdx̤xƹ3#f&=O!t0+qTt8kk_+\FX j(1uR,<rrȱ*4Ȯ~*LNxI8#@hhq'@j$֢G@6pq֔=r|2dSv P(gM9`]:YnC`H>ۿwZr%U iTXtXML:com.adobe.xmp >1bKGD pHYs  ~tIME&z; IDATxwxչժ[pýܱŀ Bn ?H.K@L!1`l \"V/ھ;$Kr<>Z픝sfvf;(QbƦ!B!d2<2Qs(>B!B!ĉ1<|{X!^91B!BqӰsƦ)0HB!B!iocРɀroB!B!NN?±P(XTB!B!/<0hP()HԴ>B!B!#|v4A` f>o. B!B8hT# 0'6RB!B!@i&0(uoLcuSi6RW4@h,8 !B!570|n&>kX(7 H@!"U!B!8:|A "$Y"PT@m$P6XB!B!NNah$@ԙpxg6J#Y X  D&!B!wg| zN  Aw޽=OgVEB!B!I iP طu֭@&$ PYT 4 Xk[u+77n2 6MS+B!B!Z(n/u}CIIswh >h2$ k4? P`l}^p8FB!Bp8|yx6PP7`0hwB~QP7P`, Bx\B!B!DuE4wJJʘ’ f1mu;1TiA@A׮]{h-.b dZ~ !B#S9`r&VbϞ=۩Y]|s +GXan;sssBuJ 3/Bmi?XY }R@.FB!8 A˅bnNDQ0aH!miF(j;X,-"1Qo`$F0H̜@u;4LWЩS;hV"u2.Ԝ>`qD*;5vpԃ<!B.55ۍ=ʼnRU͆j%J!TUUQº:)/  j 0Ψ[K=bԎ?,(iB!q8ɈW)!w`n;km;&ɀj+b>X`;r~%%>9 Bq\UBN'HD2Bq5%YK*QLu8<`(jo"Pаhn@m$Xpe X=姽-vHZ!'vC(Z.oko%3yp$=%b1B1 ?ASƖ1 hbA ʑ;GB!Oaz=ѻ\.vd)o!BB:TU44-qv8vԞj^|XIF4!4^@Ff{U"o!Dj۟`rN>t]?|+N^asoOL?^#K&H}ff&<|QPP={ H 55슢x6`6R7 4,hÓaQ薮ThoP>V R-bĈL>=z4zaV@ ~ /_0seqUWl xb^}Ul6[iݻN `׮]x^l6:uM6I~~>@c4v؁i <4ٰa)7iX,n&.d𤪪|C54Mrssڵ+Jv6Mt:Yb){i8233k)))G6lAuu5;wL'K.k׎˗0z;vSNXX(]wEII Vym۶eԩ<ӄFבK۶mQU :ti<)..fΝrBLld\N1K x"DzF2(pRa\7( N?Wyce:<~}yj?@`iӆc{f͚5vf.^{MBÄB! fϞ͙gE4֯_ϯkz)rrrrrr:t(ibܹsq:uYl6\.˖-cŊ<#B!L$gs=`v)UX֭;wb0j(ڴiW\uu-?l0nv:v'iӦiwuYYY\pG,rgh> 2zhv;۶mcܹL0L̙sࡇ"==׋aΝ<'6W_ĉ+Z,%0eNJqq)sw҅Ç駟D=f !CꫯqkDQJKKy')))9nիWcǎF[n\q]qʺ+7n\*z!nq_UU\.e`˕0N8n@ @ b$GQJKKܺukRSS"( iiin0>FgڵȵuӇyg:=zoFUUf͚o2PaZq\q뮻.48s=gt "~;{&O' ڵ+֭㮻W^ CVXbӇ;v?aÆ1e233䥗^bTVVxzlڴ)yw}ѯ_?S?EQ8묳h׮]P(Dyyy76 M۶mYn^łcذaʼyĽ{믿k֭[+ ͯdr#8=cu]M/O^ZX m݆o߾ : v %`G4 ]dS<<~u6NΤ{4ǥ <977j̯͆dw~&Kah;&PYgUԹtʫ* D*/ Ǎ*O647DvZVZUW]Ō31cmڴk׮XVodAul6ƍ#wS>yG2do۶mnX,G}DEE{/˃>b{L67sϱl24M#%%̙3Yr%r |8#G4dS>>}0a?|^/?8fJ>}us2~xʯ~+yg B\|ᇔ&;C:c޽3f gƌtڕ0gf̘(\|>5j3f`ҤIA6m㦛nb˖-Sf͚Lȑ#4h)q`CT]ד# ̛7UU_ʕW^ 6 &g1sL6n܈ijՊ2|M6mT墼7x%\¢Eü̝;WBSY|y_ɚ{n+ 3P\\=̫zX?4 @"zx^zx?> .$''뮻Mӈ xaÆ YdIcfpBn:t@zzzm*+^~ew?̝wܹsIKK /dĉXdi&-[ƅ^Hnn.YYYlڴ)ܯ ׼yر#^x![1sLt]gϞZ@ y睗0jtޝ:$ PS'##`۹[طo/>ZVƎKݓ=쳍vz* ,`ʕ?I&qSQQAΝ)++?,(_~%6l8 MصkK.eȑt҅Kb Bq*JMM%''{Q]]j%RTTԢf%ŽT.8``Wިy^*v6~9>WpGhL .LTzT":(Ji/0W 8-$39(**J>kX8X,FUU%3|>ddK,0d8EQxٻw/WǩtbFp8L$n7;|̜9l2:uDQQvzս(//Gu+y3vX"/"Kw꫓&*/~ =\* VXqXajͫJdff b40 BJw+B<'??kбcG u>UU'4/UVb1"amyU<]aX,::t}C=Dnnnth4ʊ+;v,C/(?ϛ>hРs䮻w|t҅_XVν-5),0MWdqRCzhs}&K[(pVW';;A(LFV6*Ν;?Onʖ-[袋0 ]al۶믿{j}fkF޽{۟]t֍;3.<96lСCN4%5$r?EYY;w[ʤIx8p[nm6oɓ'ӷo_ϛoIee%`nyrJYqJe]hys=^<?My3g9997R]];}B֧*<?V^AMO=o/&55o+t]磏>Jd xg/X,<#L6~%Sݻ7inwr Æ Ouu5馛=z4[n%PUU޽{ b1Oyy9HѣG*>,7osswбcG{=^yt]7n`Ȑ!'5UUesSRRŋD" 8ӧ$GhφaOΝ8q"̘1#9C=-СCٷo_r{z4yWb3͆~4M#''p8|߿`0H$TTT0gܹ3 .$;;C&nGAAsK/s?%j(On8x O?4UUU7e4M?d̘1uVd&/{.yyylܸ1yw߿dPVZo`bǏW^Zovx*++:DF~;< n7g_lf* I Ip8F*ExPUp8$'Lc)))*|r%'1U!pDD'4H$I%nQWOKK7ҥKqbX"ǰnM6<,_ڍaiZfK> H?G", 999曼K̝;7DЌ'iTVV! MK %{<q_^a}ԕB(qݺu8뼌:DkDl.X`4h`iyXԨE2U&FVVou]*YwzTDkq\m2eƍbƍ$[h8 ɭʹ4M֬YSO=բ'1V/  UUIKKk#!X`־?,X`]Բ à"sBxr#Q^zg}ѪԫR"+V8-FNBP($X B%Bl61?:0O&y1M3$h`Q㘚qP-BŒ7Bq ~&G㤇|`{OaZ&GB![$ikq|#S!8q'Y}?yJ?& (8֙|?xB!`ۥm J  jB!.Xo@tO$X*m~  !Bn @UUip·&aH@!N`B 3R&9,BL!Wu!&B!Bz$X B!BzNBJJ iiivI!B!rN? ~  B!B!Nh`0xB밞(B !B!B" -/}!B! !B! !B! !B! !B!kKb1 ÐB!B!Nv,K~O 4M#iQ!B!$Fx<֖+ҷh3p8,!B!$4p8ܢb4FB!B,bf_:8B!B!D=,B!B!D=,B!B!D=,B!B!D=,B!B!D=a#EM6dffDؿ?aB!B!Zi,у,TUǔB!B!]bVbb1kB!B!D :-jI0<'\ kjb x T\G#RgbeDhXd$4jfHlc^"ou(j2a_pj~xK,R;m6P6{Va鴨L0af4H3FjGJmDzM:SQөżDKI Fҩ&iC|ΠxtcƍKW ͧ 6gtFDõ&=c0,6>bFA#J:\{ Q-2Ѡ- 8SJg jf .:5 [Y@l,B! Z:qF7 6k| _ 8ܹݫ<`u)}*`%}P _{CQ,fwBVnTdۈE|ze;1MNឯQ 2`r~Z,ٓ9ke,ކ(|67mk绅Obq,]{G,gޫWaq:q?jgϳyk8=m9c0~o ^H CkyoQ/>M(Zuo2Zup++bj = 2x`@Q,9ڊKzh 0ҧ5j4-_t'gUfwsX)LCjOeUpF DC^v L#F~3?b+; qC{-A@b֏Q 9=|SgQrp#ϹXӈ1d[1 Oq+%V(Zw9SfJb|3C(}*t~.36+fv3͑īc+5eFnb%Z/l_5 <&Ir['oh&}GY?>ퟡ(2s{3fZsh5go04 CQ, g8)X`s߰sa5v(Xl`s[m !B!,|>֮]Kee%ZbҤIڵu, 3uClZ9݋yS8.|^Ҳ\jxSxa=6X,Vn}l~C ]Mf9ӱ\lZ&[V(R3aʳ vk$sXLZĥ窻dV@!5LC#T}hLg2u,^Cts[? | IIƝ֮2sFs*E Hg%Op]Kt8\Bq\uXB!BbNnѣGXr%Vkӛ(*l_.j: ۗPQx4hhOu-aIhG$Tfs*}XXN ,vlv7+ZP ڜ1x4D,RU04b q/-;bHFzVEmGfq^roMQWg}u>`B!Km@ip׮PD˒۪UvVurS''i >={p80`}!SQQɦ !I+ZԬNq}FFqZ<y 9WUm612,{1_$33m; _jTmjv(y=2t}tqp3=?&zFEN(*tw!C&܃˓5P01 gJ}κf"x).-M4\Ŷ5'q !B!nLl4B2~5vݺ{NRe 0z9t-WTT 8zNttxJD\.6|ӆԱR;`wNfi ]w6g:z&\7?]תilDC 4NR4Y[*nkO~?KB:62O8mu[_#-&>IBU4a:m;":@D~cs׎9` Tq|H~c1B! tЁɓ'_iӦ1p7T`n CbzHYCZv I4jRe0 LSy `qL#vLZnοMF\(+tʍo%53;>L[XA>^oY`b1Bb*Jv`G~mq +gJiM3~X4W[wPYX[/юv|զӬ"*Kv|> 27>4 0tkJʹx$N Vd;b7/B!9-:8 |w|>ڵkĉ9x a N}ٷen~Zsyݶ:3a_ ˙}+_Gv9:o=G9ʗ%@t#Ί%MЫq39{9V*#Iaت@2۱q?ѓ~-RY3=$+ M[l r{3d|ֵX9 2vzv]1x^p3rzqәԌ\pRY/܂C }ֵGޯPUa?Jv^_͚EX1utφe+(<4~:Y=8o^|wg1ۈ}}%x+ٳmڟ9ACX똦G5fz Bf z Ʋp"wIy6.MEełi|:tɪEOb}/D|^Zw@١M\r|*' jjgEQ]YlW2`Ǽ{/zM+d JL)B!ĿӢfAUUl6V+aFO6q#+)iڳNmU޴`˷kn;7sp7Tocٶ}`9k<]Ld.&^?B^rFsֹwSQ[T% r1qB=Tx{' |360Ӫ]ol w-]B_JZF.?H7ҭTm[]?`w,sBw|Uw",z_ȋ&"JwnKZf;mYș/by0hiGCm#^Ο?lvooNlf4y[Hn'%5( Ueٳi!.WJ2j`p [V:Ӿ{Wպ3#.=ZGnCݶrZv!#+,k<`ʡ}IO(^}_Ǡ(4;}g߶˒ZFS^ -5(•Xo4aۨ(ކRvp#7QUўJ7ўhw՚AЏ߼ o=abQxX]9 ~hPMz EQٱ_\űt(B!hYM .3ΠGtAbfwb;Z/*:?ڕV*dr \1C BI!)\BB ?BBB @.ދ$7IVVݙkYnb.}?ϳ+i39gՎj^ x` ŕKgD ެA[:Y%5x,B<{<_MwAz}G12r+QTh;Kn æ=pBP`_bswt;;3l]{"/II\0W IDATf?.@,lRTy!5+:wL0u2rٽyڏn`:hV']-aUj?>ԌdjsQ8h 6 EJ# Nふ1.O6&P4x h<x-'k<˝Exw)V &g_,oc?$t&?e?[r6.yw>&2r+0 ]^ڇB\#|ؼzi]y_yFz=a):7Xݿp ;)FVٺ7Y;-`ozmRB$=g+~Kw^4;|ަqX^%LER3f`(?LgK f]c!ڏ(}Sk>>B!zjgВjc/k2`p8'$ttt|0lLl6XByWvWC.f #N'+Ζ}ɢ6̫- JGmĢA&̹_z:1w%~˓k%޷GJ:i>C1Mь9ýNfǾǶUrF{ęAfPTmjsR;wZm;H,&=P~) dΡ0]"p8ٲ?OE*\=MtbbwUPYiJ$ԍ'ԌFOW=iJѴpWVQD~& <Ǒ}+I.%=_>~2d 3oڰHoVh@w6G ެ2Z o>iYezPT x47gz,Ljrʀ/;p _X0C tp-(*<ģA:Ez l)B!GLffIonm{Āx]2=n&?0ϋ`saOYGywZ.uO>Tߦ( vѰ@oXM?~|L!B!|@VQV]3X8^))O<)iytf?ONTB!HCY \ۖ=h8ґ`m/NLB!B@= FRsB!B!9r^ <~;^z)XLjO!B!8Λ`1MӰl !B!>H]2dvV5!B!:/8,**bȐ!kL: # LlrK&*M;wV J# T.LBrGA:&T;D]Zi&.N/#`$&Thؗ(Xܒ)Xl.Gh܈i&B=Ac"XK^T4͊_.DQTG>]XC%K^$Eq|f! t]L#fWM49:h=_>*ڥ"݉|& MW gdlTB6ڎ˧'a|.!g^T,V=]Gjښ̧7oV9O3ȧ3)ΖMԍY0x<њE}m'wDE~d>d#%hVLv$lO"x2VPo+m9IcbOTrKb3hMod$V@,vc]@NZl (gc!B!$Xp4Mcܸq̙3@4L͛O40M̼*͸bcǚ؛ X^E{io\O$4bɸDQU-rxO#LfH*G71e1LLFE-dԴ[qh:u-;ǂIIt*G_ݺ:PUƘfKvǛlmߋiQ5;1B? b:YUqʶ`yC^Mv0=-t4'Ns(5%a9t6mI t+iw-([iHɠn-[v% %CfR12x_vz:%=ޅb}ZTD=t4n o4t 2n潨-˟v!@Hg踏U0 D=F1IVICm 1bMx i?UMۈEFSp;PԌv./GjVu7z< ͠ajJoW=&9~7_fg~L@ue }t4'4dV'iɓ~3גWIOg{,Ǩ AAa=Ђhx1fi6줳yhP9ouz;Ѽ;b\pvg.aS =j ҡ<w#i[wcٽbuS5 JtѰp ӈS43EQ56,qpg=Y!B'!1-AI仚˚ 2X9g~I:&Jqq1iiiIii)6uqSgLQPD4̾ǾE0LLnJr@j0M 跟Sm$smTEIlcFYC?UOaO*mLO4~i i>]>u_?| !B!Nfff5znp8|޽{71 |]w3Y`&q`Ni~<6~t6橷1 %Smc|A|i)B!g9ib`XB!Bsq+Bmm-@ߐp!B!B|-B!BH@!B!'8/!I<(fB!Bq=&OfCQzzzx嗱RB!B!\.v;k׮EQi(B!BXشRhkkCQ=!B!8/C^^W]uԜB!BqZZZhmm4MTUo}!B!v^ 0iB!Bsq5 Joo/Amm*B!B!΁bO^^Ç'h4*'B!BȂ:jjj,PUUjN!B!8G΋`(h&%B!B|B!B!N 8C^LQ?7c/7g(ifzTT %LS|Tm$tp?5EB!#D#1Aj;Rc/{VVVbT B,1c0x`RSSinnP(*ç}>ɠW0h 09,ÌkĈ)RP2{~,V73ᗑ_2X4Jog r*zy"գN~,kˆ)7p8w\y "9Z,4((̏}!0 ƺŨ#y2 g&;H {= DQm R,6uc"F&Ӹ9œ1^G^EJZIϩb/PE}pMj x9U6l4ul/#/nDk ΀99ְ=9m}Y\ulWW<`gA ߌiuaq F0n Mw".8!C2⯣YtG |ՇB!>.bF<G{{Q2'YiW^y%B!vȡX(BJj~_#~_#V0 ՊZ];:ˊZ\hʼnP5;jC՜}1U64o[ I8uj~{*#i ӯ&c7;%w_СbdWj~#l./oZ6-C܁W5Y]j2_֊jI Us[Q-(ZK^H>Dh'Db1D^ql[+4kjl(v|*hW},ڮjqe1r {' d6PoF>n@3rʭd&5s2*016V+`'Uc䂫Gլ<̻)v;6Kn 6 ף&H7/Q3>mjsSR5 F(%/`?%1jÌYvaC9xQ1rNwte3֧8@o4v~N ͚ )'[͉ZEvGUeS\9%n`Q4hyL&YyOYάk϶nǫ*G_ݙFkv-9ν Z귐G2ּSNV kckߢE9IpD8>.*FthAPRP:R'gwZ2Ǩ1m'=LfA5P7v-b[|!4N)ƤK†u)(sƛSAmou/9]SHٰhڕxkc;hދiy/\- &RjV}x3? jw CL5J&Jzn%5+YP^FL748o)k:C23bo׳sͳ~Q\̾1a?ޜ2\V=zIdTB} V(ޜr6$as1<`IVOp޸ EkӶNJZ &&&Q+I[NnUM`,nLӤq'Cf(AUT͖ɒ0"Ψ0h,,@4Ŋ׾w~k;æE?`߾&kF^Q5@O}|c4Ɩ%SEzM_gMW2W} oV f϶c \&{ z:ٶ z<Љw0aC4\Gaof$=P13 hH)r u]gY/[6Kn޷O!vr_'pp/7Ķbu3|]T3sSxt4aԙFB|mu,}t>uřS^GY/G;i|} Z}AP#LXwU!B}i㡴ΝKjj3|>>z h ylkA.__Ȕ˾f uL[׮a0M77,*G^iPT ;уi?iRsi8|45#ݧLWQ:d6%~tfa.}̼*LLGhkNz TN<gy+,xsT h>>_@GK _*}>-CQDA.x|qk<1W7}W1re^}ʧ0tDC݌il_\X9R1?'2\+5L41;-/??Y8j*Fg_cweiӦ~|{# YXlD_~4u+}-EYy73L L0Y/3BVMs+HI-8M=4o3_ǩ5k&4֭fa;;xؿ8|\s;U\*/$3C}T<֋G1Y%!=O#`?a+9FbģģF Ս3% _gqi"'"whb?K̿T=]c2~ql]4v-X70M;]h[Gpxu( v񻯖G7N2H!;_qy *NKVf$9e{[f:M3€)d 巏T7pzEeȏQ:t6K^r✢&)p7#.j&KU޿ 26g塞"*܄i)c11txF sfKD<9`NQ_>:w2y9{/l`s+q)bg~r318Ye~~ѳJ{.FjbR5< IDATzn~t==ᘦA4ś|_|%/C8eH!BEQPUx<ΪUuS]]͚5kN:4Yw%O&<.Y &nO]C~QSZ t0X^ֽS.Wtwֳiϱ:`[ٟ%5;hؗ{lt% xⱐG/cؤrґ y)(>rU (XXWwG60wyC&F<~_Pd`4K_$og0MqFzFb|t=F$$ N F„CA"P,`9Ff0s*ċ`킟q`f]cV-`t6;ܢaNi{r4/'=qsLQu7܇'w Ml'o:/ΧJ'1tL_bunaSÓ1oUq ] 䕌jwL,V] { c]yhQW1hz NDedz.㯥|5[_}_ W*Bwg)*b=!ΆaمP5 m3 |S%3'WߚӬ (2-KęEZf)Qu2r+x+. nzf%WņE'} gj&'aMV æKv*G_;#zP!3)ɴ6lbOVơ݋6f0h\"scsSfpeQO4 &pd n =Gi\LQnjP4*PM|x#%1Jf9rN, 6SƐ$#wހMd x )ۭ:9{!_Dt+6L5oɡ ti6X&JM Wj6.OO"X] bcs7E8aSae_$-_:-EI:3,&_V6,1.(!BbCvZ&L멫;X4̠( (˙pسonyՒǛǘ9_cŸw\x7E4H,4zPX4D8ԍZY8o); ͒X{sǟ}ƚE,{`ut6cӒ_]*ْۧ福F05c^5e/W[FC*ms3p`â'غoq[8o)u Px$M{y/PK7~4MK~šoټ_\u.74ڐX(4عIR<̽׬ N<;~KvA5/0"E tg1^Qbg(*Ѱpw5Mphb`[lZ9Z_s} ( wgJ&;Ev hfPG48!o梥~ &9ma_px(~d8k[WIF:Y2mXO! 9LHHad;iY׿Y4tEZrdBߙ8ΕĈPG$ԋ͙ӝAQy iɯش'nB!>2T=仚˚ 2X9g~{;IGGP0öLJDhG *M#F)hִą~(qj{c=DFV>|8Rz cœXڹ Kգ>BAh '7-wG4b{RgqwڤA'd]ߍL,GEi{zJQѬA߃ VGYj;OC`DII+DU.scaV(JFnw˰W3熟cӉ t3N9:c6/6Wmޜ |k: Sd_Pg"w|hVrbЃ{3YiM'M'݅#s!FOGQ{auxO0q&6+Sm`7jKYčPz޷ҼiD0cy9!z#n˱HC4<ݩLJ'p u8\.L !7zpDUzvi14?X4;ovu8?1%s'ڱ%mGNG\7h4K\ZN\#$%9Ǎ&{|ÄsHpS DE>4 h4"D KB!VffIonm{Āx]:6W^W.E&X.{}uR gŤj.ƺlXKah\|)A+~O濜dTʘY0t zmy]RB!B H\{ ,TJkW͌ 1Ĩbx4q<1b(`uYB!B`E#BQz(WlfqxS-)=RB!B΋`AAA^a%B!By,(,,waa!K,, B!By,ؼy3[l4MIKKc(B!B!΁"X`6bv܉ah&5(B!B|ΫeQUH@!B!8GΛ`(핚B!B!Α&Xp8ϧ]ץB!BsAqq1V}I !B!yٳ;wbXքB!Bs?_( B!B*E B!BVBVTP$&B!87͆n >[^\E%h%;`a =z}\@aL#.Gwqo_:Ɲ,xaR0B!B |Ҙ2e n-[F8PY03!=E8 kCBN7jLnE!1,`q ĈG1M0`s9QD4 8X 5xH 13~zq ,}m}GE9uQVgWoYݝ`"=1bKtxGA%Q4:|XKSEjξmT XEKMXȏfS T+X֛aDB`&Y}eZnfM=IݸPT)iw{y u C]j1a,vo2:`/uB!, TTTrxWPU믿ك(tߊbaĔ[qyrY  4zS?M[EBlX_SĴ+G<|]mu~:2jdV`w(b˲j##o(=BZ@^E?C(Ø•ˡ݋ٲTMJJZ+f]cˏPo!j=Yf~ll<|.ğE,iHjV%/YCi[?!h;e8S2~}z 6lc?&lL&: ڷOkf}Gt68aƾ1fQ1rMl\ Z4t Ø OG~~zʱ72rhV;╇1oܰ/2jq8]{{`sel!)t=FAof?&D( &EAXV bS|Wxg0B!B|;::lQVVi477!P`b1L#'3<_)(GηjCNӁFQgϱqϩ:*4NA8R<9#gQ>R =N'AcؾL\BҲ0Z/ Quh>~΃؜[oຓ g_>KoW#K_ o>iڛvZ9,+_6q #i8(4 ¿>77t'C'7Kkf| RRУ~ʧaI˩$N};ʪߤv>Hj`L T`:YZG䈌fU2eYiBQ5TBjz> ĝ;-q3y97w~Ĺ_ g$,VES4+ ^x*NC?wެxs{9|mtB!,@477˰a:wUT^BB1PD) * mu]Xu՟[Zյ`4^!ޛMžwyNf9s̽< x<eM!;o\.^A&L<8b&lA0`wf,C 2l%T|ʞMuӸ[w1hF$䦥~+utuԐUpfiJ$&%k0ǒާ2;1m ;!(<4_w7{Wc <.܍AӈoOx"H@Wt@UbI CņhK;`8z.kZ(>@JNݛEر"NO43"3R=F3@`[)8a&كI;,Qʬz[\`D/3%m+t{-i͞ZWv :;i݌u3{}Hȳ,լD EZ`-<4MO&dfΜɘ1cXfM Rk hDsi@B<@(_!tH{vI4G4Z6bQ?f9#"`8Ѱ D B(aOBE  `3ŖJ4E0t_`Z˯֦Z"FhXB ^ F cĻ+ X 7Y FQ&~#4,] }!D40,To`[UT7#~"1pڅD,#3.7.RjA{X,~ UU1&g E# v_% M=r*r=ecPFWޣzjo`j&M&x *־ղ5GUk^rS,P()>Ԭ!-8褣qؓr;CqQk T%B,"w?hXO8Іlq+)yp&Q#-L}HGrMSC-Pal,! 4Uu3x*&KhѳN؝Yd+dv0x2 @{V9Ifn >x]HhXlx(y6!d-b!4Pau#mlXέ$#XT5bsf'9}F-qLJFiYxvw_gr+d3x }Cԏdlu>DOHʦh \U(G఼qqi@;v| ; 53v/yt4ll8?quqZPe>Z C@ w g+9#Zv-oL>> &;-شiQ/F1fu;fV.=;L:N>[:sӻp9CFKΖDU1'o^L,,ϟdy߬  Rg5-K9Hɡn[w<헴lđdǏp9Q8j IDATyꉆp>6g'N>cA}Q i.@K܏#) ƙVD$$w9Ѱq`j*#˟/; J ٵ_ ;RzP Vܷ.}i`:t8:?ndkn[bj?bkCmؒ" ߽ݞ)zxA& K(VG `;f[A0bO#oAU3-NX91m09'` [A1{kdI2A0sFU GJFXX"k:BRz1Sν[>ݶXK׈?EPVD4BqfwASe@b–DvT &;]8\-yfk2'm@;#u T!O+<ٖBۀ5ɳbtut)qfk\%Fw_(~켱,tDAGGGGGGGGGG###AtI$zݛ8 {UZTG4}ھmhh4 ǵ]T¾`kB]uMSJJ@Wu+ ~w:w~Gx;=ƏX 2R{a#6"Ce$]{F4A458kB[G{>UҖZ۾=`APX E􃴾wugbǏ"O2 _bY߿fff4:?~x WvG}-`$lE8# !yZq@OPAQUϏQGGGGGGGGGGGb{,0Ȳr-Y|ĺQo^$I  D `xvP;?.@CëxI5T)~#EL鎽]3E"pGQ$ѳJGMOoG[UUbX M}g?% bOK'MFFR%ZapJH݆ޮHDHb{\'K#j>⾃pZNP W[pzz~kk~$Y@|EA9:]Zғ&2H;ca]5-rL9߭P H,Kq-Οmg圔|7.# !I$$$Yjb{<3KH0D$^7[P B E{$EJ/yk[\s5o{lS6\.g7BB!{KrΨ%ِLP r}5| !(yd#l3vpRafm}2b)<EڰX,\tE ?iƍ#99w} O墭:'ifڵ|j .g}ƦM3f F^C$6o̺u# GE<+1? SwlP]qR-  _`LKǔnD˷`1SF8F#v/`2zpLD/!7B,Bƭb-AG Gb/əi||T9r$=M&фA0` ^Ve.a0#srf1|V^2JtS:W>NEawk.:GlKOë548 hL53s&7LpN ML#UL«Ҩ2n]{OT?Ez@+a7AR%(zBG!?Yn(LJ> @-';M$&!"bŵ8f_HQRv<{o5gϰvnɿi $!DD*#Do97>_nǿ~ } h\G̳ mوoGLMIb|B֣:H+W2{vߊ۷/6PtF;~\Q&# 书#=tS:Q%JU Z8=tt|BcrO9FшI0oT*xubDC(3 _DGd|qBQqE\G-cu i4>oP;k]kg a2ΜM鹿"X$%%ai|)t~pH:{U*Q[oEI:ruǵ88j_EsSz۝iɤ4{/?⃶XԼY΢=K5/5`*ZK㏣{MqRI+lk3͙t)]kk_1 FGb00㥽/ Pl/7%Ah 6TS`;34/<_DZBs~gϳ@[waot/ V35MksY\A0 hƜ9sp\]4xy뭷4 ӉDUUN;4&L@MM Æ KxxZ ᫒"?{6`C@H'3:N΄}9 ,,"IHzKUdTs{b?n7VábCYY,什n^X,l0zhVZE~(--墋.bռ˽GҸ;(,,qƍy'z XsN nc4IJJ";;bo[bygew#j#k~XJ -YvJd<l%#n G3@bMDw{p=$j{+=0dda;q"ɌvmXDmvC I=(8Eg{Z}㹚6UEu]llc0P54JJ6$"mE;"" F|rMd3p\ vrl9DZTHD9©rDv$Y"ϒǛ-orbKb1NYhc4$nQGEԵəy A[-qSrh:R}|(2bFqS~p  5M#//O>D9eM&piVt4f3sᢋ.⩧b͚5 l۶m? n:dFŶmOdJ7tPƌ󍅶;?fxp Ƥ k232fpq<^}J ۜUvؗr t{W>F̂Q5h?Do%#Ϗ³fqI'aٰZS]]{A qgsҧOz!'tSLl6c0$SVVƕW^=Ckk+ ջ e˖?WLf.$xrS&i=YɹFԹcJϤ ;'Aܿ "72/GXhxc=/?G˕HK?#PH_H ,#՜륯Sᦝ7*R/RR GcǪ3I,3d̙tMSS4A`CgHF'H;=^ՋKvlʂ+9+,|P5,3~xn:*** #GdΜ9_AXr%*:wu=VrvIMM vsIg>,X9s裏bٸq# /O>}(`ep❺w5G 뵯LZFci}qc̯ύ72"uY,5_<[,K:Ph-/!ż3|F,n>QGGGGGGG>@H?_ _333sFGp4嫠(  @AA|gx<>Cv܉`  !2.M6G!2`j8{aÆ TTTX~a娈"\.B;-/C o%ik^`2  WBhC ]ii"^AUDvn' ~5rC=BpR"D%\UIxݗhD Kʝ(- oɓ'_9.Adll]F]e֮ la{+ TTբ/cg;;.F1c=;<;װտf}zY_Nj/R&ٌ/3>1G(ĺ^ESԵ`$H[fs˜+auKJiB[ eOi[M0dU*^i~ES0aB^c>Fjj*fb۶mlڴ5 & U*" ((tJP KCT܅Q0%wQ!R"PA\NGG1@,@p% )*C%t1/+Vl6P˶6Zj_5XP+[}[ aW\q OӻAQ$I&ٳgx<K$~UUe͛7ijjߦAhjj@ uXpabpSYYɪUQJVh[G{ !Lpܼ& 0-BMEa1)}4ELak3ۨR+ǯ2h s=5vvSP233ꪫxԿYuttttttt'v{f3,/p\-zТ@hlu$, -}iСV@ pX4Mv vꩧ:ߜxYJLO~f3\s yyy}:9s|k1_tttttttttt~bANN\p7tƍK@ϝ;gglh;iX ,T0s(&ꫢx8F>g9Yɪh37)GC|F9fl%֏N IDAT[ Rl 44.̾ʙnev U3<w)1숽x3vd¬Y8E@&FLJ&s~A~ QK;q^|C, KwDPUQF1vXnvGM149ɰf`3PQL*<5)NYy tOgD\17p^y|1"%ih ;SNexpڣ,\Kv2>)q u6T΅(rX[g&ĝDCc|xҌiD(S3۷hgADk)3fnN'՘`OԐke|xTT dg)6[modNb4-e&l6[ᆫ j7r[Aǫ&TC1AnF'k<]e\pTrTK*ن=ksbr 0CvuX;cl}o#S0[O<SAjBGLK'_wvrBwv#Fʕ+EQ2e >} 2˖-*L4 B]]K.`0p) I;v젤T֭[w 6Rͩ 6,i#q-،6rdk#Z~;]U믢)@%>MYW Ƽ/6$ci4(O7~J)tK:hk˥&P 5/pK-vonuHD9Ts*I$&g"[oœO>98L]]P)Sk׮ԓJGGGGGGGGGG!Q]]{C rdYaÆ^G2Æ{} j%㌳iDdVĔT\zjDh(5{ZGDde?E0 77b/*Ɣ'0Ò7jŒW!E"`>:۷H3( 0޸KW5@4ռ\2> nzZ&;'fȟwwsa f5]6#Fraޅt;(10$u J3sװc(`u[ *1-ưalnӶO]Id%~!m圗w"#w3rfYgҘ=D;:: 3I"ĪU0j2&k [l*Vܢy b1J==nnCm6VK)M.ejߩ<[lȚUA70J6\/KܿCQ#!9fо_/ 1ļ]۟D;/ٗ1Xĥ.Tx~Jr'r_hb+($){+~?'NdǎDQV+~ٳgGyy9SO!{/hFFF-p0k,ؾ};&L ??[ yHTD(ES0 &>^Oiz)d|p%F 4R|T?O]bT_z?# "=6#zܽ\a,0RBXd &V‰"[lsg{%a:;;bDo*b F3w:|>N?tEr3ihMdg\G+ ;l&>=ZЌfX2&>w=-/j_GxĪ*{6tPV^#UV¬XEs9.-0Bο==]~1_ mSR "N͂ r Cޣl[6\L`wtUUyrF[1 fjזLy|<>q;>˶/Y)DӴ0541/7<0G=[JH "F0aU?甗:L,vb.M@PUQikkCUU{r6FѺR<7ahvhF"@QPA1gwCSETU=9 G0'W]E\j78 xZH315F1H;s ƉDY9@TS*ƈ:i%J9sytT+W= `h}ȪL%H N<1f eR֤Gz3͞\9QT B7[&D\;r_RQdy%Fbj9iZ^3G~!Wy%̽d㍗|a[[(GLMEтa/6Y0ʽ0JJU*fьF9U( I 6]A5TS*1- Z# k4T!ݓ%ߞϢEmsm~̂ҔR=GW@UςUmhrYX,dee~\} .sHro䉧]X}" t _30g`)UUU 4EQ#F~*q"NzJJJxٵkX ł $''cZ{|6*t%B!W_'H!YƀXE+Z;FU* a'>Ƽ D^~XqK i!z?fԏdccO<>'49ɶgmHiᏑdJ):YZLh9ixan!cw_ʯ E? FTΐ!lzs 㜜s(rvgmoy65ظ\RxnsG4ED6z7ɻ[ 4[n~q'xjɓ7or 7ouNZ,w ƾݣԊL| $s{]bQ"G&3f`Ot,ا:É ,]\$֯_YgL wAqRXXȩ-ؘHD}}= رc!8N͛DgP[cL >cYZ(LɚB=Sff18JmKyvH;L3j_JǺÇ'--O?Bvv6 >@-НVakfffhy >?LYDjj )Cdg9*X0uX B[6}HSSGfl۶&&:ww ÓjGd 즿? ZݷT1W^ŀf3ܛ8Dk Vzt5I0⎸ɷgCQ˺iM&8`7YZO}6]. USV@aR![[)ri $< jDQF'm!ubg=AV`+`Z4"r`=!6[l&HRb l n"Ϙ*XIo2^eJ<;%KY ĴiX`mmmfY\'}_CJXAb pb'0:j*ni0se4ڽ?>|8??j&$UϒbJW\89u2K$|LJSJg=Ti/`*I_N[^++"z*2$I'D$} .:>EZuYU]$Y wtB @.%~&MI!m16,E.lfceY%@A/Ev93+gyΤI7׾5ZZZ>u}d ͛7r#H([!B!8iV# ꠃ6M9DUQn9sGǮ'2hUSe4NQ_x /B!`ULBvv6;v`ǎL>"B,)&B!BKFU8N$t[Vv;p,+B!B >̚5k[[</oB!B~UEQ5 B!B,V/B!BAF]HB!B!ĻgT UUUl6<eeeiᠨ,i=!B!,cϙ3N*bΜ9is̡RF!B!h*oEQZXV~AłJ!B!_mT Ef jB!B!rk^!B!X Ĩ`db{E x/ WÓ܍@Q2 "K|ӰXDD"׆B!/`p/reC=#"rI"rh-P]]ĉ1 ^Er1i$&NH^^$j}I3?N^tb^bߣ?IDpEI8$~+8̥.fGPU ߓS1L3cb4Mxi59 *#w-cI%c'y}Ně)gR8nsgs9s>JNTmG[9jD=(@٤%TԜzSϦr}B!BnjÇill/u§>)9x^&U3n"^X,23uTԞ ɾUdWq`Głkf?CQy,k hӖ~9A@**~>Zظz%܉[?Kug.v69MY}dU.O 3%}~WWm/MS9O oaǦǨ[4YƤYpecl^cr1{-B(J݆ٽ=X̼3?GV_rhj,3.$o&t]Gn1B E)˩})ެqgHjz)^ì}(yg~ _xB=#xŕ2[jrm{x/YwF!WmD?jv.4_iϋl]m\η4j4tl+7?F'sÕiҏ/uyYoRP2p7?a%젥 ]h? m$hj#KP:40P5#B!FQ54MҐJHRNyy9XeqB~?A=݉5=?䌩!c^ Mџ-џ!Si=wV@gs=/[y[?a.7׫PU ]O7eYιS_߱q*LŴK3.u:e".~JoxŝYߙvzrػ}%r=- =5Lf5bs3u4ăw-AO%=cFڳ;o+;o+`?C$16R9s?/qϠj)kVޅ;UՈ 5 ]w_k'``K}OoW#S_ŖdfyYNZJAak4-Į-Oql~ט}mL$x;}V-0$c^]Kel}Lq2s&k~L\ٰ;}I昩r+ظg""U/AAdjFP,v2vT A2vU,{|2sI#Fu0M (0y; f-!X'4V?z;X{^f:2Q]tz po e0d4bhMމ#G[F|95{܏'HLD=j^}llىA%:zΖR1"N #!TƔHA?ZXB_{:Q5;iωE޻S"3nnÃmxسI 7~O.moo!B!w{:̚5ݻw0bB2Eд{ d x#wZcvV?r+f0tn&е$0y%lga& }Vw|N4r@QFГhL "FV8|cִh*ǽ׳ۊN"833OrX$JR=Jj^?^7L&0t,V'x6=4Q-I,Vf<F_{$9^\l}w,7hJG XIh4 ͣmyF UbŎO|,$?1ܙvQTXGZhPER(+,6<#3HZl2kAy =UUGlO=GlfL3}uiI #w(B,.1[Œ ?]0RG4QU ̾hV|F4IqL>}#ךņi@I1N0؇j&Nbuaqh]fu`巎B!@U4M#77MӰl|>EŋsaOFFVumPPdiI< &4g\;J&hsEzmOQ3 &/ҩ ES8 yM`o3%P8(NݑIO^zZ3~y3 4lގdR,nwNz o<üoTU-a_+{98w=5s g𷐈v ^uY4ӯ OXʪ!x ހ($Sرo_MQ\z39㪙vڧY?a =-=]mش^TKof5*PJO~j^ ~@2uͻ2:EIôL@0{g)LZFgfZw֗|6]?Rȸ 6"N6)!LƓQ@dKikFOΡ0( xL~N';VQX2C tSRu.H7mٺ) >3@DA1U4yh. {_zD=k̫"3gwLz;h9ӗ|;;VmFQ47v&K.>nX4Š 2. #17a)o.j6+݇w5 >ѐ7hoIvDN9k8Yj:gǨ{-ӗ5gz`<@B*|F*MB!-x7NTm`VUUv8B7MI0"PUM2$ (\ I%$"隵Z8:[ w_`u}4 b)\nЬU/9g«+ ۜAS{(F$q2KF={Mcw;chfb)4|tfSq<EQ?MS' f+sPg#D+ \ 4 v'):=h'  \zz`}ߨ ?h=sik PTTT"͕xȏՙhX`we&h#ݾɨEKO1MX018]0! asfT4k&X(`0X 3H D)"ɨX\C^q?wN7H p{w_Oq$xzoqVMFC9kprEa|:oc.;tL4tTU8Էg@}WL ݭy}O2Pg5E\}2+#csGB1=Z.Xg 7S}3;sOjުXY .gY2Jz*GpT(ii褓xjXx=crxU/2kTߩz0;w.{:UG!B2VC3f SNeڴiIcc#R\\Luu5QVV޽{G'f,hˌF0"0b1`/ xx슢O.{9 4Mz{{b?<$ Fb$Iv;aۋjEUU~?T vs7WL0?϶m[~bp(c F7K,#F jǡ8x!V^̜lBc$i7J+$v>x[f bAK1#Sabf#)~b{4E#0|k\Q~R}tǺy31K?AMf K eOd۾b_m%vE\|s77Yٳ<33g⪊pX<8ՁBkYٳ]ϣ]S7slB{EQL>SM!BjjdA{{;/===[gyb ߐqL\m(à;AToC~qr+zM(A){;=FdggSTTDss3d?q=ӟիW_qkkWU֮]ʕ+@4ロ3gg?w40 @7uLDS4ߝ]bf<:Qf99Xyd#w2;G;u0;;A|+2̂g8p^^2柋M%7<<|ۺas_q_SUB Qw;{wB}W=Ӳg;zŚ&D>hG S]]B!B|`A"GF.̝;ٳgFLh)ǘ[obK  gholjGPV,Krw9kIqGTTQ&t~fti+B!B1A)h(GUU.2jkkٶmې3ߊ{ 28n`' 3Dj`S4MUTPK$D"<3ٟ|n~LC@1 i$ I_K]JOrEQ6SAtSǮ hh57;B;hz1qkn "Fdбzqy%DB!B5F(ҟPӴvYY8p\ac/)%|K(V ւ1pھ Gy/@Zp-Xc󰍯»p)Wס8~&vc-AebԩdffdZ?{򗿐Evv6`IFFŌ;U=<|fѢE,U^˃r֘Ȩॶ^"F==Wx /1HLO aLL]݉n*ݕēqBfLċ/u% 8``iĦ٘9ss%ϑs=\FNBYFa%i&J]xk8%A==îRlg&P ³5 cp&~K?@ N\|[>::9# O|yҗNwT2S`5=ʠ b,CC'}ݔ "B!`Ayy9AAASL+vzYp!W\qs̡!G(\„PJ(Ѻ7PlvW_4c&\Oƒe(Fa7^&m3= *'y|M6qM7NRԠ`ܹsxfOS_mu!iT7śо۪nci; Ks۽eIZ/hTvŅmTfV?z^`uj{_+E\iS?'3SX$XX'<D'+FlSlL͚ʔ)Xtۄbw1_wz=bŊu׏ x <3SOgɟ"n<-$a$nu\ fW0:Q|eW$#D1̝'?!D!B!0FoD>؟< DQ9ˎQd-"ߚOLєhWJB!Bjd 5V0hiiJFsdTB!BRr5=h@C֒B!B!EjdAqq13gΤ[n:4"X`Z)--/| L8R.!B!B!;3*jEQTUE4RVfapvZ] B!B|؃ƍcɒ%x^233),,dŊD"(T ]IRB!vB!BarN4=ZXף B!Bwɨ $IGH$"&B!BT!B!B d*nRq?͎9BB!*X`&dT*nGӴcXg9 3^3<˓͏AxbB!b 3glݺףi,[ UMϚ{|w ~\Sj]Xl(`IG%w0k`)T_#B!7Xǩn = #ik+ͫLΘ)|d_x䧧J%( l}'Y˾āt5oQ̴E7иk-f^'yR뻴Jg]x JvD o["?h;e$w>i?08>h= ja˰ڼoðeB!BQఫ7x]=o&;)E{hX$D2&҉ ѓqETpys4-$]ڜLe  wC3ieXνdfr?bu=fټNNa-i Yv3ղ%~(n|Lv.S}+qAQm(FeE? +wm=) 4BQ,fzx ʐ2MI˘zw [J٤EX^Q(ZJ^Qz2NETͼ<y>6TIND.Hղ%}1SHd1u'HXnf\-B!B5`+n֮]K$|#<ÄabͪrŨ=/Ѵ!8)92;_z*>rupP}N󸽦Yly7 =@M+"VBVnr`igSlx;O')\Ew^\( ;1eؽm(={?=U^mhezwF>bc?=;O#*>LIպ7^e/d2Qp-k+@O_:jyزn.)2'*#gL  !B!$X0 uww @cc#7peeel߾}i8Wi6hJi6-!FN,x[E!nE]P40 COb (Qt4j%Г^.T ET"4C`;(6n|P +@$Dy{Yd痓W\bCS-XlN|μ ~$" "# ҝuwV+NuQ]]Maa!it:ioogϞ=C*+ГCdod}C$]T=/1mѧ8? **G늢2xIzJ(]e{b9/qֵfwqÛ(:#a"soG8d' 9f^LɤyԿ$ip`Jλ7~U)ϡpU-YEOik~QPGnAm`܄ETL>Ech'6LCX4&,g3riiJ4po : E*ϱoq*v( ӤpF!B!Ŀ/`J?c?Ў|-X,$!7FRaTUnBWW`(D8t6mPRP(t7bЛڻ$b~R8P/Mcɾ`xBuh$Hav۵W3Mx_JFH$bznCQ:mM[p{c{Bgb(D}u_1MHh4mOݶ@O+-{Wcмo=Dd"AO>w% jm ؽ$X% -6b R{PT=8eZn!O͑*{i$ 0Z<'0\wUUUU껏8U'9Ry4B`ggeEacaB:b [aoW]AyZ9cRpyzyIf11)ifmZV9sHRKdk,Zffr{e2.fg*+;W?+11,ZMF 쌳)6E+]ЩwĥqjO.SQ׿_@!B!N`A[[5557nPbɴcۙ:u*UUUqJPw32WP|71qDWz:uΞGoKY^x _DKbRg"ET?d //K]]]2x>9:::b,]K/ȑ#;imm0 زe #GdŊDQ:e]F]]6m"55]n鄌q+NPo\e;^z㽨ʊ\8-'W]ݻsh^@vJ6vl" RȚAO^esq{4uS.VcsaɅ{y){ ǿ׏'ssTWqGƾ> FX(SȞX 7]Mc^G#@RF @Č`bLd0BUU6nH$/_|O!B!`@Q4i(((`֭|>-[ʕ+9| pWپFӀDEKP32izL5-,D +vm2UI6mٴ py'> qƎKvv6sp4q 8 ^Gy:j` 6~q+g>-eueYkZw;Â|kڷg= :ήp?w+ˮᖇ=d\~䙶gp(l'y`E EỻKM|G{nǰ mܾvn};c3ƒGp x/c *:B}~8$!4EæPPh7sYeH9lpJ!B!՝S-'蝐M]pۍt]gLPU]P\#Ɓ 8JP8JHtuEfĈC{^,bz{{btM򗿤 /#FH$P?~9$`*8w{i^(v;F @ %%H;{ ##8==4F|Nxf̦ϣxHy#Pl6R/DOgzNGNfΜi,ZUVx3gSN% 麟4l̝;3f ?ӟ? i |;'܉M13ߌeYtE5bQVFo7ylOi 5L3qɂ.,瑆Gpڜl%sK-ԫP‹(s5"N8y8iܳl-w:u*YYY\RZ!B!1O]cY#9996x<>#ȻJLFF&L  rhnn q:lڴ]uxLGKˠH8K {)n" 8N&jO]gj%z%3D,&ƠoI<'55)SpAFyꩧ0 #YQ;v,PH$B4Sp8z4McԩL>MP}ϞW'EQh 0&e E"6uo6PξXXtqffͤ]ذ1={:{z01m":6H#XX nٙ5FރSu۷iӘ>EN8a[f%۞MMBTP3Q',P(wYz?ZC!B!<ϰuCÁOwuu:fɓ9(X08@ h@^^^>r= KeYtww:*Gl˸2Cm7b3=" 48hn+ॗ^"nv^yV\yn馛#c <ʰvq\)Sg;f N[αRRR8ٰaF!Btl#^/h@>Aˑ1(xperE4.-~"#vEQb477q'kpm?O1Mtw~a#LCD P4}BߤB!BFqmY. H%5}9]8t~++@rB!B!>XR- ,²,EIfȺo_[|)()i B!B*XEEETWWS]]̙3~S]]߀B!B!N`"HJVVV5Ass3`˲4ym6 !B!`AKK hVZ[[1 sKmmLy'B!B|)1'Nfܸqܹ!wO!B!Ď3h4JKKtAB!B!> ]`kFqq1===D"sB!B! 8NƍnPRRz1b4MsB!B!ĿB ??ŋc(,,d޼y\.,"''ǡC !B!j6~%VUÁ(P]]n&B!B|N`(\n@B!BSB!B1 >HBjtvgi9x3ǢVj'-8\Y%,<asN-Λ5ɸRF {Ýӓ'+B! RRR8383),,LNh&̞=Yf;dZrKfbYFUόl- IDATS2|M4>i䓟{1dKFg=(ƢKK.!9+-{<'Ly-OI͑ԅJ@S,3qL#e&- =?eOM¤90i4_˦J4x{#;7?G<dC_q+3s=n~@QTLig@jf =Yt7nEZV16뿹y 0kmMZ٨^˛+D"CA!3 [E!wMfn-u[X VNw ͯ\탤w.,SGXx齔ϸ îd3Φr͌|egٹ7zD# !B!#5eТȢ)laOʇeYDQLB  UUb1aƏO40NF4cAb(6-XO$ňF'p(z`90L ص7aw޼`o#;d\\+ Dy_II?9ͫ~ipj.U=KÁ/c_%衬b̻{Gio؈ÕMye.^5T;a?z"ul\t7-{Y)[}gwTpwyH: 7m>eE9R[V}~șcj73ad?}hτOڰh-~nL0#RLJ/fwRWBr RHaXezןƭNjYIB<ϰ/? 6uO~HtpVUCmm-1vXRRRņon:*.f{ٜl]_%`JHoW vZd?;lDo+aŒKs8i]^Ҳ8\vw:.}-h6`-͙̿ݑ ӓ;#ܢnFS:a!,i8@x #‰děMݾu%ph+:wնQsh9Da<?ch@HIk@JF!|2sbe3YE4|QB^KqɍTU#=|OΔݕwlT2rG_ а5g\'=ęͤa: =̧6Owx#y73)xGSioMWfAKf;p>ǻ}x3PUƑ'-E~8E0x2 ;@NgAO+B!#,, ˲͛7c&YYYL<^{m(h9q( H_2@ wړwٝN4{(  YϤY{Ifћ۹ߟ6L]}q ́iF F<ӳvh E#W<gJϗcYj2Aeu2rr&ϻͫ里q.(ֲLT͎ ((ʲv*^  ԌwRieiS7kvs;b\qk/v=c 5ꌋ9clz4n|EUAUa$'σe=1(`fnH+̖fxvB!B984LTUn( ˣ\~IϥQ6$b!H`o+@)H;fs}D,B,CRuf;c]Azv@"}XD,0ClxR0u{.I*tBFN:񋨫Zxo5L=:"!FZŘ_vc^BNA3;v0GEU>Rģ̂͑RENGL@QT45.iŌtv7)9ד5Q> 4c1%L`ŒKG%t;s`s2feX޷"fw @E.\tzI"tTW??7U_<2 =NL0M G͘# R 8R̦%z`YÝFE1cMl.?U4;`i;S_)DP!Bq~i4fQԧ>&77cR[[KSS^ٳg3j(ώ;N}BE9XGֿ/DO$8 F%?LӁ7|Ƨw18HE\zSķlUL]" 3sϻ 3"'M'5sZM<@_Og\žM?(*6G պU =+%IKCQt6oc'4;jNzk( 0i;;LvasOϸo}x7ysA_OZkWuE\r;-Un^q .u=3ιoF k 6 3XD9R<&*A[z3n'\|35l]KbG4c\_bg8emzt+Ow2vlM9r i"FW(XF"`Ҝkq *_+&.&5 p MO.J+YxHKӁuL[%.#L!{xf, wj1m[JƝ_dֲdR o6f/ sAQ D!B!>B>1 `ڠ@6h3].CYEwwʨidfUU%%%]דc\.4Mn@" ,Qˉ:*rhp=ieĂ\ޡFh RT4{ZC~l.'~y5AJE=wHJs!B> (he?8|1b#WJ6ƺ,(ʇ>a 6 )^ԽhL=H$c)^Ŗ,KSNŢfeDbJKAQFp >t0:(ϣ H_<#8~}7pB!B^ x^u[|#cPHk aEn _~/.O&پխB!B9X`Ee;ϧbCQ4)!B!'vGCX>\Sj?ڧv)!B!`A?N~~>#G$55uȶtJJJ(**pnbO#ZXXʕ+uEEE̝; ~߿(=s9!Ǥ1o<.\H^^^riL8ŋ3eʔi2m4 \E!B!8!3e_G4JJJ1cFFYr +ϗMt=`YX~rrM׷w1(*'?}_$uBptDQn7x˗i8Ng’%KD"x1ir( NsHN'NS~B!B!HLHoo/)))q.\H(:Gdg}/>OimOw]ײc 0aZ  '] +Y&WeP<H$qE=È#,p8L(fvZ^x.o| (X,yNC" Hȯ@!B!UEQp8(NǃgȑdeeQ[[FwAa-|@00e(>_ _њc6lǙж-[ cl~ۅ-+-+h餝pNkxlEA44MCUUEa,^h4̙3l444k.rss4iEEEL2 6e/^L0>zzz*..&+!B!CV- Xt)xg1M9s搕E 72`ZX@+O4Qh9j؟"C1|גÍ\vMw~Лh}zƿχN:(7FGu{E~wžƸF%@MM hQFaTU4M~3k,RRR׿'?I{1xGVƏ 7܀bռ+ddd/~?466tCmm-`P~B!B!P'4PmS~d3].CU8-J67TUr#y>xIN-4A6(*@%2h{"pдsYz?  U':u*_=rKr,#- 0M} }ie%)MP]ׇ͑ ibF%%%}qa!B!GPvv/ѽ^/h@>AIv}#nH%|)GOr>'??r"8Y?m7eGa? Ma֭FR?\ W6&yB!^B!B?jfFW q8رCO(+!B!Ò`J9!B!H:G+r\zEQfKB!B!>˲3gvz{{ٱc---)--Ų,jkky뭷ԉB!B!8Ӫz `͚5<3ɓ4 &0rHV^4irB!Bs@Q$ ү60===tuu%[!B!u phF"'';wbNH$Bee%iprB!Bi7wѣ;w.wXE"ngك B!B!>QF1sLmFmmmrfVFX~H{Y&F‡?ywZ4" !B!iDB$!t]'}P2||>}>,Lۨ 01SΊ[3r'2f L#DřgyĈ޷FO,wdLyO?ld˰?R>:'3?B!B=͘eQYYIyy9lقfh"FI `ʕD)e PydL"̶~E] 'E\g ~Sv-asLZV1}T4! Ç8i$)#5#?bwvM> i6'gN|Ow͗~ƙ~,KGӓ]JnāgNB!B <7n$ qYg1{l֬Y(twwF1bć:jsqwZ5F^,b(`qJf3Jg9|hi9X;I.aܴK({6vdySL삉{=ϡ4Yא[XAO];sy IDAT( 6l.(B"`݄B!,ӥJɦP_70 ʟb$ /e 8@'Fb. E*)DLbeeM/dƂ#p_ S,#˗a{Jw<Ui,Yr NW @g_=i(YKlB"NFb7(JKa/ S1yEqRpy,8)8=d攐Yp݌(eh6&Üe:4"|ݍNߊDI4؉US<9nкd!B!V- TUŲ,rrrɡ}kM`>娪ֺtnᅥd2R3Kn 8b?3{-XFGKUl\Ǭe#vR>J6t5́/S8Kh?e|`2Pmv7dǺ_b: eҴIΘy)^u@<]-;,̼hvMw>R~Njf! ~l|n g?d]ML#ة!%~/j;i'3ug9l]#XA##o2²J^Ӎt5oCQm(: ' o=^ {7=t@B!B|LeϼyhkkcΝMg6;d@Q2ܢ "꫞=ib{o(p!f]Av8^~d7no6Fɸ,ӤvPAahEmft;(BHzaAJZ=H;S҉{ L~ )͡L!B1o<:DUU%+(ʐDMEi+@%Dǖ?EddD4{ 'I.NN<'2ul L#(( zuTF,J 4܃ %}S44۩*;SN$udE4#R)TՁ=lX0H*B FPgOÓGB{Wޱ^94Lcpaı=X&c^7W~UQ̝OpTZӄp oF!Óӝv`i?,E<D{0L3B"Lh`S)zoF1d7P;E(OZYL^t{q3`!B!*X`&-񐟟O~~>===رX,ƢE"==:Fw e-.P5g}N(1FM/+n蘉0hط j^g.BͮӰyęW_aaTՖZ)1|ÑzyigOfxv;:d9w=Ì_!b_ 2AUezL}%`q}ټ'lVtSo-/"{18]H@'P@(݄GpRu'8ҵ{\n3zEXkzW  QTwRX69bZ:@:m4}YKo_`,8iUsQKHGmOFsiYWUo>D[kxA*wR3Kq{38c/H{m/Ci}O%YWVxY+8|h3=mNC!B! m `0\cY#9996x|Jy$yWq:FbݍeYdgg $ ȲLB$T{7=GZiۂݙI"e-51(pV, JjBfBV.4Í8ܸ8]shZ dgh> z(*=ufżip.ZM,$i;h{Qm qq;P& jv#zw4#pGӁģ=:v59iXb:vkE0ЇfwQU:7aNWk5!1ٶ͖at4m'=AEYuL\(Fg^Agn}-$]{I$L|]>s`vG*[ioƭ$b?fAsb]mlzQT=5膉Fg.n|5zQmNڛvkïaTELTIk0QUtFRn"!S) !B p]]]w>X,0t6A6(P Z{yyLP0m-w+=KͯR B!B!N*;;{`%^W]]H1h9<0sT)C8As}RB!B!lR`o-;^iR.B!jY`&Xh4Tϲ,Hx<~YNEu=\>ޙU}Y33I7kKхPZjY ~TE/TJMҤ͞L.?&I6M ryk;sr'<a6|cd&>@4 {"g͍?%1}>T`&-bG},J_įG{Q~lw${*[?>De\Ăة9.}7 >bf i(3#_N80McH)s@ 0Ge]ŋ9s&VkܐKMMeܹ|k_cѢEdff~"  1ydƏO,vj 2x rrrm/((G_[np|v2;m&ANIJ>|8'N$!!w[Lɒ K@P2Rw_)aQ,iBfә1yjBk!˦,ٿxxÜt.ylk09E(9XiZeCF$8IbO 9s8)@ %6L$;;ݻw 8q"SNw%77.C^^cɒ%A?~<A֭[Ggg'i"2C$֭[G{{;1cƐil޼:$InSYYIuu5#GDQVXq(**ٳgXb$o}X,ƣ>ʵ^KKK ߐ08:,˽X 1.zW&"0 b6q \Xjk)Ng"oA .۴Y8Jq>Bb_8( q(IHCxh5U In3QD&ClSf`۵7Á?5'DEE.͛7VeW;q.8`WHH,k]Ǝ&+T$T0;j_#d2Q%Tk*;ֳ+ 9I3Hq xkO33zU^($qUUXe+Wk"YTR(C߇ CB.ٙ4P5cEOHH %%Çir&qԩ|>[Nqq1s3˖-p`ِeY B?/fԨQx<xeEQ;9묳x1Mʎ;Xd ]y=z4v?ٿ?,3vX<NW^y˗3bĈ~qnK{aĂH$2hl˨ ϛG#?\.$ d$X Do*I$z?? ~{Lnÿig6:M|ԙv 4CAo묳=XG`).QXL#HҜsɸz܊Ⱃ_#8Gſى;K ?=#/ofaL3ԟSh#ܴ&<=i$NAeM=Qfzt:bfʔ)a֭[kѣ_Bv"KD,0 J^^'%%EZZXbTUU:4ML$ g, *PVVO,Bcܾ3l?eXh~V60 $k0.%-AM@I!J`D4 _x K҉nk:C!pcrnw9t?_qͽ)j7TU=Fp avwѿ%!0%I&XCDC5?Ij02q$7H`{C3?{>a=u Vm&bFI2B=9;D{.0ˇ^N= asI$tt$$bFjbFqoHH(97zx{b1峙|ޭHšWe֗$f̿"!Dtpcio:@4?Hge޴@a!DÝX8=C3+xS 9HL״w{uU$KK@44ne$gpࣷ0 $_KѠIR@knRG0[zœpC &@ ϻXr>}:]]]^W(u Yv->8N\.׀2ϟb了7|h4+]|$$$pM7#pYnFl?zk3˅v[K%W`:7]VSMڏ@>roF†ab:qbbDϟz(HmT}0?6$y6o;ءZbqab#q o6cAr~'qC=q޻x̄X;ف-o2tweaB-ܼfvvmǠE3۬z?]w, $Sؿ%l[}Hݮj=uabQ] c:#gѣ *XYY֭[III!)):|>߀emٲ={o|"dYdɒ^Ch)((`,\{390~gMyy9+WСCTUUqgEAAA$V^{w0GBw$Ҷe$YFom̓igv.gŒrRv̠ !8< `\x7|=MH Zw'MCI@; V+۶mcԨQzR/Fp s2R],mZOqN9P$.-ƳMmmjFL#$Iܻ^\ L~6oN :~_n&ǝ e/"͖vLCi s~OSC0s˚Ѯ .qc~_S4MLų^M=)8nPFJGG4C"fM+~sE3?;E#3o<ɹ77 B[^JǙ]o$a;DɘxʩٹHp05ޡblY!#t1urּr@;mM< 'a9e_)J 3D[i~y)=響CTU]xtNFMuaa!^׋,>|4TUvzx<|>:;6VUU^ ##'t:Yr%Ğ={x#FUU222ؼy1^ DQ&L@~~>[l-[0tPJJJX|9K.=aǞ }_b쟐srIr37bm8Ldv0 \QW6رоĪŊM` V4= C nXqMD"vR%-h޻nj9farh 9)%D3! \z/eG J@t vO~@÷cut ô<0'pt=,GaM{o0ƞdYtot {Ɂ=kM3ia??ȚcC?~L]u=~fH!^4o< \~O< K2 f::r`xo7[B:ΞWޯ1sL.r~ `b=1SzkE#>׺=g 81M$1f"I@"13I(Ջ4Gfaq>}B@ @ hk\.UvZ]>AdV1 3?-IR?}r-DRd!Gŀs P@2Zs!1IPuǣ h /0貐8xVPPX01q Go;^}x9XUb .]JBBaZ I>q='o:tHʇo+r鴹PTOOdq@ >1-0z|0 NqBDׂ%`Ş+hHm#(VP @'m_&p>;FARXJQwـfjė((,EYг`nGŗt$15][2>c윟z>Nɶml l:B{9z¾d˓ACX5JSKʧIt2c{|~\t >jiD-;  U1ا^}`1@V8<*@ps8g„ t:inn4M?~Z$5)' c#K2神Ƿٗl.R7> Sd%T$VP]k?Ƞ۵!;yۋ/7qI.-pMѦ>m_xho$Gik;B>\{];A HDdz;hL@ 46>݆aP^^NWW 3yd$I"!!P(D]]p?>6M I$F'&ӞɄ $Yy \'~}빮:~^sy7tV4rf:i%1#X%+ y<>ql+Wb;A/1JmdG.\J5r{9y<52 J)dي(`G&Ib[1n @u y=4S;cJ*LM%{}J=:Ry]V7OMz|{>&&6Fr{9~ s 3(q0> dKr{9C,CN-`lTV0,q؀'+ɔjO=Ŷb Zr(LI^Bd82I_@-xǒ[2ԬrJOqq)^diR6o/ޮR,Ј}D>~&Z$]NXN bv[CH`g=OƃaTm:Vx;ZMv SZq)cy̽:pַ;d#@9 phZ8q"u6dʕdgg3tP\.Nk-PP{Ď7 r94߀,ljĝ;$dcNlxenuۀOOD[%$} FjCd3ȲgqI%[7vddTp#l4S#d8?;m622v2 s6ֻaE?ϒCUJ=K .U9LWblHHe;^H"W r04a(^]HO$Ksukc[6R.5܊ ;6'pFw:Yx-vvKC *ߍ,ɼ޸IRpEJF)- Xb"$cIBU.+mcRJ A@BQ,8=AS4Ezw<5C"@ !;St:yuIu0aǎ\s5aP0 $s8|q#^ŋɾ>j[jy \삐Bd @35$$FxJ`o3ɕ.Q5^#4Yݣfe|m׸,2R~z  +l7Mɪ'UU`t,MaYq2LL0`g;w^f|%+\:~e%K2 ?#^½CeDʈ}^Zōfh`CqC69.Oz<ωǠ`樂twg%HD0M+a=ayE 4\ݮ?oo5pTM v@ s(ɴiHJJbƍdffioogر3dn7 B( n<jL)9ɀ؇y ڣɚC]d("5/"ߙOt7{&=ƃ)eS*]~ORC&ɒ'!ڿr;98݌5ʋ /bllƗ tt" 4G-YJ3$ә6wnߡ88otG:?PAKZrY^!1)g:\M̌A-$$**Oz9dz޹dujV7CFyG͖7qI.F/|9N.=qW3c ㎓b^9|j)ĆBGk5CP=bvTl HIH.&oDQh!d:MvGh9'KdUָ{ 5;ߠxϘvяݷ!mk~ǓA @yIh\. (**"11@ii)l6{=jkkX 8.ByE"Efe/km+^)„B~g,o^ H=;wp~,YfhVJ[>.Vǜ9kCvvse,]ڢmm]SqbE |saW.vmejTCl@jgMu6PW ‚! XڰX † v?a,!q{|X$  y.vQLÏ?fCl;2Jgom6>h`4/շp5-*9sX߾HZV5cTIew<2f17k.srN9<yV-z2ܵ.6wnEk3ɕW25ZAAVe<= x {AZwp+nn7XG!=.(7 Gf~t%z =.م*((Rh-][|[#$eCVݻD]<dH I]"Q,`u& vkZ@uY>!@ 8HII6v\vڵZ#}ă<@ Hn-9 !,ቚ'O=~@ @( 13v~mH*.u$Ib޽ @ >@%ϒO|T%D%VS%HW2hZNQн*H_(EAV,DCm"EjKBuaѓnݕ L$Ј (@p 8mR\\LNNVUF墭M-pVYD(d\aܲ9 fdV,L92U̷Xrh =rҩ>zGnq+,|A~ڂkyhCT$WN;uW`+`F tM3 7P@ЗQ :Vo{>Q5ʳod"+Aq% e%?E wT=٥gs2auΡo#B @ pxxAEEEuIaa!l޼9())a„ k.VqCy'ǞÅqAK4gCC(K,CBbW.tY*[k~Ɲ[$ >?U %,_^GEO]4P`13F+ø:^{ vr}t6A}7LۅzU8>qyZ>hP 5G)g0>˲Lpg|{'rZPmFNᓮ›ϦUO|f|̡y yR2Q<U!è8&&̺ݫi}PxSy[Qvz蛆tg;yc 7}`le?[;kU$_5N*&wY#xR :ܲs @ 8IEEnz 41c8p$IKy((lݷt'^KD&!aFZ_؇KuaYw39u2rnv3c񇥧PnQ1sfÙV/l=RYO")3݉$ˬ]7$IREZw .>m[Ӈ2a~LL3FN]ǯ~Zԏaw.o%Z@a,οۖ{D*I mupp;ؾ sA9IL-$DB;ٷe&̹fc{Jr|l@ b(TTTPPPҥK b!??"v;,sYg  xn&&{ /}@k~D38bL]앳RH(4 Yei +vv,C$MHR| W͛~ bEENXݝKbJ>Z,7Y3H[V=® ςiBdKP1lX;j9W>$I&H7%CasdL6?GSF Ÿ3EV}V #64%yB:9벇q$xyo7 ?!jo]H`"I iģ&y7;Eq`Z Im@ N40ayyyY&~slio&O?4O=臨e˖ @>BZA:VҺ" 6'gUWf8U 8'6vnXd n?^',^X OXOGK㦡8DGsýK/ezAv#9-gZ4m|G Lw-կ!#;HIMs*e'Yٿm9^ YDqO%g9|' C'@>wrtݿ,ė/X'?Ǧc3M֏՘`0a[Vl6[hZbgOpB|8Č{}+Wq UV1M썧N;{866xݺLL>4~cPqC?6j! 0jFYkUk妍7ѦL2kz-[rc.?6I1 `{0ZG4.+ )Zucs9i tbu:11wR$ =L0b#} DL"t ,v0 PmvdF,D8NԵ."~z}&@1 nG =)))rWڵk=w w*fe\mb"+6O~Ë9w!."3U7Nq6.@ ay moFZ khhA$@ @0 B,nՍqLX/SiZ|9'R/cbV6>tlθIԌ@& ɖlkpgȊS@@ Si3pNVVwb!++lIOO%;HH.۱H&&f~/]Mgkq  M6-LLddRԔN}ʸٷ`Aq@ 4dڴiL6ٳgSRR@^^\pӧOgL8X,&Ξ2g7)IS]$I3.ͽ4nW\=c*[10>|1>݇I<` g~_N%33foOn\cGqǍh}m$) 2Q I!bF?d>Kd[r}?ĐISyHn'ۖ-(ѓ*4 zG#1%Az]F$4u ph } 7cxY hv~ÑX,`LhHYLQT+$=_R}kP+!Y K,$*z-^y())AUU$I_|_|˗cZ`bbFX#{;RX39e2﷼OXX^ SOm^ŋKq!s8 o}o=6.]z{:L%!<5kh G`-Ǵ4c#%-n{wQTǿU{w@ @"{@vDD\fT8su:^:8.uPEd %@BN{UHIՠZ,u_ &g< n斧vR0I3oz?r19D|ȲʕdY!ͬ{߹_?c}cs(HrQάypvq/w6z80!7k>7-OۣaS5]̀KAWd3VC[AAA  q\~t]':Pe]ٳ:t Ӳ@#;;h zcH ɦdc_1%݅3䖍nO挛hhns)_߽GeԒQ?1I7`ed35ĂFƎ_EqRk4۵z=\?8]W |^h0fB~'j򷐞s>$4T ]]5?!+Jˡ,~u+͡(F Ds~=#&ϣƪMh‚egOJ 7u]e`lRrW~km<ٝ՞=X׹l^ .zl"bR1[[qDw/ z tY/ane8k$,*  %8TUbccYv-R[[… z 01cP]]- w%#B`鶥Dʑȼ_>OO16f,(uy\r"sxp˃wgILCFFErmCeT]^*9??9O4cGe2Zv҉ ],u.!;9QrQ"ih Q~$)[ v,DdQi8Ti/-UՐCyLRزMɟtY.FU,yw!g5أza0ZHǎT>d̹ISnNj;6-܂)۹ݟ"NnJ25{3~NBL)<5 2݊}xJS[pŦiEime( L+$ p֖  kNvv6믿EiڻwoX, :Fcc݊#3''$n&Ln3.~Z< KNm@gI-ȏG|/e~=ŏ#ɖm΍7/*.mPcZ]UgԐ}) UVic.muZpfZ;T[L֏ٿ}A[M{T/t$vog^"ґ$tMe`LV-xTFk~F]kEW$bZ}`"2&5:蕖lo9ԖoBl ={ 4\AmZ]D'dDAA 4McĈ$&&r_s=DBB'O+ '' 6PQQ!>=([@ܪ@T]%cĕD#y`6mrM7ys|.3ʹ#Npx"eAAL]]bddd nxw<~|AOdaׯ4 }GtzjY_ʜ[gUHHž,|uOf}ͤKL1{r3|fz d/ML|:%?f:ph5kkCv #Ӣ**##F򋾿jr4M\Lj#yXf(g-d0to>6sıȊhCB躊h9P] $a0:LQfPC^ԠI6`0:djȇl(-`0"dZ5h]G6XTȊ $5= Sb&w6  OW\\\=>ﺒ @߫ݴ)^o @Q9 Ot]9A8Ȥq.}=ԃ]6utm2*vt6=`၍cQudk2v͍jzfJrؓp+& ps 0>4wd: PuյAʯ[ \ݾ-Hb{hn)  ճ@AZ6{8X ]SNAA~>= AaAZ[[; kA;PNt =vtfLD? Mm]Y 1I'kF1 3 H,Ȳeth ?O$a41Ȳ|s& tD1 elxJ۩:>< *P |0ǘx"'6S%wFRԃFČEf~ͤ^`t|{t~ô^fD5Aӳ@uƌC߾}1L444yf'33N]]~ii g#Fp3tP~m?p8e;3ǣ:K,ᥗ^d21n8ΝKjj*%%%olJJ կ>|8k֬WȲW\3`ݺut5dxL:.d裏Xd w}7ƍC4/^_f3&Lꫯ&%%;wk{n$IHNQQH=e HR{>I6~誷uVt͋گjh] ɦ+kdz$#|r?ZGZCS[ Ik>$ł$@HY:ooJvTSHSG]WA!fP3۰X#;~I ώ4ՋMDTFԃ;l 'eTv]C׃H]Щk-Ԃ~7Ufw=$+G\:u+ (ƶd8L $c{={AARa7;wܔpQ uVx{Bgl۶}ׯgu7ndʕ455ħ'`4ٿ?TUUzjF#gf<l޼[nNmm->(SL!11kמ\`b,^L^^]w~!o6/iiia˖- ' B{t3o֮]$I477sy!Il=fZțgMbϗ63ay-fk4#y-LR;M㩯*&k&=-[jxD&b'pר5#s_]O$ggœ?0 2̶hM5&suď3|3pM6>&Acm)^W&!5_quhԀ q֕ I `YW?b*|[7k2Zj˿]G1>?I˰){$JB.Κ|3b&.i WtΞlKj+ n!1m [W-%6^)P`bHz{[C3A#bG ̿}_)}+`0q`RFxo%:/)2pUB0JFT45Y*!I%AG=Oٺyo2B544Tі c.KĖ-[vmHNN^z){B/tSPP۩]v1n8Zh6nHffI m$ ɂ c~mۆ륨qƝp چرc455z;v,EEES\\̞={;v,QQQzjظq#YYYhZ[Oyy9} #2C &e4Nf]cX'*q1|Taiơl]%oH;W3t]7=+Ojz(h42ڎaW`4}ݔXD\@j3z.]ͨ&PVLe,XwЏW2pet=q{Z_T`+4ԠCf A4MbX|Y1g@bFֈѵcdȘ|bbꅮkXI jC}%=DjȊ#Y6y66{4̤4-~91t̖$,+ߑ*#މ="=?"9}8FKڵ#6x Ɔe/r aő'}[:A.  ~JBBb!55m۶j*Du ]rs 7r`0`۱X,<\.N{ Պ$I1w466wr,zjzOٲe @<7x#]w---b4l8x N'`@mm-8z&_"SxĴٖs~Ô_d9-G]ߏjǨ~;BGbˊ?`Ec5ILhh2EΨ+2f.VWnN"tS[QL~#0I7-]Nx`M#-|5[Bَl ̶x$I#.e(o#?7x:gMOi(qg%1L92K΢Aվ= r@6\Hch!9d,k>6<Ow)^̼TQL':!DžX)/YJ#d$>%ؤLkKe 5R}7x:E+_a׆T?TEjƪmT^D}:PGE7\&uU;&vAAFzz:ܹ]v:RSSþ}(++Z.a2Xx1_|6 ۍ<:6 s`ǎ̟?ȓW7o/keҥ̘1|>f?%K---vZ[[;Ef3 !N -ڀ5 uωٹW7БH2j5cEl,;hFžuX1$lSY+m;=AQv=9ωӄȊ hۇȘTvs\;lb٣9DΨkjp5U|ЏX@-@V HL6Z[+P f׉XhuUcFqpfd>gc03`,h\M]7%K1ld'YpN02++ H2PD^ Zy!I   ?T`ԨQ{nEA$jkkZDDD`q8'~bͱaIPٌ$IlݺAQ__";;͛7x(++#??UV1tPWM&SNe]ɣﲲ2F#lm IDAT޼|6m ""/}ʾ,uߏjh4e0h hii!C{߿?T$OEE]{ YQ~0U[Mle.|m_i $uY2C'}Xy)I'U }sQ}Y{1Y Pwm=-17vU{>CM y bjW!/˞ƞP[-Б$ C1Z)1lŠ0WC!?eH;47ڀh!whVt=tDCvKA 6u<9pT[G߬W F3 UۻHPUZHZxvo4^'Cm #CuP[R`YEB#"a[tME 0Y"Ua@$ "XPUqK~~>_|1&Lh4R\\gB!E#G 0`9򗿐̻K}}==ضm|ne˖dz>KDD_}U5\Ô)S~EFFÇ3zh3~x֯_Ν;;w.>,555ncwqٝ-tEQ>S=\^|E&OLaa!MMM455裏[Gt:Yb#Fgb_qqqXV'*y=k\:; ߣx븚*(8נa@d$UqI1`OY7~g zsFY}Dam&9 G| t=xۮP\/fOd~܀$c- :Y>&cdYrf/{2=hfܬh+sT|?Ξy?Bӎ^fYP]MCvVLN2dm;0ɟk$7K' .SG\D(Iow{=bPVE4!*~M'!5T_OtBUkq;*u>o܂kOfm2ѵ[k^#"& UHCƞoĬp3! Ov6g@Pv&尛YYY#,˛]]u*L޽Ù%IP__XVbcc8tu\81lذpc~z~?dggi4756LdggCuu5{ ,Ϗ~EQ4iR8Ȫp0x`f3{*ixGcZ"**fvڅAu oߎ ogNNTUUwv?/'xQz89?5Jd\?jl}F$\T[JA3S$#P & &κ),UoABD&dcFP$aSt>~˂kz!.x79/7JȢ`!2&QR.r"dLBH &k̮}Lvѽi܌qыU )d!c݅1kd*4*K(U{T_b#>ܰbbkmRADl&b~'=:J̖hk0Khvtt]`r^@GaJlG훬&RQ66bq;E1Yr) &&tMYWl٢҉IBj`]]ED@dYD #p8|וl@^=1;ʷ]<;r=*X ?<."z)~oo)Au222ll߾]0fc-a׆|$ȟx;soB6~ bK=dȲ֕/;σ  ` tE4n7z|>$a6u]x!lF]o%נ6}c@  ™,٥2dBQS^|G/- ihzlBppFUe\!e{@[RS۸jѣ@81 ] QSZSmY  ]WTˊxhmm O=oii :;Q<3̟?;㔮Nrr2/"---G]I==Ņ]뮻(((o6[6l3XGoo  cI;ydeea6`\.f̘AFFFnذM6P$ppB&L@JJ ,xqÏ\HD~~>r }eŊk455 RGDO;KjS"5#W&??4VZ~gĉٸqV/g  OLuУʸq=z4˖-cժU[h~ƌ߿;/l\.~)YRSS;> Ǵi/عs', 5jg}6zj֯_r7fjjjW^`̙}z]&ԋ>zp\N"y+<Ԧ&?|PE9ޯaWrXF%٠>?[@V :qSAqڕkZ/!P2Ν1JdJL>ƿu#H2J\QW\!!φB >$UUzH:X|l6;v贺wy;TWW   "hpzeXYY|9Q__lF$~?ney<q."4MbihwߟxՊn'::]9s뮻gffxҧO~?III$%%tRVZƍ1bVyj*V\-\t@Aʋ'ᲹȡF Q tSV.}FSDϽp\z5}Պsa [XeC䨱$ȊnoEPI}OXS $]{Q]m@bϛZPUg\#'@C}vBPݻNJpp@  ?G%8T]׉%>>N ø8zŲe0Oڗ˰aV^(Ȳ|Ԇ9s^s3j(x LpA$^~e|>q:cۉaѢE|' >!$t#B#Ɲ#1r -# mI Nտ p`?OIMwP秉*`O? о~IH{tFk>t#`] O=I0iP6d7| Hӏ1'Xsri^nYpa2jo$A?  =La`i;0!!qQWWGQQQ1DZ[[CӴK:eee+<< Bz:̲e˰X,nQ={vz<noHIEkqMC$~?P)7( GފrtoTca I1`CwDB\gm9 z la˜қI ρ~N9Sӈvkۆ%C$AAzmizT6xƍGyy9Fihh8jNrr2`2:]mNSjd2ѷo_$ ERRvn/KUUnv|>> ^ESSz_fv;Ţ$IݻŋtmٲeG t*"GDblA}[6E2`7v$s*@U 0% HF##"P,ԧ֖8: feTʮ[ۂ[?+>`L&c]6 ;~) A8=1TAAq1= 4Mcĉ'Nm۶ HLL$>>c~|7\}Ռ3ώ;X`&M61uT^ÿo>c{1$I"**z @aa!s{SQQ{z/}ݼ[رS2d裏=~ǎwHN`Z\&;L>ûe &35Ĝ3w6?xCo~8DEڋ4^Iko 巏}kmIBmrR~]{W_S.I gRΥwlnFRC˨i܅_pu%%% jWi{1 >VD_7黳R:^ʯ:_|Exv hqtN'A83M>}G# Г{ .+܀^/Æ d2rJ9묳X|9FI&* Ed2xA'08tٻ dY>`0 Iz"&&EQZx^ۇ`d29A~ʎ9YQE|  Bc4; }.C'5M2j%66TUhn6t]gΝ@   pڂv=|8III@go޽,ZS ߟ[ns Mo~seGAkk+&) B#^k  Eq!!;v져8  hvDs=l6bbbz}KK a0H& μyhmm瞣4 ]׉h4҂l6f3PVTUl6c4QUɄ`Naa!C~***hjjbdMe"UUOq1^/g͚5DuΝɓkX,*h$$?ճcjRAAy8t?\\.6m"-- «ҥK5j+W+K=4.l^vCC$[oj_gӦM<?>z+cǎXIIIadddp!>4gkΜ9\r%c͛wJmUVz#ʧ( \xHD(⢋. ֒$`   :*Bll,/f|>9p8ꪫXt)[nr!=1^x!ӧOUVqA&Mą^ʕ+ua>Sjkkd͚5'5DB~Jǧ>+qqqȲ::|˞qמRn2xgկ~ٳضm>l9 ~=EЁALR8xW;-QHBCEN`?}!N@hǫ'ot,u|>I׈J%*?^w ף8woNwYWU뮡yA8QRYYɻKZZyyydff7ߌN]}>]&1X[oERR V+\s {FNCxp`0Sz ?;#G4773m4:Ē%K/ 466{SZnO>0Fe$I},ӧL&)..Fu4M#++t 7ot`;Q|\Ȁ Pw,aߖO6qlՓjp<ʪqpW',^l| dñ)T.}-^ao!asH;PCK_6-Sb𸪎}- .>4Tng a#&݅#:}[Rcti9;/1h$d͂_c0EXs3FCe1kOߴ;$g9gOdrh~>3r垇 VS %юkFs[N1еoc8 b0Eb4GiI`@MHIVx5+xs= .9 9-``J!#g e%Kѿd%mQMy IDAT<$@ٖdD6Xxum:PCw%E!W3BK$YdGV.BW4E!4wmQL-Ȋ 5Jt %ؾ˞ľm u(,5l(R泹'ͤơRƜw>O{u{%=>9̱l_?I}rIN /mV$:vL(JG;Fs b/t (&kl{mO5` [k rȊ>7q`g: е9Sp}>9gk|_bD3}K4cWXz^bdCdBVC  F;jK.$-(FkwGs!K{QG1ڑ $#+c׾~ &k~ɭ~Fa4G*A!ԐA@$^|>P~)..vs7Idd$o]˗3k, ƁW_6aZ7n6uuu3_G$K*Y0al۶z봷Ǝˊ+pyCW~?ӧOgӦMwixZ+NgpD R-Zb(SQQ͛ \uw?~d ha{M!sS=<-*s#~ |[,;rm IbyXΒbO`̹wWrpf4Ֆ'c2咧P ̶(Qɬ_<p֤;I4%Ovwۅ<2/>y!?5eY!V_|K(L (`0u;?IӇb)۵FB({EV׈Kθ]>xM!WLdeB {8K$m}8I!+&jʾa?odgd -g>6.+ iAd|?JIlS.}oK#1hmg§i܈$[ڒo~gгo_48KX4Vo!69g~<>~kfg͝@ p#\!"}R֫~WgZԪ ZE@.0@HIMH&Ѣ~k7%:J3`ҳfbE]U>?5_3x s)V{|TYGywD܍ljKK6/S,cfMj9uX1?Dƥ3!:?]w_$DL,Iii)kR^^%>>cǎQ]]QPYYIqq1?JMݻZ<> gԩݛ_Ly'_,iWdd?+v 3YМ(+XOMa_2l|ոꪰ8&%O^oS&koDZ" gɚ%at\Q~m]Je}j >y0(|q̸UOѾ77,cF@!XcxYDaOg JVw|z3v>8A#.-lֽw>uR3lNq5מ^sPLCTHj*s9I:үd{>d.gQY5-ۥ̾q '^ǚWuZPq.OcE1.;]NIGGk &[<]WggwS[)3)_ǚW""a,|^=X"Ujhr`Zw.Ci~P̝JУP.t]bP,AW/版3s(]SY% }99 Fq!2.kD"+#`[l'%7:r7r.?U z U\p޻5#jOlF}+Kg(ZmsC;$ @6ɞv+G|ƻeČ{)?# H9M bJ!cy_eU'snn dE.$G&\ 1=NozV>]X$i:#;TlQ}B;dɒp@e"##Yn,ӧOfϞbl6K/ ll߾7j˗/gɒ%nf3~x__~<@0b*Vpaiƍ|ȲaSړ]bb"_,,[{ǎ;8qbwȒDLLwxx.| 5 -{d/꫏uRw-/{h sD4Cs&k<7Ux*~NW., `t> ```tJ4j1HD\@C{#{mݪQ]qoItB:%yEWJ6[>]=*h6'т=:S)b.J 6qp{2KDc9wK5t ˉ1Y$dـ8u 0neۺ,DGǥлx.qix߸h!.d2,Iс,:z1d̥EM͑MkTno4.DCQv ] Q}?8=$\5bBBf5gH*l,PJu>z&`-Q]C{>D6E AIdeňMӫ܎(s̱)-ځCOd;@Td|Z-WR6 :9Vay]KD ~oVGQt.OC!\U K!KzGs爤 )mZPnZw(INOQp3~h2k;~|Ew_ޮLPQQ$NvIQ=gTh4Cdd$~8i7DeTU妛nȑ# %y?tB!O}*>YI P(HCQⓆR @H I29B|+8pBj)F Ɏ1ۢQpte%B͎vUCZ-;aT~ʻ7`B-;CuFO1Iy Gu]GiΊO~M "Kr2Td{I2`0Zژ#5/;N(\P =-BdԜԨ%H#L@VP̲'sHΚɠQyy;Fμ=I޶0qDƷn/OhC0bP63t n彿LԼo #:u,[4ԡsƲ՛Q;Ik>&}ok1loteŽOz?=$}hZxf.-kQ.7q`3CMvon'[>|jЋbҼ@  ,Ԁz:NȺ@c] QiH>U`⓿ppa0vq ^_4i y \U`q5E77 DE ]MvtxU@&khZт bD^SSzI-玊R9F.Ƕ!'} t-j  Bw>|'v$I] \.Oّr& &ǎ;'Ѐfc\.P.nBPq:+(wC/ ަj"I|Z3~KDLp[~5ԌUgyo@17w:1b{"m:ILB*꠩DǥP]Nq:Ҳ$炇(@>ÐdluR26}DťtyK}6|a2;'F|ρ zfk$ޔmm>LPWu>i(H=5jjs8|6:-aXIR꫋ :wa$x~ 0ph`BxDȡWHSKz4\uE 9O0ښ 2=HIHiȗ s1{¯WkFs{6C/dvP[G}!"R,7%|:>ȧ< =vUG1-̖HzͦΪ<|&#|(S-5ڕI:~c|`ti 9g%<@KE$0۟ؾ(f+b3д~$s%ԔPư W92R2&8/W?bIRL!$Nu 738{>!G@i~Y,hb{d)ڿ13_$2>OuU4՗1 !38.u4?M#H2zH_XlTR[q~c@AA9 B455 Z_Bx<|>"?%` }S $EQ.,E !""3p@)))AuFMff&>kxmd;:N~gP[Oe.N yB^'Jj*p7V:n;5PFDl?F!Pzx+bTUc3ڣ8kRq ɣ*2\MuETbȘ+ʹ-ո;i,Qq RMgٷ:%/kzKc}5ONiV 7AysנJoPi%5k$ͶODy꫏w&g9yToIbTWR`4u75jO5i)贝A19jFLL|)OH>FR2΢n:J 61 LYs=B69^}1?JHm>= ((F}+PZ8^Q3l #{r4ȳ5Z7[>|ˀ$irV1l CUn|^'o"P.$ 2rʏnoiq0M9ZbҰ:?<~.?Hoqp]2b3آ8rS@==c4;8dIz"` EKl /CVH֔H;H==IYIJG/Ndcٷ(VRכ=`Aֿsr|U4?Oq],ecd䔛w[W=IձT&>)g-gTM݄ %7x:'݈уi,Y{2rlfŨdc09!fk$6M&WSSSNA?atm m6%`ȶX,K]Nti4m(JkIuw:c4s!0D zK`og< `jn|JsolR;* MFIHDmM̦dB6PNdoMmDPL zh-&{QN^W̖(yjLX"l'TC aA6X@Lv=!-Ҏ$wXUoNd7oc4/$Us4~=߄h]#wk3T kMhjؚY݄Q]v׺~tP,ͧfB+Xt`qn ݍhjB lˢ:&{ Z_Dx5H>i^>tԺ̧JVz9hSFU0;hA'~7`}oB9y6x1hrXe7Z>Iªx6GdmN -؈P,k| ^S JUhnR x^7"j2h ŝ  ?Ii?X ..>ﺼ@P[^6Ck@k<g?rʼnD RXO*7IlP~t]I9}R[p`qbλgSN*T< Jd˫)ZЏ[;dt{%07d֨nz+ȓ?hݎm{\ը)+N<$ᾑd#glac=Iv$$+Lm"cTKx)8e%2t2w~-|dĶc$J2&[4&['195k$uCAA;&yHwP=zg|P̧    ?N(y$I"** vO]L?AAA cѣP__Oii)Pst4g/**:䉭N'/&==;wZV]0`/fȑ U%QFEmm-W-   ?`ۗ8dY&--8كls`00`+VVpUDD\ve}~8aHzf.ȷ.CCv =z4seeeDDDSO=CAAAϔ$\6lu먩W^  ]O>222:-,ΠAxټy3+V ''MӈFQpB֭[Ǻuӏ{aڵ_[n夾7y={vh45j&L'No߾~b~>C2228p8zAAA !0|pznѣJBB׏P(DMM 4PPUUC=tRi=hСC`0|MA& IDAT|>%%%n1AA *`i4 >|8x^, k֬A4ϟOeee9S֝6mstDUU{9ZfΜʕ+1;.w<ѣWX /T[[KBBz+᠊ U0رcՉ! Oh$**J +];v,GAuzEPTTĔ)SHNNbǖ-[: +xꩧHLL$!!M6( L4*++X,ڵk&aԨQ<3ȲѣG9묳9r$ǎ#33͛7{ٲeDEE_NGruםx$`(]ӧ駟2yd$IP}   0h-uKm[Ck|||('~:3t]'++QFaǎ466R__رcIJJb9r`A  ??#Fpw0fmFiii?d^Ύ;%22oSrJ~mdYH,Xy󨬬d߾}0sL^|E9Brr2&L`˖-[׆&)<[ow +,?v|  ] , Nd:d2{555@͠0`n,h 0  Ɩ1###b,J֞TU`04?Qo.? $ ܭ xb׉ms455wZtt4u׉>4Z[v \.W8њLLr]'~(h  OVk3׿`A\\\;|>uyyy; jm&x6^?r(iBYZ5 'g6;7`XX,'ĶhMCp8lAAA-d u'AAAg,p:5NjocܸhM8A߶Dg$It]׻53͏uAAAD;j !!Ѯn'>>o^X~_|q=zO`T{nZt?? ilA}kLL Vj#,_{tRbcc|æM~&l_~1} rf222>|8%I"))#F0`p ]߿?.%AAA?gT׉C%99EQ|8pÇc27nA>N3h:44(Cj^Z,[TX X,8AJK6hyy7ܐͦ>Q$46[0 ldB!6n܈nȱ1<=Att4_~9_=ƍCw n;liW!xv=5t:Zj' uCBuz7̈#سgwy'EQf*++YhdddpweÆ kHD^^W^8i;   ߟ3%I^+WDzz:*8pO{Tؾ}*ޛ~/1Qa߾s喾-gu;wNk{!I0|xvMct"#M($ѣ^^|I ࡇٳg:_|q7ߜLw|׏^z.P`0o˚5kx4iaGUU5k+V`\s5uEf~_X,k\r%jL&ϟ_nO7|]v{1bF7׿5}aΜ9444pWXp!7ofԩ$'7G5jۄ   37I>}pPWWG(侪S4Y<8QiV#1%T^spUټ\kb1|h: t]'77~r8,Z&BPf]AAA fh4p8e9\6 Ȳ.HwNt| x?>nrރ8̘L2L(Ԥh[:+jrLC}hj j]*(-- 'lUYYi?J\\C hll$22Bccs GGZZ9c0(,,$%%#G( YYYlڴ[nwڼ#op+p9p=0gΜ(t/I$" |>FŶmغu+SNÇ#IeeeiDEE8sAAA~@">r $EQ.,`g=t$ 1vXFɐ!Ce\jjj\y啤qpرkib֬$6n=Y7rM(;2yr{[Y R ITȈώtL:̞ݛQbY$$X=& !Fnݻ\WɌ3p۷Iz4551|p,XԩS)..&??@mm-#Fgʔ)޽^x!fHDMM ̟?K/Iؿ?VyovZFɌ3ذaC9Zk&*\.v;+Wd׏/֭[dٜꫯ:eee9n}v8s |GߺLA,  m0`X%N9t:6[jWSSS /  m6%`ȶX,K].I :1Fciipamwe`,#ѳBSF0 UUA^=dT XRI|* =z4w:eeAt,?u];v,\s .lpi׷[GFTT@:t]d2$I444Tm?** Yijj ѣUUU@ss~;z.TWW`0`8i[S__fŋs}qqq3ЩО(Չ ' Oh ~`A\\\;|>uyyy; jm&xF]??'~ɓ'w^Xٿ?   "Xb6mS,׋@   ¿S_A]S -   p t]o?+۷>T AAAΘ:ݭI h]vQQQAJJ Æ #66K~~>{rz$⠼GkbGU`PGQ!  ?ǦM(--=c+!!ٳgrxwĎA8S$Q^^Naa!`'2l0?(S^^N߾}2e TWWw8`3Iؾ]‡֟ѣ9|_ZDi  ?v\uUÇwg3a(//?gϞ=L>3gyf>w'h4r%,gqMưa(((8}e֬Yw,{zK|v3/B0 ?Zvm!))s9n#FpWr,Y"NA~2l6vY|NaaaxG2yd Cӹ^sT5DZZQQƖOB<. ,K/EedYfl6C^6lGm7݌ 9233ݻ7I>|8{MIh]-` ==oaÆ~fI0n8BPMӘ2e _|1< ].CFFsaÆ *XǰaNZ.A\@eƍG߾}|ׄB0LL4;h.Cdy>'=㏏hW]5L%=7_rbFq4 &I,s!n6;7oFUU LرcY~=vŋ;d„ $&&R[[ᠺUU4i/&>>ӧ <̜9?孬k(--e̘1{ ߏlgРA$IZwy\.~zfDFFЭ={6999TVVC̭ʜ9sظq#_=C aǎdeeq7cZ $™,Bdgg#NJPTTgdffRUUy睇iٳ6gƌ^;I%K #AA4~f֭,[ %KP]]͔)S5jSLaƍjtdBSUUto>=JBB INNh4 {ĦwHOOMӨÔ1L 0z~?vS>6VV[}bLTTT6c("---|o؈njv+XК7"""~PTTĄ 0adee!I?9r Ȳ̎;p8jd555ΡC|z#r_?ee>TTp8^}yyNzPSd۶Fސ8AA(,,& Q]]M^^7GVZŧ~ѣ馛8Yb~YOzlhjjjSkFVVVf#>>Gy=zp!,K&]}~cc#$yB e;NAf#::]9~8r gϦb"""p\jɞ7 'O ȲuofiEQTWWwbmmi'پ.l  4NO8}Ν;k0ra  --B."zAEEIk>sfϞ͐!C?>DttINԻwoYz5-b֬YČ]墾zy?4? B >]׿rk-¥^9x 0΅^?~xPU5\u,,X~O 5uTK޽IJJ6 ĭʾ}HLLd2G33X   pv[@YrضmƍGUUlܸ[ ˸7oc0殻ryp:3'x. ŧȑ#|L6?Ohܹ{<YYY<F?3gg}}=oա:/UUU 8Cx6ɮ6A=ƏsUm;~T@UUnw&my<>#p8(SO=\#cAl6yyy<\i.[ݻшb,܅v0|>\.`GSVVFFF={믿]~YvZ*.^xKp8peee,_._\.^qjp8hjjbeB!/^ᅬ`С|>vMmm-555/A]]Vg}O>x BCC;)X q\(BLLLxp8?~_łW^W_E4$Ib{u]Z* A$J\Xd#XBտܯ?c}]ĉyG$''sNܴiHOOM6QXXyWQ=3N%AzDDpE`}_oUWTdmkKbI B@M}G5`Ap:;̙3g9y=ҥ ~a8os~~>;vQFňUoŤȒ:/qdbF em\KWsWM8WU_k j>"͚FSv8' #9"KR/afL^.{bO1#z31v"Q(y˫Z!Ǫb 6twS__ѣK@ `L @)Y IݻJ^/,#IbݔS]]$I4Nz=GfĈL03<^OϞ=;p:#vi z=,ZHn{8l67p0}t.V+wf"::$-ZDrr2\uUdgg֨?Ί+ڕg}^FON#`bz6t-Q}8q"v:u*=zѳ,ސ@͡f >ǘ1z>j#My6D "M40"CE;Ի2a2!1k߁G.%%pm裏غu+=so$11P(ħ~JEEEx\hEY[uzu:LťYm!?D-X},_~ɴit&(_7}͇g~sy88ޭzTQxu߫]²C߸d3V|%[rgb9+,4M#Րɼ 1L?=z{3 ?~*C$U*Ȋ`9p\6F~>lnBSCbb9$jn7z2|p֯_Off&wX>:A4ϑGQ[)ܪ;l,v3z53bf05y*S('JT@"8+BtvFA!GC#E"\$$͒QAZx}̲K1ȒKȫ;{={ɖ+v)'H =,=T?M8y&NXhDTM:P}i@ @4ƎKsssxC|N(b 2w>i3;v젶9srJ0ͼw}z 6nyXf ׯ`4sRYYɻKUUn)S0qDNg^u;8jWqnsΧkdWr=6"@0,nϼbXJڌ")62\FeloΎLHȾ")ȼT}Gz=Ig  C+륌*4xlc8uN'R)lUbdY&))}QVV hƶmؽ{7^Dn7ׯ}Q\\$IPTTDZZ_|lܸ$"##dagAP}>Nc jxAóѧ*kV[Ji]x@ z,ۃe $O.$ ݄gJ$Cΐ!Cd[n8Nrssq:lܸN^'55·~˒%KBPSSCZZPPP@uu5~s9(}ٟZ_*= !Qg[6::a Tk]k3쥾R=dX2p5HHC)H]$99.m3hA~C>yyԺkɰdf btRʼe]Y3hJʕ_ q8 }BU?csRA/YX7T2"zeMezk4u[cQ,ܖy/Hqsq?==I&[o=K7, G oVL&Sc-gX:MѾWb`l#6BҦ A&iqG4MFi2|pjkk:t(F?m"-Xi;l63c y'OfҤI<#TUU\.x }>cf8ձlJ㢫+&1h ٟA2pi,.[7"ӒE11~"$sSM]"uDC##"Ρ,޿=uF.]OeYNՉ|NZZ@ ^nvr ;jzm@kMiBmămN_~8 x'1 n zKvDDr₆wx@UU;v,s8̙3 aԩƍ#::_f``٘0a{w4@ @pJeCrvJtt4C4dYi(rR Cr4Ml63`***PUOrr2MMMx<<| CvzjL&2tPzM~hhh ::*4M#--޽{$I444-{I=Pd\.PJ~ҥ $Q__\9b2s~D 9!PA6gGo$n:uFש3nYhZS#5CިM7hBm4,t)i(ɩUtǒك];1Z[240Z4 %! C(@VUFr-y4McРAx^^/$餮J߾}֭:zz=JZZ7n bb"ÇgƌTTTGCCl6Cff&E0D4߿?v=&NGի $vׯ_ Ȇ 7mlNE$m۶ztx, ÆۡCNjp?έ?LNNcǎe֬Yr-X,nz=7|Ԡy ̜9t 9t~LB>}A|I ?~<_~9>Ell,> uuu,\F#~[,.ڽgw%jD!!`.ʉz" A!cb.mXOJ!X]ث/IW]ρwg$-|{O! OJMΛ)&r bfA2QiڼCu?knqjixrN5̜9bۇᠹ5kW_MII ^z)}A?~{ o߾̙3ԩS  4iӦ[XX /@ll,z+vjs=oɓ:u*f͛Yt)@Kuu5iiiX#n?$%%1{p8馛xWٵkr 7x#n>sz!n$I";;͂ ظq#\s EEEfON\\/"?{e޼ya )--eJII,j^|{PvՔ]8@nt]a2Pzl5Ĝ)J'>bZ˾5 MU9{Qb~ T5!%P"#z-JL'#PI6a7VΣj)T1TG^صkW8hgʔ)x^ѣ~!]t_~;\wu466r9(O9sge̙]Haa!߹;Yz5YYY$$$p( -^{|>Νƍ>|81118pՊbw5'뉍 A||BN#..ZR&@pUUYf 0 :Ĉ#SNl6z=YYYm Bٳ3<Ν;cZٲe  n݊w^:w6;u6LYNNp82e DEE>d֯_O0 @||tڕ7|^z1zh6nM\\.:"##1b#G \ꫯ[9s&N^iB!-[Ƃ AҥKijjBQp\"^@)..2bEkt:z>\ZSaZ!Ct:y$I ̂ӏ'Zpj^>O9F1wMpjrJeC!--<Ȇ ?̭qr ԩ/Yٹs'L2h|Iv܉,t: HIIa444PPP$Izx"2;6Z:|>lܸ8.))a 8e˖g+++ BL8trssqFJJJ>|8#Gd޽'O$VZ޽{t2n8ϧUUIHH`|aI 88U!vƎOSS'NdРAֲn:͛Gqq1]tO>XV),,lWOVVF#^E?N"I$zEI/ӼȲ(itφ 6bA[@i#(md2wjFMM uf!ANJK*DDDw( 2fv~|>]`0E尻y0Z/DvJaa!^z)III~a+K( #&DknIBZhxh APC`07!4wN^)~8Ţ06-7EDWIiYniCkUm8ׯ={7l֙EQ([xBDDDx^4M`0jxyٽ{7{/)!2FEQ4ݻ3b^z%@C?t֞cǎO?`РAtԉ[rٴiVˏgl6^u18~Gς7h`0=cz=v sn+n^QQf ڔV F?`Ĉq?9,իC!@eG2#A8lqet0 EDb S`FU1 <޾l6YYY?u̙gɈ#HLLɆo߾< $I[n᠊@ @?#͸qիWxuTTcǎeҤIL4#Gꮀ`I&qrwзoߟTn;`ѿH\O#kB8._Okh :<%-$~߅L.2-ZĬY~T0d̘1{C~s=dee2e) !@ XtnvbȐ!H$99:\. '=N#22p~+-IDDD`0;]ßMqؚZf ~iBF$55R:k2埣uTo@r8lkdoue6̑G=dn/҆>YF#ٝ&FQJmp"t%V+3f_l7$Ib`+wɜ9s`0`َ~ -kl6V5,~ Q$bccӟNC4~al6[8 ⧟~ʌ3Dz@ @JC$I"///lD3Ӊ(HD(޽{{-Azz:s̡_~Ȳ'|kbCGl( ӧOs!::]v /PTTi\r%dggM~~>/B>}puױuVz)""/2Æ G ؆~{]@OK'PVgdzqa_vF|XRrz3w|,|T~] Q n1j OuG6R?Pcb>_~Bb3%29z`~s/GO oFgētX =d >sr!rssK;cܸqƲsNyvRSSOq\,[W_}Mfƌt҅z^}U>vu\tԉ~ѣGs=GII | \p0|qL}-X,\{lڴ_|CU,HIIgϞ턁jdYn˳-.$p oN휳zC"a<bncZ:/8}=y9׮&nH:=%s7+Obҍwo_I|/r|2Y9d$ ߦ k qW-Rvϭ7o O5i5^pXvnQ <gqaIUUzyy뭷ݻ1׳h", g欳⢋."//2.2{%..ݘ}ꩧ0Lg޽r3f ]tEEEdee 93E@ @!hΝ;&33Ӊ$IfQЪt|N|~"8Ƶ G B})܆>N*+TB:t@pw<*<ލk~P(8<pA fB:L2B| $4"]~ nY(v=&3YrVWQ |gcł`0ȠA㥗^pPXX0`oMMMS[[KzzzXY|9~p7@ZZ <a0eI0X,4M;svys,@ ) PQQCtш& "Iu  a0BHD0 h3К^$TU o X,u'@4``e%Ky衇x<8ɓ'3f̘vbAee%yyyG5&5h%jɦ׷j@y&!@6P}>@IoЂXj춅$e4"5BQo!\_~燓JKQهõ/mfeY~?I87PY翭WI묿Get:@@ NCeTUmWxY`|ϻKEEo&;wl&11_0@ @ bǎKjj*tG W^3ޯ)--=)AC;vW^?={2cƌ qSSE\\PYYIee%&MbРA1-[Us=dddpYg_mm-K,!==ٳgU,<\|̝;7\nc:}B!g1t:,"OUE2(2`H>~䳱5.ƔٓVW\賦b:!8ϿbkF{oQ_a30h\sV/bn AD_~5QW^?X&r0HW`4%:7e+W2`vˊ+;w̸qׯ_ @n0z Oΐ!C0a_x\?a̙3$V\Ijj*{.^z);wO>i'eddjժv1@ FŻ{5&&&Ig. ^{?V_M_ss?)@kG |CElݾe%6A(؄tjp;j\.P$H{ALHkKZŀ~@[AntxķmdggӳgO yp>:X__i"##-hZ5txq8hF}}=f9z=hɺqUWi&6n(~]$?(V~sNGmmo?Of_?,l BAT5a1@ MSdm/?Kj H,80Lt::zn^DFFzZpz>][Cc "?XV;h3_CmJxj#kS3;JE(r0X,6ߟU%#ھw O>HG}&Eڏ"h 4XP]hMGt;blZ~=۶m;c{Gھx$6:A/^2~\I$ƄЈJg#@ C$jTSFڇB!x7;m fOe4MM :$EOEG4;AVIJ'@ X 81dn ?kzq|~Ś?q BRג^G$O^'IR8k¯(t:TUUt:p~":A mS1dffҳgOiZ.]ЫW/~D_q)'izޅRx\.>oy9l0.BF.^EϞ=Yd _~%\sM'J0s^UyWݻw}>SN%))ןXTU{_j@ @p rxhFzz:Ȳdbi&MBQp>w#Ze\+HcInr!d$. h)%|~RnrW-uېM$嘂v8_ۀAaa)GK2,H&3h&.eqhÚh˲̜9sزe h466=Z:Hr :rP]}^UUꪫ(--eϞ=XVEa\xᅸ\."""HKKcɒ%?(a^^&LGC7add}x,L&L&uz2v~WYٹs';wK/gwb؊>@p\2$}vVX_~IMM (B~0 lذ 6e˖I'qw>@ e7 @@sk1|HF#1o׶> Z½;d%{D^t`LM#g[R+=j"ͤRzl-& 6dtn豩koP%)*0oTR 66XniAll,w+W?s fW^y+V0| },_իWs=ł|I>}]f̘wMnn.<3lڴl6ms=1hР#ND9r$K,aڵ ƣ>ʚ5kx7ni<||5ۿ$I̛7_~uͼK\qhF(o駟& 1d.]ʺuxgԩtl6!NL0\RSSYh̝;K~Xd ֭f̘1>Y`+Wdɒ%\|x<xGox7;vl>,--{ )~^dOS @ X-ݻw';;(*++ B$%%!IgqFbȑ˓b3)N\v[TSfOW-gw}E I_?\gbHZ%KV/*{S4*v[?\G~F 7 ^}_a8 5=%mf;obwwDLBh^Ѱu#O?F~hfPCaQfQZZ`0p5אɭw.-H׮]Yt)*w)))t: 7o#F`رpz>}0gn_Oyy9 .d|hFVV~-_~9wngOT(HLL䮻b۶m\xᅼ;ǬK.={rWsWӥK, wy'6+G}[oeرkx B2|p<Pl+N']tvbDEE1k֬cz\XSVV?LYd zNҥK1b| W\qIII5:'|{t >kɔ)S裏5kVX(//G4ĝX 8IHܒZV Qt@ r@Y BhNd2|r SLW^l޼GnK4^ $ Iq+,+مk0toNBfb= ؏!uHxJi^P>Hzr%g+ IDAT1i -h/ ۸IT?;{F7C="l{-$ twc4htǪUصk;w ޽O?A1ydyŹw`awEA1.7&^cML5K4ɽ$Wc̍+1QAUEٜfae]?́@# 귪~iG?"33O0l mFII RJ|qxe5I(**r}i2}t0=IIIY&=l_ԩS2d79|0Rxy{M7C=իPjPMXh]w#Go߾믿ȑ#oY?˲0/f^7^ޢ".\ 7܀Cu0`uuul޼Ro /`0Ȓ%KBf޽P(&@5bK P(  msNv۶֯_ϬYL8*jkckqr wOpvZ~?wy'1j( T:tAav|Gq%̈́ HKKcݻp8̼yHHHo߾wyH;vp뭷Hk>%A,11w}ӧkcc# . ==ɓ'STThjjpu\VFxٳ'7ndÆ 2 ٳD e]Frrr\@ظq#Ϗ*cǎmsN999!P=Bщ>GJP(  ΘXy+1 7Dصk\tE̙3]vsӿ!V0j_zƵ<|Z%hiۘE=ן?O-ۏlIĎ_^yxI=aE$_w iv=חܾ oJdV~J?L?yI<{_yƷ^]G$$R?7a~HJ*++͍O8CO?4#?x!/@z s=hp8 <={|,wSL᭷⦛nOyuM6qzyg(--eѢE\y啼 c=Exesϑ8p@{J4McϞ=TTTo߾VWW/ȑ#yükk7|w}yg9شi ,p?9s̾}Rj*V^OS,X@MM pş'*++c=FuiR__zb3Da`8bG BP(Nr8#M8 &'5C$A7 DGV1 (")6"(nd|J~a |m˦0cO[I$ { )7 ׷o_o#hߏaB!L#>n/!j?o}ݚfMQؚQuVVoXh/>es;6aS}>Ghnnn#8hOMКp`6?9;3ٍ8631Q=m9 G>ekB >[7:]ᾊ_zss\m^/^}?aHnle,hjjbɒ%۟kP~v|m3 ~~iK.eѢEh\';qʿ;v[k} !?~<@?۷l#?ç EP( BPt.2AFJ2O>2~֯'s{ncf^xnWF4,ve vusCx<'sQ׫ EW;} G'w'dcENifWB=F} !bh)$f$P( YHzt:IJJ"99wz_)))gvIl3dc!#V}c.ܞزc_G-/p\<\s5m\ BJJJ^|,u={2x`m/'xℙ Bqf '.za 49Z^Gއ8s)vKAáh;} ? BPt)%Fo߾A `3~xnbb"WO?=[Ƭł 'l d(ywd̝;(?y7>8mudCݑ0p$b cǎ}-G 71cxWyHLLDu?|pv5k\s TVVsϱnݺx})%3g?TWBPt%@s cvlE7< BPt!{aɒ%k4551p@ `ռ <\@ ;:E(p J 佼'6A "o p#Yx$E bY[]6g[|Zy`FAJ\C7f YWG/7ާxΛ0f|XEQQQܖ ?0SLaܹ\.̙CQQv\|IJ,F֙+ BP(  :jԄmضO8zh N<^\=zQkd]|_AKM5l$=t}08:v֐fRJƍpyod{x^cPz-(.Ƒqw+ Sgp豇{urn #/ 7z,*++YfM<=<ƌî]4 )%L4 I~~>ׯgܸqlٲ>}hz0M}ߦP( BP( %h{fȐ!n۬ٳ'^]vubG"-{ =MHJ9SI~Dw4ܣ7 ."'$ƒ]턖/i:Fq)//?K4K.+_ $%%aF<@⭷J "&99mP(SU~c) B|T6۶ٰa7ofԨQ 80B򨫫5@QA N`;%߃_2q3Nх%c< j@iI,m7q Ѫ ^} i 4\X, u$BSS>!%@?myTVVb&`h4ʣ>innn#x^BPe BqFff&Hgz ؿ Lju1{qt۲TCQ( ,Kyۍyt:СCǽ30z:TFo~I aϭJrc~3;>ڕz@)Dh xDvlAb!q kPc:fǎ1͒xkiB6mz$%%1tP֯_O8)SPTTĘ1cؿBGyy9HD]9 a?箻jC~r7}(6;Vpv{)\եBէաǮM,m2a4M#PPP@$mzgΝ<W؛R]8~?Ȇz =E$&PWy/iU?CMπJų!*j%c7Ν凨{Mi y)4ٲMܲe ]v|SN&%%~1f~_o0tP|,Yŋ?>O<wމ )))n % l__WO?tټy3˗/ ^/~uZ{Bq7p&HMŽ6=b 1. 0Nk2w/~Me%MX|y TWWMSWB8غu+[lA4o߾x6P(DSSi y R i@5ҶI1-t[RW[ u//SbA{Qc&PHgX`2 NP(D(S8#7iڳ4 h'hz-XJOsC19V 0oAC8ÇK/ٽ{wv.)98mS^^~PJ:{TP+BqNDFFF<=m߾}׿?INN,=1 Nw,[ڴFʑ-¶g,VCg<, MT=kG  %!)d N@սV  \^z)VVVzj_͞={a; wb/4Eӎ+3y (Ja B* po,Ndk,>*GP(:4Ooll/Z|yטi p+0q8T( \K>I4zKh4i5j0tM.'T: BP( Bqne< L8p8`ƍTTTr8ۖTVrr<{o'g2|x{3HHpcf~\!47[ө`* M`0C NRZؖpS{)U{;<7+@ aQhnƝ؃ÖniP=Ҏe(Btی;}dAn2e@i!kW43T Xhq!-tۊXr+nĶ.܉pxR9ʨ Ew 4Mcԩݛ`0ȶm۰m={˼yRo>jjj:̘I~~y(C$paPR#|F4:aÒp2fLƬYs֡P(.Õn9e{?86t'^7eQw` {W>pJO1Gӝx.P(D|aןEw5 E lf\.ƍǰa(//gĉ\.igfԨQlܸ8]x< eIm"8bMcE$bc8x0HSSuj,JP( 98MU(嶩x9<n+ԄmD"n7@4%LvaoU$%NlӔ47GøqIL4 BP( BPbŶm&Mi!p\۷p8Ν;;v,_|1NvcH o}ѣӸ뮡NnZOC@bk}oےK3fL:_㩪 p1P( BqRԀI |iU{U(Xi| !hll)%{졾TTUUQ[[aMя>a$ l҈>0~0 ѳ{ٹ _u( BP( 6.4e iءz1E M3@JSVbÇ9|pUWWS]]8cM0%%m;>>j8jYSߗBP(]%b+f$ tWCq] -`)iD4tXP5V( ;HH;ܭm[ݢ @JUP(s%( B $kvrJBǙGUb7iG 5PP(s. ,0RJN'#iax<.CP( lC^6}sG*t%_rC\#H)?~< tRVVLSS3eO$a۷O < BP(Ί Ԡ-&)_2΄lMH3$|E$Xf +*A,hjjb͚5DQ&MĤIX|9'N$77%K̙3yרS5P(^~e,3;mFt%(Näř@HV+@heTBv܉iN 0 s(++c̘1a]P(3fGużX BP(gX`s̡O>׳b ,ˢ>}&11߯jOP(!vݾi̝;Te(BP(M,m˄ >|8UUU_00a ÛܛHi;}H+ BebH1öLOr| WBf D-lBwB'PJ݁ͧ_d I=Fg2CK3(^{!U>!WBHG$T_FM݁8)|fզߵ(BV7 o*E((XpR2k֬S=zPQQA83|pdeeQ[[Ν;u]ՠBPC̞=֭[w֝nIC%hy%A0V4ح+PU@isOAGl+BB %&93SQuecOie^+ xs̿”*uo}/ {\tO ĬضOYj3!P>.@w%7$l黔XPbaddd ;wb6`H$BRR%%%l۶M  Bq2}t @EE˗/^;6JΪs2՘~2CwZ})R)mTelũ!3Lzw'&Pz%_l; %1Z͛Um) 9_ ̙3ꪫXd ~iBPt*BBP( c߾},],,X KXp2Y0SjP(.LP(W^\r%3p8Ν;a9`=Bh8(c&tÃfpϊ(NW_qAF,BRtI)%ez1RJ gYC OBc&;kNҁ$eM0\-BhSM`A&EdF\ĴȖUJP(݂~fjkkϺssEh:5{TE+ E4iIBRZ( % N'Ǐgǎ 6 y >J֮]i2d6o|ڽ "PVv/6.BwnxAZጝ$Ŋhndً&-g8<]jocȄ<*^|t '3$cYa_jlҎgإLH&Xp!oROƜ#"FꋘzOHLmE5ݫX#$d&9s 6 5 $DBW8< h޶yo,͹a~-ܙZ\qJK_R*ԛKp88p@퉉466r2sLHMM=Ih$ W2BsL7dtEV}˹3` g"AS]9?#o>u>xge wХWރ.Bt-L647T+^ބTFf&;ys8PӝH:{z 䏜=:k)&?w  Efȑ\~:i\tEL2Eb4/C4k:v4mv+Ҍm8|ipbE Exx<&MĶmr޽{[&P(m'&Ҥ\pMOW}\pțHsC9o>5M6Yct/rϪ7~NbZ_MԬ8 xi}4WGziQ^]AdMᗶ@􀤴y~,Ӧ.g?!!HܾT)=&d"e4;9?ROO!f[xriy; 3`\j`Fጚ]Yl{eĔ`@%'+`? j"'-e{6rxvB34Uo 4=" b[Q8{ G+&UgXzϢ UDM8].) ;RZP(Vy>/?ְaz444sO(bΝ',BP(  ZJMӤ;Ree%K.eܸqض[oE0ԉҎPV~#.NV6/#RJ>|LL1_!вA3l] G^uO6z4uWu\Ad6;9 |D8܌ c$0۩g_BwOoLg("nyFygl3{/-$s#K]lzm$"Q籟g[]7n:e(<GPu]?`E>Nsa\H? ́J|@{yMގh$/B1uTy"L0W_}ogʔ)~|{#-- MNɖgRStM;*r>>xӣAUZ7YCę>;A8&  ?O?{ 3<,RAҶZbIh^{~ny$OlGS\SB<3 ɽ&v,~؃́sqegŧ^n\Gse3hugG` ?=k2 uXTW/"׸h'Z{cI^c{);v(d؋q%tS',u܎>OiTIFM BѭeD"rrrWzZĂ={rp8(//'%%[n_~jJB+Vhg+HJ;E"Tw< AnZ'C%UEK0AU`j*zēI]#߬Nד-+QǮps5S"jr+o쟙v&?m8]u(Vz`YXKQy !!;4ׯx!(..wy/3p@ [nP|c\G,pJ,8U_(eX МۊIH)IMMeڴi i 0S2f̘/Aw r #-57p]wv&5tP~0dȐ/\uU̘1_Vg2UYW1;m6]F'Ƣ5v=M𥜏m577dž=-t!\s-&qgޝ @JJJ{aIⴓI^^UUU3x` O>i9^$ᣏ>bڵcY[l! QSSúuزejuQ"Y[ Ź$(݅.Yi>TUUQUU ;;(,,ld^Rudm Xf;'mi ӓK.qDbO#đ[vlaݯ>k~kY[=^Nel.xFՅAmw#Ucv|p)SPVVƪU1cw4f&gN6TyQiUaz⩡Xhv30Q,yd{gF|Ⱥ}8>)M$soװjWg --I5 D-eGEm=/["qkhs;NdZ49s޼@!9pV6~;^W㶵A|2Y ;I,BZ!^ֹf;}Hn3:W1CgT"pQvbwyݻp8ڵk:t(yyy00ΚCƵ YY?Kңo,Csyxi^zGNOc'@$B)>e۟>"q,4?;~L˜ ?*fm-%w~pAG$Zb2=~ 㑑(uKߦ?EٛoNK.7}ge?+1h(x%^3)^Bo1KK:V-!/Ⱦ#7}d|+,ಷrz<^zDA)\~>|۷ opEƧ~O<ٳ(--塇L6 ҳgO8[oŋ \zq[)SP\\wkFbb"i2oy4}]SrWa[6ɳ.!Z[C~=s"{Aөo1)]lnFON7~oiL0[3XXŨQX` W\qJ222f…у'Dgڴi,[K/98Xj/&LG? |ڊlĒ%j؅S8ImmtW>Áq!דC=7sfGJKj>Ĉ1fKŚ5Yx'9o氿y?ͧ,Z&4& xnsIu:ΗNnʻ"Li2!u\Cj_ٸ)S^J+taeJv4ҷ(i*iS/: ~ٳ~ZHq [7T&8kkVm7d`EEwx8&OBӴV4 !տcx](D wڿO<LJ 3;~3W|)]ҟADr2B%%$a*؁DޛӸv%+>-0M\};pfw_P}w8 &a(1}-N34B%{'z'LATNV/!CFиa ˗E퓏LoT:.CoRRMMMq  2~xxHNNf˖IEE| %%%E4ŶmZ|>MMM6g}djkc4 ]ILL8(SRt:~4ze BPut )%>'2sL5jTܭs/EA؄?͠DF±ҎMwO?dפa% ";DJ9m$ n<"oP?k0>b-K3| gS вn?m3ؚƮ ƣtlHpB${`TW]w;~c!D%^MR/>nW|$+wUU~IN3 h'zZVoko֪:uOZ8QD< !S{8II\c{>Z{~Z[nixә._4R"4ʹwm~F馛x ]H$cD"&j IDATA<?:n'`TL 8f܎D S4/ V=ʨ]81+Ҧ>^O^9KΡ( `GE8dccKCK]M\ \4cؤpn2[uoqfȟAM&t:UUp7or _w_ P3 Gu>*+N=@㥗^իW tp8vxkH9d(gu{?4*kr2U^zRdYx:˯"nRC8؉p]0OyEj`Px5ر(_ }\eC)?qMu_'o޷ ‹N$(8"㜙d||1pwF8RDv6syh.7E=i'qɒ%L8xOǬY(++Ֆn}ԩSE\w8p ^t:~]` saR$&fOdn^Ks3c _`XְJ(! 84[Y\9pA\d6ecG܏KDdgNOsҹdrd/ux-\+-dZy2="^UIl>+b;Hoi\|iwϞ=w}L8{3g I$`h4^  uV԰xB^z%~ Aii)Nu2O5kxlc<4tP2D zqMIZ$/Խ֭<>qn*e& 6Ç?P1xb\5*Z9`K?##ä?Oy!nݍKaIw>[5oq{ߓg" jGU9M6|p2u-Ғ\2>ǫ5Up8gڵkW=O<#Mr1Nr ׁ8NOV2J"TA*t 'v]w"tփ G\tھ @o}o8H:pTTTLrOBn_䚚>p8=pKǃarAiWG@"'bQd,NMKh>0 %vkk'OB|Y=aY`JMx_C{\ pY {C a/%DBȄ>]RحC!K駟NeY;lt|ߏ ##۷K&arss:oҷo_|A{1,Yo- nÍ[S$9Yz:z㓣 ZhO;OLƈ1!}Rwae:J=kv2DF:ة;Sad9RHdff;R*NkX=v,o~#Fz!pAwתּLO럡yYYYbtDWQ0t;>Jq'znWN9Cg܆jrt: tGish=GK~~~gffŮ\$c/mmqruw{Lcz6}[iP:'%Zat|NF"Pcx~-yr8xZN867ƛizn)%na1']uokjjGeʕǥNh9:Ϋuqֻ>%ĈÜ./3~|5hh9;$=Q ʼnd$ 0zh|>YFGP( 8b(_d$Do"C=jb;Zʑ{?8Y.QXt ZZ?t=D"`R`$MMMJ(P|"|cVZ… Q>sU`&iH͠(ޏ)`zI4N"mi;n*@ܹehmC>SIyQŕ:/8Yt ZGv|Kir<H8v wN~OJ|U;dE2n_V&RuLiyS]M %Lu]?17FM{Mc,+8]>:|8'D(h ضN{XG)QHϸL&q+C8^;7 MW_3<òe˔q>#K9!-V<-$H@]W-$X}Nܹeq¶8.,¶Lt۶tZ^(צdQ\q)f,@6(n4MU4T6GVJ~p!ڃO[&c% iե~KG Cwی#t6+Ie!YÚn`og8SD-M#HV(LAm3BCwf T yAZ ČRe,z$ѝ^m.ZG JwVGVtËmƉUA(N]RRRBuu5HAQQ^D"AMMMyGж?ci Gn }9x&O#t1= Fu> !۷//LE8su1|6nx\?qD UUU8662'㔸JnSBjnC]5kujQQ$^{-uDN0;}},m]%O54&eM>QOEfkkiH6 o߾z477^6 eѢE{1l0̙]wŇ~߮ aĂո2 ۺRx):#Eg]ru[^LDp{\$I,Fh:A_hܭAwHqg"-3UoQ0"J\$8귽@CVG)IN)*ۧ멑+Gg{:d!mO/}32Z'԰Ҷe @Utu XONSNHu^h6)(Ea4x+{pMwQ2 4Y&n;#3`*ũ)Ɍ3(--eٲeTVV2l0 aA"_?r0C&v,8Zf iP8t@͗ 1wϮ kHT9ah9]oG AoI!lNqF IP}z9w4 $.Y/osGI@̜9{キP]C!av:(a{Conv&''ϗeǪUX Ks /{OZLm|MhBdjpuݾ=T P^v$'~®ջݰ;>qC De<~>Oj֤m"u+hO<\7:5Ws,_.tX~=ַO~FP(,ˢ38MU^H$ppu躠hc&deFc+X`zwDO6@`[qZj*5n<%͛3p [>izM#a&zK%НYn%c-4|GYq8R' !>}:~K}l2.\ŋׯ.1`$#?Ű~n v3lJ-^Cŗ?3bfq9){]u;+q`/> ň5pyƠu۩X!E?efQ{X!#7=xKcƃmaȠg_&@.^uUT_Ͼ5(/{~T,WkTJ=6?Q}?z0D\|$I.]ڥ,g͚7.]#̙3Yx1|ضɓyX|9O?4gyfZ@:y_.]O<`ʕ̘1sn:| 66dJmUP(яRuq%Ws ?`bmdr/Gr+\ƮKvqU߫_{irAe/ 4kndsf{n# B9LZ ڔMXsc?xylh+U_De~MlbV7Q˔HcI6,V^͈#0`jU'C2o<,Xwt]'WQtzq~dsAsh;;+ffk؆p"m+{k;'KU_w#29r,7D62f]LoFbyGMF=p1q2M[&{e.*%)AeI4;{$|v2ΘĮ\h]V6. ڴi[.=ܶm ˹Xhm;JJJu7)S4 p饗f͛GAARJ4773gz!'Ofɒ%@EVL$e--cMchm͇~?UUP͛yǞ={;yWٳg2!ՋB9 Bq亮sYgyfZ[Säfɓٰa=sɁ{~JL& oDwp Er&3Pr߯1rrgX"Kjb5lmQ"'MGlnŽ{ϣCߟ;?Y#'oHZ .{N:J! 8ۗW¦&VWmm<_)m%:&+N23+(>b1csn'??)SP]]͆ z/ #5" ·hDVʩ19fPHT3𗏦TH;eQ(F|fvO$ג7:v}|Ϧ7nٴ7BO9cۈ"/sש@(Apr}?4SYV#5!9\`k?֑ bEehK]m Ciᢘ0^G(ǃ+V(#(mRhSN,cƃXS7Z?gfP*Sh>2Fl+(>NiByǙ?>>,uuu,]FùK(bkr|&lۦע:ex@b{w|%>%8 >\2D( L6qdgGi'yhH"-d5,\nn$VWC"2>= eR<"?XO(0_C0|^b4!b)!IdϿ#k2dŊL0!j*׾SZZګ- eXl&//Nkk+EEEtDH?Vd=-fI_O_z2+?Q^{ ̲.==&B0y~LLͲe\Zr)pvԄkhR;;1u21".,ͭ{#X51cF 9>>iH瓝Ν;UP(N dQ/&ʀ'-S<<3<}COlN6Ut o˲Rym JJJ_:_W6lXvK#~3ٔ/Z̀~6D^Zjcm=#')jb+HLeꌹguX q6KoM{(&j{nl=$B&zMոz% [@WobؚeR:}-xЪy25zbԿ]+̺^|8fScj]0oYgT͛yʕW^2]Bӟꪫx7zԤXJХk/ZKCɘ1c4hǪ!;#)^Q)L]) %-[ oQosANםR<}os>RJxmk 7gvjxS8;.SMM)` a-pxyGpϸ{hJ63chGF?~<;v`޽UU( #EJД1N\EL|H0z.?hiiQCv?1! àǜ9s|,X@UOQ=f׏y5*B233F݊֊O~n& ]cv)s& o`vf)i҉(9*߸;)7=#p*E,KOy=)uE.fG4fѕ;3ne2?x\.NglDw#:>b+++IRIlR] e2y<@ӴAIrwV:om!}t nwDpR"vӅpz2HLv誰tl+Gǜ}G:투ꫯs !8lY)u:ׁ׋,xb^yӠ .fc[t?Q۸"A#{H=XAmD*(! %%lo`y^vs=477 Bq5T}c[)"\HIt[%w1ro>@g׺z ]`ܗ imm  y?l~L > `q llj# ޽[  "GV( 3;tÉ&V5J닕b' 9_SX ĝ՗pB"+6𸻎l84Hv#8 DF&1* kJSv*!T'yFFQPP a(JqB1fQ|N:j)Xf %tAu<h˲4 ˅ضM,;,IPtϟr+ BP( 4 ,fĈ,]JJKK?~<>d2IMM K.UBP(aݕmk= D:E@9=(\ݕ"8:$'4݉fx'4ht)ƕLͩ@͑;\mT4 L8˅1/_a3gUUUթ BP('iAIJ_r$Hd'hi[HF3\hdY$$mNF(s5m"$ M7:<`V+_N&y4gZJ ip~+&m!o4F`ۉ . 4lhӎd҉7 ۂKJUA##>Oh 4a&pW,(**"??[2uP(a 0\ibCP( ǣf $#MxKSQ[${ۊwxHmbzNZf}˩ eēbd R3~ </f+ g2_M,pdAӑafm}i25ط&odm3e-!#0rLpf_"Ãp3EC/iϒQw,"\QUHq?KnXhAv%z/EÎwiܹDNqzB&L@]]H)m)e:ބ p8۷p8+ Bih2Vvo6}^Cs]{b1b Nt*C(ؐRq\ L$ha|n[Rc061%ʓU_lltɶ/_iܵ~ wFnwaywkQQ( őXh;vm"੧BJɂ p8QWWP$1?nO&e~L*V+(K,R2l0 @0D:رcI$h(!48&Og? ZMрI ߍnmlNrjg ^_ @Na`=,y@2s3tI&"t 7yٟ1~Fu#'F]HڿÀaӑ JFgl_ BSK xHcc!lٲEH8^RF(4'$ϦMܶmƍmۇ: 6F%wm3Hd<W63æ3vƍfhBRI.8Yx 3y.yݻSd٘}ddRO/gs#Nݫ|jNBP( BP(N`̘1$ jjjm0@yy9wRgA$YyeL&]#NK CϘˤ ~Șn{&doP >rJ˦ `|Z2bX$afH$ @j}@2I0hee lr+l|WZ̸7TV( BдlҎwy_Ttc7fR(>ե2f3ϤQF^KFFqwSJ#puDw-!hp3n&tte+ӖvH`Ehi؋EBc0BpyA<L&,34zLY BP(!QXRi[dq(Pf:ݑA9Ymvs x()J,Rz 3<]vX|9^)%Gryn47请9s2`GhHRۊS`3dϖQ\­ؖÙ:RZ"**Dwdpfa%a؄ٸl^g >SA<'Hpg#"[J1v;TV( B$T}+ i[hvkk*o;MwlfN4+c)J,d1M{"L& $IRbYrz>زܫҶ]|yΜ λ~mڸo>mň 2vuͪ~Iq{-fkp9f2Js}k>`߶% 9KƢ ۶SxDJ,!p`J {i; L2nڵq΍dgnpTV( BDQN׻,wp@8lvk P(m⁦>!?z߂0.O${k,Hs4p8EmmF݁Jf@K /%ߟjX8M0&@=7޽h8L<n*i9s)2XAD[iތmLjFcH,H_Mx,˨޳ Ɨ[B店FZټi":( Ɋi9q0|p\.6mR} #tb&v7sp{r{40 t]?I]q]{,~vg׋Հ#@ױ'e=۶ٳgOF=fWZk>n׆Zvu.ˬd[^9` v~nۛ4j:NwkۃTvl~HQ( BP( ,- ؽu X2BP( BP(2KKFZj7*C( BP( rR,hY>IJI8&  >Wl'w﷏oq~(CPwq9>?}~Lj'̖zG vя~}e]F2薑A__[D:*q%0c ug* BP(  :tM :o|[o[o|+bc>pIqG+/<*Zn>}y"' ;8!̛7sD4Mv؁eȑ+eYӇ?0a>,o60|NUwBP( BP|Jtøq, "&I^uX{DDY>; XyG~pqT{D,"*0жqgtkVشD2 5+1wmɋu42gYPDdNmLC/,&cĶn{TP {'bD{`>Ed̚ItZ⫗GLqy1o<222:D!9s&%K y'(++;,eY338D"ŋGiL4#Gb&+Wdή}>s+Wv}իWSUUŭYx1pB~0h >O8BP( BP(N:W{ƍ7.\JaƌAVZջR?5~":d$h}ip7D H67(}1<.׿oN8 _ro022ݾ LE}= !jց}?~@ 2!{o6Zݠi(;Bj %ٳٹs'555i{~xGss3`V,Y%K)6lwqάYBpUWqEH2DJIeeecu]B!6oޜ^u֭[\^+BNN۷o3uTV^EP( BP( gP,>|8QSSE,]X,СC7~iL{1 rλ=Lh 8{{װH eOD7n9gf8Z 2 />s:]4<wv%E]rc0xKe9]q5 g.+Gs{hxyh3)-~eΦ.0m4>l~yf^/RJ7D"կo>.{+xw>}:[l#b̟??ϔ)S4swqF&N>]v1tЏ7AP( BP(XɤIؽ{7SN%33r8@}}}ݲe 7tlٲ~ۑ}~/%H4c[MĪ*q  R#v`?vs#2O&99ر(Eo!rr(p+:7@Zv21R1@Ӵ!C̦M,@x dR-[F4JJJ0 <TDez)))!grrrm!lܸۧ躮NBP( B8iɆ B!l&bYiBN'!w{:LSϹLű71|>D[=g$kSBAEvGV&v%I] ,xɦFggDb. ns}x8"rrؽ{7]WSSCnnnz" !H$8} àb$aPPP@ss3X )%t.P(-Bii)?Ob444 5k۔cǎtCBP( BP|F{͢G;{Go[PPPb=E?iR]]ijjbРAڵƏСCӧgqBX{w>s*y_Vijp-%q}J up%Z~>Z~!ɽ1jȿ8udLLOnǎDY>r?7 _c'1b-1 B6P|w3mڐZح >wcޑ^0gGnwZ %ěoLe_S>ɾ#FYp̵^ˢEB!غu+3f`̙3vXسgvK)**tR__OKK sΥ3fPVVƽK0ӧSTTرctI#tu|222hjj1^A2.{;7qY!0WbJN< , $$w7 g"=|͠$6#Ѐgx֦2%h:`Gc[1 mX*D7o_6H'd,y'c!uۼxK3}Dn&vVB9zAC0~; Bw^Ǝ˘1cxpݸn^}U)//'L{D4JN'cƌSUUݻilldܸqH)yGEᅬeY5 V\I}}=.L~ma`66mbڵ X~}ϝ;d2kb(J,PbB %(X%|Jb\ĂI(;}mb~2 vqRJ])"Yf׿K%=Yoӧ Yn*@lsea4773g> qD;*'=n0y|T9gL$, KX]p(mjo[zkz[[mmWkP.-RD(l$e&zIaj }ׄsΜ<,}]#ʍpqžn'55W@dff%.X$8<0D,Y^ z_&%V ޽{y'3gao'ǧB!BŐ`gM0mp| oot< z,B!B4Qo&e%G;5pM/[Msx@X\YWNZP9`^?ir9aÆ#v,ÇU(N _N IDATaF8N=T^{5N|rB!sYE~~>]te^s9K/3goln SB!B8X||>kyaY۷o- m'c=NV<l'c}';'TA8&L~ɨiea> 5=ǟp`>1Ns8'8~[qqlCXF7.#c[׬AR4kczCc}%KVzFBq؝̙3 BڵW222=z4G&===geQZZʘ1cHOOO`ԨQ7^-rrr(,,dС7LRSS6mƍcذaL8G"`Μ9\ve,[,7`޽Y xB!B9W'Of˖-5*|񴶶҂磲4_iEI2ΞJ_"(xEѺt -G`r\#Foj1c1E| oވcT7܀w6nm?I ?Lʘ@Etf> }ooN€-- #Dp  _*AE!ed/`AnN=T֮]B4TUt =.XxqYx1O=J{477͕`B!B|.)Sa 333 = rJL$==QFbŊ>[؋A,Fw0 sO=\Z8u$BE3-- GN.\0 Pu?Zewbb@ %- {BIK;9ZN<N&@赗PҎ .=cƲ?njňVlFY-v'sA㍨v 8}7]1TUtjU`ʢmۖnPUUEYYyyy`ҤIL2 Hr,fB^$jM.)P(at5uEQB!xo,477STTĐ!Cx:X FR[[Kqq17pC2xouY&B!oZttto( .9se۩㤓N"ҥK;fAl5Z ~x+M'E< V"9yds>]"&},I!u3V<綊Md_}-{Kqdeٱ捠)Dn;t:>mXZ__Xnj>ވ}p1i3'QW'0A,_"FxP4 y/HFkeY$ nܹs7ommmdff/6t]'p88:t([l9򮭭eڴiPUUE<W_e…\veqAvܙ Pi555B!Bϑ0P<ԃyh=YYYl6xϝG"OQE!''{ iooѣGڵk:F O(Ce p*%$v zHlм>:׭"\92uۉVUZ9j,0'_֙thm;] *[ﴳI;B`(NOHWSO|G-hٹd^~5p(9d\z9Qcizහ׭B;h=Zf&_[t D>Zidff2|p Blܸ˲;w.'Nd˗v7n7ofͨ\@II 6m2v;%%%$ ֯_+N'UUUuY|+_*q\\tEp]w%f^{-k׮e2#'UU?dĈ8N˥cp8л?f*n)3i 4 իc>I]}o y:ϽV퀇;`/--=r=S;3Vu4MKeYl61ejKD PuHg׀>+,`0CĢXhq4a2`b's\c())? untz9x!HtvM`-[FUUUry<']XvX @{{;^7۳nO~ bax<|q (hEQ,"??׸B.GGZohmm=acܹ~yysK$I^fu8|>(DB288:::Ns |>zDхw?jjj+%Bq\R_=[a֬Y >W'( cǎrI4Q!ݻwseQXXȊ+7I!'~ղ@4ONMMMmƶm0MqAEE'P!,?O<gϞ=)B!8EEEnjjjz-铤iFbӦM2*B/T,c(B! >O6SsN4MKNX\\a޽r!B!B|u˲|hƴiP׋륡TU@ @(Bop9( O?dq@4ΝˀYz53gdرq>nݚv 0ŋ$؏ >N; ΦMXbg}6,]Æ OO?˅<1~xt]gՔ]c{ 87x:~bҤI 6g}Ɯ9sW^ɓ'3qD>#֬Y|]^^saJF~AyEQhkkgeѢEK477fZZZpSSS#S!?ʹKii)tM)ӉqgΌ3HMM=cwy|>~H3 6,ٍuĈ\|x<nv)))̟?'ܹs%%%%\.LBff!ʎ3s璒w]ɸ~/f޼y}L8s=M7݄\}v.OII  2 B0M4F$ LӤ0رcB~pΦM(++cĈ)ǁp8믿Nkk+tttp8HMMEu"Hrۑ#GR]]~;F)l6|>eI'D]]wÇOnWTT[b1"_<qF*++{}&p`Amm-wyIJexגR5jf͢?瓑t|>6l`ͽ>K,Fyپ}{W"U[TB!54, OJJ hT28qua_yz 238TBdff2t^A?KW\q@Lb(Ӊ(qg;v,/eq=fϞ磠233)((~wdwaÈD"2224D"A"͖xb,tPUUnB~-qF&NYg7ɔ!C1cf[oEaYn~:W]uk׮Ų,nV)~FQ.2-Zȑ#YlW{W_}\D㏹pݼLqq1vYh^UV1c F;y饗$˲0 ףir =6lGy 6UW]Ÿqشi3f` _w*~ (Yak`D{ii).ɾ,+9ހB/'YohmmB! nJ<_?NKTfff{^Š@л&`umu?zlR'%:FѲ 2'7Nk7^OuGP Ƭ?!5 ܁f+bP6mg騗w}_x aȨ wnao!B! ]י9s&EEE\ 1cFfcٲettt|i10MgIslrNq&t)2I  QT'emoǙb#QOZ*F"׎jK9jZ(Tp|(e&l䔳 MHqݝN)n4UW%7X4Gp- <%]ݕWwW?M7˙5e/qҩ,t3Yc3a#l^5BQ4xߋiyLSFMX{^ y?g=JBF"},3A餅Lu.OUyocYg_ (5F NJq`HXEfH>^,}/vw6g_X;p|/݂Óg3l'wι~h B!'~){~*++{ ЀfcҤIL 8ۖeP4,ӏ-=?뜞lνIcv;<9)ʺ'頥q+ݠ@s"o7>CX [.Cvn^GI-;h\(]wu9P@ռ(G4n"mceSm}<- 3dw?hc/ԯyM/l/!ŗ]|-x@YHôB,rN"Lu'^<|C[_'ҾQ<漮 R$@c& U["oЄ#/&Jn(RsN"#0R!B!N<eYKVVz*.,Z[[0a@{498q"˗/uh Eq@8QO;ed]] vOBQPuW~㝨s7QWT(j>zR]fujvt=QU@Ub.cOuDbj6~ (eYڪMx)Q­ԍ б13 ;00{DQXf(O<=MMMX}:n~?~X,v fݎwݶPWůaIcJLCVio1DrO^]8P_a/Q0d2M{ϼ.?&f1L,+W1 (Nf(j7lIgo6:]4ٕf#Fu+\)*]no>\vmz^ݍ/Hzpb.w9dRe:ca`]2 .`Ϟ=(Zӵ hYeo[ڴ~'_BWL;Ֆe&+VߥJe`q:F|嫞}_E<`Xq˾Y#ؼlX [3kl]5[N 0i޳֦m4UY.Z+ڧ(}. =i0M˫Q`q񍯳yͳ4|.iE\8b 6mg̔+;/j[zDхw?< ]]n{e"$[)?{#Pc>B <#'mrWz6s9X=#u6/{R B!8I@`$:y% gus,Yr'c6Gg܍i$ho5ӄB!BH@jjjwHb:n&`֨jK%m!m!a%4:jB3HIZn T.!B!ė/\.Tul6. Tȕ`5[ef;{TTRTlL-_,j ,-_OWX"ז]lз[;^*ϫikM;7\V]⺢00)6RT슝t-=9i̞=0A!eggSXXHAAʷmn6ǿ|?_|k׿^WRHBVkY`SNeر,_m۶ɤI4Mvʕ+40 TQt{PFkY$_7QVʍ#o(QV6:q؉Y1 <`Np'׮p9j*!+n騊_#A¢lǧ0,h'/XmooëON*%%h:%E04śP̮tPb&Wr,(YO6]]Jmm-.ӧfB!@z+ :pUVgBgrfi?>iɓ4M I!˲0a^@ xO0MxHMMΣDtfbȢs460{ξ+X:mO?gYUU:JۓFqI]mrq=Fg<`}ٶmhn0 Ǝˎ;L 4MϟϜ9suwy'|R͛ǒ%K(++ngyk.Vf5+{z=_ƢIurλynsMK'ESk?7'D^nLJĦ&q/5n|\~GwÿSO13GL;;GOK/W^}w fJWǪ=cX[!ݑ΋S^dS`oSSR@L4m)xyjEa]VHB!@<eFz!:;;={6v0KyyyOH$صk&LBH);;lnԩS˝N'Pxv z'wp yjS [CŭJ@0j]E<ׇf-f{d;z;u: 55DhXD QUU#!_qL$sN4MN=T<+W䢋.?sR[[{} UUU,\֮]{ dK/l-[Fkk\!t͘0a XiXEee%ql6U{Ċq-=FH:ؾ&uNb6E%/^w'_3[o9V!--퐹ƒ 7of̜9p84MƎK,LlWl7o\*tnu ~{wˆ* K#G- %fhP\{xup9l4, 2;fٳչ`M|5!+ĎbM|V D(z'+;VҬ7}7mwr멋:޽{5fB!'Mhjj' ğgb#F`ذa*0z#4Mۇd̘1tvvbdK_,,LJ$aرx<222hmmp8LFFpd u4wM9Sb|]CQU'ZفiXv 3>hGn:x " ( |>xG+O6wi)SPHSFOӺ-,|6-zKjWeocbba%+#fƈ]njOXEU>};Ŗnꘖ *#י ?oԴCֻ\.btAB!3=cEw,0  ܹ>_|FN>d.\HKK vLB|i[ƢExWXd ͬ[Vl6`-[:޽*>?zM-ok(;Wn9hΉSPvF8`8K7-;I'1Ӂ_/ --- 4W)))0a4lȣ>),,$`q~{\y啌9_loNBW!ݣ:-[Q2 pkAK'a%i>V  vdS/%EKaF ulFvUM(L)$וU֩wȡ:rf13q2?Gz/g B#AL;ضm%%%䠪*{9l6f͢4y=vN-N4Mn0㘦f~ `˖-F_5$0 :?\Kd&;KKwfs >(--\u VZ}~\ ~M{uXv iZ?[8fOBu{1n7̟?l:::xijj" QWW7M̙sHE ٴiӧj"hͣLç< tPCJy[9 T&Ej5T{t&:e-`BH14m(/&nŹw˽4o} /Yﰥc a=ܫ,o TëMv܂_dbD7/?U O-7ぃ; \.7n`BO\˓][pklUVwkv tMw8gㇴP4 Ejj*`˲-K,IOB8\]+vw쥥\'CȲ^_(QBjj*px<$~䊜a45;L}.}MWgda\ v;F}F} iAigRw=T*:PUǡetY߰{v8q" .;p7SWWG 0p: 20v"ƠAFA{{;MMM(_̅^~ߧaagϣUŎȎd_5Rw)NU*Y.p0520!ɸv $Zݑ`k xTU*f8yQQh)wӬ7Roaeb{Q1bc{(v~k bfD1ԩS?>wq!P!r;l9B|̏cXx1󟏸o[Jee%sQ[)!v;^uc>zDхw?< ~T-[T˲ QzNfHW];,G<իx<FOӸX,FYYYmc}'r=ox?]1GM4%YivRYv {]xUTF+yͶ68f'BzHin[h;avQG¢2Vw '&X`YguF0 Ldlذ &0n8L?d˖-0B!B!N`A[|rl6[r!C0ay\.3f̠%95B!B!N` 2vÁƲ,,b߾}dff@cc#455I !qL !D3ߴ,0M3gb&~ 8 <: M`֭r)YpUUEUB!ĉn% DUUnJZZiR^^NCCH7|!C`&vwBl6x\2B!'˅2p\ \( lڴIqBOrhL^'By^TUEc`*(⋐H$l2B!N(C4=ۤ(B xB@!5Ijj*D⸿W]׉b J˅uDMp8t Ԯ"kzk!N:4Vi#ngQUsçPT|M0XDQn7vp8L"0 L!BTUfvq:~ȵZ&X`Y3gΤ˲0M>r4Mcڴi 8& w0n7,G<Ҍ75XĎ\#+ r xR QfwSal. !NeYDQ4Mjw@fB!pmo~|xW- uuulܸvk~D"A}}=YYY'M~,PU&MDmm-{ fN:$222'PM eGJ2p r FQQeX˛ô7 6b3u6_fw3hLO2cl`( ʹoÓiAC CBXdUB!kOnSbشiuuu3S&3NӴOqx,DV B×1)GQeR2~}@ ]0L>}-{j60M =-uƲ­|Ud;W+?a?~G<]O΋gZ$H!q*!BuNdO}g<'tMblN6x+,t& :Ύ5D;ێ6K`:F"iD{xF, i=EH{-5WR:q.X毉GZ,Jb&bF"O_@k7OmA!^}~igԿQ;-,,Ϟ 7iُiijo2vРGZa[A1&s%vr*muCNFD NB!N Ls%( TVVDZ,cǒeȑ455Q__ʷeaw HBPPo-ǛM3b7[hh__ ,S'xqgoҰkX EH;  !?<B!ĉA~ 䴉[nEQL$??I0$??X,F]]eT@SrĮy#2L CP<,L=Fǻ`nPl4lwQU?wzz! A ^ " VYPuEW HhRj%!4R'~Aw}+8ssνssx쀇ImԕlB% :֒KdقV(J^M&.eF73(+Y/Y*1B!y3jvlտW eyYY +xI\Rr_9peIVZ}T@פRfBAz!Bujժp}l!ǎ˕1ݕ^KտT5Q-Ww3G!B!i$B~e8B!BK~SUUx<ϼ[а1nx*U~TV-Zj7<8U'!**jjUގ^}ə,J!B_73 AUU5kFzTh==ɓ' qƄcZIMM$x`%4]O.K rhY;'cz衇PUԫOhP;lEˋ_x7w㉏Te鹥*;teN_PZȚ#j HàP￟h>SFB[0 B{_Yĉ:uJ ^zF2331 w}3⇾f5jaHl."҇:5kcCbP14hDCbj`}0^y>6SN C`0j7jբK.,[L!14XZE"?ꦎbbؘ.m.PX&~MH0'`TlO񣎩55hטcLQX$$+PObh"IaIʱvK}QVB6B!po`0@nn./_yTOBU WB4 n‘#2Wpl bFǁEg .;.3aJ@@ ?#kԨMB!B!_k׮deeiРYYY89pV5kRXXHEEE{Cd4zBzC9(~*^lA0_Sx]^ZQ_˶)T6oرcvfBXw k3<0ghG9QvƀeiڶڬLo4΄Q1 \WMb"*111ԩSM6 B!B񛙽;/A6mh֬'OdJDDn&Mp]wqwRfͪtT=F#՟I+)^-N',\EA}.=@ܛ5*8r.| ΂|9s D<::shdÆ 2`<ˎX 5zA y2Im'Tⳋ|i3"?g>C3g Y,;(pz{f=w;i&&LQ)>8ƌÎ;8~B!B?(0>Vտ\`LLLlmX]bUUG\. ˅( evt:(*+!d/A3Ԣb?0UnC0@ E-.B.'JPȿW5(PiΝ;SzuV^㩺:(wk S+ѡÅ2O!$X B!B,B!B! !B!‡ B!BCB!B!!!B!B`B!B!|H@!B!>$X B!B,B!B! !B!‡ B!BCB!B!!!B!B`B!B!|H@!B!>$X B!B,B!B! !B!‡ B!BCB!B!!!B!B0ʕfIa!B!- zׯ/),B!Bx<[[,x$X B!B,B!B! !B!‡ ~E6UUtrn_ݷ_cYeZ!B:ïကnvq:\x{&n=5"11UU9<DU_l.]b֭$%%o>&MDqq:th*-6lfq*%%%=z_<ԩCZ=z3g;{/駟q9s&eeeU.O۶mٳ*Ҹqcׯ={ÇWTVG} Ͻˁ8v5j 11M6( j ???Ν;ǁHHHAl߾:wLdd$k׮%**&MDNN{Pڵklfddd*uԡqqRSSq7F`ܹsV+ԯ_?˗P$4h@~~>?NEQHLL$..۱Z>Mسg/^DUUWN6mx<ܹ˗/( vCiOڵkGhh(ǎ#==CZHJJ"00|vލft:IIIԯ_)))(BÆ iР Ҵ ]vtX,ڶmKdd$NСC>ebУGΞ=KZZ:3!,իǴi(// l /@PPyyy NTTCTTύJ~~>AAAL& HFph7*ݻwgȑl6TUŋ;w"rrrVFF#SQQǻ&//_ n0AԩO>$۷rGIAAA G~_>Nv~t,Z~ݻ3yd?j% {Ǐ7u:zΥKX,jU *Wڼ 0p@v`߾}>|ʽСC񐙙ɹs紛"rRZ5TUOUU.]Dxx8&K.]W h4_y9o PRRByyEQnc|'L>N:1b֮]K:u?,:y$w}9'|o'xMn:FMll,f́xW0LKDDD0`ƍ#33hl6߳hѢ*+vݻwy F#9}NcX8s )))ѫW/5jNd2[oyfz̈́ (**BUUopy̜9srդI^xIIIO EDDPVVơCԩwy'F #PU^ATT̛7Á`o߾ :ڵkӻwo6lٹsvMxμyܹsLj#ҥvo[n{5M6Bxx= !j@YYo6#FoGj|ٶm:tFиqc,ZAQfM/^ٳgٴiwqp8xٵk˖-^??*+ĉL8)Sl2V+jO>{po3k,.]+W_}֭[9x ?0m_b N8ŋ FUUU(̞=Ea6q:<ڵ*rL0;wgƎӧ+Œ3x7O>$NbZUVlٲǏ> 9r)S( :u뒑QXx1Ç?~>nݺq)N'fuK/1~x֭[ǝwI:u֭ua3H}Q f̘ĉ9x ;w&,,}x<|<f'O0el6u۴i×_~رcx<MJJ 3f`ر^o眿VNNÇ… 9oC=DZXx1/" ,Іuԉ#FFӦM r;tڕ-[0n8ٳ'eeeL0ѣyWiڴ)zM6?^^zq ҥK#!!A+7 .dРA |;çRz-IJJb4mڔÇt:`6QUߟ-Z0m4f̘ahٲ%&Mp 4iB 8pOkiw^yffM+dC"p8|nn7YYY4nܸnn{>_{;f1<<1c Z;:uCqz)xѣ񐓓Cll, a6ܹs4k֌ѣGsmq!n7fnѣG3h:FrJ FHH.\M6DFFj>Zh#Gxwԩ `ݺu9<;vdܹѭ[7OaQ\\ɓ'߿VM&͛7g͚52i$FI-ʢK.hтB<:Nf~~>XVʨ_>VH>}طoɔw^(**d2QZZn>gggs}O)//cǎv&OٳmӦ ۷ogСdffxY&3gh*rr2իWgƍZy^5jÇiӦ .l~aNJPPǏ!2202338p {YfCBB>,{ԩS\puq;wNGLL ͛7d2#gy(z={iӦ̘1D=zaMAAArQ m۶ٳ{Hff߿?w&==DTTaaaPfM̙C߾}x"ǎһG̘1{-[Ķmۨ_>/ڵ̙3h- bΜ9L6'Խ˴iӈĉTTTСCN''Nd<J͚59~8&55D\.Э[7bbbxwXr%tԉf͚ѩS'v_W1cvFL8իWOLL 111YGRZ\ IDAT~֬YUȎ?ʕ+ٷo%%%DFFKƍy8q"'""דNXlwu!!!ڰ 2Yp::u t:VW^y/^\e K;iu:,YB޽J˗1 X,nv-Νwƍ}t:۷/{/>yyyL&4h@׮]9***x衇h޼9~M+]ped2`кb{a֬YS-2dYYY<̙3E_SVV믿5kd֬Y 0i]ھFӑG5;8z(={ʂ W^iӦçǍʠd;f{;rWAA[lтvj׮?qZ~~=z4)++C׳qFV\ɼy` 8/f qvg}Fii)gϞrYΛ7Nǜ9s߿?W楗^^#>>o׏˗k^n6ƌCHHZ"##:uЩS'oߎlbwߍ?ݛgyjժi Opqy|zz:'N`ԩL43gPXXHxx8?>8ڷoσ> +,,W_ɠB!= n7ٳgrtܹ~Jrr2~~~dddpaj׮nvӭ[76o @jj*'??Jbb;r1h w` &&`VVy 00X( 7gϞ4k֌hmg5Сtޝ~A۷< ZL&֒ئMRSS2PmVM&wF#:tVug0XbZuګcǎ?ٳ;wСCL:2B~&99EQήrVtwNqq1X,TUeϞ=~턆rIjԨA9< 6u,YjժѸqc֬Yرcڵ+z(//'''vJdd6餷FeTVM}ZgӦM|7$$$\7 ؍׷o_6m /s|Zhf3=ƍwyZYZ~=> }!00p`ٳgY|Vr\׏QFzjmۆlFQRSS '99FѺuk裏`=}[:t(ӦMZa #Gf͚Ԯ] h=E{7oN֭iҤ >|pLLL6wNii6޼nݺހS߾}yW αdZlIٻw/K.eռ$%%ѢE -[ƞ={۷/ʘ1c`Z/-Zh!N>ۭ}( EEEڸ:uDݺu֭lݺH Dtt47nݺa0x=yg2dV..\@aa!;w֞~2$BBBh߾6ƛgW|mذ>};p\ddd?MVh۶-fv;M4`0U)**ԩSt @8taaa_]RfMvJڵhРN^zѤIf͚ePVVF͵!I!!!>ѼAIۭ]+˵A0L8vE͚5iժIIInݚȑ#]6jբAZv4iD;7n)((ܹst DHKKjҫW/ZhAZرc%P BAj= TUr]ׅ822 2}tRRRtK.{G~~>> [l!::W_}cDzn:V+~-JS\ s8 >^z"RRRϱZlݺ!CгgO`/"|رd233IHH`ƍ8pKj:ug}Ʊcǘ6m(·~wAZZOeݙ1cرc',,ŋsERRR裏n 33M`XxFnƌ??޽?QFȗ_~?O>|8jҞp!MFVV:-Z[M6 >NǑ#GXlN?5k{p8oXv-u]L0EZZ~gܸq|op88N-Op:Z[7o~iڴ)}p0oЮyNZnd"##/9<.yyylذzbXزe ~!̟?Ae222X|KUZZʲe˘0a~)cժUfVXAڵ?Aii)owfryF#VbԩӇ_~cDzm6 ꫯرc\*޲>|pmFvv6V#̙31Lud2ѪU+ ^'==%KPQQU]6q\|Yɲe?~VՕririٴ***|z0Z˺w2}Njh6ʆl6EAף())7 $$Gy`q~ڵc̘1,X@kIBVEX.\SO=ϵVUrn(="ЛGa߫ł(ZEh4jyz[ͽV޼6 mvc20ZPnk:m[nvqEQ`*l6*AoeKUUR=6gזAIEEqpoŋ}WTTrx>{+Ǯ{oi|Cޱlx<4+// |L&-Xr%}˖-9NoEÛgˎ7fXx |x=+ky\[FTLV./( t:=rZxy*i\8s  Yd Ǐg޼yp8|Z+:轞x]f =y=kڼiժ3gd\w]u\X,-v}t^wTumTh;UVv{{MQk޹V;n?_[=NUU}Λ\+zz(z+_B]+006رc{']ԫV-(Mg7 7T ~Uo7?EQnX 񎓾~yIzgw}7=̘1gUv߽*\@_.w MT޷ʠ(U>Qx_nݺ*ލFlo7htqF>ß}:4LUNwNZ:oN7Z`0TyN][*N9z ??;?SkYU,Yv-۶mY՟ʯ͎f]n&7J*ҕ*n/UmOεFz+B?_g˲^''' l|ZjQRR¥K !B!gr%nIW(¹s稨 **3ŋk1B!B!~է!L&bbbS<>LBB~/jsϱdrssV^nF:uVs+B!B;~5d`ܹ9rUU)..nc6 EQv6\઴0mr/"m;n[{aii)OUU|2N zϚnSXX\v@PPK.U+/_yp^Edd$.Bvɓ믵m۶eԪU,-[w}á=#9N +㤽,ix<h !B!}ziӆ:oЫW/peTUiӦ|'S^=&O̙31 WXAnn.=zw}>Jݛ7x9sk.Ǝ}m_m6fϞԩSo8ֵI&sNlBϞ= 1۶mO>\.oj2h ߿?<?9fذal߾;vjAsN~x V+:t`ժUX,<|>B!B!_FSV-ׯOjj*.]Ν;5k.\`لP\\Lbb"0p@NI&kƓO>IZZmۖ 6Ğ={VaaaU(?C'{ia7mڔӧ[o`JKK<>Y @H""[mݭ۪^VZj uK ,3ds~@3! ẏ̙3>% ##c+سgO-7KuCX|9Æ c~8NfϞyw9s&ӧOK.x<zͻ~3Gjj*W,YrDs|4)))asw2rH~?G믧)S`YV9++AopBxR?1yd&OL~~>k׮e֭\pdggF;v,׿ܹ3N?K?al߾˲0p8dddŸ{yGHMMmu 584)̫mDZpI&0{lzAII zl۶?YaȷD,D"gƍٲe H]ظq#>^z)|SśG"<. Cmmm|ŤaKKX,F}}=4  ͷZC\.i?i5k+WS__ϦM0`&MO?T)(,h_={r駟'Ly f ^cԨQL4@ @YY(,h_]veƌ<쳼у^x?j.]|i\2((('xBxgYbEX9oK.gyECCC9ꫯҩS'yyFE$9},(('|x ފi.55%K0k, 0a._|ҿ.\H]]ph3f0mڴxFY``'xsrg`6vm,Z_׼۔anɓYtQ[]7x6q<|iqqhנAxmq"AϞ=0 *++ٿ?mvrQUUa߾}{&55;vŰm~J)**"55Lvލmߟԩ}ppuQVVƃ>xԱ rrr,vލ{x<كw۷p8LNN.TTT`&z" RUUu8>I'DVV?a˲ػwoRlz ޽{rѷo_ ڵT| IDAT+>Smуݻm6|xpu@%,`o^*vSNeڴi\.^}U/^'""""""mݩmm6tᠨ׫ȷ7.,8x`kєPRRo$!zUDDDDDDk7FS^^~ E]]-O>_x[G0?)sO|/Cyy'ضMmm-k!##K.on_׭Nx+0 !Cw^sANJ~zӇp8:t(W]uh}vz-׈|uX˂4LӤ`0ȫʎ;,(,,$++ٳgJVVgqYYYTVV2sLRSSFTVVf:묤)@QQoիNo~w^.rN?tL]bo(--!C[2 >۶m{ 233޽;w捻ocYn &p 7PVVFQQXݻwn: [laTWWu|uX˂+V0yd|A6oݻy`ɒ%D"Kuu5xb.R,ѣGs饗ҹsgv}Ǎ7xD{={0}tƏϪU}HKK#%%.-JVVO<w}7e%=Z웦I("---4 9x4h>͈#6lX{tԉ?a֯_Ϝ9sm>vs7Ѐmyͥ4袋xٴi*^{-<,YknVB/33b1 C=D=X`h4޺ 1,0 "n/~ <덷o>h$,fM6;;;t^Tm W[[K]]`r^u/^Lzz:~!:/_ٺu+`޽{ٲe +WWbsrrD"|o>6oLMM {>Ȇ f۶mAHOO+V9}ƍٵkeo>V^M0;vP^^N$M6}vˉbڵ{͛7SUUm~ Hb,Z ܹ} XlZeY~ ϰmɓYn{aժUXE}}=;wdضcƍTUU߻a6nxԮ""""""rb/>n}n'!,H  A#aq\ zG|8۶T04iG&2f|M^{oTԩgfժU \@^^a0qD|A6lؠ""""""_ ...^DXƒluڶM8&''?7y0dGbȲ,('th/ DDDDDDE- DDDDDDDξ- "H|:AlNmamg̘}عs'-y"""""""_v)?##j^Fϝwᅬ`ĉ <xb=z`ذaB!Gqq1~a|Z3h *++YbEDDDDDD.a@8f׮]kvi\r%/[o Ä 뮻>|8wuݺu+?)v??я4M#/p2"YYYAEE555~tBJJ ̘1ӧP,K߰-,0 ˲=z4֭Fܹ3N@ @FFFoll'x4q8ADDDDDDD&aAff&\r 7tns璕?u]mߟz 4iA@JJ /^{-{Ʋ,<ߓgs . ~hu:7ԭ%)))Ӈ,***={6~)Nb,bԨQ8pxZ< ӧEEEٳb#G$55׳uVuEo$bkzM4_UUBm}$#!(p$,kРAc^@g6mlhm۟FDDDDDD&--ozz:`u@%,MA,!Y9hp2%%׋iX,FCCPHRM0 viZ;Pbf;쇸zOpӤ+2Mhۛw-XcOKΌLdV=6L_pЩS'\.U9an7.x4M:uۭ 9q]cc#@322xuXUWcd64|;Р}M~ǃ4YE}}=~?>u  ||> rrrr[>|8˗/>`РAydee B466&I`0K 466*l:˗ogm`0H]]Xm~"ȡX χmD"~? *Ң#Gr5PZZ?nJuuu7㿵9mzhwK`ӧSYYI>}͍?F|x99V6`FޭeytLc uCڨMb)_{&?v68P ~8ݺb6{o }؁u!r?vlP˂cY`A|z*4wˏ~#Xp!K,geڵ;d„ ̜9F-Zļyx饗4͕|n'Ofq]0رc7|3ƍcРAx^2228餓xx9餓0`7o/ P~իW3fxGٵkv|.={+WzͬY8p UUU̝;bΝ3<Å^ȵ^w9ɓ|ocӦMGx^.]ڵk ضgܸq;7?7L.]oz-jjjK୷_WRſW^ <7x)Sp駳i&RRRk9s Bm4#^|i`W8P'wpsPNbrLI4wnOZS+,0 ɴi╴#Fȑ#3f ]v%++bիpR&Mɓ)++P;U,65UȢ(ap~>,bʔ)撝ԩSIIIo߾I4eժU̙37ңGr\'䡇O>OWSLa߾}ߟ III~ѳgOzҥK8p wyҷo_RRR%͛X`={n`֬YAΝKVV={tҿ>c0Æ cذaӵkWv)¸q̤[np\krѭ[7Ǝ磡'2du@m2l@*1{+kSc6 w|,@t'N=S~m OߋĠ{ٿ/X(+VzuٴHU5%Av\w+@SŮ j@ЁJKKyw6m8p`0H}}=seΝAII \z饌=ŋG4p:UgYUUUٓCl2 `Ȑ!tܙm۶1~x raFeY|ᇼO:5 H$)_(0xXl穧SO%s-3ϰn: ࣏>/fҤI\.lٳgK$/"(,,dܹ<L4ݻ3g֮]{|I>C^(,,Q__/1 # Vtrb;ٳgs7ry1m4nn6PH$BFFIƈ4WrwaaYݡT^I˥c@0daJs U?_!r8Rg`#=` mMcˁqx\7;STa6o<&N'LEE[n%1i$|>]tO?r.֮]˹+D"|ᇪq[jw7t#F 1qDJJJXv-ƍ#;;oL `ҥqiuVLd޽8p@;T'믿LO^^p۷ %%_}vPVVƮ]7n&L`ǎ8nݪdܸq\tEFVV}z`6'OD"lݺ/.]0gΜx~ҤIҹsgr~;!33e˖y8p '|2SNeӦMٳt]wիYv-v 0iSԆ?󧫺1eH k==gf0<ϣ$ʑB'"t Z2ǎq>bXN7v4JgP6mrRv:^7LN,̘˛BT~O$ x4%z`0H4{Ν;sM71j(RRRme˖vYf O?JT9n= IDAT`L8qƱ~z|xkP(Ĉ#2d_㏙={6EEE'?aʔ)t=WbY<ӇiӦO?[oʕ+ٱcӧO'QVVm8|M:uDQQ>_yqkF9BCC)S0a-[?Nqq1K,NcǼXnX )++G%--n1cƐ 80vXOYYٓUVM~6lr iiiՑƲ,RSS&q1Y.N쪊r)iWD?1 Y6Ѩ :DN L"{mHz`:>}`-,[MѰ=AF߾|6^~+"O'f"p>x6q<|iqqEkРAc^M%Ivvp "HTMbN۶S05kz^$7D"VG555I>oXX,otfذa\zDxk\.W|@eh4nw];ci2ִek:6ZSYt8p2)Hҥ n[SbX<p:GMLja;ܴX,t, _״mbYD"qSoS@ @Cÿaw I[r%Q~e1!dq豘 .]Jl\}hpr x* d !  R)q G!t7x\`Y؁X6Fu3ߙqk.X. /8[Rc z6Xcolw Is'uJTs[I, r,l^`iSR/k*?-;2q-u͗q6]K;qBW㞦ۄuPwp2 S+ ]Vk8]R?;iS}}=uuu""""rBbG5kGj벟MR>)"FD"kgH;Ǩ>^=4EGku݀|y<#utNI#uDU%y0zj?_%^jWoJ#E"KJ惔5/"'RKEIÃE&{s7%4m5ŖaeMc;m۶illUqX,i& *a,R\#*k"'J$!'Wn$ZQc54 *EPitq{|Ѱ3`0H0 X,O( c"'\T 444\ eYV|>XLrBHdi" A\Ń2UOŪ)nkMNDڵHsZ,rXG+w_@y5eYAtj Boqb`Jmxl>H{P(Z۶'\ Zz(PSSTrBh4J(j5+ {33pдJ^";.)L ͆۠2,ig l4l>4m2p}M3$޶X  kv1p͓D'WT.E!ThllԎuԺ@ڝafAAPdlV/ bk``0XR=@"1$0%Mo`&***uVt:F"]sĩTWL,NH׷4L iÖ6x( OOOH1 @]]P("}~: 9 K3֬eggz#:4tLPD"(**K[]Z Z ZZZ Lٵ^wd,sb1 f(""""""lr,둢eAKa4a&n )}95==˲A#nIDDDDDDeNzinlhhhPn]!uABB7 b8мA6:uo U_ȗ>p8p8H\b@=;1,Y@8fzB/&q́ 16 bB-OԺvƉ#M<|Hx'S/8|y+ĠJVʓJ78n-캠@DDDDDD‚ph3 TϷm- '>f4Mii|Zwjv UVpl͍>Bk4oI@DDDDDD}ÂZ֚neqB Kla`vzY@(09V*zWZ$̓&V[X|9!B`sM{~k- ֵՒyh`C """""""mkk8l%U`4ۈzyk3ƺ7ZxZyLDDDDDDD>_@Reh@[XwF-$8Z qS)_?\DDDDDDD>XpFhzuA9!KH`|Xkk5,8PשUȗ>4Ugc """""""r|V)HIIENDB`lxi-tools-2.1/images/lxi-gui-script-in-action.png000066400000000000000000005657701420007711700220430ustar00rootroot00000000000000PNG  IHDR+ğ}iCCPicc(}=HPO["A;P,8jP! :4$).kŪ "%ޗZx>λ}^f1eq!]!> aLb>'Ix=uSxwߟգLYs'tAG.q.8a#' 6ۘ x83.+8*kޓ0VN+dTQBbkHy?Er*c?pBqŶ?.Шm7N3p:0IzEm⺥{0KHZ|x?o@;9N4*y#^xwWir cHRMz&u0`:pQ<bKGD pHYs  ~tIME4I4ǩIDATxwXW{eUR kDcbISI4i&1Ml(D"JuRvpk/vf=s̰gDDS_ƗE\~0j=5C%N$p[EDDDDDDDDDDT12Wvӆ&̒"#"""""""""/ 0$1]rU'&"""""""""*3+hb[!%9Dz i=Wev4{ZfIӗ6&DDDDDDDDDDT12W|YhZorĴmb[h""""""""""x^ֲb_rChRZgЙѬ7MDDDDDDDDDd+o&j-B"- DDDDDDDDDD$fE\HҒ2^,*'tyҖ/U }3J<64)mhBZk""""""""""zBg<6(9]<9\^"%J4 iDDDDDDDDDDVy ҶhrZIJP7E$"""""""""䰈2^WxP֗.-,MW!=*sײj^i2:/\^(LFyӳYʃRfM9KN鐔ѹ~z1MDDDDDDDDDT݊rEtt'ێbEel*mtY.!$)-.e'&"""""""""zJKD.GY5Ģ:i}3^kJ%(;I]^k"""""""""":O'5(OF?=˹h]iEOkK1tbre}5$)mR5׉QӼI"V F]Da~dEJ+QW<Ӣ2֕UoOʅP6jkk;I*ڊbΖ&"""""""""jZP(rͬn:@$ k1$JN%J%%fM1]ZY_]r͎.>KZ ϯ333L\R DDDDDDDDDDTb1$ R) >uIyxRC'3K+RZjZ:1BR_/~j]QBxrڲm۶;88 E^^ǞXZZ .] œEϋ'פ.&j.JO'LJwg++dg""""""""""zLP@.Ʀ[`\\&K??]?ZXDti;<]Cm۶]RVT """""""""EVC.ѣG'P~^E979ԫ(\VOח.%]ϯ;LJlJMo$''ǢYœК2,O7X.JJ%BTڰ(=AdHC]i2"~p;ۍ"""""*!j*R+DDDFT* P^ gPƈE IX@i:J1]<)]\Yf=^*Su=H}q^;{k,#Į <]"""""LLL`oosss7HF%!JaffBFSFS a)))1xr79鄵v Q9C]M,F&sD aqADDDDDrD"ADDdt2 vvvHQsyҔ= *eNHR?\^qqQLJWȾ!MFDDDDDLJwI$XXXDDDF%!J|ӓa㧟(=14QOxISSSjK=wDc;""""]g瘈j;R SSS[&~/4_.m X,juɆ9[8vDDDDD5gKQMebb333B"huVT*P( ɠR*Z qae˽?i˛AtvVcDDDDDDDDDDTLLL`iiYzn+JaeeU:A 4v3%{z ꝪMDDDDDDDDDDט#;;}YߧsÚ2^)mfG߱!""""""""""XZZ.Bin~riIb="!;%""""'f̘)Sh7oNAAAhѢEܹ3n*-C@,ˈȑ#+Ԇ%b1rsskLwժUXj~mZFzz:°j*DDD}B}oZ1c@& zX,F^^^%""2J(6ch޸U1c(e;>~~.P#,N'k1<eȐ! )K%K<-00k׮СC&"z999̙3x*5 O`kk[n'|#++ ׯ_ZlGcjjԩrssq=b4n 4iٳѪU+=gshӦvYfe u._t gϞ-3^ȹm{j }AjjDŽ УGxxx@.#22So߾:uY[nJBǎѣGb>\$s}XͲ*ѣrrrp-ԩS~~~zdR|}h޼9ƍR"""W^WV>*ܼ577G^^^U̚t֐tښ%)oP Rju%svvA3+\vMDD*] ADeݻ0aRb?_}Ut GŋX 3336,Y8XXXGӦM1p@l۶L,[Ժq111~:{yycǎر6f̘1ڵk =7d\:uҥKudaa֭[u֘6mT*ѴiS3W׬Yxb߾}Sׯw !=i$A8;;G̙3BVc̙&""#=q/^L-ׯ_m $^9Cib/莪 TP>ǻ\{bm>f05|s(yjښ`j7[o'k1sT{=<7B>r9)5ѩJL3fEFpN+gnba fKS>nQ`cH6^1Pi\Yx033&3όJxW |V/ W~~>4mg_:'ڏD" 8 ,6YBMgΜݻoƊ+WbӦM(((ap}밷ǜ9sбcGHR={_vvcyۋ+_033CݡRa[0x`Dff&߿ٳgk/FQPP 6`:ӣG8::Ν;Xr%t\>|=vrJHR>}k֬۷!JѾ}{̘1h4O+TNAP 11vvvxv}eQYMQQQ۶mt邼111h޼9K{KaÆ:UmT&y.o~@f÷;,On'߽g \-ac.ƜͩP @C yaj7[d䫱ғ?Ǵ\D" _:}q7Q3dhf'\lM!Ed-0q!?6IDDS4cݻwĮ]p!?}6AJ8w8ސqqΤ޽{QPP˗ jGȹ ]vEDDN>M"##C}ܸqGdd$b1VZ `޽A`ccYf^d񈉉Add$ڶmٳg(((~lڴ VVV077\.^Ǯ Ddd$Zjs"44aaaX|9:wׯ#** ݺuïQFa׮][. 1xXp!R)6n܈-Bhh(v܉ӧOk?5`h 1c ;;Ճ;m}ʞWn:G7o=шB֭BVʕ+HMMEFW_aРAP*ڵ+nݺ0kӦMCFF6o\{3I^z/uҥK,ԫWk׮ʼn'pС3,X: AF`ذaP(wĉWSNx...غu+oHDDDR~>_ |h4hРVj;2֋,Z59sڡcYcl;k(W2Bg_s4q3Ŏ+X/v3|an*BJ mӿk&;#Nb@_ p@ w):#'kgWpHRaIP5[DDdTjt^^z-1~x8qK.EBB<==@'i% 6DVb!ڤ믿7xO?a8z(_m 97ڵ+\S|ڙݻwGӦMm6|?]t9:tPxV1{lh۶- -[ !!D0zh(J̛7&L@۶m!ѹsg\pӧOF30uTcٲe>|61m۷G Xԛc޼yعs'˗ ɓu+Wk׮:G*etRRFZYfaغu+.] H-[ 4۷ѧO>7oףs:駯۷/k׮4yjGѣG.tq~~>,XiӦ#F#p9|HNN:t7nw)d>}eÌ3h0h ̞=Æ g}۶mci""2PcZĢ4P{ァwEOZ*+o)g@(n}Э[7t R|6l8|Iiқ Em9sg|"""*T*!ɴrs.r9F12S]K _ru;]x9JCR ;gݟs<""B,_Ǎ7CA133GҥKt6n܈-[M6D>4 FNBff&bccq mڠKY"H{sYֹr˧eee(ڦMt^´4 >zBnзo_X/nݺUELůYT e27(1EєH/z!vZL4 ŕ>G^7ϑK[עE }6,XD޽[dgg#-- Zѣ_<5q5\v 7~'h"4TQDDVjLr:::bٲe_󞞞/1oSePtoe8~6UlZ/c2gM4gJeΌ+0m\4Ҡh;v`ԨQXt)͛711IB}嗈3EӦM\x"ڵk AxxNMLL gϞXn_RQЪU+|P(mחP8x Z9uSEeZ=+WhBi4|'ؼy3&Lm翠jLn߾}(?F}_ԩ6oެgCy`ffL6m< KyQT*,JgiPxOOO|>}zmeb\5bҔu *}g# c_G59'ְ1M}}WiJ4wחq=NzR,ܕĬG迧j@LL \]] sssCbb"ׯׯG)-Z`ݺuHKKCtt4LMMѬY3Щ" ͚5Î;,4nG18_ս{wx{{#::3f@nݠh%|||н{wAm 97NBll,Zhkڵk _jaaa8s :wkȑ#FVVki۶--Z'N ??Æ Z֛ Kxܽ{?>} 336lPn׮-ZӧOcF9E BЖ⥗^Bvv67 :w<J 6?z /Ƙ1c7|UUMbʕ@\\LLLШQ#t… x!5k+Whܸ1-[fywrrªUΝ;CRaHbܹx{Ԅ Ĵ/ݻ hgGϛ7Vymb&ºHV>NglmX1 8K WW|l 0n>RbL* fnHg/V[8۳ _״lAh5j<==ѯ_?ͬ:t???5jk˒5k )) 5B p],^֭eee!88X[/~~~֮| իRGرcP*pwwNJ+E[ȹQ(x7paԫWF)mwkkkkhذm/RģG0`#33.jӧOԩS8q"233WQF(:$$QQQo]j9>H$ٳG`:u*  |teQE:r6o DCƍ!u̚5K邃W^j'-- RRR#** ˗/֭[~oΟ?N DS;\"((37l؀g]~aƌ:%;0}tׯRmWYœբSϋ&J?/j׷o߳ELG G%) kv^{c>Uw!<<\/"R5¼yЧOcօ J̆ǿk׮A$!00Cn/"ѡCcUP`` ~HR8qk׮ŭ[ JѡCL6 Gpp0 FI0i$_ׯ ~DFF㚢iM+ق㝝qС Tž?W{h??GuEϟRT1V 2D/III?DDTI?#^}Ugjгaӧč䂂]NIIٮhp!cw*ڵk3g.]ݻZ={6ҤU,-J: O@=<1g2cliΘ6̘&"""ѣ<==P(p]8p۷o1u cΘ655ᅬN:-T*qY,[F\G1MDDdss *MvvبČ⳦Θ&""""y߳t P(駟DDDT aeeUvrssk܍&"""""jVސtAVWxtEfJW&j( XZZ ;]PP}:|||f=bSyk/2ST fDZB8Nf4u)afaK˽Ƭ@1+z7QA$B޳e l\_"' u /qNcj&14T 3vWJ&#xIwDBbj#[hRoclm銐gbloȖ9x-G`HFB%1Bx5?޵">:6.gBDDDDDDDDTtPPa<9Hf&""""""""'jebcǎ–-[R zm3ub_"&1)<]-ѭsBTq;5 K@bc~*b#N 1 "@nV3g񽎈.1l߾VFD>]NX$61[6P)e UuBh4eHYIXE{v{N:K4Qy:"""""""z~Ԫt׮]ѤIlݺj /y镎JrY.$eO`fiM+zc}he8;rMLKݖr.:[ #%ʠǮR{bcahkSEOT눈ClTݻE8~8LMM gggX[[ks#V.:Z߀<MAʣ8y6z͟YҒǯ,!15Hlvԯhf ڿ{hzFɟ r#kSlѢhHmSFDDDDDDDDT{&E--=L<~^.((lRr )))r:,--K Ñ#Gϊ}`jf[5 NerGm|q+ ,#mCKK;ϖ=v5z7QQ$B h2,m]q_OIOtm)Ғ"p kSFDDDDDDDDdTNNNzc\\\p Tž?W{h=QlyILQ!c'kM)""""""""""&"""""""""j4U+&Z11MDDDDDDDDDDՊi4n5o-O]Wct*is01؇fc*ê; 矩1EDDDDDDD<5VZ!883f30vXxyy[5G@R荝y$;NtLuq/7p1{N W*)=;+NusU{U2协!|y\<wZy'1vJիW h޼9F7"%%3:@$ H94#/V*:i w Ǹo[+JgV:o k^tj;."""""""Z~]7MÃixV÷`f%_w4rOz@.{HKcqpn:nMÛf!!V#r3p*Y"lF#2RNEcHG[6f#ǒ+! 2t4ѭ '3^Z!1ݠ󥇣[xa)tDz=\9͐ h kSa=w Р@ yTJl]aeS3kLN *nh]ȵ!|tGqhժD"qUEĕke_禡ژs=3?r~M qpiS3+y_"5>)`aU;kqkW?.C<}{ Dc\ZCQ,oFܽX8cðwnҶ#$Fȱrc艱!3% ~cA^vN[P]<V)[g]Zeϖ 1qp 7l\ㅥW}e""""""""j͌iS&NHܹi8M$> xp7QjlPSÛf!?p{Ф H-Tj m{HytWj{E3ZKTMZĦoT*ƭ~kd܇,/'w=N?D^oa ?Zj{ g2-SSK}"$ ]99vCWy{8e. #9{@~nZPuX5ԄpT'<u5@2%WwYe""""""""jUb:##'>}`HOOF3ub_ƖH> I\=["-6A.HM a֕ݘg@G_Bz=:sKGh4jUJBۇ1p/8w""t' ل[!=CTNB]HWro&^ۅw}wqq(3>tʟh?֨Ӈ Jqnu\?F9D# 9_eH-EzS%b3x kųe]<qtډ ۣSFJEcz\_|#""""""V%U*RSS>ĉѶm[:tHpB6"Arv $u-q:Bjf]nV_La)ۺ<&*v_Ƣw;4C>F^]tbנ#7?tT PxIɧnPg3Pf)3 }joylmW6.:%([3$ƅ 1+{5 wLͬ`SjV\.9vvuK̘=Z@$Ĕu\_|#""""""V%&`jjjk Q^阚#!h-|** iIwlK_G#Rs4 >U#ZA|TB(V³QWX׃[h{6?P~[&:ck?.8`Y/$(Lgn٫E]c;KGV'ږG@5(os3r-Fægq>1BݐD_8;PrѮ:z7p:]ܴRUG5V)Ѩ\9O{t0)?NDzBQÿDqk0l ۍGQ2|=jŌiF\;* ػw/ݻW<\ -M$#h!OL(؅NUt3-`[>^wߐde4ܾL6 ]악3M^ШYw.y,G(Kǝ+q~6Ĕw솞/Wօ竔в,8݆?},1aסk^!é]CwѺLܿ WtfGxDZbbb#V_z"fŞE--=L<~^.((lRRW! 0Yq2iK2*C!Kʂ˸rG!"""""""qrr₳g,UCSQbEϙffmlcw#NL׊RTLf])n؇M5Lv4h,m]pfϧ֗&"""""""Tm~^]͸}qADDDDDDDDDlQ4U+&ZӍ7ƠA]v;DDDDDDDDDDJ1mkkΝ;#%%]!"""""""""jUbZ,cРA8u"""""""""ZV%{+DDDDDDDDDDVILׯ_M4Ǎ"""""""""ZV!*V3ub_"&(c0"""""""҈{΢[W,*\0yUyWIIIz;P7! /J]'NWXnenK'rvC(ya cØRbfrrr₳g,UCSQbEkGbZ"Vg]߾}RpQddd@VWu"""""""""狱ӵRDZZZu'"""""""""gjZ1c4۷o7vj%Θ&"""""""""j4U+&Z11MDDDDDDDDDDՊi""""""""""VLLQ%((۷Y_~]#"""""""""UjMbҰo>Z6vjZV*HNN6v7jZvttĴiӠVӧO#55""""""""""Ujp!8r,--1vXXYYkDDDDDDDDDDJIL߿wAbb""##sN]#"""""""""UjMbiʂBDDDDDDDDDTĴ9lmmc*DTT233aiimBVƍQRk"]v9d2q!deekDDDDDDDDDDJILݻ] """"""""""DDDDDDDDDDdLLQbbDDDDDDDDDDT&"""""""""j%1vc+s\;+mg.=wjZknb^H|p݁H$F1Ѩp[:8,cwj^m\ RJLspss$%%a׮]Z Ǯ@%?-`jgf4vW K0kE2@#7#Q#JP>ٽ5Ϭ5i Sp+dsS7)QP)e37{e::Yi3|GKmz_)ס':YWVwjPf\Cէ?w(O'Vi-<|hWkJyԩSGF~~>݋w1vʕ8a\xlZ w/F=?̭ݭ,/7@VZppENf<B ]&&hyr=|;c 7:WĽRTN]?X~%[Dcػn m"|0o86x7냾/~!iy/$ŅbMwnhP;Be%]pfϧh8 _Mȥ8 g|M+z7 kgv>ju(1@~N _9_BbRUѳPkfLwػwvݣGݭrr$? +ucڋh_?`"1øנ#: #)[ub>q*x÷ .YI YI J'~ĥ#3gvvZ'Njn rSTTl&b^v2RDʣxqS@npnӗDk5fzY8۸qAT)zF@)qAFJ4B~۞\b ڏF•?¿ S&?mR} GO%AV#! :Aoqvyt(1 0d Z=k'ۈ9Hw ~_QF}.*EG.Aru]v]҃PF;ѴX\>-{ᗷ}w14Z5q1}I4|!-1Ъ4;_lfТ8ǂJR -. 5!vue"YCF-quGaLm9f !:} VHK|!KHP{@``m_ywxM'F+[t~} 5AZb[7 g!Q&&RtZ3ҧ~TQUO@ ?X꟏qwU/"""""jMb:t(ի\~aaao*y'a"n^݆ l;pf(Kw>0gd?~^$6Ad&E8-DE_ґoI&=qd\8.n'Cdn%t9nG!ptEJ)Cɟub[&">&,?+g;(#BƹFqd< A#0`jdD#!mѬ80ɑUymD>:nMиH_ڢzpvo!.틛w;;7F$&D"h׹oГhj%b.ͻATB[x%f(K{ ]g. \cEʻVUsZ=uػUG>tb,H-0=P N{g;70xG;M[o 35]}[G/KSFU}i3"n.7l1WέhW"1-aaa֭[ҥK8<<<<ЫW/[G;cԮPc˿&o@!,r8 $<:nMe"ܿ&)Lᚕ'=keAI#r̰\9wzDbYJoGjG^G學 rh91WOȰO:5U}1BeFkwO"#9nIܗPSsCGQ C@>Uzmh4=3Zw^"1]DNP 7|N¯ B,6Esrw4#%F ?afad4i= ,G /; nMS"NѪt%F 7+pdl o|vCsu;r3*z_UA9-|D>.!>Uy/}:2S5jjѵ1zo fiHHHHŋɨ_> JL1]-.e,b#DvCEuO'ânub:)>sK6w+bY#! j*e,C"h6.=9RH$>ΰ.CЅ:ۊ'Ӌ߿T&eUAQ#DU#Sܼκp E LnV"RckO anL%J%/QB¿/kfF ZJݮ|\/ZϯyIhzTK4xv2u>–ohkQP=$K ;=JE>&R1^DĈC=)M)8v{Nhv,:|~?S5Vk*9_9ec~*b#N 1 "xVgdF[^8ea k'$?ݞyiPB<pw:e:KIm0tʟ]"""""}jEbZRA.#-MLxzVNVFD>]NX!ʫ1]Dlb mRPAP|i5̭qr!#>4j%N٨M'ٗDg c4GEXENƓQv}UJÎKyQ<{,/dH~AA^&m{ڏj;P]`oo999SĻGi3}T>=6Ѽm"ow4r2 7vNWM!?_{sdDr!1-94/; 9j],`ԢJªt@R^"9,ƹ1 ?ٽ2'dYN҉uURJVgqmSO')n7`6rpOPn: tKhY,KPϧCYJ#56.AAfj,6Uy:@͂ҒgT]טPBΗs*J%Gc8 l-PAG$]l˩G_,+B~NNj3s[XZ;t\BTϝT]Nއgk^3 *l&1}uUVppp@[mKpvo(^7`(:OƾuS&o/,{s32դD"1&:Ǘ ea#K#wp%b.»Y_xE'zhy2GFpvoVݧ!hhUxkߤWNuШ0oʉUKkgHL ~}Ѯ8lY'߉f< ""B{.] ++ ǏGxxV&{w;.'3.]o=Iq x5A{B.?P)~e;PÏ\sKąNc[{`jf[jK] <mzC!Cʣ=a>sЦɌGøp` rt1d|N1z]W^z7ap;B77. - 2Sq`tG_Ծoae~F#G TJA1#mC/SX+=5!vw: êRF'~DV#uFǎG1b6 B|%]7٠~R3k yukpd\ICBsa|'Ů/"X-z!T[и.LLJ ґo1v-,? ,3Ďpܺ* PטZg/| =.}%$FYA$H=k^FzғB~(`t^ fHOs\qK!?/ KSFUh bSq^>]j6bρYԢb늖EŖ&J?/jt6)IŔg{4&S-] %Z5]Tgqrr₳g,UCSQbEkόiĶN}x4 B̝cP)hkdys̠LLE&:ZWtn)$:CDDDDDDDDKy2.!6Q4U+&Z՚Ξ=QQQصkGDDDDDDDDDTkԚ tR)FcwV5dVZA.ݻQRkkL֭[P* QR+ppp@XXBDDDDDDDDDTt`` &Z11MDDDDDDDDDDՊi""""""""""VLLQDD0y9Ƕ3v5iqư@NNpecwLvuyǨ߬7f6JcZM<g~gԈv|0jNcwZ Bͱw^ }EAAn޼i`nqB887FDDDDDDDDDT)&1]n]"&&p-k521ݮlXX 7 0L7H$B޳e l\_"6mHi wиH&;g|jP 4k7m{φ3":\9=46,_Hl0%^cVט460>B ,PzG\:?bʢ9agK9+:Ǯ_ Γ4hn#>[&"1ckckz(@ܽk:׆}=h Clqw4zXXk?^k~ lй%""""""""5鸸8pww ߿o쮕A}P.`t0G4n9&FFJ4b.i<}n?Xq3xvs0?'8yǗm8e.E}_* 'H(Td=GdX9@JpmGդ'l#c܍{ #h__@]ﶥ&o:6.g2>Bcʓ{!X'1~Ǥ4sDlTs͛x1k,9GAttV*[G/dǕӲB6!#9!#1 Zv{C'.35ag@QݓHw;b:~y+Rc};iƿA dНrG"+50 A(^ۅ.Ssp_ $fpG "SsC$^BGQtW19@)GCɌGR5\8UZƹ?ݴnKl{""""""""j͌MCZZѫW/ **Jp;{Da;hn7/.):\<ue, an 8eBtP'N!>wv@fjtE .(Y`7H$ZW68y&[v}BlbێX@wWʣ[ɲ#ߠ~>NP(2HͅsEANMܬ$=};ýA'vA.LNkPrDb 4<':k"n__q """""""W+JybXhJ]_t%>J*$Fݬoe܇G:gHh"/; 9jܸܽksPW)%Q^;U9>u6X,)Nsd<o_Qո;,zgx6musUR䈽s }_5.ˀF,am_rY.$efA.l""""""""Q+j111hٲ%4h{{{3pJ0j.4gk"6ک_Ѵ Ѿ;pj]&yU/Ѣd3Oϝ;!gnв%KK ~vԬYBNU#.a"ӿGϡEd<8YAPYm}i\UG`Pn3ػEѨ[{.ptkDh}:- 1s#V.%Թ u]};Ǒa'ȸjM) ((z9rrr/kI_+wY#35~qa=,m]4h,m]#>)Z(yhMt0 yRD<۾Ca˿Ipn%;=v^]xSs vr|Ï\s :CUX%Axvţ sUd=Nz/iIسe(޻/ntøY!+B-H~fГ^sykLͬpt\\?F'h| nlq!"""""""gOspغeQ墇㯒ϋMJcQLR+[R# ÀΓ4fP*d"""""""玓={6@&ebe[.z^{fLOjf [G/37ϯgR94=7O>~}u!""""""" b)"""""""""Zإ<""""""""""]&"""""""""j4c8u\]]2ճheߪĶ+} }D:G㫀hݺ58ssscw PkӧNz &LEՠH8O7gڵ %}ֵ_8&i_}/#}D:mm6Xr%na 8;w׉ =8уOбNGYHCqC7${FLlOo ~h<.7}߬yX"a8z8xfǥo_EЧuˠn yan>>k׮ũSp)^ZL1/.^-[C,wh8ÓuC[HGwppGX)>S?4mXR >,{ʕ+$""""""jMbo߾ľ}~z`Ĉ7vרDϞ=} ), _KwS/MEБ K:͝6uCmH8| S.N AkBUٟfͰnS1d:7 [BI|CL? o_}mX^k|;l݈^{!4#:n9:.!vcPj8+CWf 6/]yܿ?ǜ9sPPP~ >>>ژ.]`ѢE[noWT!Iչ.=3x6~>Vf v> X7KاmWCl߾ƍY""""""Q+b>>>r ␑3g ;;͛7_|~ }?ÇW^)7qD Çd .ď?nƍx6F.Z#_@x4s}< :c@$4=u\-7.EKw=ԝ 9F$pyc  ZFet:$|vJoATTT/";- OWr|ŦSN~}|rabڸgGcY2I:)1Tk*]\H)P!\H5Qktpq$?¦M̍D6gZi8r_7nbNd)U~\B@";o[};-;7Om3`7c O8{,.]>R]>IN0.]իO?5jTTؼX̺^.tr酃 (kB|5U/GXfbb~Oe!]}*$Nι$"""""$E"T*zRip=;"44={ĬY믣gϞ:tܹsbȐ!x뭷*,ϰaZOXXwX@̬ӿ3fhcm|9vBߛQaٲN[֝h o יsaվA1uƿOF+pw<\̀SYPoz;@jSkׯ_/sR)H,(,,EAK,DdZ^}2_g+"R*xS7I9 68$^~E'T)tpVT'؛נ}uhsJ/C[yA)>S1v#d*ζʞwCtu;wl3zUm<ȜHsldi>7sLDEEDao 55 4ҘZ5}^^͋E7nP%cbn.Ό6Cnp"1 DkAѣG{. j'66r۶Ofb?~'Oݻqܼy@JJxBNNN۟^ c Ҙy7@ږ?u߼:tPegAp3LC QoB8uޓ{ ! ˫̼2ڬ­ҨSfrs/ 852O/⛈o&jc=bbxk}tŠ+H% IA\~UU>>dI˹W1p0u`k>ӦMCN0ydHTx 77(((uUSݮg^ǃסK/H>¤0DV})ZefYݵK{?hglʺN1xU>ƆRvgfΜ#GbԩxvB@vv6aϥKY,I._2d_Y5faaWWWXXTU-W sssaꫯZ?,,LS0&&&hٲ%nܸQ1Uy\B߃m oKoOد=>4yCdN$\>ٚQF!KDDDDDDWknnn@ݺuѰaClҒ屷Ǽy#F{زev{߾}1n8 FF{Oܸq͚5C  [[[;wɄ~ؽhA mp~umLa8zf> ; lU?./QgdΘ`ίNCygP߅m~q Rf}044n_F>P+p4(h @C zCSOhsυ\Keu+{\Beab'b}74Ԑ!Cp 2RT׵/bRj·6y޼y=z4-[ 4iM4ƍ^{ 5G} 2Գ@9 $-DSfb3'߃aaXr6y]km] 8Hp}*$puuũSQթ5}gϞ/bժU8rv{vv6&L7|;Cs3#GCXv-rrrgolqo`} b+kCŠ/1C삺.hľ3W.VyR7:?.S߄P!?&R֭6E}1<>_!63ǃF_9rCϞ=~}|'{.ZbH!s(5JL񙂆V DZcQ>)' Xc}:^s?;3}gb"-IlXl. ;_kR u80f]b~s/9g =.96Rkk@|||*˶m[|Q@xv8:K/hn{쁕 sŚ5 VXmgN>ŋcʔ)x7Yf|2b\J Ƣt}bauhεwpqL𚀍1,Lk8Mc qg^S!1:t(._O`""""""D̊= gQ+Z[.z<*y]PP٤$>K_|,--1{lcwѣGcԨQ0aBu?/>?U]{n̙3sIo Ξ=  WbMG2-==3ٱclmm䪽)wI$no>?Uw1)MDDDDDab1ZݠRDN*sm>cw Ĵ>Ccw'6vvabFdZZF2UNpHGt|𕱻C)-|Ox>nybjDb+ٳgo߾cx뭷 ///[훠LKT;ͯF)x޸9s`׮]HLL,:0G-Wh)S? ߴfF231G>•W?47Ěvkii>;p"3גKcD$ѮK~:kelVI{Ky 5!\sk>}D:ƣN!}BX\Dx\{Zr "##1yr,$&O$% qyddd퍾}͛شi0l0ߪ ľ3g/OOO۷opqqh=Oo}avUU-bRIgu޼&e}]o~nǺᣰ/ݎuþ}:qD|^{ahGݧryodzEg(Q>R\׼شx3fppaω>؟S 1n8U*O$pqCPӪU+!$$)))8rd2Zh!x?WwkOh~5e%✂'HXuC'x7o25I3N>JoϿp)_Wn7Ӿ^WhD{FLL *< w"<;[lwEW7 œsp $ KBH}70ٻDW_aK-qp9$ K得1,EdɈnpI$Kĭڡc^o8wpngƱcx{~Emo-h8 ˿;v6?!rP$ ^Bb#a^o#4,ɠz|A<2Ȏ@Xf:qɲd̺gFIi y 4;q  Go-c?܉G='`gv!-E{O/O?>qa+%&N!!!8|0,Y}…umܸomu/·; Xv5LV4iÉ1UyK؇|^شK=pa̺/ÿ,<+t|N%vZ""""""? >.j$$$͠vlD Q۬y7Du~FXߜ Uv6mz;f'reݩ+ p9V;TYv@ihv9?Jծ];\~}SXPq8d)E*@a9 M۟NۮF[ ֱmmulsK:kX;aF`jYXæbvl䋓|>r It Ώü&0`cʓ*OŞ=~K؇dYrC/]@O瞂_3kB ^k՘lG"~b _ٽ;:1b n 5wwF~ݶ}o'tٳ'f͚_={>9:tܹsbȐ!x뭷*/}x,vvp2sV ?(MYRf.X$"E/ǁW\po߾!"""""")$@u033C^^4i^za˃a% ba /,{widܣOss61|yM?> 0|,[l{?/ȟubnbo||!հq}u6V]{\9O>qۑP``Mt ŮG0g 1(F?mp3wCBA\]˥Ɲgp+" DɄK؇nǺn]oȵZH@]㇠˃"!7yR/oF[~C}DqIDAT[BClVI[n7n;}}AAN>|$%%l3ۥ7>1<-=ϣ7~o]5hsϘp:} B3B!S  "Q@8rH>',|m{MÈ3#J=&0XtYXSgLH>hg ʈxEY_qy]<(8ECx/\͸Z-}7Ernj뎝aծ^ 7Ex (S_w\SOB l(2DāUkW۪{Z;m{kZEDEA&aoH$%az<|z}9>Xw}?!:_H$d6= ^zP{{{dgkd{b]FPUMY] c֦T+qK-J'%Gm7RP*pQvA H " `srU inJLdVX] 7o~f ܻ6@RY1PV[uH.&.Xw)MC2?f5 aaa)=nt-1330$%ʚj=0c DK P/~]`~}ݛE]SS|駘7owoBvvvvvv022j<7*6Ѡk/1$8;5;`%풋CDDDDDD0i@T T HX T~+WгgOƍ>bbb: kC VO,)k*9&Ad-P,;Ϝ9c[6q'D_Ӿxe / }^v\!,/ 5ȭ (P|,*Up3s7]׶{ο/e%}I'q$*JJ|aXw$&}YXazaAc NZ(v+񅭡m"uve6;^ ,/Uwc4 o o6 ~oo oX/#K߼?~W㳤4>Z>tGHH~w >M1"(l.'{:ɧT*Pq^A}NO;`8N00ҿ=W{~ Hꫯ ®]R8q"Ν WWWf͂Rĭ[T1ׯ_'@7{3fѣ1cFu5~{Lnv1Xᶢ͹;::gϞmS âK,a``Uؾ}; 55ǰa qju3'!45ǡP {(:rP>~fǫT&#~ůo?bCds ~N-ĉxW1vX9rDchbG 7`khԲT, eU1 7p,X1ٽu`Mux-ŗ_{Ρ9v+@h |xClNܬ9yqdcWƮ&kikښLqziԖp015i+`"2ꫫM7S{LKn/aiߥ?Z|j}r_\_@VeLJ7?KhEK7 7@URR>{?'?߂UɷqZ_-}hwBxx8LLLO? }N8q/̟?/_~j6l[СCovLMMYYYv.:4S؁П^juqN_VV^k=,GAue*G!*{? FFˏH׺DaZ$h6p0x`<عs'd2DcFSqzk(Ⱦ;`*L*LUPQ#"`]1YM񌪭Qu7~nj{~cQU^;uDDDDDDDKe2n6fj<,[ ...eamࣸpc$\(Ⱥy!WBbを; ߎSR>HUŎliG|q>S cS¥DOq 0tJ\ 3["G<1MR;c[ƁO8>#!p8"~V=|\oRirHOfVe߄c8wbČ f$ H=?~K9$gM.YN0x십CvT NLeό8´8ua]0r]Ҭr9"&T63 `!F?>NZHXٺb[PW[3_VZh1'vѝ`s^ [H9A58k2S">0SN Z8i """"""p退899a׮]꽃;}ߐ'08u.$T S=F\3שc% u- ߫޾[G_@fJbCs@S:UPB(UWW܌V)! ^AziG!>hӒ(gyx| Ң,şҪ_0vG1)q4 E)jwtNۓ%_' A(ԃX9lՖF(+AEiݞ M^,KWkWWRcI|PTڤ?&-QQvP^|ê92/`[ ~epc2N琈Hݮ0///ݻEEEZ?.r'RoSKwZjd$FFiD=W 4^m Զ)J-?3UU%<E~P"@nz4jk``ݸj*K۴mYq.8Q+@P6y@ת$EJ%b#Ga!x|?;"ƅoV}azl=M]% MpZ'C; B77-4^9mnt51:LqWXdy뿣\?U[++VKy5 ݻ[rrUl$FkJ% a`h(/EiQ܃4z{]mu{PxoR(̿wpa~2l{GCP +"܃`d*E/>=zV[C]]5o?c`hl >U0{G*H9F q~h/F_sMM~୥sMC@G \ /n:LTy,FyIZ>&02Vfm{*,l\`mYk3=λ%̭QZ=)݃`a kg\?#t´@ T*T*H$X,T**&(( *T7k_0x p36^Dr콢Ņ{" Vvn:x/h)mҟ,7.'T ;~[bdl ^\;jճoi_O|vN~-3<!#!LUh9AٴW[> ߑK`fxJY7T1W` @e04h=?@vE8{Nm/_6)e#%F=ouwRCNƕ&skrN5uT*P'1cԣ4Y^"V xMcg} E]ZL{]?ڌn^هT83xMj܇s^gM u"C-!u[ra{ By(zOãBQd-IRW!+%R0%""""""Ky $$Dն+r9of̘ޘ8qBCh"%.~ P,҉r5<LYrg"M;F}5 qZX^jIMiTWpAvހ- RqeJ|@J\R'): )Z5,[L{zz&7Oho];јTU#.u5Mcy&8{5Z3`*"wz5Uu /7ٯ9&][q%o@]M?faS[Tm/_V۪{>3´[8xVh2Eyx)B^=j[J]3Dl_u z=XY(.HSS*{^!8w9WDDDDDDD#q@]ԂFڂF톇g ṹ-\~~~1{S }*uAO{ϡψEyJSB?tɵ:M1P@mg׊FeGC D݉VN:a5b#vtuoPW[!^BUy!oujDDDDDDDDb&/.'"%.G?u:J(ЃgזV"' }x(u.ADDDDDDDDDz)'S0ir=0W^8{,t_J(ȃǺNr6qFTw1[GXAѣ044i""""""""isssL:߰rJL8IBBB|r,_O<tzƭZ @NNSn|ǟ"ErA`%Nn16iZR|CUpoxܜzU}-QHΎ=11;^Yd?vߍH;hhmCː˱os8_p7Jn`u$,Z׸6]0-PQQ6SWW+W8p"ߺTWTv}c1vXݻWCfM>5ZxܣZ1n>;wb\8DFǀ״ob=o{Q0<P? %7w^ FzFȯLJ",ڞK,XOػw/Ν mu]0-x4s5Ν;sBCC!ЫW/%] x޼IN>ŀ Ca>ajM[w>8m$M.]և'U-1}t!%%ɾ?{g0?~ߚ-XDdd$?>@mu駟m۹s'VXfodY #lFmϳH@@Up}u>kVDzзPqle`U텽/pnMGr>.s%χHixDMJjqs~$'^Kn/A(ZQW#$^>]sAlq,VEBqM1v~]Kն[Xc&\iC^-ZcFlFJϘbW.ז?XDzDdv۔ٳgallQFuؼu%"]' @ j cH}(&H{TɀĽ5j,2^_x/\ UɷPt D;[B=>0Cڵk{k׮'mۆ4:u 0l0^k֬իWamm[~u>PnFqMj_fE&1,j^~*k!C^HY$/ZKKQTS_,/ލM7M q*ލ{9&M@Fy" "+W`\,Z$M%(`ax}p5s-RTዤ/C3$OKFWW.v!C5y]EE Ҿ'QQ(d>8~x QWѭ X`*++/ ++KvaP&; ׯHf<'gZ~*ri(YŪ´6q w={qqq8~8Ν*L;::ΝCEErssqƍN>;>Pz9MᄑokANNj5żyϳ؝?ps>j}w%oc0lgy=wꫫ#N}k;c7 < [nm *L__ƋW^DJY z+#8lByUyk6n@ȭʅG_c.&.8wq"` O _ gδxw*ع}-]慈+VB|044D1aݻr\;+;kQ(<5yn4Auzׄ$vJLFj\bݟޤ=dȽ;^°h"opbccqQw̉h|11 Ŭ^Rv't>>{]+_oci`n+$ zKpY~`o[-bbTɩA~97:uXNrpa >:Bz` !@$]qu;& p6`  Bbi"K#>^e]%l ھ|UU:tn.ƴPPPZcR@ے\珴UKQ h8D6@(-%-VK&E"?yW~~>ۘ7okkkU1TYQM /pqc 04@X!_bt4^_ '`ԩQ)Q4^pa,T{8l۝(@>ZQ"HR>'GfMXX#*A~U> )*Zk[Z񺲮R2RAkI$d"""""""[L @___(kQr7GŒ1I,a:4@Uv1tW_sRqqqpss}ݛE]SS|駘7owKJJ`bbj B5{<###ȨUݘs:$~o{nQ۟\  mH)k#ee03|4^!Aoq.2+2QX]ggULqM1rr5nU.*$ j4cxX[ FzM%% Df5Lu'xczư7qrRx7ٞ^(đ#x%"3=x^^Gy~.QJJDŐJV/0c ={#&Mkkk$$$h|ɴGap =<O> Rc.mS3'LoϪ'q `>a U?s ||| [" ggg#((vR8q"Ν WWWf͂Rĭ[T1ׯ_'@7{3fѣ1cF#9GP*AÕ+H,MTۿ-y8NOi_2YMj(v+񅭡mEDL1 Rb=1~RP PxK}KoMފ>)=|eZGa"r_737x[xciߥXVsՐ0l i=aW.*k]wMb]b&>OVXc 0ouɱ4MhQ[C~==GP>.MgϢJQ03%-f7}LGs)gGGGٳmꇈkL $$Dն+r9oRjuuuՊ-+)tR|  PԥO*^ATQQ[OLG})o!{zJΜNCQVA' 4\'NW_رcqȑ&y?gĉr)) /@__)))x嗑vaÆoEii):fa֨q 17ٿ#ml m5EjY*]^Mb&m84LD&X}u5IF-ob6 |V_]|i1ܘ| 콽͉a'![Q%|%>ߢ/5֠ű2KF 5(O?49s/]y WcM5H,MēO"d23t^fzs:ݾn«^|ؙ^~LqfBt5uŌ3Xj! 7c3g˗>!"""""""č^wQ mkh zwEw_7<[涘{ 噐wvٳ1k,̟?_m +WmٲfffXpaH$!cF\ZCYtNxfbZO;?ac ?agN|=ac`֖ju S)L pBs511oUV!::旈=شckk@E6zV}hP6z4Ѩk1M}`nnuӵD$aРAxu=%ƽhSPKn/rO:6cp=߶e<lO  ک} Na 3Q\S磞ljZƽۦ4888O>aQH ,Lw _ݺ5Smm- = >Z\)Gy]SkE :[ 65/26zu\/\ZQ<""""""""""^X&"""""""""N4u.1b HƻcڴiHIIt>Q%D@DD P.F(Ld2!>>555PiӦٳuDDDDDDDDDDR(Lk*00rnu*DDDDDDDDDDV)L u*DDDDDDDDDDZ(LaҤI8vtQ&uA*mBa}M_Q\\4nQw}mĉɓ'QZZ.QHX T:d2B&DDDDDDDDDDԱDa!!!%\]]!˱}v]GDDDDDDDDDDttUU6mڤ{ݫ봉% """""""""i""""""""""T,LQba: DDDDDDDDDDԩDN^ވ m8U]DDDDDDDDD]@(LcĈD"All,BCCbﯶ[nuML{+=~G>Dđ:Myo`_t u!]0-PQQ7N&êBu:w-\< w8[m˧sVmoat{၊jrң0qfY9B}~A CLvzW >#</Q˹=5婭06AYq.\OD]]-N,~:"m@L7M;c[ƁO<Ő+!qAIĄoGԩAǍYS,%0أohu5F&XN|,PmwOmŶu^(/}?sDDDDDDDDԹDaZSVVVXt) rrrp9:N!20i+!ˎՕ%+|\Gbv8$^!'vBfJ$cS_0?iX1'vѝ`s^ [H9Q>yH鞽  1qrjdF܂*DBynqLc0wGVj$l5U缥4A* t Q+LY&"""""""f u@gFhh(ߏ'NO<LLLtZאrd\<E JgPC:"nE¼$Dn@Nz~N-=iEeHz#kOfy=`e玩 "}1l콐6 n! Dm Xظ7BQZWqǭ:-͏1-~;8s[8ߵ*o""""""""ɪ999ŋH4yz2l}i'luu͈TWRcHl jro_o yIj¼$rq>);# 3}LEHTUC %r2`l*#gș.z[|_Ek =4rңpeʊs}~4iIzi3<\< CiQOzk6?@qq1$V܉TVŴ%M zTܤf ISOXB=?]@哟pw (g 7=5U00W 4ZޢynIYq.8Q+@5=̏&1-R*= I\Ѧy """"""",g077GiiV,Cz4w׬&1b3U[ ~,Q aGm)r< ۊa R>JY)#S)OG{j\e=汮7O104}~M{Ki TWAoxߜc#~AKae玸 ?t|_O(L HRHRD"bHRXYYbN~gϞ۷/}Q( \~]Zv:ª /h $:m7x? /' ;AM~ [!uװ5}U> a,FyI.z{NP/ ~0t*XٹA (|G.uOOI=i( dPhz[Mc ;"='¶/Lmˊw y7PR1K.BBBTmKKKB.cףF!P:Vu "GcKGPUYKw'Fg\mQT?,CV9^jIMiTWpA|@J\+): )T11ߢǾ)kPS]XDTUY| MoVEM{Ki D !Mprj\}LE\9DDDDDDDDu44j7<>nx mu=4婭70BYXkm'jkt=DDDDDDDD666-"<<<@:w_+= m4j7wLMan儡V#6bDDDDDDDD"M&/.'"%.G?u:DDDDDDDD<]/!Q4u*r=10Uc gϞS.fРA8z( u u BJB4]wZqqYYY y7nF1c Mzɓ'cܸq3nݺ:̾zzзCP7nݺutBCCurc,ǟ DFw%CcDyB`` q%]LDDDDDDDDظddd| Fy=Gclw;E"***fc1{lTTTqM]ޢBշ舱cb޽N{bܹm.Qd C||֭ç~mΝXbtAVבH."Gbvj16cOmƜ:u } ȃae`U텽޳uV ܇iI9&Vc؏{7ĭiVٳgallQFui%"""""""nB.3gvbbb4l8.R_;ʢ"!ŸIj1B##:Ee%^zw2`q>}W#e0 ןCU-;yΖikСv}ڵkm۶!-- NP__z5֬YWZ|(6k~k*z"evƗCDjY*.5[nX_^ᛔok;WceⷑV-:jce3 G<1f$89qܠvriP### 4.]BDDzqơZ%= z@QYP(QWb$33n V-Qt4P_,F`bUaZ\Ν;سn޸8?~sUQYYsΡq=z=&,vgƏ?6܀i=Ṿu:ii&|EF@,vYqa=i:ԲTUg 4 C[rrr%"""""""K,qEʕ+HKK;ڂ|?s7mK/U1Auzׄ$vJ.}[5>X%IӛT0roX~=BBB`ccӎg1郘"ݯ]C_aKJ;X5r^R[K}V :3u-ݢ0]WWjd2EEE055ո\珴UKQ h8D6P*[K S[-kK&E"TzGpp0^uܾ}Þ={`mmQ63&==V^aOjy*L΂/T?_"ܛ Rc.mS3'LoϪ'q `>a U?s ||| [" ggg#((vR8q"Ν WWWf͂Rĭ[T1ׯ_'@7{3fѣ1cFm0qtz}Me1rHBs |%0, }I%&bRI뉛le`f`J):9V{9::gϞcQ%~!!!%\]]!˱}v@BBGb!>>^ԕCh)zJJ@ҧQQTTo_Ahb[޸^3'!45ǡP {(:rPw{`6zI@eB<' WĉxW1vX9rI011O?2|g8qĽ\JJ0| GJJ ^~ecذaoQZZCwGs#ml m5EjY*]^1Z:GFAqM1vej6s77ڤk03Ċ++]w'sOTdcO;X16sL\|YDDDDDDDDD% nZh[C[Шл,"000<77u= 噐wvٳ1k,̟?_m+WmٲfffXpa#m&"\hWbbb~ VBtt!"""""""v`ccb-PYqCFvq4탹9lllC#!! N.ADDDDDDDDDz)'S0MDDDDDDDDDDK9F;;;H$"44T-fʕ;7%%.QD@DD5kt>Q% 2 aaa7Cuu5u>QmטA\\jkku Q- ΰDLLS!"""""""""veaNvi 8;;ڵkN[vi___#))IשuK"]'lll$A,C*2`E"xyyիP(N[iږpuu\.U===a``=$"""""""""ҡ.Q¦MZaQHǺDDDDDDDDDD[,LQba: DDDDDDDDDDԩX&"""""""""Nt7a*Mr9u!?_,]8o&ވMr$:jg(A m{g~h1b HP===FFF(--ELL ._X~.ojoS_ԢoV}T#.GT<῿k|Ӧ]&(?uU:{bl{agzr|k""""""""{DaZ$h6&00 899aĉDllFs;1ZYU^c;wJ(-BnFtsљ/"""""""Ke2n6gϞHOOGZZ ..CCX /`ԣbg#)[ͨ=>H{ Ix[՗uOO<&\q8d\QFXA=nFpyO^O+7;K >#</Qg"N{]*J pIj1S==[f?T~^7C8t59_B߇<(u ^q=;;=Ő+!qAIĄoGԩATk1? YߑK`*Gey!n:-i9G=L 砦 g"T[\hJ~Ǥ[oOt´&n߾ ///H$fffHNNujMr6`自"pCfyB0GSwQY.LYLdڷ*i%/K% Bh?SĮUL`LyK";Zç?,;RoTWhKia&n'c,´ǠH__2t59_CƯй820b0rTg@B~}ܵu' ghלc~} F=.~J-\&u6깯?cУ`L(KF•}Z\hJ~n\ W}cRgs^A=)_I)L?OCTBPĉHMMujMr`f z8!&[9 ݻe97@Udkp6x,@jE"nE ݀0ps8Oi}C̔ Z+n&N]E] ̭y(NU&kgqHprj,)kyl.4Dm ۽^ca EMuyR/v@E g~y E-义pQK3(uU1~!l?~o}_}}H996=槬8u g?w K4/Nk>Oǟ Sڊ"&=DDDDDDDD&u2HM+f?HeDգ;5y D#ݽY)>0i@G \ /n:LTƹTW[ vdQ&uFaF3v~ٿɏiOuUDCMWUe1Kr11]^Ң,8=輷FS8x=vg -a']簁UfcynbGޒS ;A훧PWW#)îKR)R)D"b1R) iii8p D///"))I7KMd^dFB"Z_ZT0/Nc !ǨG߁e동`l*H_ Pu6<D_Ӡ[G7%J&r24)NjOvE8{Nm/_6[jzlϡXJ]1vPը\8G, `e7"pVу{{/7G;r {zLOCT F![atuyp綵j~49"NXc;bMԊ}Nv]b)ږpuu\.GE`` ƍCCC"22/^uj(@g61ywc`7PWS}~[W|~xpسOl]HZߵ븮_cs[N{(*H װ6}f+l`΋/6ݫqob4K'7S Ol{]1ߢǾ)kPS]XDUs|UU-==rp蛧s ab+a.Å#"1~m>:m4zxl&|9DDDDDDDD;q@]ԂFڂF톇g ṹ-b Qw% n &"""""""vcccb-PYqCFvq4QWan")VcȸPU^tQaa!"w3kK+jq>\$""""""""z0M)OƏ: """"""""%uDDDDDDDDDDԽ0MDDDDDDDDDDi<r L;:5zٳgaggTZ4h =zN%֘677Lj#`ggDXbȑpqq! pYdddtz7UVQ޳gOK0`~MŋGHII p…BRR-Z>LSGDDDDDDDDDwLD"TTT ""L88|0v؁4C":#Ǝ{6ghh\?#G⭷¯aprrj{ܹs!u=}DDDDDDDDD.Qd C||wt2z*\~k[R-Vx9uuP@YU PTU@%@hh(>vvKW+(9wעPxpjr5>Z _k֩SkӠ*5IӀM+Q]]ݪ===!++ o?<nutaa!~geeeFiiinA&/74`Lg`+| wJyvj}LCHOmd2XXXj555())~9s HPPPЮ1&H Zy∈u<AYY䄌v?%gO!{z$C)TwZ7V,14i`ޯ}T$5[!Czzz8p _1!..yQi@T T HX TC=マ={o߾Wl-ɴGap =<O> R7ĖG]٘0 }Z:{G^vW{CZb@Ob!'|u|Μ9&B!<<<X xxxEsNbɒ%pss믿###ٳc8::gϞmHDDDDDDDDDK,a``Uؾ};@PHKKùsZԕCh)zJJ@ҧQ$6oVzۮC뫑7BQQg^@k(/GE|,z&1Pr$8tdoEG6ĉxW1vX9rDm ~gUw7nRSS 8w~m,^=RRRK/!==]i0sL\|njHDDDDDDDDDG@5PѶQwYtuóE```xnnk*zޛBhbgB4={6f͚CT:211oUV!::Zeشckk@E6zV}hP6z4Ѩk1Mg߾}077 t988O>aQ/iRP(_N]ADDDDDDDDDZbaK[S """""""""R#uDDDDDDDDDDԽ0MDDDDDDDDDDi""""""""""T]bi///xyy#33I?LMM!pY:}"""""""""nK1t8x jkkJ쌉'"66?#rss#@":}"""""""""nKߏ8rD"\\\T1~~~}6"##'N ޺N[?300wQ ѣG]KDDDDDDDDDԭtt`` d2)B,XllmmQ^^ccc]KDDDDDDDDDԭtt@@pA`BTWW z"]'О兽{HUUU066ƕ+W022R[:^exԨQ߿?v Ldvv6zuoB!푝ԉ.Q 7 T T SSSU̕+WгgOƍ>bbbt>Q%f̘=&&'N"446lr98B]ODDDDDDDDDԭt֭[5Ell%"""""""""ֺRDDDDDDDDDD4u*S0MDDDDDDDDDDi""""""""""T,LSZFVnc&9{$ny=N㡱( Ciӱrb=Qw$u ^^^TŘcĈD"All,BCCu} <͂EOTɐbY-}? ῿k|q} 忴[S]QQVӜV9L\?DDDDDDDDiwww… cΝdPQQ:=o001Tڪ_QUy!\4uyyyXl\\\TiL0ur> G?F•}HyIй2~%$6.():?( ,TU91nFVzwꗡ0cU_>0;6`S[alj\Z\9).vuOO<&\q8d\Q8o3̬!˾ w !&|;h#f` 6,'?@r8Ios@$>H{ Ix[8 vF(-0/Is Md 07d:\9YϽ@_ abfTDXΘéV?300:V,áo b¿AmMe1bcL+&>uU>*i%Yc,NZ;/乷s]^uVZTb%o7uŗozHznǝ͏DF!VWwϠDi/H}] M-=AWi7OEeΞ0e(g 39O4i+!ˎՕ%zN5ͧy:q5 ;CQA*F>̭Gyn] ԗ(OEvڥV ?Kp[o""""""""K!ɐTZ+1/{p'(*Hmr&󓛨DHEi*04Đ+cs;zKvI_uu͈4ͳF6Ȼs]*eZ.&V8s`- TbIMe`kK|8wEQW>uЖ saaIF0]r$"""""""΄N5 ݻU?x*$}I֔J P^Ң,8i&U0&q=A( '5 7l܇ VC =C۷Ρ0eqnu:OUe1*JfF뜴]?ɰ壶MV+!z?"¼$L]?vDa:(( >R)R)LMMU1@]$A,C*J7k_0x p36^T ~0t*XٹA IDcS)DbZv:ª /h $M02Bcaia k UNgω s)Rk3?r>bwm4,k ~V>J R1B=}z>sڙ\=|F.EBLg󃮟g9$$Ҿ2+9U(jqg uF5>gDDDDDDDDTK,̘1Cm{LL N8000@HHj%\]]!˱}v]P+3@<~K'6_./ `T#?3gl_'6Ao?D\h}*iWƟ!FuU lly&8{5Q{-݃ƫb|~}xpnx m1|]i`S[o`_3""""""""")bExxx "uj=+V4z(=hnx5 """""""""Su5١=&"""""""""N4u*ٺu駟:47w{t_B^pYiިQ!ckody~?]E6cO "mM-g:G(L{yy'e˰l2̚5 ZUaΜ9ŋصk :$&dڪUp4p~y,rQߠANxr# t=RҴ&XK炨Z~|F^QiwwwQ[[VVVZtE#G[o_!!!͛Ԩ1vXݻÏUXSQˑ^aQ% GDDpm9r"...Zh.N< .য়~BPPPgyNBXX^x}~~~/bϞ=6mZ>̙0ŋq1xyy шD"믿j?>ϟK./DBB}]`֬Y:;_R[8m.'f<)M^|1 zVmݱn712]6!0JLG3ḾWD}AS* ߨj[[՘?܌úc VEcᛐ ϰ˰}%@X1:k;7ԶM>iiiHIIsiZ~Kylی#ͩ7qk-ts~$'^Kn/A(+ S53 ǞƔMW<^Af }5rApqlz,rYiI-3c M AзP͋6nT! &涘4S<^^8 _9>^M?;^s%o!pgǾO_Ͻ /nSkopώψEX~F#3xqC;AY`&9Vn lThѤ#k!nm`0^ڐ cS)`S[}9g޹!W49йx7.c h"]' m3CCC|W¿/dff_~pttT8p *yfcĈx+Wedd˗wArr2<<};{=Emc&@ ]1skJT&è7JJPW\hgKKyd=gG Ӏpy@-gy }de#ao y|K`7`7EU6tP\vWC %vmk=7`%;9qlF;'Fڌāp<8ԏ}ax}p5s-RTዤ/4HFBe]% 23#A'*IIxG$ zjT).5rL/ D_?zxkXxE5EInoR~\_c5W$ 2 SNk{ӧ>}sνTxNθ4շ뗅JMnWWT; P(P0*O->m~b,MnZ64ĝw_C/tA|Q**AUjZ=VA6@i۶"/Pv0tu݊5 B#O/y59::ҥKU眿!,ߤ֏L$&aPU!xM5psvgԏ=< [nm *L?8M18tjY䲦OQM/( ar|Q~%ocr´!^υ<D{(v ~v*pzT*AcPUa:gm X>^ qzkIdtwoK-(+ʆ-Á/]+.HCLxXnF4Ūt5<w¶`,LB+L vB]]]cӯ_?ܾ}[UT( U[&BնE111M7Z52deeZS\\f|P*JOer"hk 'T$[#/@= ʢ/7KYSV͡63TWRYd-~O{دY5w/^o=3sXL S!b@DzX&tIm ,.Kaodu^K}ucy۪ܓe-uX_, ,mA3@} .˛^?ՊjDFz4yz5'R똖H|PT*Jߏ<7F|[bprB=%Nk٩FnF鉧Q,@p&2EYH?>$va^zJa*ș0rXM󊈈R@xyya޽(**ju(+6>D"ƍ:lڴ Bau*ԊڨAII ?̙3D9sf-! uM/'BkQ eN];1T=).@ѱC;fJK`7fAa45w2P~-*?Chf~ O/\XCY8sLվS~O] TKbkjj 5*cbb0dU[OOā4](~ w24~ߟ&#Qq 73*bKeu5ZI\dglD} P(Puf# "/(*Qv|892vsrU iPiyj}_-E.h숌]?BA q.1׊ZwT+/hcddsssï\rycZ{*G,#eB8o۷?;zzqFޝ}vj;0|VvC TyE]^Ң,80MDDDDDNOaaaׇT*T*V1-9z(n߾7zBPP|IP(HOOǰa  !j*z5j ޹s'|}}d_٣qEEEy}UA ۇT|a S ۳X@Uj FBD-DB=Vu?ٛ?E[ }`ҿ/EWתb.u" C]I1jsa>fJ/E4̙3X,nS^1n"|%5"Ga"r_737x[xciߥXV컳el)=>_? ))#@}>zGmm%&bRI뉡'h3c =z3fh'}(*HŌhXX; gGT0/Nc !ǨGQ[C[DcS)DbOYQ6Ra# fJ undl ^\;j{" Vvn:x/h)k=FDDDDDDDa1cBBBTaÆiӒJ,^n‡~{cpZ_H$>|.\@ppj߹so#88;wĀK/!==k EEn=17/Nc`@̀M}[}^giRυ(P0w}fFLn \?YLaA׳(J-G4v) <Sh{J׎_ޜfiYOO]wA'Cv5Öprר B!B`YXXWqsssZlB )) Q#RRP !/*Jҋ v 瘟)Phc[Ҷ*gvrĕ+ >8> I;8zV ؝sI/NW^9zXSO7nu/oiNW^]ʌm8>`ƙM=JS| Up/CI-JHz$Lꮫ . +ԭ0 G3&OOhQB=BY~11O?뾯3kSNNJ xWkY2y< 3Y0|M aكWjLc&>_ztѢXv85oPrzB!Bqojeb:884;;;3f [Dc+D8caݵ„:Li2( Jvj/rJ=Ğ{X7 7nl\fq&gRȊ`jөtpI.=j%Ccrc94>\ѪG23g43cb7m8IL$$եf[1Y~ೋd'dǏהlJ33Q.};z:my=ТXIL !B!#%;uꄷ7VBTj_ʊzŚ5kHOAcC(0Qp,g)i%;ٹ3ýLjC#K +W6Kn.\Z�u5u-z q U=L8;r"V=qyqZ%ZTUҕ x/= |O\_kq>;frbrɕ|,c+ܬNR*L r"!+S+Z%!fҕ:zZRRwK9SXZb0sQ7KKta^=&vM߿h[-?\gW2$GS|Sg7p@n]| >عbfnĴ{F{ :nZI#[?!8:Sfz&d2t !B!xՊ<gΝjԩvvv(Jٴi/_6vB<'m'#7Ăx>1_]JSoU{jJ|^o9gԊOإ5r.Lǝ}eprofFLn SNLX1Mٯ.}E=z,lZɗQ_ʱEʢjSt?bfnŎ_?hcz#euֹ2-ĥA sK[vك_(.ʣ]Wo&Ey\?B!BhPC,jE}eۊre7[f;%''W@Jq/<%d0#~`<O:| ;]B!B!Re777‚L@ Wz*wSmSnq1-BTMC]ٝ"U5{ v'ֻ.333ڶm˫jn !B!%IL !x$*LyK|SJ%8Ő!)`II ;wyB!B!(%i!W鹧B!B!C !B!B!$B!B!BWBTuCiء夅28g<1j,g28tnFc-HW}{$3mA:=-'|`B!B]Xc:00@HNNСC\~򾾾楆V/Xk (rt|2;pt!;aK8kFB!BUHLm)_] Z؆c fԣ4o7mPUW~cݵ;s[c/r4(nVnק3ĹTb6-7ܚUCb/s)KQ^Y\zXR/`Z]0av-޾6x.~yĘػX3ӪU>3b~w7lGg$UN @Ncyصjc֔#AYR}N!B!d21LZZQQQ} 6Ϗ_ q_|CjI[gvl؂668[8s&3gX_:06/o.؆c!_)H,HLƙk~ !*Sxu"1E/,[́ 4Ɓ}5 \CCIQ>1S\GNf" 5>ե_yi[Tғ/Ѩy/Zuy~~393LXNJbZ!B!nSӝ:uۛUVT*O>lٲBc(DT+)VS* _Z]:; WKWX7x/=)KTyuN9作8ɟ$ ٸ)9mLh-Nl."V^Fk R#ʦ.xolKGnĞл\=OθwND,ÿOuWڍ(Tvsx6+v :=7)/B!Z&005k֐ꊭ-}&&&,Y,i#cؘ!\L҅ΝyK;I.䴸" 6vvjх9CYRH=m+['U% Bw[UJfɇhƝi%:yem֒<(wV p%B!B0nݺի.xpu.]57np5/_NNNJ.L& cHU|xCN]trdԘWq䥓tIslf.etqϟq`_Zt~^ |C8 . ':84V[P*C?dXԥAO s13_~9]\zؼdr2N!B!ģV$CBB bϞ=ꊫ+vvvu+))4T* DI't4oFCL杀wx4ڃ= .u֭[8pQOӖhe'yvF!B:j7Ba9M]Ь`Zu{s=\@YO5$\>w[OO|WgKH}TRXu+6%G53uzB\`ث1e%FW=YX1=rd\:Ns<<h:IqQ)sz"B!BG,JgQ++V.޺7!888,95 SRR=Bǖ[ٙ^oogرB!B!j9*˸ dJܽcUܭlrekRBGR$#O`P2&7A (jcffF۶mꫯ!B!BAfL !B!B!#FfL !B!B!xHbZ!B!B!}%i!B!B!$dΧ-?/m.l9ii NgYHBzh:o7ۨsljScm{$3mA:=gTQ2x&!B!xՊt`` Çgʔ)L2CҠA2L6M6qDc.D,COb8ͱMrsM쵞Ӿn{C q ѹRw]][e+O^ъ^.]#gȾ̋zNgc !eEyDkeGUu? ?/}JUBz%5En4o&G}i=ТXIL !B!mj]bSNx{{j*JfիW5~:Ǐ'00G;l!gϋ[,[OKQckrlekBmLh-Nl.T%^ ,v,d& N=LLLqF zoet{jV %1Bﱹzn#xq".j/Iq':'Y?+F*?\?gm\sl@Au{Z7)/B!Z&005k֐yײdeeh찅0Mڝ%1KփQ *)[jZ\]qt1iӯULjFsl:e=caeľrAWP(ʙSa;%4hك/ߓ̒;Ѵ ;ӪKt> &/۰i];~cѠ !B!Dmdb [nzj މu!''ء a47B#F4iĖ[_ͽJKZ΍PWnI.VVwmHU֩`mmMz6v(>)K'-VZ]8:&d2N|8\ |C8 . ':84POƑ>Ɓ}ijŬTwq76ȊݱKƝUWQa.f?S}?LLNߥA ɗN&'3oߐ{G!B!"1BPP{WWW\]]Ӕ߿?ӤIJܹs_ K C龥7Y}0aI&_ۖV\+X1zM+VYUs>j銥% 0p@nr3onOO=dg7ZVq3o(&mX*״ Zv%I~+}GzЫfӪݛcAPQU&^VoQ޸y¶&)kmx<5ygijg9~d'uG^q W ڄL&x;:#B!Z9ܹBAnݰDoNVVhj%[olehf]eYvqr#&7)'p,X ,El[3[f?ܻ|s9zKȾCٗiER/qD]Qo^:gœ (<5{}}'_0'AC'4uSoDdJ꾍iQly e}޷-F-mٵzfU&.jfVzcE1N)S0eJ *_>C__fذaXXX;|! ݝyaN>{WiP6lcXj=X6mbڵ\xء Q#HOO'>>2]ve_=+*l(/2O?4>O=-bڴi |8fff>|X2Z̆2yd駟%**SRRkd ]ƤI|2W^5hģԜoū\>S3KF؅G\>N7jwĈݧQ(sƝW<~mPTEJbAх3S>!=iI|ݬu(cGx/Uވ^~mBsXYߏhkė<amY7wѸW  8 -N?pvoĹQt7NfܬZ{VOWkzOiʘZ}Gv=_AܼvF3>(t5~-FQ~:)~~YZ;ʧt73 k|jͼNrYʞ: xa x !BqTY֖@!?Tvn׊ӷ+[|ˋ ĤI=z4AAAU ɓmRIxxB2Z̆r1Znڵ]+Yn1,**"22;e|ERi85๘[stRr%|#w~Ioq}}D('Cb/fXc=@Ɲ OUsSrv#qWm&/>JFNN"{ݝݬa8u"<'/{iL?>fZ=à}~ Wz~$F 5_Nwbwϫi7R.{l^2gѸx^k;mN w8i2$(;Û?`\uoC9 c(B!ģV&IKK#**&&X[[Ӷm[nܸIDD={ qߙaooOZZge c_'N2w\8Pc}_Qe'uv=_#1lf Fx qQ{0ڶ5uONIĹIvƁ}k$;F=um76b#wk!.jm}_ˉ]_ҾS 1zJccؼd}zN|܏YXcfnKf1(35_PU_G+oOeٿ緒z#ݫgheZu8;7pt$ŝUِ}ץ_*dﺷHINOC!B!5f^ŃSNx{{j*2 E$7nرcܼy (kMGN{Ԕ\)((\2Z̆4`BCC?iӦ d56Zڭm5I_}"V^Fk P(K ()\ +u}CSS,m{"^ ,v,d&jwV|Vݪ{Aٽ_5G>c,$hMZ.gFERJUPa墂l,`i퀵37θF~^u]|8Wzb/:p}C5| ZٗC!B!E*1L`` k֬!33S_TRTTDZZVLx˗/g߾5.IMMչ̃!,[m۶p%ڷoK/kl +|V+ b.llg_V]Sa;%4hك?7_+['U% BE%۱#9wxVV~-։!#5/zEYR{Μ NAaa6O\_/I;MIqx59hu+K,)*RTR) u. G;S+!B!#,ѭ[7XzuIdթSc.QӾ??!655u֜;wN2eWF񘙙accS!T*1h֬53sTO#Wn #ub/!;zoʲjB4}ll5 Hؼt)X5OK uwo?Z^z/‚,iKhElPX01.1mygqtiL^3Ն14'Np{{Qs#zOrY޾ ?C30|"O!jca@VZ=u2|s [:)V2Z+'K's觼9TDaukW8tz-޾xy^[DGl 6(.5vHB!B@B!5;!B!ĴB!D5uB!B[ ŽWĴB!D$ -B!fdݙ;fÆ >}ӧO3k֬mG>}cw۠=ItZǤ5ږCIݮOOOOz*k۶-[na !CIVknB!B/jŌ@qvv 99CquMiӦUh֯_oX ?`a eԯ_h>39bBH[,_gPxӧOg$%%U8vI\¸qB<4B!BC+;CfQV̘%..M6aJJJ2dNNN2˗/׺^JETTïQ]ve_=+G^^^у5kܱ̚5k1bW!x2A!BQԊڵk9|0$$$eєy͍".]W[...̝;]vq~wBBBCP0~xlYv-<==ٴif|2j(?΢Ebܹdgg3tP/sW7?'hy1{ӫ~(ԛ:Chu9G;{n»Δ.!7X^E_G8~'/;9 CA='p yJ|SJk߀%::q߿uv'N!j)B!~CjR //eZlIDD%%%:keeŋ),,d֬Y\~oL4srüyHHH <c߁=+vD{wVYKOo>=CQՠR.XRI)(~ UA>.c^ifMv֥-&4o?G]XHv~ܧ Kr׹_cjoOU}Σ^(.{K{^.JJPbAACp՟^8o?].$W/kinnY|ρ/ϗYBG^u2Z!BG!խ~$mll,ckkK||bPowZ1c ?<<;wj7o[GcccCll,~m͚5czuE֮]3 ...$$$;pjU&!!?srQ?΁3gǏgҤIDGGkU+1o|.ͦ׋1en|a7,Īy ڈ- Aʭ \oEq1k 'U2Eq1Ŀ/~9a9|`}O] <^zf#?<)Ki=o{a׹ǏToΝу-[TA8q/_F!eI`ii$B!xT* ͛dffV{GaI`Y13 l_vYe7[f3pKNN2cgyC2jԨ I[[[oOӧBͽ$ƆB()),%B!eLLL033KKKHHHЬZPDsM&]\\,FXXX0 (r[UngOmSnq1-ģ?N:pMcB|wwwrsshB!ѤR(**lll'11jϞ$1-CLRO?Uz,**(c(Fle6m锔]@!B!GQQXXXhZgڼ$ xqr-0vB! 233e!B!=)))!33vݷ$ksf;!T.Ii!B!AT*qww'33SsQG}ִ\R^! lrsse!B!Af_u.^HbZ!Nu-yyy_!BQ akkϭIZG`` 8;;̡C~)bmmMNN8q !HՕBc$B! quu%33tV$}}}ȑ#(Jڵkǐ!CXbiiiӢE 6mDjj*ݛΟ?o.!lll(**2vB!BZc@Ky]ÇKBB[l Mwww∍%''222WB!j5B!F`iiY]Զ^XYYMAAPU`YfʖewΉ'4SRRcǎB!jGum6!B!~lll111ZJ^j = jMb[nzj222`nn^9jB!B!BꞒelmmQT2sjEb:$$@mۆ9瓓J"66֭[YʣiӦ?~ !B!T*BW\"onnΗ_~IΝ˘Kƍko_5mڴW^h[B_ɉ ҤIoN3oWrSSS ^yyy2kZO"1-B!BR5jT/ҹsgvɜ9s43LLL4vJ4i҄h|||Ry۶m;w9s搙 @:uxwhժ}k݆BB!B!jO^011ĉXZZRd,YGGGONN ,,瓞U/"{jT*111ښ9sBAA˗/gٲeԯ_I&ѡC\]]INNfѢET*tvoFAAO=W^L3pǎ\~{ggg~G5jDTT&Mb5惰l]ҢE >GѤInQ$B!B<2}Ybccr ۷gڴi={3gwѸqc6mڄ=O>$kZu4n :LzhժW\M6̘1ӧOHn݈ <<:0yd222Xr#FH\Bdd$ԯ_KʅOҨQ#.^ȤI|$֜63{*t֬Y̟?>j57&))zɈ !'~B7o2dT*ӦM矧}ԩS>~Wv튕Ȩ7n3PRR›oɨQh߾=?3zҔkѢ˖-K.Z|F5SoĴ1-uQPP֭[J(Iefx Mr 99U~XU݆V.(i!B!bR888h.X33h=^+1 JJJ8{,FN:1|pqrrJ)/33ʟ !.߿?6m"++իW;RII Ĵ{$/؎۶3~doK0hz0V6u9x+B!Ry\6cpݺuoZn|Uj5-[ۛ8+KP7p~mᅪ=$BZԩS3vXhڴ)&&&X ,R:ɉ? jO>7$--u Ԋt`` 8;;^:tׯkXYYѵkW|||"55?<9e4ldqbל?Fڛ66vkSv =>ӽ:N^tб zv#!.j혘7ٻ-NN_ٴO`_:dLFYRxV!^υB!S2e]i___8rJv1dVX&w޸yfrrr $44e˖.feĈi(dﯓG ];4![-өJ4jދ#Gئzn3mB&K']ɸy]nML$9Q08?B!f͚E^^f{ǎlݺU:9x ]t_~aΝ4jԈ,ϟ_W_}E˖-i޼9'QQQdeeΝ;O^$ѣGcooOt5**:0{l8E9BOӦMadff%a&˒o&oФI*kjm߼y)SCZZ&&&w^8x ͚5E8p]Ӱuf rK7kiиWϖXXٓ|c; ?k{n!6v.f%S{/v`ʼM>;(Qi؀ڨ&.j6keO_xqG~N*!)$;pt!;aK8kjK{?N^ݸoQs5eLM-xo? J5TU :<1]ckFFJ G}B?:_j}*Nαy$\>tgF"O'/~g+wѢExxxбcGի_UEf͚Ä _Ybkk{}/--3-S+ӷ+s aP:ž^zR[#6MR2v ϥ /F{odsaM9o\5+يaMzeo0?[†OŎHGE4ǟ]fp=(NnM=%mwݸt/Ϧ]zb/Ct=Cٺl1t}}8yWwg]vM~3ٹj:ף:~-"#% z}m\6"1Gw'PXqVr%|#7":h6{+̧&yfKtQUks7mǨߨۺp|%Qh v9LzѢJ 5_>[8\Z5ofa3nK_";-Wϖ86{ iB_|ǻtyR*۳g־ /..fѢEw|{{;wGGݱ;d59BZQFرSNUYS5J%XYYނ yGQ5{LZZfiٲ%vvv( prrhcMvz]DGR)2Sc8sGq`_rY j5tf=̭ػ-NR\#'_S'VK̅ -:ի ]CxϨ*/#7'r\=Z5zo Cs'yb5G#n~|ϓ%E\^BlZ|Vb#wz=[`mlKtkSs,˹_ۡLWk򲓱wջ?dڂtͭfJIIq!%Ņqj#dϚF M>[8\Z5f΍ذx4Q{Hʥ8[z !B! AH[:ntNfժUZTl۶}2aj5ׯ_ҥK899U/Xp&!O]Tu +u}CSS,m~t.t} @ sNO8SjwbyqmX=J5_*}^wl1]ِ碪תyWdT83PA!B!Ľ$tJ%l-]M*1L`` k֬{FF+W rss %''G6" 6vvjJVzTL+LL+-[\Szѷڰx^7K+CSVT^^UT 1ΥaiBjHY,#MѸ3D>o`;=]{(Egbcʩ}B>veԻD5 +~- /Fk-8\TZ5g.lLCB!`bbruKAAЪ5Kyt֍V^jfeooo͕uUNZ%ͭJm4j[3Sv ^! q \U(?Az #Jrʒ 2yXXko@>e'oQݾMaA9)ZZZΥZq:EWQFU<[js"#[vtTwq76ȊݱKƝ :Ά}^?w.!EUndz?k$ݹQϫ-JeQK8\k>9 .>w2g潾B!呝]eggV$CBB bϞ=ꊫ+vvv2קe˖ӤIlsC5g14쇫GG<tV[hP`bjNWȶq"֌8gT\Z%|`c犙֌qpjS}?P(h2+kGud'uG^q W ڄLK*g,e:G0SL:7bѨyo<[a[M+ {fF@Ǒ86cQϻmEViuͱw *R/| 5>~. )AzafaM]\=pLSqH3pq0!Έ׶PXEUZK*<h:IqQ)sz"ѵU9sl];yi\>Y:g} qiЂanҖ]gp`,æOM72Scغ| 1:_(,ȺzSS ҒZ38j|ty/]{=v~sfkSHz%|رt.`ѱ 7K_4WtnGWԜ'gжy+C΅.U]^%Et8'_ɗ9C.z !B!Pt^^cffI|^JEII z,=YԊrʶnn=.wKNz-ɔcA﹅[زahcR8ߝUuʫj:u͛.B!puucu:X..U/gFXXX0 (r[Unrmm=Ky!B!B!xxHbZ!B!B!}U+֘we{DTId|B!B!Dy2cZ!B!B!}%i!B!B!$ lÆ >}ӧO3k֬mG>}cw[!B!B!tV+֘nӦ 888Ç*Hǎ#--W(s ?`a1PƏO>ȑ#K!B!B3J%Nb_LBCCqqqєiԨ{o$''SOhk]2{l/FMDD_}M!B!Bgk׸v۷oGP)ӦM8z()))ܹBjŅsk.9NHH^u( Əϖ-[8~8k׮ܖ'6mb֬Y(~FYhQQQ̝;lzcB!B!B}0o<V[5b…lڴ SO=F"""B4JpB!B!Bڭ$3f ֭[Gbb"&&&XZZ={d͚5s}ӓAquuȑlڴ 6?ңGF`>m5mڔ rJ׶޻w/#F133ޞ4[oŤIHMMqzBqyzzB!5N|dmVkXYY@^Xf e-LLL(**";;LL[ߟMXn־H7o^[lllxޱdeesJRzԔ\)((J!_l٢R[!B!jCx ԚĴR$55k׮1fڷoQ*bccéSښ_kqqqjk۶mc1o<&LJҩOZ <>BA6mܹsZe4h8vP:lY JŸqq 62w\lg]_~,^";ɓԴ[BRSSxu)L^|EJJJfԩ2{l233< !5[ !B!!STTYUѷtƎ-B@ nV]4@Fh޼9[Yf( ǥK4e222ΦM6k333mۦײ%%%ر___ƏϘ1cefGFFҬY3^{5ƏOrrfIH^x^|Eؿ^mOLERRo'N絰GRRF‚w}WYB!HbZ!Bq?HbVeOl_vdtֽ$M*;rO(B5 n/V !B!j;999FOLTY͍` P%U'˶)]^!B!B!rB!B!Bq_IbZ!B!B!}%i!B!B!xҭ ׯcGB!B!BBfLؖ-HOe*vė_Wj>܋P>-~OOOOz~ 8}4Of֬Y5g=8}4666ml$m۶e֭XYY;!B!B!V+fLiӆHIIiԩS.]P^=9<۷o7v蕊Pӧ~z=h ~ݝ^{-Zڵk3gNr?g}Ƒ#G.sI\¸q}!B!B!R+fL+JN:Y~=)cffF~~>&##!jUm5mڔ rJ׶_~Ǟ={xw CRU܉ѿz-&MDjj*7ֹ풒 !B!BqjMb:##_+++իk֬!== ?_:#Y3{usՒΝIJ*0c̙ _/ΰCB$$ pI;3ҒJIW֭Iַͫ~ /^;^zrOZZ=nʖ155%77D 077׫ qrrB!B! &1T*IMMڵk3۳}v\h??;ڴ˖-7h߾..PR&**xiFZ*RS嗊kBUۤP1BZtv=׭O[ӓ9s0|poٳg}_۷s)Lqq1899|ruK9::hB]!B!BP+.~XBqיʦX 6o.Ӣut)B.SzFggK,,OUDDi֔mْDBBEDDЬYJ]p///ݫ'??KKJﯵϏjm6;7o&&XlCeԩjqF^yû }mSSSZn͹s*S^f͈0hB!B!BԴ>1P(8p E>}pvv&**J+aii t)TJ5Z9VX_*߂y>b~M1o^iE}Rؘvm bt_bcL ɲe|c<ٛK;Vk,G˖-+M*oݺ>s:v숧'!!!9BٳgҵkW7oV}+W'dРAx{{3a.O[P:[~֬Y1yj=<cllloPoFfXx1666|^k+ ;={ZmIHH?dܹ=zqJaa!7^ϳeʕ ҳgObbb ̙33i$y״fR̠A8q\!B!B,JgQ++V.޺7!888,99RRR=gyC2j(, ֖ӧsic#Fn/V#11]B!BrP(߾]}ť2nnn()wXU.w+ۦvƴ0?:u͛7IRZ!B!B<$1-T*~'c!B!B!B!B!B!.B!B!Bq_IbZ!B!B!}%{0xpCٲCB!B!BFa6m>L\\L`` 8;;̡C~B!BG ͛7GTfp חvڑΖ-[B@3J%Nb_LBCCqqqє%..M6aJJJ2dNNN_!B!IGߧW^ŠĉiݺCB!Xbٳgӓ֮]U͛L2tjY3;6n]3g2믊̜ȑ޸Zw]c=LB!BZo߾L0ggg J8tZy6l5L"""زef+СCpSN?/VᄏkՋ޽{답5\xݻwk.j_7o[ošCXO>L::uP(())!''?ΦMHOOVCG=zKF⥗^=BSHLgnnN˖-Q($%%ݱyyy:׽pa{ZvBLyʼn ڔ"I..|yk T[m !B!De5-.. xꩧxINN`̘1?Bݺu#??Kh888Zh޽{)))1P>ZnͬYpssөfK(ё֭[ӺukFٳgޱiӆ@Ο?oaB5igggƌBu֑xSuhڑ5O<5e̙<1*O{O9_B!B)?ޞ^}Uׯ7oVVV|,\]]ܹ3'N0hL 9sZ?dǎdddFf0554ƛoIDwppM6 x{{oɩSM!jMb:##_+++իk֬'L:uۛUVT*uaC""/eqcVbss._!**MQKoggFNL!BaXߴhт}ҲeKի v횦իW GHHZO?e͚c7nܨ c֭[rJСC,\lMƍ၃={Mnݺ1h 4h@:u&==xbeN) `kkرc޽;NNN$''c-[w=// RSS_|8Ç@ROT갱瞣{ƾ}Xtnݺ3Ν;J~~>űb .\`BԌZqC(bjj*׮]cTspp0AAAYL).VitzBQz/K !B!jYܣejjf2O?W:.bJݺuquuJ ;p@͛)JgclK.,X{{{MmҡC<<<4uuu駟?ԪS|7 >777hРcǎw{rrr1c>,A?//˗ФI<<<$%%č7>ecc_ͳ>K155͍gyoV 777-ZĐ!Cpww|M׮]i֬AT!Dͩ5) ͵u֍V^ƖΒ흴DEeS\qc[|}Kli!B!aYZZΈ#޽;srrXd ۷gŊL:ooI&# Дeݛ0qDpppsܿ?zo߾|lRN}>4lؐxFŀx7P*<EDD59sqF5v7>,> G_/">>>dff>}0m4dĉSNٙ$ƏOhh(O=fn !y}bZP0p@qwwˋ>}쬵~tHHAAAٳsss\]]quuNv""Ό5k㖌PLff17wc|m[>8C%B!E4hݻٲe +V`ɘŋ5-[ܹsN: 6%KlИyyyyVٺuB 7WII ׯ_l_tÇhfWRRZFRe˖Jԧll%Khgt :m۶5XVW.f;vwbz*P(4c|rNI4qqaÆj7nwwwr9x :tۛ~uĻYfj&N ߛoɓO>Y㜝Mvv6_~g}_(]fѢE\p_;9}47!$1-B!˗Yh=5Ύ"ٳgf*͛~:#F ;;; gʕMtt4ǏgȐ!t,--&::Cu(J^xӰaC233r}Y9++S2j(vJzPT$&&rqaaa 0RiФ͛7̤N:( JJJ!::Çyf5v ̞=ooo󉉉侜<^}UyBBBprr"==dɒ _f:uSNi ׯpP!`Y1.(l[Qnfz{*HII1!!ﬨ˫jHLL4vWB4h (..‚QFϣV=z]rww'''µ6^ť2nnn()wXU.w+ۦvcYc۰aO̚5ܽcұi<==ٿ?3vONzh:M#F uksg=齭ضm[n݊&!B /d۶mlܸ-[h֢޼y$!P+mڴaL:S2|p.S 4֭[sȑ*ٳoTyyԻ>}:ׯ'))!ħ-?eI%z|H;m콹ʲWRcqܑف99$/T@\Ͽ^XG1 aExxi{xc9|J8z l弟3c'BbiRɩS4MhтPVXY*D2B 5eѣC5v>h^9 Eb~"Vq1"S]iW 7V1'&@^eM5tݕ"U֦֤qy׶,aA|~s Yޚ5kxw駟^sR!BT]^.{#1bH"C1G/ L|'pi%aUr|&pä='7ژ?u'f;}7Һe pvs> N槄Q吭fŔjJh:%FqEMڙSx@hh(B!B!D$̌N:P(n8!e)==0ɓ'uqv؁Z`ԨQ̜9Kri INN̙3UPP@.]ʩbXal3ǫ>6l[_{i-SZLfϷ~/b $r%W{))ZֺV罺tB!B!&姟~Ғ:0h ɩS{Ů]?>z :$;}||ؼy碢h߾}i u… t;xxx0gΜEK~~>7_uGAu܆Ǭ9t8p)#wFʯ\m*x]RFcbp*kw]o>MѣG9w;v츧Sߜt+}cWw'tk""عq2wb f̩+{3{-9wL/M'SuYܪ9˻_9E`n>N;;RR-jJkl $ F4AXxynT]m2o!B!BLbZVUywaJJ SL{ڵNe s쭏#G6TW28?0^}SgD MEfƵ 8 SMZ";;75տtMLLuff&G[nR%22??oӦ^m۶5{yy9Ga͚5?6J՗?b[b?qܞ}^.GgEk?zN: 2zho?x`&L<@f;v,Z]gҾ}{ZnB`5i#FcFQj{v4Z uSXxQoKk3-&ƶ N7n|yCg`:;vҽ$‹ i67 7,L,0QT&5Z qqwRLiƒ%89}K_1Lo8>N+(זOjsΏf ;,Oڑ ,Lj> ́ON&432Mc0CG::t's'::tϮ/KZ۴UsvAU||| 44/B!B{_CբRիjrrr % )s/*++cϞ=5JU6mڄ /2$''pB"""j_oښe˖a4 1',Y+[o`vIYY''O+>j͕Lii)SNe̙pE~WcuA>nf;()&~3]Քp<}ƖK1|_~4E\Nm~Gխ_FG5!Ûoɀؾ}{: +EEE|ٳZ,L4_~333x~gzOaa!۶m#**dkk pZ.ckV&gޮDŽqtnN|QV>pqqkV>=1CK7۽ɤXO>_mMm90ڃ}#XxAzejq>9rHNq凱cbb¡Cx뭷nkNƠ'_!nsܸq;I&͡cmmͫzzj:u]k12U4"NƏo쐍"T,;{ܹsٲe w:Vˆe4?B!B!jiZͩSزe [l!//ѣG:=}. Q>>> 0`crO f„ XXX~eB!B!& 22RRRصk ooo* 6PJJJ yxxp)|A'N䯿|پ};'N`ӦM :NmOptt֭3FWk׮|۷Ǐ3l0LLL7od̘1[S܈#رclݺgyE{%>S'gԭ<5ZAp,c2hN* wM še~]o[ۭ{i>]lvsl&->h6MZ}#xU)LMY "S<+o yiw:yb!|1#XwWn$$$]jP۷oƢB!B!44333:uB1@޽!&&Ν;;JOO',,CrI;vV5j3gdҥ>}!C|r9sAmХKrzիWaÆ9|0V"??>}l2RSS9uӦMcĈ;$&&2{l7oWϘ1cxYlOחŋS^^κu '`ɒ%7?i$"##oY:?p_'r*#js?f#i\Ž8|4-ה%S~BW?Ƕ֘:ʨs۔]Hv73>"gTI ÕJiiICS\Lщ]WLJZ㕱Z)==//B!B!DSd姟~Ғ:0h ʊ!C}vʌAvիdС$%%]͛>E<MFPP`oo.\Lff&999uggg<<<3gsѫ.SSXXxUw6 d~" Կ^GA&NujKV(G[V %Z2\4&mEŵg}r S7<|޻iBhkYL͏*}2V+Bagg?OϞ=y'ugΜeŊ!eB!LbZV@JJ SL{ڵ 777lll=z|< 7vpAqݲUZ޺B!,_GGGV\IRRjO>sCW ܹsٻwoc9rdLQ5Bojj_lwu㞟BmV]X"FqppuJdgg7xLLLXjzq={dСL>`&MlH!B!M&1}=B/_~?x`j5M5ѡCx7'%%Ѯ];m$&&֨ W^^:RIϞ=?NS ooo(,,$++vy8::"##={Vbj*sZ rKXtfա#e qTEW|)5k^:X055m.@7FEfigPbpU_m- AV3m4z!^{5@Ν;Ǖ+WسgfŅ:m۶6tZBE܇d c'̌t4ĴB`Đ)۷ŅÇ+:WQQQNƊZK8VeDFFH_z'O(|P&MDr 55o߾ر"h4h4uI:Rܹs/3ڊ Wa-KCCZwFFq)ܦϟҘh&љ,#t}ǡ#Ixڜiꃩ+ֹh",,,j~>>>xxxZ)w!R׿jݻ7JG{>dggTw?aL21aii)iq[}bZբRիjrrr !&&ݖ2èQkߴi...˸… Q_~Ϗokkk-[Ɔ |Ǽ;XXXd6n[oł عs'eee矜 wfuߣ))}4{ubJΑ߯ޞ={x70`۷o~#Gɓ;Gq8{,Ç͍FVV...t҅={ܰh4΃w21$O;Ej֫^&WWW-z}(##OBEgbb¡Cx뭷nkqo7ncǎmsX?`ܹ+Bܷt}yV-Jc@/?8yyyXy^|ELZ̍<@/AaL21$xzzRXX,Ե\]]oYݝC5PQm^SZzǴwxyyѭ[79Jbڴisc&ƍՕ+W;ҐcˋO?TB{ÇuIiL¯Y5k;pЭVF!B!$EQ*L8V^ءhoFhȱMtt$B!BѨHbZ4$&Md0%B!B!ƥ4vB!B!B!/B!B!BqWIbۺu+ᄇ3;ր6XatϡK|KVѶ K|Jcw ֺۛP<<<\ocݺucǎXZZјB!B!7Mb]ҡCȑ#$&&ݛ W_;z9r$_~C' 6?o6v(Mܹsٲe u8VGi֬qqq|G=zTLXXL6?! !B!B4M"1V9uyyy2zh֭[Gff\vv6n];t! رcJx׿իٿ?&MbժU?^Z,\o2c.B!B$4<"""$%%vڅB[\EEW\ѽMtR/=ʯJ~TB`l߾'Ni&zmy{{Q(F9>fnh 't!mx*Q(xq.9&v{4jme—OWN!R:yb!|1#Xw+|8 s#&Mĉ|DGGtR jMbmmM߾}!B!BqcMԩ Ɣ̚5 FCzz:gӖ|71|._LvS=Fb̙,]ӧO3d/_Nrr2gΜW[|W'O<%KnҤIDFFTʊ~ۆ3P$a t|O٫H?c8M5e W[x`r6N\5- i^ªCG<5Hz5NòXVUƕ*0hNA^RW,"7hR(:~^鉱$̝*1`ݢxzADDDXر#n]Vs:vXJETTAAA޽^S!B!Bk2iLB͛7۟Ʈ]֖ |I~~ =ތ9˗/Tz&NHHH[n`ڵ 0I&BWx>֯__τ n?>>G/=*rꅲKu>>n>O dW&)?p69'ܖZ}3?%TQZZtŧ(:qmfsGl*)+kWT]b:ze'01]but|`.'Nu_cّСCY`3g$++֭keCzz:^^^>B!B!B_ILO?aiiI4hpҵDbzz:/_fp1c_CvHNN%LJ͛7m}jk͚5X[[s…:ǒOaa j *1^(/ d޶sXvW[;&6Deٛі(>^cfi>]{WoX Ys37&88R~rή?Lyj 9ٵ' T*UXĄ"RSS)--u|[B!B!4ĴZMˑ”)S޽;v|II 8::;Z) Zmu}=]>CYx1O>dRnfȑ 6B;t|m,ZŊD }%kՅP9&U㞟Bm7絛1qt򲅔%\ Z]Bt墢\XTTZ_vv6klc9p7ёlB!B!$~XBq; ---ty|||eْ,,,jݗDvxߺsN>sY|9JCj*bcc i[kPZZֺ,YuHYµեmHx9e(LL !*23(OKŮM,Tbۧk>AS/S LyM1uqHj3g޽ХKΞ=[k]~~~D!B!BZOL+ FAvLJ!CBttСCueڴièQh47LDێ;HNNfʕM~8qb<ôoWWW6l#GE>>xxxR!B!~jT*zꅭ-jBBBѕS(KKKHMMe׮] *--e̙3>kkkXfM ~~~|7X[[l26l|0ަMpqq_Օd.\HDDDڪҥK9v whJJyr8o ϾAicK٥V_~e@~ۆچ_#Z#nxI|Ž׫*xy}N9`}Z=bgLW).$ZW&x/і` WOꕘna*rjmsϞ= 0۷kc,^ӧ3sL={UFɓ'OB!B!QC]Ԋj۪֫^&WWW-z}(##dff! 0n8ƎˤIlN{ s%<<!nKחjڒj4J>,Ci06ٸV>MTS((ʐ);;; $OIaaasͪ~VZz,ΡCzy\}V{USm}cZqwlܸ{{{\]]r励ù+O%)-sw<;>cjaMEY1Z KS *ʊq! +B!Bܳ$1-0Fo5vwUtt\B!{gPfP^bV]FF0᲼ZG~.!lXcwE!B{$ ]~d|B!D5ig7g6;t!B!y.HY;~]sw]oooBCCg}]֬Ys7SuV g;{6<> [nرKKKc"B!BFI$vɓyyy'iѢEr͚5cرKK?ssscߨu;~uw5sehʾ}?~ =[rq~7ziXGI.]8zbMaaa2mڝNB!B!D$jSNelB^^GUWŅqQRRBHH6m… ]#|||0`A<_'O&22UV !nGpp0&Lء!B!i鈈"##III!%%]vP(֕ٳ'˗@R;2ssGk<M oۏkx . E7Cq5t++ T,/>kNBNjs 8|1s QtIHH ..\]]Yt)G__~5͘1{o>^~e}]v/`߾}?~aÆըc۷ ֯_ٹs'|ptt֭3FWǤI8q_5,]Ǝ[cmCOӧ}vN8M:tmMHHGP4X=<<8u>'_abbR~݌ݐ1fbb¼y8x gƌlݺzFApp0ǎc֭<3(5dbmmM߾} !ٺP~ء!Bd;fffFNP(zS2ȑ#i޼9DDDpc\+ Mi) gJI*-[땳ދKL]~x-z):vxx4 t/+R}AKT)I?r]xRz1 Q# #zͮ~_:3K1fp'y$͟KQ1xO9=zQ>KKKʘ?>/_]vҥ <or!pwwìZ|òeHMMԩSzuYYY/d.]?EEEХKrJիWaÆ1wؑ_~EV9s ;vyCϭ53gtRN>͐!CX|9ɺ봮mW_'|ҠNOO',,CrI;vV ׭z cӦMcĈ;$&&2{l7oWϘ1cxYlOחŋS^^κuʪT* b zB!Bt5Ĵ SLAPPZZ͛IMM@TbeeEn8qGۛR)=G/=*9K5ʩHY24J"q{El%sبW>󇵸<9LL[Ztŧ+E'|&τק)1l@vpe5p< i3Is1pD{fȑ\| Xb/OӱcG]bzǎzׯ_ѣyGj$-,,XbUީnp_LMM#;;C`fΜIVV[6Cz|neĉuV֮]ˀ4iuiO>a| om۶1{lSQQAܹ3~aP c'Nf߾}{ܹSs3gdڵ??iL{yyݑc,B!B$sss駟C 4`rrrtr -[$ LL[tBKJH饋+21qtҭ8:1k}aGO֨K[L[Y|z\,S'm%" \,,,n8KvHNN%Bo$>>MsniӦ+&&&zlyy9ϟW_ƻ EEERZZYCϭyfmQQQo߾^mYkk;z}ڵӫW/<СCIJJ;jwL233ѭ;;;9s3GZ-++g!hlJrrʩ%9q_B!MPILjʻLBٵkjJEvvg<ݢP(@55?[絛1qt򲅔%\ Z]BYs]ua^uSܿ돏Ǭ'UlUS7\*˗/ё+WZO>uޢ"$w]SPP3?3Qw4$C!և~7/'ԛڧpAqݲ.e]Ν޽{ jѱBE[;!B!YMᇵQ(zwfddWޞBcZ⳧1o sH+G)%%%XXXԺ/))vm'1_ ԥ;w矓kMnBBB0`:tϏ?2Ty7dwcVVcGdddB!B!?>1P(1bڵ  ѺrjՊ]D`` l2%i~zg78J% S3/Xi>E  :ahS8?}[\qq*3fnzI4zp:u5)cYr%AAAx{{ӯ_?&NXS!11={T*155eܹ\ӷo_K[Ν;so{zF;1bD񉈈}3l0FI-x{c]υZf3k֬;TVŋ$>>^o!2:~&MD~hٲ%oy_2~xONVgɼ5ÃzC!B!B}bZբRիcǎeĈ8;;BLL\tt4{K.L2|}e.JSRB̓)gna<_UJ*tp<GS\DѿaLCtu_(mm߶۾F+#m/>y饗t4[o?;wd˖-s:Q#'GeѺ}dŌ=uٳkK_8~8| w'۴i_5/26mbȑ,\:ɼ-gS0$ݲz[{tB!F$ڵ+:tL9Bbb̫Zgزepǜ 6?o6v(5̝;-[ӓٳg6mb5>?zhONf͈㣏>ѣu.Fll,ӦM?7aB!D+-LOjYuiM8>lģ"B!q5;j5Nb˖-lٲkN >j싋?۶mO4'N_ҥK)((`رu*S%44kkk{wNB!B!&̌]P(jLQ]N!JabBmhvo'e<^yS {?^o/%D>ҕK@Y̅:T~H')n_u*`wE'rsfÐ5ѣ>>;v$,,LV9s ;vS**(B!B!BTd...̙3^z=zyfRSSk-닓gΜ1v7g|{;Cim -[)-!.R)9{Uua9H#r6o@@=\Y֩ *)3l5!--^;;;:t(tЁ,\\\ .st™B!B!$~O?%:t`РASlΝIJJu߽BV(G[V %Z܆Ǭ9t8p)#wFʯd܎fi>]{Wo2UcbU>TzB EEERZZY\ gg:oB!B!B[k2iZMVV)))L2ݻk.rbjҵJa۫6=u <^~!409}秐s[T55nT겳qppW)((ٙ#ٷujBqu CUa9lgcB!Ni2Sy\OPzwlΝ)..&66{* B}G j"3Tabٶ]e2*<֑ջgΜ{utٳgT:???"##BXL4;wsNv޽{Q???3vB!B&1P(>|8111ajjJqqq55% ӧOhms6 SW7 :?@Pr|aq6 T.GSZ9MHڪt%`Fꊥ0qtk\tlj`ѢEXXXPVVOT888J"..ugsϱ~&NCTÃPcV![n֭7(ܹs2vB!B&'Z-*^zakkZ&''bbbʶoss{R6mo̜hg=C٥5^WXm(mH~52uߣ))}4{ubJΑ߯u7 @Pm?V.'oٳ7|}v}666_^޲eKH||B7v4 |ώOz7fpj{t11}!4˜d cC'OOO Q\\6E-i-˸sС@*-5Wk^UT[zƍՕ+W-///>SIJ !hт6mڰ{n6tž={̌˗/s%zqZQ|+zlr|c'P?aL21ɸ Ah4 ~ ::hc!BU$&&RXX3ؿ?:t`ڒĊ+B! Ĵh0 >oBaBBB8pp ƌc0oGgJ a{L!B!;Jc B!B!"i!B!B!w$F5''g4۷5v(B!B!Bq59vJppp 33#G+cbbB޽i۶-VVVrNe~Ѭ[LzM`` !!!deeѢE Lii)fB!B!ni鈈Tڵk.1Ibb" DFFңG<<< NL)7ϟ ZjNRR1'jE5lޗ=]h˚={ҙ5$jlӮtӹ}B!;N@QPcjaCEYao>=(+˪]OA\!`bn (mfRUA‘ό!h+@[Zq ㍖yB'ffftBAzzn{rr2͛7///tuZՕ_Ow{5>/J^^9#G6}u;={_ ؇M!po7G`ayr\ܳMঞY=(/ͭ笝}{t vh:[ zajnKI1rۤ`cwUqhwL0e l޼TÇ3Ϡjh4ٳxb0`?EEښ=ktwDZuU.RPPEԩrő ->]׽2B!D`bf@VnRϬ7v8 \Lk;h w5ֻ; vvv4XBMM&1O?%:t`РA@v?$;;///Hii)qqqcG pp0#9yDmrLn=.j\V-C/2bmKĴB!B!dj,RRR2e ݻwg׮]ߟ'O @ff&^^^kQk4ڛS5'5JA!B!B!M&1}=BJR:V[DF`ccwœR׽3%ՓPyVV&؇K!B!B!FV( >055}h4$$$ХK233uSy<8q vdƍС8R ciiB '223gсޜ9ԩ-}B!B!iiVJW^ڢV!$$];vлwo%;vǏK/[ȸq<%%j:'X>脝)_;cJ!B!B!+}b`Ν,SZZ__UvT* ww >"ڷo3]!M̲e8{Mo;T!B!0&姟~Ғ:0h `Ν@ JrH:mt;cPhƥ m-!z"c&!=Uq&$KrHf~Ƹ<0+G1Ֆ-g}bZP0|pbbbԔÇu5k;W\ښ޽{SXXxB!Ԕ cѨXغa@qN<#~ښ˫JQϩPTEd^Ga֥;ot ZDBM{I'1CZ-EWѸt?co=p~V>]~!n'Z-*^zakkZ&''bbbt4 :uё 8x *]B!Dݻ !664*;@qR;la$9 FTE2}!i"2"c9BC44T>V222駟B!31cpEBBBرc%%%M!B! Jc B<Ӽ lܸ777̙Æ 5kO!B!I1-Bq"**?zÇO2n88%KB!B1-BqUTTŋY~=&&& 0a !B!QB!wB 00{`mmMJJ 7n4vh>TVx[wrjEA9c#sʩ ;TEW0qʩ%9qG^>nĴB!Da )+<i޺?ܼ;aniGnF,wL :6w$\G'h].=&WqtmEAn gj ĜG>GQsj5*f +^X+?pJ_ _p#B!B!w5t޽!&&tf׭k4t$הզ7g}GEyielpa/|)_KG(̽Lr!KLwGt&]R:T25.O\_sѮXv8x~b -sYI|*[#B!B!w)@Chٲ%۷N*XXXP\\?/cm}o>zWb=s~=FN)IˊdD:1]< -wgqqlGD@~Vo5MS̝NxW\:(m. 3$fC4T=B!DC{7iٲ-˵lْ7|(k'_c"swTEWJ +rjeP0khCBiwL[YY1doNYYYe PVTPQQRY|/ź_=IB_u.s+ICvq'yѮ[@J!,Z퇵J ֎%s1|3܅eƑpk[7lwyxz1 +[Wm+M8[!1B!ڰa믿HHHi9WWW Ɗ+OT%?LAT [7Mzƣ<MܧkT!FvssƆѣGU%_yOYY֜:u82]\lx :ԭԫ!jIIϑC~3,$7ZM#%JEۮc+ӟj٭L!̶\oF]nH̆hzB;W_1տB!B'/_?mj/ HKK[WFTҼysΝۓKs(-ι2uՒO $*>˕FIq+ݳ}ҢmJLSR[k6 K{m]uu@]MAR]]B!0!wI !B!O>1]QQAvvvmo?uG&((K.ѥK8s挱P/n&nNRVW4WjȽG ĞنBiBQKvQW\vZ '}Fz)r2.?? ¼Tb%֍Cۖ\8 z } D.1dg\U!DmBUZ]Vs=B!;!B!5ĴٵkAAAٓlBnnCU\.vMА7011'?';>ĞU20>QLr5(/#VzNk?s{U<8ez=>rU1ub>k%vnLwlbN,5  xɕL,!B/jpyefΜeŊ/B!@YںzC޽穙>B!hWuPZ[[[RSSݕbݺu,YZٓ3c ѣ4i >Kǎ7^ހ]{v&oYoC$yT\q[K{eg@AA-o@*xh( Ҡf׷Y}i0 3{OS 'ISOSvN^?q}vm3.YDAzݦյuk aw1=6e$.`jnmxoC> eyq7l<==),,񬴺>;vz2:t7jKj/mW:֫?wL !BJ<\p7 r9\ž={5k...7PჇ#L̬ne9PiC$X*( ƫ7~oZ|iXHqcwVzX{ң'h*xTh*tKC>wm_f%&֔>uO^STJҎ`䇵^?q]SQw_$( lymG#&;50>60={.CijnPo|c_=3Kr-@6HbZ!qss#//Z"ݝf͚a>3yd{=f͚_P.t[m4@qvLHx7// [W\aܕ԰M@ cm@W,ȼt+owL+ T%$ܣݥbSt.1y/߱*>[^9IQA}zGSk51v m0"4;B!C~7.\u۪xꩧ5fff\|K.ѣG\\\ҥ {ٳ >777OZZYYY7EG-F铨';\;*ʨFSiJ2ņWשj5)HTbD!i!BHRh;t %))+V3ؿ?Ge׮]|7|:A-B!7#i!BT*3gA$O<AAAXXXлwo߉'3fL5kְf)B!hڔ`m~a;ۛP<<}9r$=z`ȑ9l0B!¨m۶eذaűe˵ӧ8::r9vepDX>|̟3v(Mܹsٲe uxh۷իWaÆ;ΊN+ptcp|u+cX; cr } /+/ Yxv!3v7eȹ #66iӦ;d!ɓ'TJBV;><'Q^9y?ΰa5:>~xGPPׯܹ'<<GGG~mzms-鶆ѤLe<ެ\za1,rCx>5i;,G?Ntsꆃ9s3+;ԭOmyڙf39s/gH_l"aH{"ǣXXmn՜qϷ~ј*/X[[ӷo;tƅ?5oޜE2|ݜBTE۸;!V5.Krn&QU {*N'B4󇵸<9LL[Ztŧ+E'6x[BSZB]h)OKi2ĜyEVcn=HY@fsGlLv5.OMSbڐsaH 'N5{ oooF˗HJJQ+Vhx"O?4;v%wءW~=GyFb‚+Vp9v`Qޏ?\1^c]X\y.ռvf>H^|Ez8%7õ2kXĴ% . ,21S`+G?bߣ(οNƐiE](VZ\!y:,b^<5崰nA,8?Vou.KOO˫NB\^^>B!B{^OL[YY1doNYYٝm+x]"FJ/]F^n Ys37&88R~F]rghwnc:8EGu#W2sx/v}wNO,!dfi>]{W/MqV2\ү[\*ֶڵkGrr.)}#hltL6 \]]111ޞ3gԨ7:9v"(^h̲L̮];NNC?~xXz`0̑95FExnxUTaJaE!%ɔK0WߑoKƜs853Ɣd^S6N[vbX8s0jUVVs?/0 ;wӓ˗/siB;=xc"B!ji777lll=zn|ů ϯg h.j}W}3-,TTj:JEͪ wB  ¶Wlz<xQCzSapv %q(ke3ϠA|=};Ϻ}ƩS\,}BCC]ֺv/ƍ9y$; {6vhBLUTB6E@Ƥ7UGuyݦq}'Ɗ?1m(sss&Oɓqrr`Ɍ9:4%%<9 ~ vQ$\@+ӱjH{MqGw.Gg:Ӆ4O8߆?iqF#~3z ZCc֔} q233} 0ظq;v,&M2hN`1uTc"ΝKxxA;Z[[%ݼy8p 6l !!___ƏΝ;}̳> oPvlgN vvvܰLIkpEƤ!O<{t ޽)ώ$g~#zcӓ̪Z7Ssuuewww:@E{MګjjU6n܈=\R݋LMM֭Cw~$ ֬Y'_'N;4!B!0*IL Qoa4 z!c!hM)kѪU+<==III!!! !B!Ib zwMg',B\/88ݻwBll,qqqɜB!BQEMXᾈY!^~~>cƌa̘1\xvAIICޜZ-5-JRUKNBR|#vX:ԵeemV\kET5&o4k;[h?Jxݨ<:۾XңT?Vg;W՜㺇'׭ڼ~ioC%=CB! 駟]v <2g{96n܈!^ui/Z-ztS k*ʊuKFBiT٢41CibN֥ wn#PQWը05m9.S *ʊt\2/4 1Y^(M-ه?QZZ5W۸|Ɣ emmN۷٭{9 ' Sq87,[ܪcU4ұg~Wrq (8kC'Ib| sNgP/¸qHOOg}]<<sz!ΓO>ɸq8pK,1vB$^TEX;?`V åMҸ{W.*2DIDATJӻcZu;/7;ea1mO<;>y&|$tSӀWשF=g:'w/E N>=4Vzq{땘~|z4 Sc(H?gC'5t۶m6lqqqlr@FF%;c͝;-[9)m,clذᎶ -y3~0_];,οwXkm_ʋh]Ⱦ+Mr.ˆeڴi|Y&PN8ԩSyꩧ0`$ER~No'7.;; {]U1  {b{Wשs2|ܶ-CzS;dooO>}̬m۶$&&֭[`̘18;;;lH0` y Ӯ.q $<7_zB6A3a,,,MBcǎOhnw3v;9:N>s6(6[~m~H_x*p5Gh&7'.z.x:Ic%<^yxm>jՕK_qQ~WW܌3ػw/_׵kW 6FǏg߾}~z?Ν; Ύpqtt֭3c[F:2xopqEbŰҋ73,'94}j^;ZM#vX,=H"# 3rF3:gsgVv^[ڵ3,f r.s_3ԩ_={o vX,?*6Ŀ; C/wS)t \v7 lp}^#44kkk{Gϻ+n:VZÉa…>kI& " 8QQQ[Qq:+UGm}U۟mҧZjK{`Qq("A6aBIIz{OsO\w\~m/0f Zzj(J<|:uNL8qB}~i%MMMzjܻW:^HHHm |g0 <-=©/-}DhvrsQGP ۭFwGpsfLo>/5}I+1m&2w?ͬҾkXh c1m&nccQ^jj*\]]"Zpp0;K.AY""""""GOLcذa8~8d2Nٳ'7oD;CNJW(!T6Q/lyB{3F"llQrC.UАgڇ'yBtx y.@z&Dq?W%#o`wrϝBCiHi2.l 4[B#gFi.DAܳ:y*S 5P^ $LMM!+֮];$&&Vy1X(ˍ D fΜ ___888@$Zuz!t؂XuR2B2dhbkI,l"ƶڑ+VNGba" K a"4V}QQZ}4}Sﻵ5L8H-JE<5!8>3tRC@dP yv"cZ]"/0t(ύb)DX_֕[EDiGGGXZZ_Nxc~~~ƁW[P.X}fc CW! ؼ@|$P|!{al8>‡As%9=w cƗ&NP1sk\]#'mN**.dY)t}"(ުU`kkk"!!%%%XnzLWPP~ PO/4 'mzqLrDDCR`O=}X&_և\)GNqM!jNnobtY 5ǪH.DV1XU槲D"QDDD)*&yZ&?f:FaV Nްh≼{iV,l|aޤ QT/~;v`[JJ =zݻw#??_]o߾С~j%cwoģL\~PqH[_$(aY*Ur9~>Pzfv^9]`d=9`(Xt 3 ]MdXcTOgֶEw,&JBsuƎN0jb_a0iӦm߇;\\\?B=z-[pu"''nnnծFFO077v;U}-,[T8'#c|-.e\BRavrƂ_;׳?4] ζ1As0U܇HqhQ\柱d{{H6mV:' $MPD}FiѩS'?ptt#bme>y|,Zb~0i !V*!UP1}9M/YCX#{GMM!zȱp&̼S^JDzǜ{8TJ%wnAPc{o`?}&^ Vm`ޡ5.,{Evp]-ntX]UGp9CôEk~*Eqe/^Ν;Tkۉ'knnn߿?Ls,JѣB!xbX[[7ebccѷo_Դ3G'N`n*DlA,vD?~1J p@c1>\c}=aM"Sv~ vx{`knӪVo4vL찲Jtt8~onވbxh-n՝WXUW幻ծ}bZW^^^011ѣ1m4G:ס,,DQ(|mASdtςyz]RZW{ߒV~ :A)8Mɘh1?{ MN@5ʺƬɐse2lCv8x D=6JbȻxB^G.-GU9~H:~Z?cFwn85 >s 1p@mEEE5k"##_xwW<~!pI@*ƍzQ޷~ [[[;v W^՘Lٗ3ƪ’B4 aa\t/CTάѦ#t׆\CAIάkӻwAʘLkkti,ys&/`ʕ)ZElYĸ0wXUp(IzO؏/nĩp+RR /UO1cƍv'(2*^ヨL=JՂrʖnFU@FF.EǺZZ"f~InY<&L1uT攮~XYYaƌAFXYbF#$NđdlÇxbjOWTK7l۶Сs{?:yyyezε9NxxZ6ǟKp4 ɡϠ}xL1_>Yk]3K ZRCe @ E{r7U[2-=?$ w}wTr9.@IN6.amm 獑u:p.J9YlK;w]&"""""""ab5HgP)޹@)VX^T_yP(ЫW/CA: Dr6Vw^ J[ٷJ+H+""%""jJ[@dbyAX%j54e"cKCB PkGDuuŪn/NKEچuZ1-んO!F˃j^Q%ܨ]A9V(̊MEEE?lsN}Ƥ7vQ{)w)AJ+̊Au*kn Yۈ лI"'4t5ennaÆɓdO-]v~CTT &MEDDDDDDDDDDWϘvtt%|}v(bff&ѣG>}:^|E:uлADDDDDDDDDhtRRvءnС())ٳg_s DDDDDDDDDDJOL+ H$u 5 Ɂڷo{{{\|л@DDDDDDDDDԨĴ.T*r9z Xdeeѣ4txDDDDDDDDDDJLL8p@kɓ' yb'oCB:K7NǏ_ 21MDDDDkٲ%ϟ///H$EHHV 6%%% '|bЉ`bݻ>Ji,^U)  k;?z*_U?7>^_ȐT*àzi"""F&33'~ aΜ9x8J봶w!X 0t(ԀUV3vX`:Svcb$$$`Նn۶-FT@lޣ?G01B$7l`:T"""GΜ93ghx".^~:^yCJDdPi v򆕳7R9-.?.IrFr!"4Ĵ5z]y*<0E'!+ G׎ulmЈj$B!F@TE0GQz_>/^[~РyPf-{KG01BvZ7~S1s$vPР:Fm3K!><. 0; 7 -: EI.g3tQi0i???dee!22Ҥ.e-;Gtuu9}CRl0ZcP!M3=8"i<?#7+IWu!aӧֺƿ(^153É=o=HD1tQ:///?Fe'v͑Xzz_k~7f!<:.q n ۗ6#~IXmJDËNBSzǔРJ<> DDDDDDDDDTG6l?LV26}3'!.etRjbf3fYX.U?6h/Daa PS [xN$^cY^3&zǕ}jDDDDDDDDDTĴ#,--^'>|l߾Uթ=RZek;u@8eS1c,p1`93R*0f?Lٜ4QډtPN(2~G=ކ FPȤ{Ss+(R( !@C 41tm  YL-DFѫ餤$رCcСCQRRg"??R2*fHU2UwހE* `dl^d4oۿĴ@ {8_HL`GwY&͆s;ŶʹٻPhRpt(!""""" ?Kɰuo X?7:ypsxtJEOӟ:l"F' $ֺJee7OWW0\>yُt )qХ<8 7\(WO|V#?'Q!22[0;"PNAs =Pc?)Х\5$5]3s[rv?n%B7Yh=Gsi"""""z$Cr YYY & DDAOL7Tt]7GSS1r2pz!7¡YGLƦ8{V@h6˥xa9|)Rd$CH&혅A7?B<ȿ9!!+EHU.6,MŘey|l"2tQ0- - -D?. JKK2 Cաm%mfPOWTHNN6Ko`۶m!JGGW3...׺ۓUѷ,䄠 ?9J(+?VʖQn1Ϧ{*4)1Mu9 gLQbbӵ.Yp|3mf(t͂Ҳv* [t F,zggg{! $$}3s E֭N833g349۶m#G"&&~~~(+JqZm~nV4tWfK0,.*!a@jj3f 6nc֬Yhڴ)bbbf\zU͛73gbÆ 5Ĵ5z K$;vLT* sŴEk$CbP8p ƏoPjE>}?.\Sb8q"58p˗//_զ3P(ȑ# ( ozck~D ^G.zp*bx_ 4;&c'Ը-pv"]baS=ɓSy8L 0W`M]hw2|"R 8]5.e`ԨQCLLLq;88/ٳgqUݻP0k,?~ׯ_#FԸ-777=z}ԩSqulڴ /Wa=00۷^CDDDDDDDDT43HTX̓RDjj*.]WrZhn@YT!s0hWv颥Hh1 nv?<Y\,!׫Ֆi6h'YGW< K a8vPOGRqX彏"= yN(ؿ:˿B²Pp#f-[}PeHetwܩ0333lٲ2 }Ю];cǎܹs_6lVZDV-OOOlܸGźu;u_U\RRPtI\pzA$=<<]vUZ&%%NBvv6b1|}}1i$ر:c;4/@X:,6Zxߘ?@i2k`3t$gEze-6FƎHgB33`eeD#F?ܹs-+!55xBOLcذa8~S⍎'$̚5 ֭-ΐǪeI{w`3i!0,qybysP;إ-]fKWhlSJ:'SS h׮Չrwwǟ.<<۷V[?#,,,eyD" 99EEE066.L;;'aii :ϟ۷#77Wyͅm @UODe0h@>(NYiJ.83g:rN.SD"M%U ɺi/gaҤIHMM#//vvvؽ{7.^t:[[[H$ZG""""""""IaRRv؁ݻwo)))xvލ gffkkJWDz6Lݐj* fܻ.5ȱHY τۋa֪ ;tz)sEtܹ¤'knnn߿?LUΝ;ӧڷoۇ#Gb̘1h޼9|Mx{{k\Pҋ~G¼yhӦ -[sssZu9DDDDDDDDDRCW}d2qԩ F[ C+ʦof-,=d ܷFNpy99A%ojUFOc]DKuǙ{AY(wtR(RCMz)s|8p ?f… _qqq_ѦMlٲꫯo_?`oow}HLLqΝjU&11+W_|`\~.]g}Yfaܹ 4.3fܸquz i@YԂrʖnFU@FFc&L1uZSygiiÇc 1t8DD#,R l]x m  5BVVV}7/L6 aaaX~=7oU)h.uԨQCLLL!988/ٳgqUݻ*7{l;wϟǻᆱk׮駟py\v ;FUĉqyb߾}vN< oooXYY!$$!!!Ųe˯򊺎Sشi"""_ //Ǐj/00۷ǛȐ @mCVV"##㣵!!!3f 5k|ܹs:!47GG,*B܂ِ?Jwgz(gbOEG!rXX+{4 /!/WEv Ƿ?C(׮<Ѧ\ -Bpw脒< ij ҩ͛'''\|ׯGnn.z ɸuF]x#::^^^(((@^^tt*~V̝:u¯^.))Ahh(:uUV.#<<8}t=!4Ĵk׮ B[n~:\777 4r\)=lG枸hr%99xGR086,vW'(c3'M͠ffxǐ.M\Z~U97H&VS6CGq\-,MLxOA)8%woktRo ,M␾ؿ:C+1ׯWK/7773IIIryyyXz5J%>|^{ :uR'O8Q~߾}G~ӦXz5ݻ ѹ`eeD#F?ܹs-+ 55:DDDDDDDDDR6l?LVa@HIIkΉisΐǪ)~(eEfDM"&pa "[ЪKU,44USϖrw ܓGoߎ\rH$hM4P.X~nǞ7AdkC (hyBvUIgAҁz8= Bܳ7,Ìp~}"#<9ӑsH=D~rT:WIII}تU`kkk"!!%%%XnzWPPGqq1`ggݻwŋ[[[dffV[[[qMDDDDDDDD?LJJŽ;{n-%%=ݻHKKsu!{&-`{2[PqH[_$(aY*Ur9O96K)-̬mhXxwXgޡdq&Tˑx)kW"b6{O"# )ɰ C6m*v}ť}# ѣGlٲׯ_Gjj*rrrV:adTwBx"]tݻw+,ߦMU;"""""""""CiBDqS((..D"Qzh]vE&MбcGxzz>|Xy'~`C9TB>#c4sC_臰4 FB |}Kz yG;:i$3vlF?-Z%醌m m;r,f 30vqסR)Q/R3bjyp`V</^DΝajjĉHLLڵk 777SLp)=z@(/uWll, ;;;jyg7D6ml2ת v,DDDDDDDDDPӺsХKL>/Ο?pP"r(>ݩpY G :qg}Gx_A)-@տoI+?Mٯ?k`7$o澝Hpy;}v_EPpLI^.6Cd{ԳgX Z ͰQZI3gΠVTTYf!22_58wyzχ~///3cϞ=ر#,Xxnj7n 22ڱi@iZPn]ٲrM{??*0tP=7a?SNiNŋbp N'˫T*bRo`۶m!+++@^^CF f\\\q3ZUѷ,䄠 ?9J(+?VʖQnq!amm ::Ii""""""""zOT_~1tu*""Zn\WzTmXg094w\5 Xz5BCC 5 LL7`>!Q=ԣG1f AWy-X {{{CNX,:j8Ȑ8Ȑb1$àzi""""бcGܻw8s ͛{{J/Zc!Ptz7GG$ 1ydCADDDDA <'EDD`n۶-F/ZO#"""j޽QF @JJ 233 5 *1mmm޽{W3ݻwk,`񈈈0tDDDDϕWԩSزe rrrj*Π&"""""JIL B9ڞܵkWr<|С=WT*~G㏆(-~~~BddN;w0( CNDDDDDDDDDԨ4Ĵpy{zzI& 5tDDDDDDDDDDNOLcذa8y$d2NABB >QSvtt%|}v檷G5tDDDDDDDDDDROL'%%aǎ={||| JeЉ꽹sbԨQի9Uժ-[bD"_6lOOO $$|9>*g-?S7_F^^虱œ9sУGL4IBz?BD"Ѹ) C"@TXODDDDѣFYfȑ#! 5 999ؽ{7ƍp+m666Xx1F]aRjCELG5g 6 Æ Í7o!//DX~=5KeT}bZ۷ !""";vĽ{3gΠiӦ7tXԀdffDfgg9s`ܹpppz.'Նƙ.cjˀ͛7̜9+O|/ z!@hh(;DDDDT}*aP״iS|8uN8^/cڵŗ_~cI5W8llqQmk޼9ZjӧOZeT0^SNa˖-UxV ժ={K.ҥKQXXW^y:t X^ٳg… Tcն;">>u|Vx{!rҳ֕- -D?. JKK2 CsdyJXdC 5p...׺$+INNN ܽceܭls*""""""""""[LLQd&A.cafĩ .C7󓛰qh}i3C""""""""\KLm#GDLL E"жm[#??qㆡC2-hJ_95ì/n8r2bPU /ƿC!"""""""zA%ѻw /燎;ѣD1tP޽{]åCƵza+_Жȕyƚ8F~N2BjT 9r$㣵񈋋{pvv~ӹ m3@VZ$5 }u=ĶO.9t3νgo'8m& ^(ġ-ӑC_]+;wHRmqE ڎ#_@sYrBvF,O~k5uY1M.et1; 7 -: EI.g9YkUV'w/C e?Bhv7~Cnfb?cz8B^J:I'V?ѵLU^v`i`ivpʎ>DDDDDDDDT31l0?~2Yk׮q1H$bРA(**BLLu4nzk%%\6uyQ,ՆCKܻKc]Z8UOmJXN[>:ǜsS3k<:@x>BRnBm3}ƬШX.ՊcQG}B\~  7G2UxY U\;^|9Ɉ ?W~ """""""'aii :Dcŀp DDD222 ___a{{z9/QTZBQe5:֪mA5bRCTWTK"'=-挤0dyh"< Ƶ3£e% ->bLJ;eN[Tu,R+}ں7\[O>vҼ䴮cCѥLT*ܻ zLõw ^Y~ """""""'ctCEII Ξ=|Bk=WRUiY(fոLmIaN,K4h8uX 'kK;FP**fJkh޶?Ŏ3&-:IJzmi^sѼm]9Csq{*ZD9uUe@.+Y1 ލ^#>B`aWwI_1P( H4n ŐH$P*P*C.]вeKTTT̓0[pr]S/@ @o`܌v/LD)ulߡKܼ꒹[&Nmc:ZzǝKsRet򛉄BCKߠS>d1ѵQk}O7aVuTJd&WulT?kl?Nn>vJR &$9G^%=Ӻ:q0h !??v횡C;(#Q{u',7XX;!'3'vXqlY1 p*D9W̏/o' +%I2AP,⅁(Kt!j}dEޟ@$2$-GqE]FUk:b#06Ýj{e'Zv=sLc,jAue˂re7{ǏmҪ[FFm%mfPKOma37j96hE=zOWTHNN6Q뜕#oCe @ E{r7U[2-=nhѢ̐@$$$:RJ IS-^HMM5tȵbup2s[c>FF_>6 K/aJ)~q8b b S.˱y&0sLlذQen OO ;w_5 !nݺj]ciٲepttIJe,^""Рݻw ;v ?v܉lC^l/ye1p@?s5 R28p/__~N'""""*o׮]̝;YYYؿ? !!2 ׿4&T7nT빷oFӦM4^""`B#GD`` |||h.\@bb"F6mбcG\tIvg oĥȿr q (c C [AoW!qǺ0w@qzJ@w:̼ڣ݉ r˃ s˜F8hm[r%쐑>}@P`׮]ضmFӧcpvvFnn.]>H}Ŋpvvo$߳g^uM]Y-f 7=wu]ףy3L^wn9O?}cĎUo[k}Zq;_S0y(J~=۪}5r`gN,@2 ӧO?cODDDD4gΜQ?5kh9|0BBByZ Z qI"/^ĺuPXXyЫW/( \x?sNИ1cƌdff>Cxxk0i???dee!22Ĵ@ @IIzBלV}u}_( #' ٖ9Z?eQ̆Q̽;ԣf]}"a{_,:ÐEG"@уlcf|quwܩt{Ϟ=_bh߾=6oތ8;wУG{Xt)n߾ {{{@GT<*Djl1 K-^܄؂X\ϺS99hgUO1i yox >>80"#q$HU]}Xpk]3T7zt)˱(#___&^ҥ =z-[k׮7nO? GF\\@+V [n^urOz۹sg̜9'ODPPd "" "1///ڵ ܹ3bccQPPDvL~l:s[}j_TW4[cKWHv0,ӵcQ^jj*\]]OjѣG8qΝ;C">>1l0o兮]b۶mYڵNL<%  .Ԕ9 'O>gS'ODII |M,Xx!T*m<Ef:\uy0vtҌǻ3tedQ1Q0mѪZ}`jj \^x͛ϟ?,>|+WĴiP#R7ZZDhNƺ;9wJ\>JT~jyw}d2: """"j((( _gΜ3gгgOC(#{?{Ŋ+`ccc. ""iGGGXZZ_쟁cEvv6ccc׹4 qް 3f>4@ tHv X6jD"y?/FFY$XFF /[nxW1{l?Pa_$U+R6!Ј T/fc2A6۪}7[[[~@DDDD|XyJR݋ॗ^{gl\LJtRRvмpСCQRRgj%Q\\ +++4o\ Xs <ߣӝXDһa?}&L\!Pi=fmA`dB0o(bxRXXڴiSVZA$&ֶm[q\r۷oG`` v+8//ZsFP(t~nsssX[[#77W}q]65u鄘.-F;v,y +02H`xugVm컡i{5tDDDDDÇ#GB.ѣGxumxğ'O,"""jT DP(P\\ DƺiӦܹ3\\\ЪU+wչ-ۑc0My+짼Jǜ} hN' s4uJlIa=d82vR>x":w SSӊ㶵|OOOؿzСC1ydnM6R.s]o-[@ i`mm]a{GƉ'0zgv7GoD| Z[atk ?G.s+|l}ex[5108:TduVvZ661Û/1G=5QC"`Z1PzܺeA岛e6~~~AiiiUa>s6Bhij &`:u\+W-ZTg? 3f̨6/l%]XZZXx1BBB 5BγdyJXLT%"i͚5֭ѣXz^?|0,--ׯa]""rqqA~~ h-WEOrpp((w|XY*w+[FǍ uKgR K,DDDtT*/՛6) իQCADDDDDDDDhN+lݭܨEDDDDDDDD 5.LLQbbTcR)6nܨŐH$ D||'"""""""""jTDb$ ;^V*===1tP!::]v/]v!;;5 f*Bt-33Sc{׮]`ddd̙3dԩC'"""""""""jTvvv7oJ%RSSq%tӦM^V*HIIAӦM :Q ΘNIIS̙3I`iiYB!LMM!J具z NNNJ0tDDDDDDDDDDJHLGGGHMMETTOD"x{{A ˃BP v^i0SyWXX\JJJ `aa[n!&&`nnTjpyʰ^77v\(Df͐bp9   5`"H=Cc Θ1bbbb P*{̭[___DGGK.066Fhh'""PT5%%%"""""jj' "1-зo_A&!99NBnnLll,N:___YYY@vv'"":VQ"[R2QejjZI5 !Ѭ>zNݻ{:\"""zd2k|MDDDDDT!e"I ri"""j|j]qq1D"bw X HPLL"XYYQbll +++5rM11MDDDRE CT"!Q `kk RYҍ5Q4cRFFFDDDDDT#ưRiMBWi"""j0j<@|B888pi"""""X B畆@l eٽAzHgSWvL&5amm SSSNADDDDDD055 !ɞztCJ4???jJظqz{3lmmq=:uСWXMk}BoX.EX(,ȬQUQ}"R*\_\\bR}tE剈q+K2T*uB7V "1 ǎS/+J52Baa!\={:\lJ*#f䞷kVmCDDdH%[uHWxnhV(HOOtD"/YfJ+f- R/fRnizXٹCm@(BhvBzۀMmHK8MrG~s@-""QU'DDDDD$} -\ &1mggyAT"55.]BffÞ"3>-jm3{soC¦Oíu'qOQeivG ɱrB aZ嚵艬(a,Gq+5""" 9kZH"""""|hADb:%%NBvv6b1|}}1i$رFmSktKɌEhV@ËNBSz%mZ@!/DS(KZd9GPHCo65rM4tttqjj*0k,x{{#88V6}3'!.etҼTxr*yQ,UG#>x!f. H[QQ.+<؅zEDDTj2tmSMDDDDDTtCMh7 [[Z;,xbT/e=V]=mi]UtD}sAnkpm >}gw?HIN+EDD<(DDDDDP- 21mffkkkDFFzE,Ij\>*)#9?8ѬeODСU|ftQ膜n#F &&999/Rw888LMM舒H$CsXXX9"1o sѶ8TJd&7thDDDOUrT!DDDDDG]$rRh i@} 2 8ursseLLL0m4r&Mкukdeeaޅj7wx^t̔pOZGVo'L I#+Ju1gtCNc|!`Z1=[[.=~\voVe"""j$xV3=*)]6899!((@rǏnre[.{ a%s1u@DDDDDWc45*="""""?g&il1~Fab=g#C@DDDd(eDDDDDTkB Ϙ6 cf]=777л^gu'NСsL 4 nGqƴ|}}5IRlܸQ ooope$%%,nT Ɂ_d֨/{S-^HMMڶj89qyelވ1 >6 Wʑ\ө̓oVf{Zen޼(̜96l0XDDT? j"""""zV  Hp1R޶m[ի()) /W^y{D"1H%9و_vbծۈoq Zⶋq?aOW/@&:""$5Uѕk0Sy( og!r ␘Ǐ-Zй ujA4_:ފpPôx+ b~:z>S}% >f^%6K}h*ףծ??x:ތE65WkЪoԨQCLLL8]{ǣ?0qp0qV`qŸ]6A]?# rd$wXdɸ<2R^N7@߾}DDx̎?#""""vvv7oJ%RSSq%ty&&&JЇU߁HX◼>h0dё9yD.}a8;tBI^}x6K3x_Wi[^}}/mq>h'N 2JrsnSytwܩt{<*(MDnqS!S8+L󘆥bqbKM/nBlA,g]W?C_/?} wN3UVC Ssz,___>}ZMDD$NADDDDDObZ "1SN!;;b4iv؁ Dڒ'!qXpxmvb 7ׯ_Xu[A!e(w]~zۿZx:ՙZ>}sZo _kȦ#1\c b5t._DT~uW'[5හq8fxHLsjj*\]]7""O"""""khT$%%a֬YFppV={yؿ?JJJjKq>ZTrHCCj_x咼\̽;4ʜ9s|ǏW]w[dN=| 3w턓>i ̜[nkkz-v%R],mRraSj=fܸqz>.rҳ֕- -D?. JKK2 CDDDDDDDDDD5VTTS9 *XZZ"!!a O{r8c*J۷^NHLbc@͛666s25* ƍCAA !aii R F\|D""## >Q qqqprr#ܺu \h899%%%exSWYFc&N11MDDDDDDDDDDu1mi""""""""""SLLQbbDDDDDDDDDDT&""""""""":4)&N11MDDDDDDDDDDui""""""""""SLLQbbDDDDDDDDDDT&""""""""":4)&N11MDDDDDDDDDDui""""""""""SLLQbbDDDDDDDDDDT&""""""""":4)&N11MDDDDDDDDDDui""""""""""SLLQbbDDDDDDDDDDT&""""""""":4)&N11MDDDDDDDDDDui""""""""""SLLQbbDDDDDDDDDDT&""""""""":edwnoĴ; """"""""":4)OѢE C@DDDDDDDDDԨze'CCC Q" > """"""""":4)&N11MDDDDDDDDDDui""""""""""SLLQbbDDDDDDDDDDT&""""""""":4)&N11MZ._d$''cʕZf ~Wwe̟?~5dÇGrr2,--  s^%u411ׯ_ի`jK.˗7obƍpss3H>OF~4ZOUfϞӧOÇ@@@Uk׮ؿ?"##?VVVzcbb+VƍyؽHNNΝ;.SSrr2vQ1X'E׹DPPf͚jţk=gum S ]ѥ |oMG]+..N}]ѧzGo߾ /"{=hiPWFFF1cF{ ;;o&M#GPTTvڡiӦ~A.k3vX\ps̙3QXX}M62 ڵko> >w;вeKх\.ǦMk^C\\v܉:˴kD"ܹs1e}ӈǭ[ХKip\p˖-CHHLE#8q˖-S/ػw/{xw4K!>>^1cW"3%%C||<Çw5edd ,, &M{{{̞=[kD"Add$BBBb ⥗^Rojh"ܽ{Ç~Vƒp},^:&&&P*8wpe$&&jԡ8'''|w Ell,N:aÆ_}}}w^8w\}Xkp[o}O<7xn/sƝ;wk.kJ%:ޗ'L2k֬wy]zt}v۷W\իWdD"ik׮a޼y8s ];v ??_zw/HNN]}a|ȨV{i:u|:tF`\@cK' pBl޼>qH K<ԣK??}֖.z].eo߾Jf͚il'戈YXX^.?5v.1fffJRd|0`~w֭ 88/Bu PUVa۷/-[9s_xѮ];̙3yyy:CVVzއ߿?^{ /.4ǎ:i8y3&HpڵtI%'nhՇ Ǝ kkkd2aݻ'NĺupBC}…7nϟ pwwרCz-c….ocX~=<==u/]_...pN}bǎW O{ Tz-ʕ+z3g ??/6x{{&LX,ƀp᧖@ @ffz]npUB͛7XUgφ@ [˗/c֭{.N>ѥ/"Zhٳ'\]]~E?8rHʔx7o>׻ܪU+믿Vևhڴ)6mڤwUgUž~=tyBxtѣG̙3@hh(FLb֥zѥ]G""""ƪ&B!1{l<|Yfؿ?w!$$fP+ЦMlذ055E6,YT?cԩZO?EHHR)](>@np]޽sU__عs'T*ܹÇ7лLUvލtrr€{?HKK:;iN8|D᧟~B||erss駟شi=z}7e'%DZIDATpY߿?5~UR2 0-Z8^~n߾=Oܹ_~z>Ǵ>,#pB/ZBJuXuY{mW]k6^ƣKa8w/>1k|Y\W6US[?ԣkBDDDDX:}yzz"11Bׯ_ǒ%K4?9ݻwѩS'~+X[[cȑx饗sHHe˖i}ŸsNFѳgO&Lᅬ^{M:3&&FǺJ`` 1qD|0aRRRp…j>J) ^oݺv킇}]HNNVojRT/gff`mm {{{ܻwO=)) YYYe]j1|ػw/3gBRO?ivHHHxjC3+;C ԩS#@Y~SرcDGbb"*bzt!C'Oƚ5k0~xDGG_7oN1`?uƏW_}o>|=z믿Fvv6N>SX~=}]+-_t:ݻ!5^Ӫȑ#Ѽyszo}x^Umکׅ>^U???XYY/|,ZyHIIQ/WUOmS:-DDDDDUKL'%%aڴiP(HII0X"5@uG^^vd2X[[fΜǏWS~~F:@Y{{gI&UO@'iy2KT*xWcҤIسgOAWM6ERR'MuU}}edd <<DصkB>*8,SRRUɤyqqV٧՗^z ׯ_GFF2227`۶m>|85k 6+ڇ}[nmӑT*J.''ePzyyi$ҥ }` Brr2Q6}toFbIpqqS_0drrr20rHbJKKæM*=[O?ɓ+ 22Rk͛7ѫW/|}} }P(({lR{_ ~cnn\kkkkmvo7oĕ+W0x`T3g"##qu  6h|1X_Hj 6lxV{,j{߁nqk[Uv}]<.TUF(bXvq믿LV̺S?SUBDDDDԘջtUn݊cҤIhٲ%.\.]h{Ukx"rssbf̘1 ,@֭Y߿C=СC̜9S}!2!!!A۶m!0{lhUviV0e :۷o׻ PkРAԩ)))8}4/_@`.ӴiSx{{yJVOP۷ǘ1c~dffjk4ٸw^j?JM6a޼y8ŶmoiӦ xΔjD 6b ٳ|AUJJJl֪Uԭ[7_WU`Ҁ4i$jRxx{͜9RǎW;={Ԕ)S`j׮]={6mjL>}.]})!!AڹsL_jϞ=2Zvo'NsNC*))IGΝ;zUΝ;kΜ9:w\e"##'VϞ=ںu222yfOIIIKXo>EFF*22R;v쨰N]vշ~(uE_}֮]-[H^x=#9r>W_} _=:~nv|N墣GyD1110aS}?9vXK:pZj_~ET:ǤI4{2un߾>3zqqvء_k֭^u 6L۷oW Իwo~wwW^ _~eM>])))ڲe֯_K*33^fҥN|0`{xb+>>^EEEjԨNѣ3g$iƍ:|{7n.]؇9rHr?~,ݫaÆ9ǝc{o۶VZ:}I&GQVVn~M4QAA֬Y|effjNe.U<6mڤh)99Y?6lؠN:ԩSGVXdڵK͛7u]g/7(,, ~)ױTNIRZԠAt,}̙3{lk׮KzǏܹs "׾b 9sF7o5dEDD8;Wi4,ݰayG۷o_>H111z7?A{VJJ.577WWV߾}%dɒj-`0TzLU+:rURRRslBnO)77WZrz^zʺ~)_ѣGkתA2}p]0jl6{FhڴiJLLTFFդI2.^Xj۶ZhqE\eeeumWڽ{4irQSxrUXXXa/;v8=ld2CJNN.SVZjԨBBB.ڋսޫ:uCNe\ .\{N;vT˖-{L$b(==]ݺuhT``Ə4ʕ+eXTZZg}g}V}QӦMtRf͚5K111jҤ}OԻwo+((H}3gTttF-ZhҤI hСںuw~Q~+..N͛7׍7ި'xBEs:wVի?Igַ~8MQÆ kk…:{//jРA0`d6j*uUc*~뭷4`M4I=z~^3''G#GԱc|}NϞ=5e-X@ڵkfϞMj|ZOKj߾}JHHP||vi/ӡC}ڳgf֮]GFFĉܹӹݻwd2I7o TP'Oւ oj׮]ڳgƍTd2魷w^5JIIIz=M:UwVzzV\>})7j([͠AZJfYɊRZnݺzO<C Qbb{=jرѓO>uO>]_~} /ūVtvv:w DFF*!!A]wݥٳg>P$Iڼyt\߾}tRKۧHo߾:uUPTT #Gcǎ/y9R>ڶm{QC믿VVִit7;Vxxy{eSq}ͱc꥗^R5tP/Udd"##W^yž~|ezqqvQ=-OݵuVjJO=FX.M _~eo^)))׿aÆnp*tR}GuQ}JII=c/xb $5jHwy,Yq=9sbhƍ:|k̙Z|8qh?jܸa9rD|>r?~ݫ3g꧟~r;&88XǏΝ;m۶)--ͭVZ:}M6R <~٬9sjj׮]oOpiU*i&EGG+..Nzᇵau^N:z״b %''k׮]j޼:{oFaaa0EO=:uHjժ (%%žɓ:sǯsl6W9CdXgΜcSTT]v]{<?~\Ν#GYw[KcuݻդIKٓ {Aر!&I:tPrrrjRFRn6pUV:|KS SǎղeK/IX,JOOWnd4; earJY,;S}}YGM6?=tRf͚5K111jҤ}OԻwo+((H}3gTttF-ZhҤI ՜9sʜgСںuw^zy7kL =ܣ/'KSիWOfϞoVqqq-[L;wTff =:OAA맽{jƌJHHرcuqqׄ Tn]m߾]z֬Y1chZbڵkAyfݺu ʕ+ꫯwѲe|^4IARiXmpf[78ۦ sӅeۼv.]O:Ue|}d2>|/_T ӧOWhh.yy/p LDDHʑT"anlqm]qԩ֯_B 矵~z_W{j5GugyF7n͛պuk 0@5 _AiWL`U&_W튚L:v$HZf}]35?TӦMSll+::Z˖-Sݺu}]-]0}i?}Qկ__C 7 1b~fmذAw:ɓ`ڵk٣qƕy~X֭ѣG^FceWuzYm۶Mݺuo{5fѣ-Zӧ}NvUPTT #GcǎO<&NiӦ鮻R||gyח Z%ԩSŋpB>|XSNΝ;5x`=9sbhƍ:|1chԩZdf֮]?X%@Vm~X"`_5|2)))jݺ6ۃmTNIRxx"##xrd֪}0} 7ĉN۬VӺ`(uVq˗RW~zt~NZj#G}ެ,effꮻ%UW-N#Gԙ3g'?͛7kӟ(ou&O'ɓZlԥKկ__&Mmj#FÕ5khʔ)ζ7o4hqƩA21bo̝;W>|ƌ|j֬YP$9,K{ )ta6ݥKSNUY<_UY&""B]$H*T0\X8LVɶ.urcPL`U"x4^E0 *iWL`U"x4^E0 *iWL`U"x4^E0 *iWL`U"x4^E0 *iWL`U"x4^E0 *iWL`U"x4^E0 *iWL`U"x4^E0 *iWL`U"x4^E0 *iWL`U>|]fC&`:00Uk?d>M&_d2} $) @EEE*))uu7'Ts_n Pk 4^E0 *iWL`U"xp`L~U-R\\s)??ߣhGmO6o\5n饀%W3ujKңb`1KJfU[V-7Y|];+9 @kv L&TZ xOM?y6*P {ոސ%x寷4H \a/|bǁ4X}]%ʃ?3L]vh>DmPWX׫,G( xWcKA wGL&BCC+O| '&j?N( @@++[L( BcA>}L 56H| '&*k5n׬_BigHmڴQbb^~e}&LP^4`f_WL&=ܹ6mӧOk߾}9s222|]=VF =CUÆ UXXt-X@ PckٲfΜ)I;w>#_&ZdPE5a_EiYŚm>|9Ơ 灺ܤ,)a JIR@P*˓V_WW zLI.]ԵkW_WP}:t6lT{ٳuw5->>^?]ڽ{Ξ=֭[+,,U z-ժϫGE@9[VE5wV7ָmSf#N?}FeZD]SFz."ŢѣGk۶m:$`0Z57o5kh„ ***`W^yETQQ \s"""ԻwogQqq=lcAw}ݫluU͚5SZZoPmM>Gdze4zo~Ѩ{Osl٢dG񒤵kJڷo/IjժvIF[ח F)00P{Unnnׯ$r-mqqqjܸo߮nIڵkWey衇#G~zԦM_ /)''G 6Ԃ 4zhvmNeJJJԹsg9rD կ_?Iʕu~LNݻwn?={J6nܨDIRo6k ӢEqF>}o6nIl*IqУc5E .@/4~5V͍a nBkʩLKTS3}>^{UΝlm!tTTdZlnذח HIRvvv333%I 4o;v옞yk2e$U[ӧOkz5|I}YAA^z%^zz5k,gΜ<_~Y?W^yERi0&IVjUttrzZJ:urW+kcFQw}222taeeej֬5j$IjҤ :%Kh[ %_7isjhޖF 4oN׎?'Jݻkܹڶm2228p@f͢3P{ TXlZ*W͕s[$˅T:6uMޥTs]jp}OOg+<.esIٵ !fj2bB;{s^t7(ה)S4w\=ZGo_$I~+clڵkϪM6jժ.\_~Eqqqjժ5j3ff6eZբE zUүB?ޭv몄\nKNNVrr+}`P˖-5e߿_&LЩSh"cW\֭[]vܹ;y?=iX^$I֭Ӿ=zhܹ?nݺ)&&Fw}&NC*55׷KxvչYWb4礭9i6Gw~oxd0CgWi0طJ`)/5%I%<W'>FD~'͞=[L:$Ij۶=C'[OKpT``$I2dޜ*NzWVCJKKq)ya-~N*2J?ζae4!5kbGjӦV*} 6f4գG讻R׮]SffZhFY,YF&LЂ d0ԴiSIRLL}ցk wp?-v}.$A&CjuGTi}ƒ{N֢!Txlo.<|^pR֫#cHUuZzlzLBsUll6lh߶gm޼Y:uҌ3n:5iD6m$)==]ҥRSS{*''GJOOl~oƌj۶:uŋ+55U~M4IE DDD?׾}ԭ[7hJOOL˖-+;;[fY&`ŋK*W{1]wuٞ~AwF=4s[jOm]vWV\Y&޺uxCiii_M6)??_eXo>]z%~h\PPഞ[TOH:_o3jRߤoбД˭V6j*:}Fe0t]҇ſRN흷tvzήݠ_P;۩9qGE?ǡt(o[s__:=Q"MV64X,uZRF-|] xUytieWʓnxk^em OM?UJukVel#+~>ܹspM >ߢ} #}]=UY` fCy0OG_~';O?6TU<%(9sPRprzmѪ&`ZrrrbTY xOM?6 A%Qe o28$\ &U\d09.ۦF=PPPPjjUAAVFFˁ7Innh} 'fa |#1}} UA~_7N0K Tj3Z`gf33 :vؗ UB6I2tǹ?֦ ^תiu۲ .X,&ݾA~ >EmORthdr_W$r@Rπ u1!MTt5jxF:vIE69f.o*.ʂimURi(mtf9yш5kv,**bL&ծ][EEEvܹDRh[8]ރmZ1vfp9~cX233]vwժ"|/44SzΝ_4v!8δcia<*}aymN/i '6'O1 ԩ\fیbV!>KFZj) 'N?p6I*ܦa<+#486y(9v .laݶ-PRPFw h4*)o\#N[,?>}zӱc*}a~ m=<ƴm8Tvi^նmdu +{kXRƖ`lr\:dҸƶ69v].*ohʩe.me-m!)V7(8v ]p !]kH<5e[ zB[RnPa5 '.ǀq ׇ7cl\j(hr(lp8Qe{Hs|[j[%%a>1 WFqU6T2U64T~ mv i[:k%m]{L|{HaeCzZ;/Nn+Al7kfC% .PCױ۵W(;#Gls1t}cOgǞV9 Z;cZ"˥`uhK9]v(U<[cKzLۖR= ;n77Vpגk.k`l)g5Z1+--7ƴpEK-.{MUCUrRzU9衇ҕ2uT~`mu)z9_zU'hT,;.4WRW*1]^8:k mn|=]pQ^\C +Zy*I|kr ^k ʪᆕ=аPZS&t.+Zv _ECp^і*i~1-U[Zy]okEGE.Tr]j(mcڶ^rU=+:^ϸ5F9M})}5mjc ])lWKu^HWܓ`}\wlyeWe+*SY eiOب,teWyATu`}1+_J8NOƐ&Ý q;EҒ ֫*gu\UcO"H{r>Ɖ.o'++K/izOWճyC/g@]ƚv_ղl(p2Uϝ฼}nҒ%tw9fOChBkp4$TPsUa63\YUjv'v|%`|iƙ.|y˕+'}T̓їr[βȀ!eXIfII* 5(1 2iHHGIMP 2.10.242022:01:28 19:36:276< JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+м:_]q څV$LT=oxj81JP3Fƕwqs` gZb0DQFj=>Q]_`1"GGu4VS"qդ"%>6j`} OKypZ3ZFhʁ~@ie#0Ĩd9t Hy_sQp VA8p~Qӹ7o~UV?|P?*>?kʏ?*EZ|ʪ@?|P?*>?kʏ?*EZ|ʪ@?|PysAfU#T((?_γJi-mFX~4bode. n3?^0>~Qz~u ;=\3i~P8_طFyʀ"ܰqUػ]ݺhQEQEQEQEQEQEQEQEQE%x?~<u +Z,OSֲk^el?xր./!Eܼ 1չ.mͱ2 1ҫhC3E#I$ NN5t밗̇0؀/F"kT1OeFlq[]ˆI0mSo<6!ī:v>bw*I:EgQ\Y{IZB43\luZOP0HϡPt?y#>۟%eڛ[n>q}2-ۻ!JW$̆H' ECE((@QEQEQEQEQEQEQEQEQE%x?~<u +^x8;ײ}>3Ҁ.Jk)AnHbxr*uYEI#!Qb@usD3mD\g?£Le˕-OdPUGy6&69zXuI# m !P>\uTak)a'҈l.ci|o(v9U^FIS6L;F\ cqTdMV1@Ȫ~̄y>- |*b֬$nN*E`E@ŋ.;w5GVe{S'AW)'<Fi` s.̜Z]TZs9zqF0]Rlg'>1޴4Ȧ"ıpF+x(Έ"aQ[On9 T=5rieQWŮu>ݠjAeɾH9`x.G4]ʔT K&2>]E0њ@Q3@fE4QFhQ(.QP??FPZ?v9ǧֲ+Z˄TDTKx9~TsQJ.f[ױ;Sc=~ifʕ֛ }j6(*dJW]̸v_FZBi>~өA},e 1@68ҪykFgYj1\/K=_4ڌ{W%K=_4yWuyWmY/!aB xa ~d%p0*|^T4Ǒ|n\SZT޲FI3zGƲMj}(';f{UI|#D,D^Iֳu=3RVbl&(wcڹ/:_ѣΗzhǵZ\u$j!1'SyWt@vO˳WZ[AlԹWqp=}dg;#T*x?VYcXǁz5u;!=+KƷ3O#쌇b%yyH`;?of 'xVRXL-qҞu{ VH]V&8ȉ2ˌ|8=NQ77/*Mpg?(7z@GZK]&a m>dE5ģgݎ0qTOu"(`1zI%dfJoZ>ɵK9B  28ךO&LK 9n{g\zW3*Cw8y)&.gkftu6zЊv鄥kN])2ےBsQ}s2ȲJJ` 5Mvy~_f{p;u '&l95f(D*z*z$6l[< ?Ҫ*3Vcjqº\MlwQ)%rz/ߚ&`AupF?PqMYw8M)!p2y$1RJQʷuPqN.̊h'GRqOH@qԒt1V"Q/JEޥg@QP??FPZ@ـ2K6/NZC)f8Ǩ$}A\:t.#5(C42 8R3%Ķ!fu9 t:;ܝJb?R ě8prqI}tMFrZO$&CG\}Fdh(]>hp!R\U>9ǶiSc 1N'jiBڝPR?pmjhMw2yۆzVu)Z5Т*IT ?vpڟ7P5`Go#n+UM:W700)!XCTnI)FWڬq#lv={r?w¶Дr>"0cb2=*\i#IAyݝXM79k$000do )B?Tj7}g zZ*PW`z԰*.,? W??FU#T(k/g1?VMk؜->cڀ6-3W8.=0z )2xg*铃pzVڮcsctàzf͢kP.W$u [HpR9Kl}wz_QOnʊNRH@UQTbaB۳=?Opx| z'MNӚƢn`(+&y Q(FQEHQ@*z*zдO1A#]NpFq/C|.@$a7? -eu~[(?UJy-gY :%C@eu~[(?T4]p1qQC|.9M†`:~ HD_?<Ο<>LqHBTd@z]ߖ wvy+6?R-eu~[(?S--ct+ȭZ@-eu~[*Io<sT0c#=jX?~Ws^LesQT~@I€-\ǀWQPr3Ǧ=}յw0@M2فsq\{U\E8~T8sQY2^<\ MCuj$漞$}(:w >hohoKBݺS}}CEM4ThohoBy>ξ}Kh:/jG@ξhohoR:>ξ}Kh:/jG@ξhohoR:rB3VZ>Z<u лmYV}V+G-"DŽf b/c^W['HH 2a>@fup䜁Xo 8­Ż)uU@:\L8>lqU+p?b ޿WX*T3MM*ɮ 6b*eHAڱh m=!gX͹2m+OHKfY3ұ( i>5/p:R N.GŐ`}soVt?|Au味9q昚^avlgQ&@?5EoCiCeH ,LyA84NdjԞzqWGdV!dT 0޿?E;z(7@޿?<iPz(m<h޿?E;z(7@޿?<iPW1U1ei^ǐ͠mm~c͍f!^cq7#9OC@TV44SnD8ea G?gQZ 'qK?gQ]asmm4+5UҊVr8 EhfHhe~(>Ү+Av-kr\rI:m4*f3 }Bq%`HUp ?4Et- MB֗1sOYكzPuG.OjoK V5sv]~Y4gRգNq>ۗ_G]w ?|Ǜ>1QW^%iF+TstV7jş/m\&@ש/mZWpW]xRAי _ҠeX9#Y}M09 aU8S)MY MVKHDj՟E2 ~o~+"ߛ ??²( aJ3K7?QEl\(H%wpHOs?²( 0#d@sGGVE7?QzVȪQT07'v-%tEXtdate:create2022-01-31T04:06:48+00:00r޿s%tEXtdate:modify2022-01-31T04:06:48+00:00tEXtexif:BitsPerSample8, 8, 8>'tEXtexif:ColorSpace1I!tEXtexif:DateTime2022:01:28 19:36:27-0tEXtexif:ExifOffset190LtEXtexif:ImageLength13334tEXtexif:ImageWidth1524$UztEXtexif:SoftwareGIMP 2.10.24}B$tEXtexif:thumbnail:BitsPerSample8, 8, 8 StEXtexif:thumbnail:Compression6epWtEXtexif:thumbnail:ImageLength223o[RKtEXtexif:thumbnail:ImageWidth256(tEXtexif:thumbnail:JPEGInterchangeFormat316[R/tEXtexif:thumbnail:JPEGInterchangeFormatLength8334i#*tEXtexif:thumbnail:PhotometricInterpretation6 tEXtexif:thumbnail:SamplesPerPixel3ZtEXticc:copyrightPublic Domain1["tEXticc:descriptionGIMP built-in sRGBLgAtEXticc:manufacturerGIMPLtEXticc:modelsRGB[`ICIENDB`lxi-tools-2.1/images/lxi-gui-script.png000066400000000000000000003161131420007711700201450ustar00rootroot00000000000000PNG  IHDRt"=gAMA a cHRMz&u0`:pQ<bKGDtIME4I4ǩIDATxw\SWOB[=p[WݭZcCZ;|Z.ZZ=["(CЈ|߯W^ɽs97|s=W(Ʀ/B!B{M[vLLo@A:cSB!Be+mA1r2Wd?!B!ߔ*_yi U$ N>!B!fjOYEL:(g10L!B!DuUᕦvFۃflpVR~N"B!+年tE V^ڲ7N!B Ҕ({htB!Bs빻sY[m+g͘Kqn4vB!Bk Wkc+ԕlvoEiJ JZ !B!zJ ܴel+w]sr !B!6S;A1(++-@3gOzB!EYWIJ *-PU$+)STd)B!BQULO׺RLPہXy\Iˆm;B!Bq?(-0+|.-Oy)R [^VVA}!B!BBK^4] JڧuTrwS" !B!0`+m8ea,T4+JWd;E^+JٮWR]yU*K^Z0,a> B!EI`!JHK z\V;+ ܔܕuB!B܏ t4E;{ ו]qGw[bݝ]Y(::c9"[T:5jԨ2[Egcc}󱷷GVKa\vd$E늤Qȕ5%ӧOgذa͛7ٸq#-"//Ux 4{S())e˖ 5FzOpuu5Xěoɍ7]DQʺXIR1gñ,3qhܸ1~)%~/xyyOBBY/daaQ;9::WU:SzyJcoG=W<Vg'4^UD g2eڴi?1i&MN믿6wxSNe:u_~hڴ)Zcǎex{{Vr +V`׮]iGiڴ)DGGi&-[ƯJv퀂/qqq#ZnرcINNM*'OUܯƦftbJ@wDJ^N li<&mAjRP­-FZX???hڵ4h.]b!=VVV_3hlmm_i޼9?0OK{UΜ9K׮]ڵ>c=FϞ=Ks#̫[n̟?[[[ڷoO:u*h47ontOŋҒ-[PV-ׯϥK]eQʻF'4*CDD3f̨Z3f+r۷sY{=RSSprr/ 8̼QAݩ{{kKV*1)WcXg;%/=LXZ(8|%H%9KSz9ѱ5JnfLLV|HhjmL0U qW\\cT.\cfgjbCN8aLYAYekccK@_bxgHIIw5ijdg<9;;͛ӠAs7]s?l}mۦnP(xᇙ;w.e2h̹)<3ݻ7nnn\p/PN<ʕ+aĈ\r{f͚E׮]"((/BkzY X[[ӻwoY|9K.`С<ʕ+W9s{ݛ/_βe ӧOܸx" .$$$`8Ν;qC5۹g…XYYqA/^̅ sL> *4-//8v~}eQia¼/ѣYYY\'O2k,Zh7?>'Nv(:uT?ۛ3fp!MᏫ7B.O?Mnpqq\|۷n:j5 ڵk̞=ד͸qP*lݺ:t@rr2˗/g|嗴n?8RQ͞7cw իWiݺ5}:ϧq+ *(7Hy>!YܞCp!8(G%L$_ [GuX3)ZVEjt\#< gå3t:5"..zRy߳:^Qri\LdgԳN<Ɂa9|-|Ь%dL K <<[յb$t9y:9kgEw?N]e겛<("bC<W83}%[=tYYY⋼k3n8ƍǾ}?>|37fРAhZ݄ĩSs=?O?ݻ9s e̹gϞ8q)S8*;;'xBkb޽i޼9};=zƆ.]7o裏j9s&O?4;v$::BAXXV"66Xbcc3f ٳg3~x:vR{9riӦ>}:SLa„ |駌9RЙΝ;ӨQ#]Ɨ_~Y̞=u1tP,X`"&M2X0aNĉٳR(??Ma]9* =z4Z^zI&zjϟB`ժUѨQ#.\@hݺ5˖-{ݝբ?d 0#Gri;{nv]vc{;w.SNe˖5QFq!n޼I˖-ҥ gϞW_-=V6mZFGG3}tt:C a̙1?A_%ЉRЕcyBB>}z?(V[2,^etom–^MmVt>ޞG^h$'/. -q/8!ζ'&5[.`<빌mK}LRakkիqqq1jdlll7tPH޽blذAZwUzP=z(hSiӦe9rQn5kJN&55`hH$6cƌa̘1i^D3k֬ƍݛ޽{?trrrCΜ9qtt/۷ogʔ)&1m۶2/|Ӵo{ BLL L2I&1}t}J#c7BFoᵢu:!!!ڵ+?8͛7 ߲;߫;w.ͻo ͟?@$̜9O^֭VVV4nÇ:dZZQVQ<_fΜiBT'`vj59U U5gb'|P99şG _Kȧu=+ wBcryw}Q[|iV˜J{grufڴiFJt1;Ɗ+Xj:t@Ppt:;y΁HMM%**}ݓ zU ~Ҍ#(3͝ҀV\i-11%);))#Gү_?zŀ/yꩧ8|}[¢Y+++R4 +N+e{#;;%KOR92}SJ kӦ ~-.\`ܹűqF ==$_|x*"N>ӧYv-=mڴAPg!V/kZm777>SׯLJ>ٳgTfjеg>GKXIYZt[׻- Fs8u-kE%ԆeK"t:666F*>@^țN#==ѣG3|fϞmTZXX|yψ6wÉ_ʏ=JN&44 1;7W^o߾,]Ԩ vv3i{y_J%Z۷}vxg+1+~ ̄jѣA ''',Jvt^גVt#*ׯj+}*򾩌ᴻwĉX:?yT5t-[… 𤤤uƟY{9;;cmmZ߶ޢeȥi4%ٳ}||裏6mZye@׺ǃL-W4мN^%(<6;{Bs_KEZHzJ x6J:Է2^ZiDҲO"."̣pz*^^^gJٙ8ׯϙ3gpqq)mڴaҥ$%%>jEmꫯE߄FӦMٵk_<T{ADFF2}tzNmkذ!{6*/ćM6,YӧOӲeKΝKLLLҽ{w,Y®]hРiii|n/Oǎ7o#;;#Fj `K~#::ˁSN̛7O?\^1h ~R֫WCSO>]bQk֬ <<^y= Qp ]^^^/_fܹ޸ٳgG0@}t9c%4(|{hn8 nLCoƚ$~?I=i`lVDeCrFG#;/_nj 캐M]G'ۻ3;aU*~FӶm[UtQGLJ/rҥ -[d0zh}KsM/^L||Kƍ K,7n0x`&L@jj*QCoZ-ӦMc֭Ԯ]Ν;s&N履~b޽1zhrח_~4666T*6md,ƍcʔ) 2y}@WsTMEڵ?J9{l&JZt)x{{YOߛ}vW|?HHHAԯ_,Xի9s8pkfȐ!T*k#@bb"DEEo{~/_NPP 6dС(QkJ2p@On02))iӦy:cG J] Oq롼uֳg4ӋV} g(_~omݺPHXYYѤIfϞm0ÜZG) _vv66l( >|xҥKsWATP@@?#VVV۷%Kpyҥ SNϏ&L #m3'|'|e˖XiЅ9~Qn#*ѱ{VDNNF`ǎ@*h}$=tAdccS%IOO7JB!*&99oF B[rrrP*W*n& B!V-w2!,Zm{*3w/H@'B!rrrrrr*5&B!'==,DRT܆LբhCV߷\{RQ4|F5.%EB! Fc=!Eh]QWUV=~s׹ڒB!w?^"c!]\#=MK G{q!BT҃h4dggB=*A t)B!4 @4sCY2n2fQkJK G{m !Orr25u՜F!''Gz(¬մH"B.;;[!,C.B!BTtB!BQMI@'B!ՔtB!BQMI@'B!];;;sO!B!}/ .B!Ձ][\ !B!D5%B!BTS !B!D5%B!BTS !B!D5%B!BTS !B!D5%B!BTS !B!D52w jrrr3wQB!D`mmmI@Ivv!B!e#//Fc!jZ9!B!DZ6w1䘻B!Ba!1{@' !B!!1{@'B!b$B!BjJ:!B!$B!BjJ:!B!$B!BjJ:!B!$B!BjJe+NNNt///\\\8w;v0wB!jLJ";;Çb!B!D՘.)){J^^#B!Vc:!B!xH@'B!T3#/q4FHISB!B] k(SYW(\9000(>>$$$JO0 ric犝~9=:yYFHI#iJH#B>Cq sUI~yY^IvfbQ8A?̿M݅B!j̐˦Mٰ͛aG}777sJa%E(B!B#Ԙk,߼yiӦѰaC]Biac/n&51˦`f$ņUO W!ֶL$R/ؗe`BAfc2$D3Bu;3c}xd} [~{ܧF!B*Qc;YYYe5<6/Ąie"NeתYt1X8U ]ESY8({e:xVFD0Mێb?IcF1o> >&1ƕLIuWYIu['BD5. UVYT? +^RZXR~5j6 UU/NgP(uƤ)OfZǣ^VK4l9;T(mLѲx4Wmϩ?Ƙ7 I@gU.hit:-1}ʄB! k(E.+,>,n=n.|v /X[BB=s=]!!!ڵ랔nhj0^ g]s#[?]H=/ ?T,Pfry<}_Rv T6n[yNɓH/?ng`Lr۬/]N:-")>#>#]5ԽT =ᷘ8^B!YjL@׮];&Lә>}:?8.}۟؋hM;pZu}i5;GOf|v&ٴd gr>x%Q'*]%.'Js/ڹ^Uiòǔ|Y<}}K!W9y$nݚQFb @_J]=`cFlJ1.^')6˧p;z|uˢc^sUս׆嵏xzخݳz !BUc3g мys%<'¯P2bKD_> +2h>o WwoNgTBQWj7HHaʗ:ɋs!lLľEa \}吕^k5MXcNce퀫q%R5hџϮOpS1|/z`zx^ ).>b2y4j=҂eWHkLn*[fyt>uv%92'~ˠ dՆƶOyyGWo&Š/}Ff3k;ya䉥{#⮝d&FTwcƞ/!B5feQkBA\\cv/`8a'dg&}ػ4|™ׯbLWt9>/Ƥql=tdO~$Ƅ2pwe>y9Xc,#{~CZ;1]mD_>ȵ}NF^It;>N'eLWR!cځ_ނkoGјc>cLcn*Ԅ~GwYy׆ƴ1yOy$\0X{|`٧-Po_>?|{GO<:Z^L9_B!9jL@Z8q" ֭[GL/w$.~>%vJKSx+_";gM4k(*+[4XZQ~6.~HO.1?[_ {PJ^=TۓpuVJ/^GߢCٺl WCw֣^{Li綽ҎNDW|;;2)1u7|SWḪUr3}T64}X{;Pso 0xyzQק=a'VeB!DQ~wlllhٲ%g͚5$''G>39=/ݘ4/$^p#160B{քZZzf &7/عik"N~G.$nN#OY,+9u.NC|1i|;9)Hs\:.f}t.Xb:;W]K BOF[׽vn9X@eiIi)4*+[Zv~lʎ{LnǘOb{zpl`lnlL9_UA['Bmž[8B{#T%ސ4 uƯP5F:-b2Rc& %.ħIO\R~G:=4W@yv9 zĺ5j5Oo G&%ܼ5-qlBm>ļ<˼esfj,) Wh9\=PagFLA\94ݔdz')"yL:/~#>]r2J6,}ykxm @:x |鴴:ZSA'FL^名܈8btݍ)K!5KtҵkW'99͛7snNOu^>$]"/7 m48fGei郿׌N@^nֽ͐Ƒ ;X04y9X:aTk[g2Rnpw|Y QNۦP( _NIS(+=[?ſ3t:)68ժϣqn(&᭟7pO٩t|ez g̅=?mRfMI;~-`d%so cҔUwSϗoUB:'m+k,n=n.|v /rwnȟ7EyS~mRFR?ssbw T!nrww/7'AAA@*hu\8!BQԈY.B!A$B!BTS !B!D5U#kڴ)C !""כ8B!BQ!5ɉݻB!^ J%C dgg8B!BQ)5* $99˗/(B!BQi5&_>͚5c޽.B!BT1)-d֭Jվ zxOǹ[HI#i$M iBqw)"NQd]Ტrֳgr p/&'G%??_N,j,]4s]|,I#i$4%B!t$(((HMg"]G2E _׌NRdn{nRRRj]!BQS;C.5 III֕^!B!3)B!Bx%ٙfn-ԏ !g]l˔19>;wCu| !E jժŘ1cr 7oFVnb)=:;GiБ_J4l5_Z9OÖprw&׫Et|h&. IONHRNNk+Gr2M:FREkt@ϑG'\!sٴdF}[fdg$ᗉE(v|Z =c=緳gQN OrA?⮝4opt!)"M=BiAHR6}p+U-:Chy/{K=%;x3ȻhyP(ի<ƾW ~~!*l/7gԱ1XXX둏i1t|N[d\gD_WO^ykNKZQ`Iahв?V֎$Ņqx'\9դ3R/doϚB!DuRc:N:é[.9sT6?K'1a~Zuȹ#k,mٵj>s]^ÿ? '+-3x%_ƕ(l"16c勄l9+&f}ٵw˄l2ܭ>EG>bW|S0H۾ Æ_&t (i OvSێWaIRl:O9Z54m;ODJB$W䩲ېLbC׆ܜbvl ='\`Lׂ/ΕZv\:?ovr!:>2-:ei$ wpt1}n\9BK ȥUfuv* gM۰+v$>M{ e c߫el=SN^yl[<>Nn&+#A4k? k~ a'֢jn-c^܄&7-M!=x42Msl^ 19zҰ*y?!1)R֖ׯ͚53wJP?QB=l[>>?Che",}s|];Ijb$L34j5XWmj[K+;lkӤ%^-t:⯝lRC_MZU"/oi*m0]Q(-ێ%xV]REG!j$f8;u/҆}k".yY܈8Br%4uZK Zb̙"51tZ]Opj7޶s=!IկPQqwͫ)? *+[Tָm:;}k$!<'-"=9ڠ^2z>;=&s\9PvUc̱BIH8RA'}￱{Z #% NL*{C4D^AFj ѧ9fM$f=t X= ͛7_>ZŋFվ z=lkݏ\%]Cq`96^F{+$Ĝ7ncJLJ^Ʒio으P*-s!q}6m~4y٠ѧKnwpz];\cAh[sx| :%uZ`3ꓫ #5F;g (g~~.NyQSڡR%E,ccW[dmㄝAiqdg$t;3mFuv:t];aR~HdЃ}og4ֶ:sYdg%|Kwgoև;h~4 zQϟb{Ss&:=2{}E dśvBjFt撔d>55ӆ^AJc+vkmXlXO+O^r˧08`{YJS%_CMu(Uiؙ0[b*ABQy9ۿm2pY2RLNc{>nGNvoGw|S&_hax(vyNz_k Vk#N%]ucr\JZ̴x~ܙz~ݩר=yk,HVuB!\5b%ܢ`&哓LR%_ǍISUzxk;V~Z u %>M{st|dޠBǪU9J<&%!X\u&*%Yd۴QdzuHDvcqmGT$KIڐQ6 ;[>!f8?s4 lipCNKLQ|S~i/j`5mEkr.JQP(qp[bޫU]{)mrH0> ;3rci?/viYl2!cGٽ!N\jJysC[>f}snj3!~Wc3gаaCڵk+[A?%JKεQ(t}bu2X緢i0⮝,vM1.H= &pՀFӶs&IHzMVTjb$Wʠ vi?їԿ!}'^-216e_a'D;|MIe~Cq`xpĹF}S|wx/y3,mJmpbK[QzlUCzS/c~%v<5YI\>iW {,M˧7Ъ{رiMn6}=1_v 92|lRy9iXXXƦOW(B!`]5)+\VY.|XzVz]_u M c?bieφ_&(J^cok#B]!B! E|]CYgrfffʺ7G 0ݻӲeK,,,'ǯ:9~GQs3ViS? 'WNܵSE>P(-w"٩բ}7jBQsٕޞk׮GQe.טҺuk6oLbb" 0Ν;gccؙQgIOƣ^k\<]K] !B!up׭p]r^‡ŭg{,r pO*㏓ɦM~i]ݻILsxkMNfRɉ :=4w$%!z/}͇؋4m !AK IiZtKLJfސ-Ğo4Nt6-ceHR\|•s[uf'%Ve/soF>ƨUO /\Џk' ۆL'dz8%'+۳ >!sٴdF}[fdg$ᗉE`pprp{iБ_J4l5_Zѝ >ݔz>B!#wwrxzzȳkmG޺e,9=tѴj RRRW\rE+Qփ`hy]aתY܈iQ ~'R"zLǯ'NOۯgꅝ\r4>EG>bW|S@ee˘7aoSHO?.Pgp+P0.hwmcl>ƶOyc.p+.uyv^齹嵡o>taڷ:#&q6jnNrn+*+,찵EVMλ1u7FUB!DMPc͛ӪU+lBRRգ_~at>̠~|MNc NWvF;3x+ ccjt;\cAۓx'51X^blTMtze&$Qa:AɿL+hrIs":m><59h{Neecy7ƨB! jL@קO?NXXPp^zܹID^s|Biʓ| '7r) iS(0>ͭ~Hx&JSұ͘cΙi,3SQ7zNX6?tӃ xJ rW}ލ1}B!jq:Re:eJ&)qgOiqn; Z (#% &7?{8cV|;W6ZJQP(qpkRƞw_Nm!BQFtZWҶm[5j ZϏpsDv.$7;3Ө`<굡e'_}~yh \<yx7mOSYy5^jP'&51a,çI/k5Q\/Ѱ@}$`$=V8ԣM$\:OnBAӰu1ƜwSU/SG!B1C.mF`` Ɔ 9zVp݇À`e@jUJe9y8d.vN&Fm4b"N!AK͢C:xyY$8ǩ?hrt6!O9bzKy *Kn[`l>U>L/?j,|9iXXXƦO ؗI#*n^1}9UuLi!BQ܇N!B!CW#\ !B!ăH:!B!$B!BjJ:!B!$B!BjJJڰa<󌹋!7ETum<*v.m;1ɣIպ̢h߾=۶mEB1 gʔ)⋌?sKO>aRf͚뉋+sYy):Ĥsǟ9>8ɣWpreaۅ\|鳇 L֞[IH]ku5Ɣku_GhEfUJk>hg%fx *t&֟ȉ'ǁknqi^&wsd2j%Ŷu컹żoܺuk~ _ ͨQذaGeժUtҥX>U^x:7G4lttHdz{m=EjW Ln814ul 'm>)3w~c>23x Ù4O!0 0l²e˸z*FE˚5k*- > +WJLuћ)Ǧ+={۟4vhO#칹G'3D5٬ \2UiԂ=6Ȥ}h4WjOOLXZ &Wn5+Voo?Nbeוuz\LH=Gl/מ^ =0NkM*90t]jWf???~RRRxי>}:[l1HӣG͛?Ä 8<_}U^BEOz%%/zu95} mSw[ˇ>$,= .}E=x;m8bKv4sjgXk֬aرX[[W:/!njD@T*iذ!'N ::_iݺXZZ[oqAs=Wb'aٹs'|vBɓٺu+ǎcڵ]ԙ_=:K|%P*.3m#i /T :WQ K㍐7XumYd@ r% h&֟O7&h ~ʮ]L8ȔSf*-k^H&̎I!::2bR?>ڄ6'/M!5l[c]>c=sޜE`\j$Y9tIʖ8۹]{b=iv|4=E~ĵ_!x06[tjn.2秥r+P02IX6ԩgΜ)u{Bn*:+47J y>>pA… ix 6ŏ ۷/Ǐ74,cرn4^.ʷzw 7`H:p#yj|Af1y|;˽I)#h?pu2KS9~uoָ͟1e6ǎ+u_?v1W N fRIA:}/w(-&,=ʇZ*-qvXxi!Cݽ; I$(8(Zhf80Y*-qt&G `E:fͪ^ǓȌMm^k[{m뮮Kϫ*{MȂ ['}pt?NeVTSOxb-ZDǎyd֭T*IJJ歷'11F4UꦘMu||ʊG/4ZMrTV Nwwn'\L U!jl߾AϢq.]ͨquu%,,L.66Tt{eҤIlܸ#Gp9mFB֭[g_hh(-Z0>iiidddȲض'7*RĺA#Vn.l[˽fG~z:.FQN]ys5Hͺ=,ǘ2ښ*ɫ43N`QE||]>IsR7A?~ >0Vmʦ5hQ?`C1w>{q&֟ȳǞbEƗm$9/ۍ:* Mdgc+\Z#G8;,O`?9w<ƺtM:M|'!gΜ_~ŋt֍QFuVĐ>JsI=õkȥǾ7RYw$iyi 3/m:Sj !ăt)))XZZbeeEff&F*3(*J+h ߹QС۷gܸqL2ѣGX,B غ >ʆ\* 0W~%W˨4E<7*]fc%%%\eJ{=97}Gzz:nnn,_]UiasfxaiRzeabi^kulo_?ƔFS!...&BE<233qttחk׮_FF:ppp(<>w}Ǹqprr]ۓ\v͛ӬY3m*rY#<<輲Ξƪ~C~uZmժ 64 ؽw)s!]n.r~?}3bWQΖbka[rJ9UlI_;_g_ J[z iU?fY9|*.n]8|u'W+W||JnlgIP'|Mlmmֶj\YLl,ʾ'WM, _uܪ$$$o_iaaA۶m9{lzkS&z{}5`kV.UfMxF8㝖cW=nӤIBI j׮?uԡq޹?dرxxxT*6m~O0vX]6GFqe| gUVЗ'55/Por"i2{aY<~Q6 6W hO’6Ϩ5q^gaӸ -T0)s!K8Jkk߿ Oyms8W+W8 k&5D'N 3Vs=:]M60$朙>ϺusZixuƖgqb{gj4qh WVD O{:u敦ҩ% .NeWuk/a:ubH! NoekaYvuYjL5l0mưa*OU9|^p Ƴ@&ytޝ &РA}QziVXA@@>,M4֖s"8)ؠZigS&˯.'$%mձC6Է+:6s\n5sjLSŁj ! jFի~e6\{e0rk.fϞM߾}ٺukeʁ}Vg2.ygg`f 'ؾ1;1Mޏr`Ye/\+^}o\\7y!oW/NLcn,X7rn/kgN^:4}9p)O~ {BjJJ^ G2cߌb;ʱĠ@LLL*_C}vJ] #Z&UrGZ˼m6y'y嗹q~VcǏx*5. zE.+,>,n=n.|v /E' œƌѣ?~I3 SO=ṲTkr{{{6nȬY8uꔹ#MIPPP "[E"e,9=tB wwwn޼uJ}.zPu/իWZ9!D%=tB!BQA1!B!ăF:!B!$B!BjJ:!nxyy(B8um<*v.m;1ɣIj߾=۶mƦ !蜜x̙30`@ZjŤIx0a.Z }¤r͚5WlR=tI ?s|qG%Uj¶ 0#bg=z;=94ȡjr)|]uD&zX4{nQnpvYbp1^{Babpq{>}Z;Vapp㏮tޫ /S v*nԨQlذGj*tb}ȑ,Yp~'ڵkWckY,VF$17ض;Ε}7rӆP4UsXgЫ轃u'nD/5y`}pf6Y>?u =6]'NΤIw'"STdggsaRRRJLӠA sXr%1s_|||۷/k֬$4Sd^)1GoB@nء>#ޏ&#d6p-MVyyZ8`c$&2$F}Zœ/ag-V1wI՟}͊ۏS)XuAݫ^מ^iX{}m~ոr cǎ?{9=z`޼y?L0W_05h >̜9s5k999|4lФcCJ^ OL'*+U1mh̹4yWg z`v^JOi, =# Q߮~y׷OXzeZf cǎ}&x $Khh(yyy%i׮]Pմi|||ݻ;wX'aٹs'|w}`݊+xֆ.CMp?vhu,i+בc +zΧ>q:krG|!bi8ϿJeprmd2m#QїZ߼wС\z _Xzokdo_%o8p+WxDgE3D}1Ac4Sv`A5Viy^kG0dvHG,&COŭ {oeW.nd`eJ3Lm< K;ǬSHKOWy9VHjştXW_rrrxn};v~0>=z> رcXYYѳgOUUjke~\|"\- ?-Z4^2 9U^KMR%N$퐷IKeH!iz{&+?/}M;vԳv1>{G%׳/P]Lhr8]BD@gڵksuV%66ڵkO׮]9u}套^瞣o߾]tW^᫯bذa2bĈbæ>Zlit^J[[Vm¶e4H Ԟ9/>"t@7I  r֓9۹/<׌Wͤ4=_ݗ\x }xzeOKTWN5pEDۯXtԉ3gΔF  ŌΊ&-/ͤT(PX5AUޥ}9P A]kދey\z? c@u}A ևͱM:VG׎J<_4M>JG׎&s7@䆓Yu`[eϻ)5jľ}ؽ{7_5^iӆ'N )G) &*tڂg>+M_[۟ ip]JmZ*64\TUdZiͣҙmuG#n779zڠ.,= hҎԼTڹOO:c˓Khh(;w+"՝J%deeѬY3ǚ5kͤ__ٹs'cǎeϞ=@нƎ[Hr(V лÝԑ<Vf%q,y<&=՗^$qb2 Ǿ]'2sfVJ?KqOqsF>>>;vퟆ~ءL_&8)I '#nxyܡo|* hڝ^`᥅Ow,X@&OPhhѢjyj&;vt,gKgno2{4 0QīiجeyCcD.)XgϞ#** {9,Y£>͛7QT8::?[o?Obb"5*53fmی>VǓdqd}gɭA}? 9U~~ ,@O*!u0,v`D, _@XF޶X(,hڎ%Kh^kWΔW\\C!Dq5"S(@A`Kzz:ʨb;޽L47rΝ;ǶmHH4222Jݞot^ɍF%nЈU>wr摟iT C|!&Nt{?yس\LHZ$%=vQRPS)Tdh2Ύ&;?+UqE\s?3.Wyyw^SNm6F?faaAff&111`iiYjSN[nL4]ޱڝĥkqt`nVImh̹4s,\Bj:Nč={dޛ{ךq9qaS ܭYvutdSrjBFtj8y~-YYY&R63@BBFCoߞq1eFMbbm:X&cn?~<ϟ7*/B%N]~:meTF[mDRotsW+W*{Uijj/Kn6Oa#"쪵j24\Jd>"3`O?{ϧ{wf7mt@%5/k/b[lAOG-ZTWmj`߀^y3Uƕ7c呞˗/g5c yLµkL:VUR^64\TUsɅ \HJbUUtՅlFJ"C' %+?s-w}Ǹqprr2:=={{{z!=L i7ĪOiԑWkoζeW6$ēce3̅t(4iҤJRLM&9ԳG>ŦbЃC\E9[:k狭mq*TY&}|]p{ {Y/:-,<ǒݽ~YPŭ ǓWyL9ֳ %A`5w [ۊX8;Sn]BBB FXXXжm[Ξ=kY1bϺusZix~*T՟ġ O7x^Y}h4]{+V>K&Mx_ 0{lƌç~-͚5Yf?sWU;|^p Ƴலe6 9UƜBE ԲEZs)1f#qv &Fid߈GN C p 8{yyq{Vw!N!VVVLpXҥ7-dǎtܙ.]Ko]i? 33Eܔ7== /`iiIDD$%vK.,Y 6mDhhOLJRy4\&ˏi\Ó:EInT$QN#*/O%hgAEv9޾0ߘ2;x%-Π/r׮]̞=}uVr`e??ƥKtY03Far4oLv~6{ιw n8XeA#ʩW<_W+Wf`^yDeEF}Әb. fIDATƍ|q uwN+M_aN9\ʸ <ô򍩗3GcA]T*yWqvv&--3g{A{=&O?ODD/cooϗ_~i_Ň~h^+/|HnBCpSk6؄ʞWNUZfcИsQUi(ɟdn˹U, Aau$r~{a]pR0@#2|p?nèBuPk(pYQdaqYuus```PICxTՓM1vvv̜9Ew1c=z4Ǐ/:G!JSO=U#ձ^ձ5^屷gƍ̚5SN8BQ"wwrxzzȳkmȣp"˅:!wev`RToߞ_|Ee2Fz%B2H@'-Z_ՌF[n>SU\e0*>BЙ୷2wB!BR!B!j" B!N!B!:'''w...;w;vF!B!NRÇKQ1iB!:y $Khh(yyyN#B! !B!DM$B!BTS !B!D5%B!BTS !B!D5@܇NP^P! kkk<<<'))4B!BQ<&L/Grr2K.5:B!BT'D@VYpa!B!Du" !B!D5%B!BTS !B!D5%B!BTS !B!D5%] R igܗB!:z n[DŅsαc4ZUVԪU x:č7]= NOFj vrhde49,$;3RQ8A?̿+OU^~Sz~Zl38RK_sL!NFfZ/B!x@:JEvv6k׮%iڴ)QQQ9r|:t>ʊ+HJJ2wJE۟>|Gc|;Y)l_1UoSWӤ'F}??=Azuғ ?.XWS:ŸYXEor2ύB!DM@tIIIݻ:fڵ7odڴi4l y$] 16:>k;Y)wDlZ2^>ĭv33DNPN s~];ip͇؋4m !AK ֶL$Rc_/˜=ujg:=.9Y)D_>Ȗߞ5q_Rߏ3=DӠ#ij'-;o۵;ki,{CS{AsCFj Nn$ŅpX$8Gs\ ygik*|lԹB!wUYYY.ԙT֨WYm[s&IxkCnN:1X8<;\yҩx`\WNeLW<Msl^ 19zҰ@64BiAx&cC1|;VHxfcBҺSz#vzy1oר9{~.*";3#6;B!]`` III(R(mE>H #3-`҆}k".7"|HB kr3 :{87DMfC| *ʹmԪݜqV,TVXZak_t< =ī-=eoNiqx/WB!ƫ]׮]eժU直wqQ?þ/ * K5kT?mڭnniYV[ *.("ʮȾ3,@<  +zKްq;go-ˆcZqjғO5Mt|-,O1鯟$)fiIĜ\:چ *+ʨ(/4XZwcbϖui}QJP( !B{n@?k׮%77G"m:?Jbs _>ԥuƕhj>_oۮ楳bI_}ޡ?fwKg0E$kC e126 w𛾞Jl&սY۵ >}!B!wO=nРAtڕ5k4z"l.j_>o>*d'+Ms[E#c.FUY*$]KX[:֡,M-siQf6ڴBaAyS 􅅕m#BnY !BѼZ:BsUJPTTTThnC ߟ;v`bbJ;ct7JwDG]GEE9J.[mF?P4J2S7{SNc8#+-C`naopna? 71Vg֪Z3x꣩k3vN^8bbfE~eJq6*v՗R\AľB!y)ڴ>>>dggb 055e:d-][ٿy6ċUeF oo0< Jsoslǽ)Y1l)/6{/DT`&Ғ<ڕH.w5l.,L]Ds:༚^`fxx>#k\n_tB!h^ { SQcYuZQ#]2Sy}OC ?m B!R}`}\\\8tP0 T5~V^_Y㥩NS#]޺N!B!Z !B!]JtB!BqB!Bܥd@'B!w)е nH2m^v8pt;nnddӾij|1*lC0[.oѧe*} NٴiO?tKW177oR*t</a5VLϞ= ӳE]YTDڟ(lR>N: qFj0CVzf}#?B64N>ſK)*/⧤T7^;6V ]פjWAʃ)Kf/j~DICiqG۫oѧߛkhP5s `qvX'TwʝƐ~?_1y-ݴ܍> Wx ;[u=n;>Mr'qNфvxm9y#z]ln#}#ٖ?bFoڵL4 33&!Lb@EXXєsr W\aΝ( ڵkv>^FǕ\N.ՊsNXo~/$ #![?q_O@K}uzc[;RmiZ7DJq.믬?ԙgkw_˺.uS*>K~/1*NԑKi^7ϩqi%JC]i8w?GKFXZZ2hР&!Lʖ.@K011! Ba"6B^e@|~ҸKجgdaIۅ\Ƣkw*(pS0is7ݖuAl}`o >6oᇩT{KƏ4>}p̙PgE+˫2ՙ:00_8lps]y19s-卮oԺ,|rrqPUر{]]w7s7坨w.fH%E.\ȢE8}4NNN?0>,OfѼ{\|Hڱ~O)I ̙+Wҧ7nJۅ?a0M7I)Ia{vUMVM߾}ٵkWcw{j@ԩSQ(aRRR CHSQ)rlt\yNW)<~*8҄Xz0yyxxp?}w+$K _~-,<6QG뮬IS=r}@7|^Υ.q80aX{y-%Ϛ5]mlgk9}E{h}L:/ &y E|zSyMg˚|/[:KʛbvṆު=v^JW׬}\wH,JۄƩSl3Ӧ05u+ ~cu-˛ʒbvRYTDYj gubٞCzi/,M{>N4i?UuZ/))ubx l¦Mꫯ6lSLAmWFsUo\Xu/cdN9F,| _8jVk`ݘ!ĝ?`nnN׮]9r$k׮%;;[ ZL-YJ &{?i%id3\LiCTCp5wXa='O4d `Gߩ?{<:I'q(t?,;{@ZJ5rN5LNEEzI~'ٗ]YGzI6&>„;8}[[+]dsiSzQh<ץ\S~[Rvlu>ۑchnq> #33ƵbO@@@#VjەXO:c?7(eqx㳌i3k> 2MAyt"یFe cEU+53T5#&F&6&u_z,\Gh 60g.o3y nӻP< 'hݑ^$!/IߺDt,]@'Nt쎳yz˸/ qaN9Klۙeq˴1=3u?)*|ލ?]YGBa+dj03͘ZeK~/Fjzo8::YwbTƴ77Qէmݮv=__uTw?kq#[MdnM_uMBteߤ؏}i31I[wx 7סNJ˕XԳ=#ǠEs~/0i$T*FFF̙3##?7FŤIM6L0FåKt;v,> ̜9~Z?~<۷ogгu+lImsPuTk(\]]9p@bwVqɥ)ڴ>>>dggb 4 j~ammMEElٲEC`dm}T擺=rm2(ڴo{(&z_WA,3ydNݻy6l۶m3x |0g.)%)J'K}Ҍ_eˍzZUhﮪ'?̕eQ?1!>uڠ|q Xʙg076gy|XUgqWZκ-]F7nl+ O/sʛٙ^{ S#Sy|rZyeJ\]xkPs8u̠ҧw QTQ\,꼈"cyruؘW[$&0Lf1}6uy S#Sbcx*)I/+wpov}{ҚKtf3dѧѧ^{`f߰}^{lz\}Btb_+Vi7tC5}6m_z )1$~ҸOeq1GۿI}5qH];hC_|7_ڵke׮]\{`~~>SLaܹϋ/HBB6f8991w\|2zkZ[[<љ!n>Yg:ϻƒ>}h|'N7>1B;0)j,N+j_*i|(==ԼN2Zĉ0aSL% 4R$y|23l{zD鋻߲^˰RZz #R[pw b>\!S3jԨz}}}?>?p?Q٤|9tzq ,`ƍZa#3[7=jgy$oTfmæ236.1*S8w9--RA8lp`ߵ}|[uOۧ5_S<U1^PF_ܥEڦZCR1NcHq͵gd` NN:y צMyMu'F!D*tJb9BNNN 0"7C}9oÃaÆvFq2}we=}M<$F}Ù{r.JU}|r̫đ'w0[S; [ޢc_vٍcK_CcKs$s:a@eMy`ss&F&*vGF-u~ڵk4ifffMB]VVaaaDGGSVVv1vX8@qqxWst; ̞W+9t:Nb<- (,0Blˢdu$IqԇR91/tz#:{:ccaI{(1Q9]?ú+8w{3GDv6擞k:;t/kz-c]:cc0:4ԉxMr{4M)I!27ĢDbc̍$[wαzMqAשf5u+3gbbdRgygfYJŹs|AU?Zz5~ҒA5)F!D*t &;;K.5:A(?=6/q,,i>@oN"? 9ށsݖuA\پ]H4]UߪgTr;PWjә?_+>}p̙n+CAZIeW.W`[VU-z"qӟ_.Gػμz;pfeRӼ4f);<9fuUsƖ柚foN~Y]Ms0Md0fgLev1Tg9e3^:˧xNakVڇf39uaazf:/s~7-fP_}"jpO➞D :1FތE$0  cA7?[cB~8uÆ ^gaذ~}pB>Ə?ߤ5~O)I agb3WO/xPvWsfF&)%)lOnPj۷MOBy~~~MGHPy-q~r;6sW(:]uFl+AC)MŪg Ǐ׾ce0֟9cϰ&y ?%G>blbMҧLƗ_؜Wξ=v4Ӱvr>{/8ykaԒT8(oT)6^ lNlPLCO_yRKRq1wap&dp#$֥mٚ{tłmߐ}N`MeI1ya;,*,5⳧ub?g{饽L4!V^1ʕ+kՙ騨(vŤIػw%%%e8v7V_.-)[yF×_2V'gF,| OZFC紴4ݛ#u'YXX0zhvAiii*MMbݱVLMQ&mK{KE~> Zݤx[ypa,dZ;;Xu 27R3grѺ}dM'lMlv<}a "r"Pppcb8ow{VkQS9o@PNdq96N[[+]]wCb>9I)IaoF!*DP|J*JnK[Jގ͔gfuI>^٘t'ٰ@1!))VS #;;%K׃Uo_/ʣlYa.7W%U{;gG"-WGS68>1B!Z{ Jʊ2#?ϊ+-Oi%E_QPzySڟh]YYY58W(הRBAyA"kb_]^Mղ(Л#w̿:dN圢SNUAyR;kwmGϚ5_#䏐:`0((c4D~ 3c> 'XmR|E'<ӠOo~xpN朼-eo e9?/`է?f:%GSP5XhK>:&(_: BBBիAAALcyL`'BuR_:x09_ɫ9? yi߾=!!! 2իo+6j(&Mmڴa„ h4IΞ=K.]С Plmmپ};Ǐobܭ_aKos뇺 5x6ۺxxxʁ#igLMM 1럃>>>dggbŊfV=Y[y.}m ʣb3x6JbmWA,3yfܽ{7/2Æ c۶moC+Wbk]^܅朘ñcژykH R h֍\K"eQEq.7{w$=^Ȕd޿>\D&m6XֽPuώҚ}_{&c.m76܌Ҋm흰SLaܹϋ/HBB6>; ؼy3u5)))/n>Yg7ƒ>}\|'N;K>1B!Z`V=TSXVVHWT^_.88Pzzz/adeEЦg&NȄ 2eJ[kVJ+B6)ӽz鲽 MGnfDŽ%K`iio[>Slll6mZ3keY`NjtB[CI\\\8tP0 T5~V^_Y㥩NS#]uYn8;;sڭ}^uxZzw!+W`N4ڝrLP*Ϸtܑ[@M! !|M'^_2u;vZ8.v} &&&!hK!B!hUr)B!" !B!]JtB!Bqj2`\]]ܹsܹS'&88},+**bٲe-]|!B!hV1S*swӸ,nݪMWVVꓽB!BܑZŀ.++0zuӸryB!h:}9::2{l*++IKKdfftB!QIQRSSٹs'ׯgXZZceeEB!BFgtqqq\p4bccٰatфB!Qݟ}KE!B!ЙckkKAAAKE!B!ULP(pvvR* x'77KKKzMee%gϞm !B!D)ڴ>>>dggb j7h )--%%%;wB!BFiR>zclB!BfuC'B!w; !B!]JtB!BqB!Bܥd@'B!wV1˥"s-]VYѨɟ`m/&tQ&Bq뵊- {{{Ν;Ν;kŵiӆЦMٸq#jPČ^/hVvm))"%!A^VG,˙?m骉z|nE%e\/ճ'8wd%;~ݎ_(ĩMg/%\;@[|J%ϵ;YY1nY=BVqɥR#GSg'N-[~z.\E!~Owipv4kXXZhBq[)M,(.ȶɈk2| {ٲbJyY1Y/Nt>yE9\GK7B[U",, ^zs}WtoS9CbN 3#0pV6.d$O 7#"be7Xj<567!ƏL6}=49ލ._:gju۔Mo>za,v۾7_Bxe|؟k cmg\ꍮTV7اw?tЏ~vې˱]&g ]NFSYADg#sl8}QQ?у |1Vph;o:+[]GbjfCVZ GGܹm:q}GDςBQk[>eַ^zJ!l5F*3Pk0&+-$2o87߼X!D*tԩS4%F~ؽz!W] KFno(,b\ǷGc\NNFǹw{9k՛ӫ^5)M-?v2hTu.;jNC;liR±q-i}cS\It/Tg@׵nk0Ps˱ 3 HLz >H?~lwɘ_yt3?!Z,ƽN>?ѷ>x7хv>׍$ŕzoKij7S.aJF.{U87~dDzӇGlK6Է 4W;.ͱJPPT] 7b̬iӾ7>o ! Z% V HMMeݺuDEE1|pZxu|ڶó^"5 +VvmtbYD>D&"SvKʔX5hHO> 8Cg>ȹKΏHKgw6^pti_4@ibNC41gWHKL]d_ԻNvޔI8/oIӐ}օt :> mGlNC}ڜbNĞ|N+gNyN-d^`Ϛ(з DɹK} ږ_GsjϦCIGNFOm "3\;)Q9ٗuOnv|c}bN.܌#xZB!n{ B 55cǎp57^eCoi=Nbc|߼[wOޏq$Z\|L]tK1ZN:Z,|j8wgpjM3s[|ӱD 8 Ғ# WESS1鯟$)fiIĜ\Ga^z1 Iḏ]ӹd rSHkP>Om`J|N&s>mN1O!Xںbdd='03ƅkWnU/KƙзyYI:iuI>mK@nfB,;:j )s}1-q]n>o~cpV2Re%7W7}w}_!=1@V<77 _Et~FWn51HǑȳkw>HT/k39FJ@L(p}Y(JKiӾ7^Gplk'8{dPZKBN|{Nsvnާi1rdɈCSY΃3Vi!sS57>u*rxڴjnK6ԧƴv]!Ǿ'Yxr3k;/=t)BѺ\B# uRPP`P>%Ed]Ծ>1hLt rS+յrj#Pw#'8\|Fޝ|h4w*N꥽/z5 5IrxVk(u]_Z6Pamfp.-Dib~2 {'oz/QGlTݣc8\=zܶkSC 7 #<|pl翹| 9W))ι~(ɣ(?]L8킍;?FSIfymLjI\<ql =7 5¥] V..M%>jz a4,p|64JFMi'kO[f~Ts-O(F0k]xj2z ~cpP0l‡TV4cHݛuf&0xtS{:gC6l.>F}Fƨܻr3KTqtԨwMaD8JgakdaT,W̫n^B^e@|~ҸK @ɅjI[7\}̙37]߯_?}]^utW_}Ebb"{V=c…,ZӧOf3\re_P!&hOl7WSPPu^ĂS  '=彗Pz#, @\7}/DCvY6#]Ge/I.J^8w<&1'b <,=t5t O/$<3>)|e  2JoFq,X='Ggcn0y gr RtV``~[5j۷/vem#Bg䀮}888o9S/o*K IeQe)=c?QL=s~H/e /R''c(9[6 ?~ʕ+W_b׮]L4I;𠤤R\\Lzz:ϟ=Rk?vZ\^]`љEUiI>6ϰ&y ?%G>bl))VS #;;%K[҆+VZ3T5 &_s歃U"s#u>w& q0uM7;t/QcvVi -.f.:I+I#C}LLk/noު}K7973dJ+Kov̍),ܕŗQ`x^?:/6j%%7}RR!=wΎ۳e?[v-boV}VVVڴMygaa+M{WC$a\qIWۮzWqq,n׽IayagiԕjL&)¿c\-J:GZ^Y:q1wIN/M'$!!OKϛ>no3s 5QIMƖYail٤9IWۮ''m R (J:tf\qޞ?O5;uDTTTB!0D) T** R* GG+J9wo~8O_LںSh4_qYP'%JcۑcPq} f:TlG!oUp)yi߾=!!! 2իWk׏5I&C6m0aK.icΞ=K.]С Plmmپ};Ǐoֵ-mJ?Nb`㫸x1|yE2hDz1u9XpmF2Saflj\$ )012mq0qe8 '2h/5:fM*8pI!BU\rijjJhh6٬XBK.٘Pjlھ SJccHq7\z|m&5FV֔]"u,'u{nۤ]_>_|mw}|wyfl'kkkRRRniV)ej+Wbk]^܅朘ñ3(.]F7nl+ O/5g`i}scs杜0 /b^^|jʲ˨Th%|GQEs}沨"ʋ8wq jk5ݘ$ڇms"}w;G=ҚYm·,s22q>i=8qB B!0)j,N+j_*i|(=932nw*adeEЦgvĉ0aSLѹGlɒ%XZZ2VO?MZ1BIdfy3;;F伦SbX0 {?*i?$@RQΦSP^`6֜uS9yeg:uꖵB!LL&¡C\(/MWu uakk3׮]kr(Jx[I8^^;7}/J5/tzm5 3p."qvvZ]~2$Ca^y,+ewnު=DӤ;e0'B!Voi=xͩ7=VXa̬0C59ɣdeeojgUj*8:ץȿȿ7igsr6lCLLL]!rɥB!B4RK_r*fB!B{ B!.%:!B!KIQlmm0`s9vܩcllLpp0XXXPPP@dd$'Nh !B!DR#GЯ_:c֭!33OOOFEII Νk*!B!Z%YYYMYYY1m۶%))D "''WWז.B!B4J˸aooT= Ɔ.B!B4JR੧BPYYݻIHHh !B!D3Ν;֭[ݝÇSRRB|||KO!B! v ʉ' ##www+:!B!]鞸Z5M˅B!n*) *TbffJ,*++ILLGdddh/-]|!B!hV1355%44TvppLJlVX fᘛSPP@xx8ǎk !B!D]ii)q1%%%ٳ={tqB!Y !B!Dk$:!B!KɀN!B!R2B!B B!.*fB_b/tB!D b@gkkˀpuuޞsαsNsss7dffr[}k|{>zGϑmlb{0 -]!BQV1S*sWg̨Qpvvf֭OHH+W$''79c;ge%PEB!BZŀ.++0zUk۷˗/ЩS'u[ :򲒁3ndǐvQ'nOwc˦0nzK,`tǾ38]Q\ɦɟ`AV|{>ȘC+8 Pg|ƅw|@_u2,)Kǻ(**93Yw|Dok?l:zqt3#cM~" bh*ng} }3w(˗>W6ʉoGgxzvy!<2ZOQ5#!BV1k 帺tn %Ǿ®_擕ʽ;|zA\<B;LFJa7~c{Ƈ#1O.''#ͺ-Oa^.Nv%b#7UqGi۾w^x7G RNҠvnNC;liR±qt7>ŅĞLBut]N!V !Bb,夤5 ]舅EKPo+%EP.jQoL зh4$_OεXڴc6z ~k kz ~V'9X5hHO> 8C\;L8QZ41͟qG7f;>"2I8O;go$IAn OstGߘ==;ʮ V.uUScn`6;p:/#ٷ}-V's-v>.# fcHiq4%G`iލ.fu*S ;>#1$#-)(Ko7!IL>9c:LAn {B!B?̀.''_~LMM),,$$$ _Et~F4 ZFuƖU+:)(F<e͵-#c?] fT_y2FQZOxyyK~~~3h :uDnn.-zPcJޝTݼ/ܹ,> ^SpeGJN场eۋK~y-FKl!sJJ q.B!Ҳ+++Jѽ/Uj7*Ė-[شi<8::jcڷoϨQ8w?}''=CE+Yʢ΋XpjYᄸr 8ee8lp.||m\B朘C} K؜ٷ}>y].ۺ0y ldW.gֻj۷/vjZ !Bf*tdeefffYv-EEE:e6˛ʒbvRYTDYj gO؏SK{diB\ɉdX}Q)rl!<<<꽷ʕ+k٣(vŤI:JJJ8x Ťsecϰ&y ?%G>bl<[rWbQ"&TשSl35'}P-k-c]C\SZZB!Z%5OOO6nHEE E/FFFj)//ȰLyf]eE'?uRB&c1ب:Vo>))VS #;;%K[RDF,;{֍kÆJߪm5Wݓt=<FoTfB!ô]pp0ݻwgڵ:WVTTPZZ%deeaaaa,e9?/ fSYm?ƠNPF`^ ɟJP(\]zRDv AHH*/_f899ic4uظQm.?M@SN uYѸ2Hm؜jTRY'++I!B  D׮]YfMtҮ]72͍T)S`/K3~(J{Ӯ/:{S/oL=ܷs :.(1ԩMwQgU=+hMeee9r>ɓ'ckkKϞ7&bJn; \]]hT}WG]βv݉/11L:͍2+pp3?u 7٦3Jōfۍ[ЩS'n6B!aZŀnȐ!tޝ0LLLPTT*1'Om۶ggg zo~8O_LںSh4_qYP'%JcۑcPq} f:TlG!oUp)yi߾=!!! 2իWk׏5I&C6m0aK.icΞ=K.]С Plmmپ};Ǐe}UW<Ox>AG뎼"AA|>9I} ~6~(P0MbEFLYk,龄N֝51mM7d[Qၫ+eB!kajjZkݻHHH`Νۗl6nHNN۩C5}6m_z )1$~Ҹژb.=>{#+kJ.tN^`dm}T擺=rmҮ MhGkݼ 6m۶*C?\.Pumʔ)̝;yIHH}w}GAA7o&::vHܲ>_s^..$&0ellSlll6ͰݩZҊУ_w+++~w,X!B^ pС` kKSUF}8C'`ݺu̵kZJ nL+9!B; ZJq5r#&&FLG!BqgK.B!ZV1˥B!B܋d@'B!w) !B!]UL?NNNsa^ebooϹsعsgK]!B!U%))-[i&yGqtt(J9rAB!B;U8C~zkט3gdeeEXXzj" !B!D3tfjj @QQQKE!B!nV9 &++K,B!hZ݀_~xzzqF***Z8B!Bq˴{ڵkm!B!-jt Ϗ5k,B!B{B 2v؁ * b P(8;;WUZ JEEEv&L!B!?^gydd$wf ծsppLJlVXUB!Bݲe)--?n !B!Diu\ !B!ĽBtB!BqB!Bܥd@'B!w) !B!]Jtk{7G[-ˆKq6&oE0lͰtqDFOE~/ %BQSxl?899ÇzA1wrlǵ֍yr9vmg(.̬w˙?mRk'?c͈Eڱ|n`lstv C]/!B[U%))-[i&yGqtt4(NW으J18Ңvz[^~ rSHO>Eiq.e%|B4Fs^/!BZ뤯]Ɯ9s&++K;EV윪teGI[G/.D [~P ܆X7'hrjۅ'Ҧh8i'i3 ;漗Ml)[ qz{O6=lYΟ_ZPg|ƅw|@_u 0౯ y6~d멤%E4Xk{7f.>˯>Kh }GWot\G6ԧ ]NFSYADg#뜱gGٛ+DZAT6k} }3w(˗ކUhI1ԅڿҮoB_ӵFOg'T!V13SSSRb4Ƴ'WceBVj:k;7/ߡ(]F2fe's5)xCsUZ_ 9ni/Yɿo(,b\ǷGc\NNFub ~OVj4*K*KAU./h΀/h"1sfmC}yt3?!Z,ƽN>Mc#`\MŇQO|JEy)٬enʠawO oIVoY!Z1' ^K|k1:s\1l>B!ĽU\rgdeeӤC;FƴIp Y Ĝ\lj=%-$ >WM '9b iIlX9ֿBZRe"%;ۊ>Ncdl'm9cHyJ1N-d^`Ϛ(,"|GDXC^f" w)Ok7bךּin7|},ox?3No"pfo}h*+(/+[G/FLakFj mS!B. ]~dTTT4:fAMoX8{ OVZ F&8킅3gd_ ui)[:{<<}`i늑1f&{[sAgY3x֊P|ۺxj&~Pv4܌x3K/3s[,m\v%R¼4 2iKkn |p1\67WĝLIbAu7kVJўȸzv>} ajnÃ3~ &b-n}}*B֥U 肃gڵ6:>QH8CϾҨe'S.SGHK Z,FJz%Ƅ(L[#7NNFr BqF'P(OJ tPiq. Q;9j@kb{ )OS5j~SeKsOa^:+g8h}GSN6sZwB`̓()eWk>B!Dj.4h]ve͚57DevQ?K!+"=CH~6)%=B3\*FxsA rRRsFaEZ{y⭒Ke*dߒE_CǀqzĹmZyRui!JF>UZGQ~Nyl]rҦ)MwHQ}ޜUQ&^o]ª  9 \&}! W ~I**:nE !*tC {abbJBRammmP̝$+-{$ %!{UGsM%9Ba ~sKo3"]GciBibȸuWt]>#}Gg-!>jM%䓵7_5}xwE رj|L̬016w !*.Ԕ,dzIn g¯/1 O3:OEY1kuftxdxuM?bս|ѬgǗ3(M ~l>] c_օ8G;pmne\: Bٿ&e8u7cbfŞ5 kX__|+c\cK@*oՉ<e"z K1(Sq,oTWҒ066%+=>UY!@RLJSsF ^Ӯ`MxdZ|k>T!`V=TSXVVHWT^_.88Pzzddd4#ĽHs'rB!ٹ: @yWxijHWogh-lh1 {(W{ taoKM!B܁d@'HaLYUU|u_<* !B:ɀN;HNF?}4!B!bK!B!ɀN!B!R2k]E#! ٴ{Ö.vq\]][( b혛7B!BܭZ=t@zz:իژ={ҵkW쀪%9r^C㆖nZ,XƍIKKY޶m[^xu놇ׯ筷ުf̘A6m磏>ѣ$&""XOM'B!m*Ė-[شi<8::jc***8y$7ndƍs# 6kZgnnNvv6_|u~~o'|gT[v-&M !B!5b@~z9Bbb"/_f۶m(J1gΜ!**+Wpv܉B]vzmêgoc3s /Iu|XՌ/TãFItqTȠq:<~Ayunoܸq$&&_k]||<|7oO2Ǐ|rbbbxwg„ SXZZ2hРFB!wV13SSS~v ={DPԺ> ccrwl&f+ƕ_(CqR={z.\hοHl)GǕjseP ͠a8 ⟞D^nZӧgΜitwޝmHw1j5۷B!n*tdeeɉy杵IDAT׿>}aRRR ;ovzkadiҡ=S/o*K IYj gO}D5۷k_}i[h(~km ZݨvW(SXXHJJ %%%4{̟/)B!ĽU 肃gڵZ_QQAff&W\aԩݛ;w6}"e9?/`է?f:%GSz^L%wT*MVj?_SVVvPC#?#^gdee5B!{K. D׮]Yf+z4LM.]B(ӯV\eQ^M锥`3`MOL5sU,t4>V\TT:ujt###ݻ6mllL=8{lԩS']n!B!Vb@7dwNXX&&&T*T*@mtܙmѣqrru]Sُ}i31I[wx kEf(,brܥ~NS;v¢kwTOϦ˯`lK0 ǧb;r ?|S<' G營fff3U d̙tԉW_} ~fၫ+h~B!n*.Ԕ,dh4j5ښ ٲe .]jֲT硚>/Ĕf?EiZV,üK7:ތ_]HƏ;*p56QYTDq92V,~^{0o>* I]6*ݻy6l۶mYgee/M{yy1|p [̘1g}x^x7WL|'N4{? !Bq7Pf5CY;EeiEtO?킃7|XFFFKA2Wĉ0aSLAѴteee΂ 8uTKG!B܃qqqСC@.PYy}eƫ:MtqN4uakk3׮]kݝ2B!, |7M6i{ B!ȀKLKA!BqY.B!^$:!B!KɀN!B!R:qrr ==Çs:}}};v,lܸ/B!*Ė-[شi<8::֊e;!B!]U[~Nڵk̙3oooˍ;v, 00-B!M*)EEE:˃ҥK-]D!B!hV9 &++K^^^B!Bftӓ7RQQGfǎtB!Y{ڵk.WTXYY]fdT5}Ybyyy-]|!B!0H 4???֬YCNNκW,5jٳ.B!BU ?;vJ@qq1v P^^^r!B![?^gydd$wn !B!-*t˖-33k׮mb !B!DY.B!^!:!B!KɀN!B!R2B!B B!.*fok==v}EwE` _ח[HB!ui:qrr ==ÇsUmLpp0}\QQQyp;;3l:zqz@}MgpȻ8 M_O%-)B }3w(˗zW6ʉoGgxzvy!<2ZOQAÿn\|_?}˗.1~Jee^aC22R28t;MeawJKB!U &GGGfϞMee%iii3 ;*K˻G RNk;7/ߡ(]F2fe's5}F-s|>6ӿo(,b\ǷGc\NNFʣ8;s0v^Uspics';*ոm߻][\<}QMijIdFr$_:e廧IIoѷ}Oqa&g6P]׾S;U@AU./h΀/h"1sz>=b]LbǏsȾˀqo`術!B!DMr`.KMMeΝ_ݻwcii?UK?w-2Jԁ,"|GDXC^f" w)OĜ\lj=%-$ >W~mL:sLf(=?C5DDεXw~DZR=?bmX5hHO> 8C2_;L8QZ41_G>}QMibξAwaUT/"*k.;X&[KZ_VYYi .!" "" lȍ\D>ܙ9̙s sLZ2Bp/&X6IFZ aWELԏ4E콑aQ VvԨM3wQiFXU}V:gĞf?T54?~0qA<>G!" ]۶m^:;w$33S;ƍo֭[?'''Ξ=8]ұ'~Fx_zQ:.yBJ5hc&nۧ}sK[,w!}|.=3xtsʨ[~ZffiÝ.k?s?RPM-٬3/&"vMΫܻs]g:uqV\[:KLLӤ&3)d훾"Gff17M7.U##|淗1%^?J%"؃{7ijܾ+#HJ"<^F!_X Ǩb0 :gޞf?,r2¼w̃ۤ$j?B!=W]qrrbϞ=$$$6%%DZG٭]S;}?JDrF]nUjCO/ڐ*׿QзcbjQ{,M}oEdeL&3Xez_J]@Yy>Rk]Jw]Jqcoz*5^~w=&1dbl-r?Lz$ּT/jGӎhs6hOYI(IS,L69- [MzCjJax쀮s~XRܿ {}Y!"?͐ˎ;ҰaCvڥs#beeERR^y|W~+IKWM ~ I QTsQ8ܙsǾ!2Ix 65iR&m-<S+-m.c| 5љgRccC]_r<&thi]523d_-l_jD|g*sVsT3f{˝ؒnx+nFD X֯`j^]EՏ4i042-WnRMwL/pfK=gNe7s%Pi~tJS +;,*iK!\t;wqƸcdd-XZZjݛcooOڵ߿?˗/?ƚ,Т/g~I1bRcwL?;TJaj^A' g|T*5m{-Y r( [ڶ6_E-tnᇝCS*V*;O:bٰ'斶Lfo{}"Q.c~؂GvQIJꧤIWڿ>u ZUP*jCYz?6- !/U˫=djzezLk:qNl36ĪbuZx+7PU%GnOx 23x4RB!NzGj6|Ѐc>eiR hqBs ncB!(2R!B!\>wB!BtB!BQFI@W ~fhWWz]iѢGB!蜜6lSLaʔ) J DzȈ888еkWSOAd]=8}eMCiQ_痰_,_?[la4?֜Zt?=`!X.ƃװ_yۘ811y|B|x.}qiÉȑ#RfMm6mÇ ֭[\x4E\2~~~lRgȑ#믿000@R1~x9wzmOrC27ovzРAV϶ߡ/MEt6Ǖ1itMw.DM{]\vaZi_ | '444ϲŋ?gƍ˓7={777,Y|…|:nyڪU%n@\fb\} CUHTL.LLv?ːjCZWy!+rXDZtm+eo~Pݳʆ*C6YJxU_f!m:p5^Λ;I(1F*z>鉹9;v||B|x.C329/Xӷo_VJRR/^ҥK}6ݛk绸pQ233߿?&MO?… ٓ%Kx]ߧYf@իWk._~,ZF" @Q^圻ҼO {-ƎzQQg!4>mi̩ &tؕ'b5ΎIBŸxt0BժU+.^Xmg1|4huĉ:iӆ9sp*UT_cbztgHn+֋wC a?`hԟL;ˀ=瞏r$'P @Ϯ~Ɔ yU5ʉ|)ѣr~l#7ori<Ù;IYpEc}=KruX|5T~cUjzŪ뎶9w\#ؿ9wrѧ88s92CM˚PSYtjRN8p^[ZZn77bmB!e@׾}{vj333ZhOZjt֍4C/:Ĵi/Ƞjժ4mڔZfȑڡ֭k׮5ÃÇ<,,Lq^Ǝ5\988CN:EJJ 111\z 2Kj{],h9琮IyuZUl.Ofb캹mXתƤړ ^u7F7U6Xk"?\QxT1aN9, ZƮ?^':d5c *5k_YK ݴ¯,HMs*vqk +#+F?wNk}<5]VTvm^zbA!ϗ.k۶-իWgΝڳf*Usң9w.;w舓رc|GmۖSNѻwon޼s~Ms4hEbb"III.ϩEyyʓOy|ї{Ii 3&Ez@juXu.6:l6"""+vwwՕ3gp=L?~&_Ŷ ncp>9Vˢ7|bEZ7-T0lۙʦ1P`md{g3R¿퇷MmMljVN YP'̼C_*ɟM'bTmC<+V&2%*TC N &~0+f>Ƹ臏%55Ua!B}899g333IKK#..N'}BB>NEyeeeLT<󞆾}ؐ;1\˶hl{'#6F(N QЭ8ʗ/_rCC.n`` bcc0`-[E1 &0x`>_\3YܱRmVn9̓k_YKE̿<n6[u9?*Ty޿q E}~Ħ>V0KE|,P}3*>uⲶs<B!ċ鹸) @ǎiذ!vNLL :󬬬 =ÇӵkW6lHݺu?t߼y̫W^3E)))Eީ.===OPTΐ˂^ׯ_+4{ zb邡u,[.O|cǚTxlr H կ,9[nk׮|u|i{F͛{#caaV>̌ʕ+cfx+ʮxu[7UCvGY~ o3qƄ>{05(fi4TFyUj:vkp*RnO 4ĤԎJƕ11D=mgE?hh0jZ$,DaZi _>ۿ^9Y9]n]?!\t;wqƸcdd-XZZj\x5kҼys*T@FQ_N:uhSEHH6˗iРjBR1zh]_>}8z(})(u4Yk~~'ޥqݍu u#mYYfѢB ~"ʯԺ)vvwI[[L L0Peɚ, ItZHm"ET0nĤړpB:|+ҳu|%5]LꖫK\{2S.v]^2z4(+(Wd_Wި<>E/$U h\17 h\1uE-U%+W_!es1^z}%Ͼk״7Fqvv&11wwwZWjj*Ǐ:7Cɱo>*UĻヒ ̟??;1n۶u~zo??ĄEw^غN~ǨI~oz@BBȰױn=j KRo|N^OҒz<]rȑ<‚۷֬Y}mԨQʬYtǏӦM~8tP&G':꣙wi^7agj >ԎaL9?sqyhdՈC·0 繛 Xl9{^~>\uM {"ݿu>2x%M*+?Ɋk+hjݔ%3yλ̩?d$^a퍵y`@Fdqżn:{#ݯvF0(Fle~В]AJ:CpR0ZQ}^wx7۷/ϟA!/.`=dS嚗352x۷oS}OO-,02dfԨQ:׈-^sssf̘ԶoՔ+Wc>~f1C!7m]3$poսuͭvFlesf"#1~}2mih߫~q =SZXX3sLKބBƦH2\5krrr5r)^l{رcv'А-ZrҮg##i*Wω]4~ nFeS"|3jSvAr6轎54 ^z%VZ%B!!Ŧh]W222h׮g2P0jY1kP$x4YmˢFѥ=Cre.'\~^vM|M!B!B!BQl2R!B!DH@'B!etG=޵9`՗}OwJhтGbjjX!B\ '''*U@LL ܺuK[ׇZ޾}?ݝիWy>]iiw?#vˆ95sL۷H%|}}~:Y*M!BsнDDDp233iٲ% b֭e3x`c(QtڕvQ۳g&55#B!\ ܷoO&<>>۷޽{=ʕf޼yA=5*O{4 aT|v҈\VL/4$R} 7Mqμ꜅X4cl oPei3/Qy ϩ pX-MkT~ov8h8hn4P6]iww$Mot:-tҽ넇3Y?ӱcǒS.\@Ϟ=Yd \tIѺ߿Of̀rٯ_?-ZTQFPd> ר>T1Y_㊵Mgٮ#rXu$zଷmS!Ru{$yj+A}7W]ݴ>]h/VzPiX^97σg1UVʝ Cfؿ?n~45lL:iZjŋY?iiiҺukB!(}j߾=qqqQ*TP9ǡCѣqpժUiڴ)֦9r$DDDn:\¨Qz=xxx0|_ׯ_/َȽvg׹2/b:I']0n I^'I EVz/Q+ i265OG_4<9C 3DGG[gܾ}^z鉮C!B.k۶-իWgڳմiSn޼ɽ{رcXXXжm[z͛7uCt>SDBBB |R&5j$\I:nFLg޿u֕IVF:YФh{Թ0Y>zG1d}UYB,UcyיF%Ą|='55Ut)BQ=WC.۷o{!!!!4˗F:gE>NE7|tU*UyOC߾}Kdȥ>lJ9n&y?Lr/{>t$yl3C9 G],kkk B!Dt;v^zڵ5mڔb7<|0GÆ [.|7oR~}y#"""O^)))t=} ,HXXyf22wYj ̝3kؘP%Yke&ģjT-V֭P{δvdFl QYQ@D@@u-p֭KB!\ ܹ37###lmmR'!NNN\rMgZ rIOر^{}Rzu~mضm[.^3 4&/aaatؑ+bbbZ *U!7JMLtΜn\GC8x$&5kSY7mA/E?/-~7nizRa [ +R1UG`ݻ/iGJoR֮Yؾ59ϝ7:y$M4)0z+WӳX,B!JsիWcccѣ6mkРz %T?Nݺu.o>֮]˻˾}۷/·۶mܹs_777'7|5gΜaZ׷/" .$(CGkݱU_c?c껝D̚sz#Avo#4ǰukJ)~wRoBXH?&**(/^J͇~6#Fp bݴn:OF7ѩSbѯ_?شiSZ5{bٲeyL0777vsO$MIyܹyŋ.jS1c^SR$kkkkѣtQ'}$$ץJzϖ2Xr%...|jՊÇSB<>}:7o|T>Og}ȑ#/pqqa̙ܹs.3aܸq|GOwww֬YC:R){z… x7ѣGI];2|p|||Xn:t(պ,LFXp!| > :iS>Gу?WWW7j?ر#z/dҤIL6Mxxx0i$\]]IIIaǎԭ[W[n,_;vŋٸq#j+MիGqbՍweٲe&--k2fƌCxx86maÆ%\|5mѣCջT8J*?U?%Jopvvfԩtwww6oެJZ*]<{\@K@@`ذaTT &hׯ__gիW1cFaHEcee]VB.]=z6]֭پ};W\!""'N0hР'R7}a߿@<<<7ozYR1m4񞞞yر쌛ѬY3ۮ- ;xyy;V}Ǐρ駟x" , ((뤛8q"ބ'/;;;VXK رcS~XRWIlu^۷j*pSNͳhhmʕ++? .$11^zݦ3f\rs,322bɒ%k̙QT[h8q111x{{GQǟE3&Xx17o{: ><3fSL)vʕ+:9$$D;/&&FORR!!!\z{CVGɲepwwˋSbbbBݵi&L~-|$$$ok֬>#66Vz}wٳ|رӧOsf͚Ώr%\Cmr AAAёgϲxbT*kSZYnzOI{Qѽ{w~ eɒ%DFF2rHm:%J깤֥JgS rܹs:E~nԩ :ӧӿ6mgXPQ$&&boo=cΜ9-[hQر#7n{wڵmگ_?TڵkKV100 ==]g~jjǛ(Kb]Pt{d?&ϢtYv-Gw~/)יްa#GW_~()|W˜9s'O~={sNVX ǏSO,X@+sv%m1k,VX޽{dԨQ[N6UT ρ޽{:CIII᯿"99h.]SzuڷoJYAI{v)1/^gܸqv.6}7=J= \~u0{l rURZω,XFիW4i-[S7nׯ??G,Jbԩѯ_?.]ݷkժZ&$$DGSv={WWW ᅬFA,X[q,33L+͛W/ER O>```֭[ L?gubdd 8/Cr^~ei ǛЭ[78ի100 >>7x?4$ϏYfJ*U1csy7hЀ 6a/_WymSJx^T|||;v,ǏΝ; ChC ֖˗/kݾ}X(ammѣGŋԯ_rʕoZj+~~~ 2OOOڶmW>5jʕ+:._LڵMOO/좶]I[`ooϼytΈ,XGGGۤ=zwriV^̈́ @QFDDD<3)i.}_CCCKMǍ>|7l@=7n>>>DEE]!!!h4ݻwJ*s-ݻVZc̘1L4/RJJ?J¶ٳԩS+++^{5zEiҤ 6([q,Grذa/M?Rnnntޝ={2uTwgmٳgӹsgƎKZZ2Ç|ai*Uʕ+9sP')44=z0p@9²e\SRiJ3dۇ?GaԨQkoۖ-[XbcuۦիW|"u$kƌjo2j(~wcMn;J(i]>UP<*Up֭G/wXf *TO>!44L~R*==OOO<==Yl[ngذaz3<#wwd_Q۞-r޻jGΘ3u9*T3<&&gggڷoO6mpuueƌt҅;wZ*R7rqIeI1l0pH`` l޼N:Ms7]n:ӹ)i^zCll,|/PjUt.]W^4oޜ.]j*vJdd$! ;#>>>Hq;ݕȹX\|y-Zu~\3g#GdSbb"666]cǎPbE@I'''-¿~xx8:tsJKK#00ӧOsq}]OJGdd$5k̳ptto[n DΜ9_(^hP뇅İe˖|T)hQB6}u)m'ųLX"Zɓ?ȝ;whܸv+V,v9RSSCVʕ+ҽw^g!%mZCժUԩS(?+mS**m'ųt6664hЀ}sN޽O?WׯߦgϞԪUŋ[ׯ_G`bb=xj4ԩj###,X:_t֍ƍcggwpsN&OL6mhذ! >\{2C3l0jժi֬^z(v%ml2Ǝ˴iӨSNNNL0!F{~0aM4aѢEԫWkWWWׯOժU=z4F d_?332RQ^%]JFΙڵkk[_KMTիWqrrrswr[VVk׮e3Jb_7nUTAV\-݋- ,۷䄟m%ǟwΜ9Ø1c8y]j:}޽;ӦM_AlȐ!2dȐbR97y_>{fڴij.Z1c0o _`nn34)))RRRHNN&$$$O[XhiffF prrN:֭cРA+tؑ+VP~}8Pir8q"gϞ9uE8Ņ͛7֭[#;8991k֬'Ҧ3f`ӦMQR?%JռysƎ-[p-:T(JTuWIC*sC.MƔ)S毿b:ׄl۶.]hsiwߡhhܸƔcѢE|`bbٳwݶӠAۇsyPQ?N~9s&FFFDFFl2V^'mae޺u+̝;[[["""6mZ)Eɶ+i͛7”)S5kmrCk.E%}L3g0w\?d_S֡Cs-3FFFl߾]gE򜙰Yq]={ҳgOӉ] eiӦM|_̚5iӦ1k,;vL4(~,,,pssNתU޽{suh4$%%1{lIKK#$$I&i-%F\VY`+V$>>3sEdy~g!B!BQL=R!B!D6 B!NMTTQQQ,^Zl۶ms޼{].!g...DEEaaaQEB)Sݗ_~ 4"##᫯ƦXLLL3gބO?DjJ<ڵOO'Ei4k@c rEDDp,Y] d?'LAAA:t^{ʣɓ9<x{{䤳YϚ(th"N:UVر`ٶmM6`DEE< .M7b8@PPAAA޽֭[)ȑ#&""777:uꤳ\i>E0annns5ߟ7oΝ;(W^pBΟ?OXX7'O~ׯQQQ> 4tYRMEnxyy1c jժETT˖-+Vy棤-Ķ?z.}$ %Q`ժUDDD;Y}w {K$}x\e*ر#ݻwgɒ%]g1rH \\\9s&w)==z`…уG[r%...|jՊÇSBR+ڵkر#ÇLJuѡCR4jԈ '+EJ2vk׎={ϸq6lj>~TRN:O`ҤIŽ;[6MnX|9;vŅ/qFjժW>JvZƌØ1cgӦM4lP~ݻ8&Mȑ#ٻw/YYYz3gFŬYh׮+V`1XmVzu>#^Z4=zy 8 8PM 8J*<̌wl2BCC]%('O.%NIJʣ$ dߺgϞ[.gS7xCg?ݻ^GI>J( e.KOO'$$ իС˗@R1m4OOO  |nŋu2d ˋwyZƎK@@θ͚5SM}a߿@<<<7o4 c;z(N^۷j*pSN4EX"y}%""B ::+W@pp0W\!>>^']ll,8paÆQR%&LWKR\\!!!pBիvyQ03fpe\ܹsudz*3g71'N7:y(釐}+Vp%8v={T]J֭[}vm8qDuX>8||2e2n8]駟r%&MŋټyF2tP٣ȑ#Ylxyy1uTLLL޽6̈́ o% ?x Q_eǎ>}3g0k, h߾N{;wɓ'sqΝ;ƍud$VZqI݉bΝҼysА5kg\y5nܘ$JIl{Au)wJjPR%i:vHrr2=M6jժ:)kt)㏒|֏%t2k,.]J.]ؽ{7WE={-[W˖-9{,=4jɒ%\;2o<&N[osfff|̞=3qD߿xݻGv8:wٳgqrrb̘1̜9&..?#ϯlÇ?|8Ν;W*K}+}ӿHMM/hժ666 :oӧӦMӧ3p@{= @˖-qppCI_#00ӧ-Jɉwy]rJjԨxxxx0j(:vƍV>{njԨ}M2tN>w{?~$g=NNN޽|v͐!CK./W*wjhт3gh322NJG_L0Jv3lذ˗/ |o^yj֬ @۶my饗WbܹܸqC=V*qƱc]z]6}۴:̭_~TRk]cŭ'%]Oz]J/GiӇǏ˥KxןHSR%(}-B<2Щj0aܾ}dzgvɍ7Xb?2խ[5k`ff 4fbŊݻW{vdԨQybjjʂ '99squТE ._̖-[4iv8"""شiYYY\xq靦([lK.rѥKlR򍝏<ѣyN~>HTT?̑Ȃ z*k׮ vƍ? ?sXI_:u*iii׏kתU:uh~ؿW+rA~'ۥtܿ?k֬… kyڣ}033TRSS^:_}Yu1qիGdd$!!!{?^[J*1yd>|8;v`ҥ 0@q>_};vԩSܼym۶_UΝ;3`Q I[.]YW}Aolڴ>L;_6-sT*O?gCQNJSObKbƺ;%_(-144Ņ'N?vwԎ>e>{ΏGuOI䣴~= KQT*j5>>>̚5Kg&^|ƍ?+++^{5zECQޞyRŋM7Zm۶iӆ!C0{lƌY^g4E$22Cj* Btt4Ů}h40%% }}FF^߰a7oёw}ٳg]^T?FN߽{kkkTW\.uN+髭ZޣC888}vՕ,,X6jԈn޼Yh]JAkkk}]:v숝X[[g}JrʱaXرsI-Mzz:=z`ԨQyT@Ys+2ٳܹ3sIIIDFFkkkβe%u'8!W nݺѣ ::://^fμWr}7oN.]Xj]v%22RSSՕ#GY$/ő',[[3lذ| (ehh'%iŶm1bVbذalݺA*Up- Ʒ~[r.\8X ͛7өS'RRRt(0Gfff 6- bcc/_~ŅU奓wa0mOaۥdXf *TO>!44L~ ?~w}4LXX;vTd_?ho:rUڵknj3qurrN^xx8:tVZE}#ݺucҤIWI=|tMC>mZT9s&+qqqz}q"22ķ$iKS(>}`hhȥKj56lл׮]+¢)㏒|ԏ>/DI*sC.svƐ|05j3I{VJpy:uꄍ ׯٙ-ZhݹsyOKVV:MHHy~Z>gի9995QIz=Վ;pttd„ ԭ[WVORŊI+UC.s?xmJ$&&r]Ӭtn:&&& ֯_ٳgټy3>|8/]c=@>Vqvvfʕۡ߻wGGbs4k֌~[' /sss177/4=zbQQQ(~ELL k׮- >|8 "$$$r___ڵk644uyw۞CV뤽xb988K|07733EՏ!JB 芲a̰aèUӧOYf:79s1cpIs]v~J;iӦQNz aIعs''OM64lWWW FrӴiS^~eT*&L33kfȑzVnhܸ1vvvyhܘ?>z1QJ^:}Mvx^4h@߾}ٹs'wsVaܭ.Çn,֮]ɓ(S_7nUTAV3{h SNjX`A~Dy6m | 2___ Rhnȑ#yOܹ3~-mڴiӦtAY-ZĘ1c7offf899#ڵkiժӧOA| 'UOQn``u4h ;vdŊԯ__7n[nL0ڵk3zhuΝ;瓞;o6={VZ1>}{zĉ={6ϳRRRϐyLHH033cȑl۶-g>;s@Qm- n}6m*lfffTP'''5JXQ(XWAPi_FIyJӦMlmmٿNmۖJ*XS%(}-B27([n֖sbkkKDDӦMG̙3̝;ǏFt͛7”)S5k\Ǐӯ_?fΜ,[իWk>|;vpٳgO`ciiɱcHJJ믿sFI>ӠAۇss3m۶ѫW/vQmwt?XΘ1C'iӦ1e믿X|εdm׮]̝;3f`EP+V`cc;qqq:tHEH?Ν;GRRnbܹ|' :]v)))) 8y?`iiIHH_}^ۥdngggA^hQ9í 駟ɓ 6ٳguVT*πsٴi~!fbڴi̚5`Ǝs]I>EmF!))ٳgcooOZZ!!!L4I縱~*TI㏹y&g޽z3m4Ν_|AŊu| VһK,K}9Gxx8seʕ:u //"TivMLA,,,tժU޽{sue}LI>JԶ(l_.u=vA~$y"o\|-ˤ? !&KK"H2\5krrr5;C'KKK6m[n`NyFFFiӦ?^mX[[sCg!ċF:Q,V{?~˗vqxlԮ]!.K||<_uiTIBhdȥB!BSi|r)B!/ B!z!:ooobť]!B!(2k׮xzz6 cǖvV=^^^DEElٲb3b8@PPAAA޽֭[ !B! "333޽˲e -v>ÃI&JJJ ;vnݺB!B=ޞ[nѮ];ǏҥKf?AR1m4Ο?ODD 4HuYYYidVPKjG]*ٳggȑ,[ www:u*&&&t޽TK!BQ|e& 8Pgؿ?@YftRtݻYz5-ZPD޽{̙3G;e >\jڴiiW+ʕCRq.B!BOe{a޼y̛7txWXp6ٳg;w`Ŋ0~x|}}jy=J= \~ҩ\̙Cpp0/!B!Td:u8p aaa:Z5ضm._Lƍzy }pzY2{l:wLIKK+ղ!B!Wf\BPǏ3` {޽{ҙVTy= Æ ͛Js9sx7}Kf͘?~|}}?~<7$&&C4ׯ_G߿Aff_"m``@GTP'''RSS I;qDf͚+GYh"Fɴi033 8\ !B!J\ RSS9|0#FйJ[bkkܹs%""iӦ'iР‚9sqF4-/fϞם.KnnnZjѻwo_| %?M6>B!B 0S嚗352x۷oSd iB!B<,--LcggW{ 2r| L:.]͛UNk׮ѣGkС:ׯ޽{cҤI9{׺G!B'tܺuv?~<.]JŴi8<xzz2h eee=SB.]=ze;v,8;;FDD~~~4k֌-[ʕ+z*3gdÆ {3qD ߟ#88gX>FFFtޝ~///BCCYd 9R'Çr|ƌ;wɓ'sqΝ;ƍW.}#B!ēVf(N>u0#5kK.K.޽իWӢE JLL{{{ݻǜ9s[l)V={6gĉܿ;>CO,X3PSN,\?6m0f* KjڴSkOj5OMMYf:֭իWt6m^z:˝fÆ \|777x ֥OyB!xL@g郑+ݻWfٳ;wr VX?Ǐ/ղ`INNܹs\~] wwwON<9+Vё/t|^e8zΐ{FYcǎJ*0l0֭KJ5k#G>֖PJ ZJ;vtR x]J#B!PbiiIN8p aaajԨQ+W|Ԯ]T˞M:233IOO'55:޽ӧYz5&LN2$$$TÇZG1cڛ5FMsQۇ?GaԨQ3|p {(./+Wʕ+]wwwF׺B!i(S]bb"ǏמQ0`ٹor_;iKJJ*@$&&ggg{=quuĉ*kذaܼy׳8 44~QNZh9$..Hj֬ @ZZIIIyQjUU!B$vg6mJ 0a05j3);(>x@{ !-==<<3aΝ!!!L0ቝU+nnnZjѻwo_s擑oIڵIIIݝO?TȾ X"?3gM~*TI㏹y&d]J!B4\!:Uy9Ӫ\9/G [}^111E@ !B!*KK"H2\5krrr5lE!B!Ŀ$B!B2]CXhQcbbJB!BtŴ`.B!'C.B!NMTTQQQ,^ܖYDEEѴi'e˖m۶R}%B! V/R=22+lllJhϕvaoogi剔9 cǖvΝ;+<B!xQkF5O?f͚ 2&KlyB!^Te @zz:!!!gV^M(_<*iӦqy"""dРAϟ?1cŋټyvzȐ!jn;qss#""???5kvM8oooYG2o<իپ};V" .0uT(IS+A>}tۗgLuڵә?~x.]6UJ{vB ,]T;=zhm֭[}v\BDD'Nȳ.CCC>3z*3fۛ{O'SkYǢ>f̘˗r sջ}`dd {զ)MKYf .\ << 6pe^}U]#Gp5Ν笑>qdILLd\zk?HAԏu=}P!*s]5͛q]~mW\˗]6թS+++^{5zEiҤ `ooϼyt-XGGի0avvv+444tZNSOOO"##:t(=4.::9x t 6MQmZ9z(~~~\xS\9 {覭-/_~ܽ{W;oy\%BBBh4wbmmJGɺ>(BQVܺuѣGAtt4IIIydeeLT*Wr}7oN.]Xj]v%22RSSՕ#GY$/ٙӦM\]]1c]tΝ;nAy9םNRNS,mƈ#XjÆ c֭zCbb"Ǐgڿ^_n۴$Y *'Jff&K׾宿JR,tۊ+< [uB!DYUХHHHH\XX5ҙ=+h8<:uƆL-ݹsh:vԶ+==Kzꅵu[ XXXhj5yWNč7NٱcL0u}bm={pqqiӦ4h O@WTSfTj5ά\///wDܹCƍXvY?OQ4P!,*s]Q6l6ljb4k֌Y̙33'OjvUA]%ǎ˴iӨSz郫+קjժ=FC``6?M6_FR1a=s9TvmFɫʯw___uFƍ(EGG֭[cǎhopBk2\~=z`ccLF!,,N:V122by_~={RV-/^˳&%ӬC!B ,֭[eܹiѦ9s sѡCnͤ0ef͚Err2/FFF0aرȞ={\W%ǎ#))Ç7hЀ}aaa9sظqNm۶ѫW/vQOMMÌ1 M)E/Ąٳgko2yd,Y>d߾}x{{|ΎFw}GƍIMM-m6t额~%QR?J<}P!R&CY;Uy9Ӫ\9/G [}^111E axV^9Fcǎ壏>Yfza^̔)S5seԏB!gE˫=djzezLk:wN<8880m4nBsիWm۶|Hrr^~b~"~"(n?1m41T7AhJx=Rڵ+W^޽{tЁڵksҮ.Q@ TVߌ ̸r+&JI*{8{0YAj23KxB9Cݻ{{{ƌS`3o<~7>… `Æ 4lSSS=*UOOOVZUڛ+022bᤤW_i,֭[G@@UVSNjo~m-Zđ#Gغu+={WXܹsٿ?F*j `bb񿿚iG{nN8]x뭷P+7 4~?Yf!t=ݸqcsŅ_Ǐo>J:sag\!gĊu/y/eS*8;%ffaϡiUVFU&UP65פjf{7SUK6Ԕ?QMX5o7Rc{4~9.ՉC [ڛ\ 矉7ޠjժyj[^}UΜ9={d޼y8q-Z䄥%fff4o-[Vqww/ 888`ddիWILL̳ɓԬYS;ՕիK/… i޼y'i֬TTSҤIҮ IHHZjر3gR^=4k׎P<<<055e 8cDzyhݺ3m۶Ν;\tIQOdzݺuԩSxyyйsgzciiݻ9u2 QɐgbA&܈MǦu/s}(;^#^q'KMoo T>@;Om}Vg,,|0_Q0) ظq#/!!!4mڔpBBB3*9.G~~~x{{0ayU̡C022⣏>ԿZn׵ת@/9rqㆢ#ʾF74޽{j.\ s믿h4t҅&M}gϳj.]@ǎСM CVhwݱc*Zj쬽/ilXݏw()ʃ>Q%ʝwV-en(=6Neg 0 CqM*v!() HΨ5j4;g?+9(7!g螰͛7kʕ+>}m?#\0h߾=$%%qUhժaaa2~iӦmۖ={u!!!/Fk6l 00N:ɶm +aÆܻw 7سg)W\G޻wӻwoj cxzn޼9+Vرcygү_?tMrr2:@*WҥKRRRtJ#ILh*mj0%z|ܰ#^BE'jOOO7n\i$D(!D(QP?0ν&~ue[QTt Lҕ@λ ,<1of//@ dy^땕3MrN!B!* B!N!B!(%:!hСCiC!defРQG9C'B!eT~]Q4B!B!)VV'&#|Ca}A!D(!D(QX_ȼ\πAZogdˇv3 D~"~"(//g@alπgz@, 222HNN.pO2OEY\`^^#g(E,j?T@BBs}eddPd:'/6'B 'B $ ^PwIt?IPPgQs^*}4A~{ry:88KII*geeBVVj3hbb"ODA%%'^;QGm^7A>u׫...~ITLG{LZV_~C?r[Fc$S&iw}rǵN$|׾t00 w>==}[ *t/Cvꥴ^6I}+-vC wݹUOA+g+r5-46;s^9?~Aे1mK)n=6mWH|lM[K7ۖ\ ~ +t~z',QxIieRJ]ntzMwxi*vq[6o)Q.i+eneK6Cg/ ʚԥ=X5B',O!H6NtnR\+mkges|s=wMrYz8oti|0s[. ϵOrDahnS qRF7N?ڜ鎹@fsEcsߟI ]mb|.ڴ, ab&铥 KS-' 6L6ڻ8fLp,r:)RSpOIs[(8+-}%MlժpC垣߃.:}X K[DCжo(mk.wmTk {T|A_zOۜ@jkZ>EjفܮAԗ s]ԷKRr1:s+͝ Y usK`'Ճ.> u-c#G4-ζÜ4]R=ԩa8ུ[ZܜM>ރRpJպZ%olO$ vc{[sjPWS w-#onPk sJ|!F^OKu.7nNHTxȊZ-Z%Zh}=JA=h|t^Q{k{SڦN }%c%tEXtCreation Time2022-01-29T11:37:06 CET %tEXtdate:create2022-01-31T04:06:48+00:00r޿s%tEXtdate:modify2022-01-31T04:06:48+00:00tEXtSoftwaregnome-screenshot>IENDB`lxi-tools-2.1/images/lxi-gui-search.png000066400000000000000000002516251420007711700201140ustar00rootroot00000000000000PNG  IHDRt"=gAMA a cHRMz&u0`:pQ<bKGDtIME 5uIDATxw|ϕ@ 4R HJ"*b"MEB(J N ޮw^Iy:s3;;{ ([,e=B!^nC /DA:{)L+m@)B!`幭8+i@gOB!BP|SHIdw;O!BQJSVழa!%:(&ݞreB!% ꭳRy%\E!B!ʛOk7+6Vܾ^KoB!`sk־sb퉓B!n7W\Ťo/fg͞K}nôwB!Bk g= ,[VR0g+ZB!BTY lnzi{{U`=|B!BQVDAyPeR9k={C'B!,l^,v Ly̓0KUi9KAJ9p'KB!B-<7Xw'A Ċ ,l ;Ҕ۟ !B!DE`-03S\y:R6[q yn!B!BBO^4綂:Kym+DmrҭroS" !B!*/c c ج 4B恝9Y:fVM,7[B`NiaAtB!BRp0giȥ:}^(+J i3g ܔXl'B!STJB!RzF:==3g(zJ uP9(h3ΞMlrI{唀kÆ ;Nwrr #??V^o@!B!J%jGGG˻ޙ3gv3,S?=yjZXNiavmیyPڲe}||dee]m/B!w+nnn~ȑ7)̃9s;K.[kYgj0צMoܺW,B!wF!??M_ ,vqlR8{:kYf9-[6s:!B!n_|:sHY&3Y띳WcÆ ;WZusB!B Vǧ װ gqX[RNCglJgzVVZ@pp/4"BZm-=VKnn.999Jwݽj?QO!BTZ,|||{)ROAd8aQI=UBUZ3ՀC :<^,T}-E^2mR퍳3b%RiG`0f^([B!*Fī^zJ ;)lR}vIkI\I8Y1<==˥WIVY-sWWoy !rIKA˒"1N3X9R9::6/ڣd+\i8...j\\\wOB!D啟cC=0/9`96m͇^<-;X Zh;gg]>rBQZ-^a8<3WLֺ$.CRT%K\hлT_\c!BST899Z6͡jh4x~^pqשk?걻}WL!B!*J;Ɖqss#77컱 ͙o3(s۷79] !B!Ľ쌇G8;;AnnZt{Le`i[q=iƙe B!Bpuu-q0gWW;֤(f6Aie .n!R?~~'OsdffrTBÆ ټyiZͬYhѢ999\rRIZQF>F^ztڕ￟ѣGa2j߾=-Z0nР}vJPP#Gطo}]yӉϏxu֕if͚ѭ[7ʻ:x{{3|p:wLpp0\t͛7o1j(wΨQHLLUVhӦ ;wiӦٓ>]qY;6--^^^nXS/rrrtZ^EWYPTeݚct8wg]I԰zz}AR*33s̙ByE2ޛSfMUfW{us\r_|4|"x Zh={;w.z9::*o!&&gggΝK:uҥ 6l(f,}űW^%""MJ6mhӦi!CСC#pnڈնm[>B_мys7oرcAR~",YXJ*ԨQ .)hŊ6ǎkW9eB3|n&!DqCl̙3M_xzz[oѴiSƲl=rlܜ R*P)7L/|Ύ*M3*M%7_u넫<c8z) ȁrjZzH԰p<*u|K%)`ܻJIP Z霌.YPͯ?iLob6liii|'@ٺ777-[PNBBBʻ yfp#BA^>}:...}m}3huvv1_SNܹs9{,ǏgŊҿ._ѣfĉiGGG'|BJJ t0''':uNc,[ (R3BZZ/_f„ spqqa̙tԉ\/_?P|:w/Ν?ԩS#ЧOrM4?ё={d"##qttu֌?5kb05k9F͛7"::ڴNqXkd,{899C͊+8~8'NAr13f Zߟx.\h 6,Wof\]] _dv+{w^rrr֭Fmۖd.\ƍ+﨨ʲ^6ӯ^ԩS]vǥ)$3TIQ3rU3C5.esF AS(m鏏cpV+䆣ZIw&!-TD^9}Ptz$gl=Q߅ rt$7V7g>N$gjqm=Rj=Q⿫+WNjXt);wd֭zBCCqpp 226ҰiӦcS]VV7n$77O?Ԯr.^HZZ!!!lݺuYh9sСCΟ?Ϟ={_>CٳgtJƍwxxx+n4l0^ʥKhٲ%&L ""\f͚E\\+V gggM=4mڔK.ѬY3^{5N8SOi߾=\r;w1h ~w /IJ%O|' f̘'Xv-{aԯ_C߆ BFFժUaÆ|W/O?~ktiLTTW\yL<^ϱcHJJnݺ̙3޽{jСgΜԩSjՊcǒ/bzSŋ5\^,M6r5Gܹs:tΝ;s ;*Dqjo'|BZ1 qb?+b^[vOh6K}=ohAP;2\y8r::gxM 5]Pd~?Cz9XB tZH.BlJ>`\E7оkxPI:QۧC[rrr>}:cǎaÆ 8~kLC<ÜBFt`Xĉ`nь3 pBmFDDM4)l^~e&OL&M6lÆ cΝ|ѤI:tc5jšU999<o;uDYz5>?#=<6Ӎ'$$c0a< -[( Ο?ʕ++R8Veʔ) >-[T*i߾=dܸq ƏϨQ1b} 0}X,/ ZnMXX̝;999L2kҧO>S*ȑ^1'Np1:tpGHY}XFƀ.>>AyW9r$V?DPrJԩCXX{~~ڷo_(jw{ 0'O2o޼rw[xx8VrYV/z*ÇG3h OСC:uj[EVL<A߾Se]f-2x ܝIQE|jI5_'N@WjTuA†#t6 qQ{J:~4 Wǂ *ony{5!k:iuz}}7Sh\Gu|P.w7l`899GٳL0Mҭ[7:vH۶mqtt70M`{K.5=7 ,]/w $$cǚ7n\~:u!83^NpttdԫWݻw[O&--Ї0e(6Mјy)`5kCNԩgϞo5P08$,""Ça:={-[0j(S*͛yf7_~'OҼys4ibwR޽ŅQF1rHƏ /pȞkdjMy7 :u:uiӆ뛖.t߫FL>3fTk=tӦMYR/5m6ON͚5˻9Zm+T63I#&9SW.j>N?@godqjz<9y:Ӽ* lH$3OLj5f) DI(JFٳg-xXO?mD'Oɓo,XƍP(v Pzb'9x İ~._\w{xx&P(Lf#Gp~'V\I-P(ʷWzz߽k!))tK?`'''3`vJǎ޽;s駟6Md|KY;999w =uo`03޾6=rrrXt)O=M4AT5*F-X7n7|Cdd$ӧO͛vAFF4k֌'+zJnqhy)SQ:^o3/}5j0}̔)SHNNYvEPi uL*o׃nA>NdiIИTuB+Ħ䑗oIUnͪvuB`0DÆ MhԨŮ԰aB}b0$<<Zʹi M ϟϜ9sX|*_>Pi8tgϞ-=4iRoNNN`0pUtbwnYf\rϛz(Jz=[la( ԩSl^\]v5C=Tࢸ8ʚqۗ9sfŒ3<%Z&>>\Ҽoq8m8vXoC߿w}|n7իǏիW*x{{&u2k箢 Q⾬zLܔ)S2e ф{RUvדATY߷Gtb.!~<`of@F޳)e\&59\~JEݺu MwѠA֭ˢE|2Ԯ]={_wU:uf͚DEE1~x:v`0 qU:uƍl2Ɲ޽k׮Ѹqc.]ɓ'iذ!ӧO'66bNb޽oߞK_QfMOM/N˖-1c;w$''-nϞ=\pMsuuFZZ˗/ VZ1c … ZxGo^:M4Aј&駟&##///SPO?u c}SX1bjժeDEE/3sL [Е kXbtNg"Ch,dN:\xӧzLOڵ-"PR֗WvWR72q:Q |"Q8{.ttJWݍbbb̢_g}Fjjl۶۷j^:sε{櫄,YB|| Nޟ, _NNׯɓ( 6mJ~;σ>Xާ/JiӦё;wtRΜ9#> cǎN:2bĈR.cǎe̘1|,X{/ס;w\?7Qxxx\4rssȰinHtspamsȥ((J*vILLd֭!l-]C}}MΊ|ruVdvѮ];{ [n-;pI&Nȇ~hvE%FIrƌcZIi5IڽUYjz;{y([)BOU*KKyϏ-S򖚍y+Buk,B{)R.iVh2 ΊrjTy([)Baͽ %+ MfA#==\VKzzzy]U^'ֿ)BaI4n >u5PF q6{t:RRRpqqٹ jkz>uo{ !BXRX)`E/''G>i?!BQYːK!B!wN:!B!$B!BJJ:!B!$B!BJf յO!B!ʕo]fݩS/ !ʟ_ P(BBq_aܳ `vPkzO!˸uB +n+\DќB!w"ʖ!B!BQII@'B!tB!BQII@'B!tB!BQII@'B!tB!BQII@'B!T-,^R*-[RNTjuVOՒARR/^ȑ#tn !B!KJ%>,j|||N:4nܘŋ˻IB!Xbeƍ AP#88&Mws!B!]*D@WNr挏:uws!B!]*D@WJr__̙3T^vL޽{9v_~%2dgΜaϞ=K(RɉiӦi&Ξ=˶m4h)]P/k.Ν;͛۷oXF .]JDD6l`nW_}WyL0bիWڵx !BR!sww/6u'gϦuָI2e ۷gX}b0h֬Æ /… mۖ?xV\Y988믿oש]v}FSO=믿Ntt4}/˜9syVR5kְff̘Av;w.l޼tuu~㭷*6o<-ZTh?̙3ٻwo]s!B!* 988Tޙ5}||gڵPB੧?{ҩS'vyb>RE-xQ\M{ȹwC-֡żKWyZuSKh@}<]IJN}LjTh?Zq_|=IIdǾ|9qw^ !DYJ޽2;nݺuLbo@wUfΜ_4\]]5my&[nرQ<Ϧ`ΒL5kB`0Lݺuxnz=wss=؄~X|eέS:߯5/_-?ç _zb Ѿiш5wAa<ѿ+ɩL qO$7/7!%=_BuBU{Jٮ^N+GTTTc*w$t:6lXh{FFAAAVlْ'N5j̞͛=C~^yB_ӨQ#~7zɲeط ]+aʕ+nnn7b}((=ʶ}9s!Q3F[n&Z4b%ʧ@Aذ17߶X՗ tz4kT#]mPG#qr4 ɩcϿ6k+cIMBu.D]7_Ba Cg *qF=Z-L6Dbccy'hݺ5QQQtܙgysrrӓ'7Ю];>XbN⣏>c޼yDGG[iT*%=tz=%yIJJvڼOу,~jCo97{q$MԦz?7rt J<Ժ 4 bnfdRѩ FzF6zJ%;Y899rRt(P&jZwWg޸M.ҰnAiYn B!#3˄8H߇kш?㯽GD_"/^5c>wjKRJk7!ztleB+Vc/ !Ssfh|.\aױ̕URѳskԯZsk42#ZU~X x4.7Sjo^k0%=zڡC-hT//A1Cٲ0G"URn>{UtdG:5غ)^nDijvSpwAMZFilciX&.G)˃a!s?PгV\[图1`Aw-V~}W"EQ*0]5n !DeǶ|M}].\Hbb" TRȾUT?#--#;; G\x^{~޽{hxٴicƌaEddd P*$&&'O4=gȑ߿:i&SZϞ=Q( z>.:$GV([w%9 Ҿ9kmh:zujͳ%HNIg?jt4Ơޝ@Br\N]:Vo&/_C K^+~\BAבkhiڠ6Cv&:&T\xz#>Nj ?ڏ]놅[22ѱO>փ_/GѫskԨU˧sfzY,GԭY~-o߇2jx>JScZ^k:psq%Q<޷ =;f&B߽?ObJ3̆ں(Iö}'hҠ[t؊$D.mq313OkHVя +;@~$&Mn/O7en֐+bLX{`H9th՘5Ly6\]_FǺzZD˦ٲٹguW~[vH9bLmn`[Z;:~ E-hP;zNˮGXGSYaIz>{]$,$*ޞ Bqwu)RJUz8iw[\K`ӎC1xyV( ّZײu~9nZ|Tžm͞BQT:{=cjբu̜9б̙&M/W_}ed -NrIڴic~wߙٓ{ɝrvv&88}rkצuL<.L&^Z"F5wo'N_0wz_oP(lږp#._/"7W'4MA:ꂃV~OJq:OYTGX˽4mXEˎOLR &zȋW9tKXAF#(Bu3X &O*ޜ.XwROF<36RC4v~c:غ֣Zk+c9y<ދ뷑mW*}ٌtDEQ7mŀGs:wb@ר^- 8}m нCKԩנھnkht:5Zv:i39,!ժ@ú<i\fO~!l*D@WYstt (4pIII4lؐYfO?q?HO>VZ1tPJ%y7hxK.'`̙|wԪUz^{ $:̻ŋiڴ)/6l0c<̘1EѤIF͘1cVOZ|p>>>k\v={1bv":CqJ4]ABTjJ(SFN1篰mQ2xfpBJ% E?޹8 H<ƩsR3ynhoS``?ZMԠ\aٚ;N|DU*ͺNz4Z]ǺzZ{+(jɯd][װ$(uoktFM#/'S((ٯ2ݗhVE{kB)(JB($( Z.NlyӄfR0 j$fT*OtlTquqbt-Kb<FZfD@;]7)%@͐B'Y79RI͐STR-Џ=GNs;f~ɩ=W (44aIq7\7>mH.FŐWlOD CA9 BU%~^ *2jojb%jk,ҤA3mt')UkbBʨBteI]\\yy鑑699sCZMONN7ߴu6l]G}G}d5=77ڀC(j UI0wfEQF0AU8qk| "#rvR3i~SD^ʣ=;CXj\Azf6NmސSg/SfAUV Ʌ#,-ٷz`22i֨.nk,ΪhKޭ?ֳ?FJZFh9ف_m#5=Zu@a\w8I.1xzgXuu KRNwGuV* ӅNIBpVoye{UbHMϤS( N+6٬a]n&%C?x' 3`Mm3ֹDE2O's?)WJVM8GOӺYtoçm\y~/n%}BʢBtض^ ! &0BF#%5Opbn~ZĀQ\z-X891%;ӵ] whť1\-Yu/}{8v|3Cj *IL$!9ޡtjŨ:Z.N4F.HBr*?Ŵ׾ baDD^.b[Я{;F> ^[^- ([y!=Q)͢_6ޓk\s|=ӝ̬%%Jwl]|D:w|)jv0]I\z㮵ǥ1<=r=oa6Z*>#q )>ގ*Yw`F; m⭷*c oW_g5ȭ?^ʼnТfe~ KK+fV+_ygBB!(;U8v@f?5f+vwv-C'שGRJsB!@,u/"I*zsZ nҚNwBqTQXvmuBTLNN<ܾ9oɑVB!ĿK+Ν;BRܹsY]?cj׮Mbb"Gr? 41cƠjf…l|k_!kmиqc\]] ʕz-N8Ν;IKK̙æM 7ߤz긹1sLO3g$$$0qDM3jܸ1k׮vϥs̙3^zH͚59s&AAAxxxb o/8wrn70uT"#%( 䫥w5BQ$P>7776m۹|r:uqܴZ=B!w C./]ĕ+Wpwwo߾]͛73}tSف,[;w2o|d6lʕ+IKK# _~aÆ^^^Nǎٵk:tիlْӦM+Z-#F ++ݻ3ad6jb\^ŋ `Ŋ-l2z=aaa,YHz&M8{,Z`Li:hve7o/[neb0,nwvvnݺL24]v\Z?ʕ+h4= Oe>C ^5F`N6l0g믿C?$SP:uҥ իW.Ѧ`h֬Y̙3t< 4lؐ/SN{nS͘1Yf=^Jei^N̔)SL%ˠAh߾޵;vx-=7Fcg}Ɛ!C_JuB!ސB]Jjذa~zׯρpttɴOVVEjZ 0<߾},v^Z5\\\8p ?k֬N:\Ҵ_dd$o6g~(|uJMM%99Dvѣ9<[l 3sLXpr{R$<z- Gk׮{Þ={7@PP{W];vfN:sjذ!111DDDн{w gͦMxٽ{7dffҿ/BBB8{,.]j9L:0Eoob۲zꙆ曤wߙ%11=zÇϷ_о}{F#cĈ`ҹJSNĔxJ{VۥN*Upuuo߾B!S衋BV\$->>4Lp5t:իW'11FCPP6RZ#!!AzjϟϚ5k`ΝرАDs/_f]xpXf̘… III!++^z$>#֯_Oll,ׯ_gԨQnŭ+ s)_qB)jFQd7R^VB!񝿷5\o0=1{m|^1\*JZZC@@7oT*t$%%FݺuMmcFhh(;w,jȹ!BJB 7qeFF#t:S^BQ$w޽{˻r.B!ҪKq=f恘4}DGGjNg Ҋ+KzB!I3ockZ/111899Bnn`V]qws=pf*nw־ۍwS'}nf~BwNQdrB!*^eVv芛Ҽ7FCBBc$\w1po6g֭wL!Jr%L^gÆ Vqt:k͚5W̛7"N{CШQ#~i~mhѢÆ oŋ@ݺuۛx֭[ǹs瀂O<u N͛7پ};ǎ3էaÆ ̜9b}\\\裏l3n۶-=zۛ7ovZΞ=[r̽Kh4BmKP0|pj׮m܍uFY`gΜ)~7իW/zw}GDDDeԡCt邷7ڵnnnӇwwwRSS9t[n5 ߷=iڴi5HXr%{<=3g4P|;{Vw-mC{BQl͠odH(WY.,X`Z͒ .R OTT% ppp P(`$##cUok?s! &NXƍvZj׮]h#HKKs̙3^zPd[͚59s&AAAxxxb KBcǢزe ~)z0|MW3g?,rVӦspp ,3JIi,;Y^#::UVQ9ٸqpqqaܹ]!ߝy[ff&YYYxyy@5P\vͮ=tseٲeՋ72{B鎎E7iiiٓ}z2e =z[n 2ƍ[ܷVZ7~ѻwo4iBprrߦgϞL29som[qm*ĽFdd']RQvmX !UƍQfMquuLJ< QVtڕ˗Djؾ};Ve˖־4iK,!##PZl޼ɓ'ZҶ,=*tnܸaqϓFaɒ%.227np juV͞Vٶ҄(YYYZU)7:ɓ's…BV!:P侘w&""PjU'OQfM\]]M4ңI4hЀ^{HTT)MMPP͛77> 0vٙ͛7s /^Lrr}Ϝ9CvС~~~t֍jժٯI&={V[h{pps+.UB!⿦BLb0ly{{[EVjVk*GLJJ yyydZXV]Jˋ OJ*R^G̔)S3fŲZn7|SeРAotoَ;ͤI3f ޽u3f0k֬"m=m9B!E"ɱdY س_ oooh4( |||jz2ӷo_KnܸAZL @bcc7n̟?@/_η~ˑ#GP* 333ټy3:[ l–-[6lXRgfƍ?~H^[fO1cX= .X-۸Π !B_T!\ؼMZ|t:sK (Cm+%%Du7 k 8:Kbb"=zO>>|| ڷoψ#1bqqq1]vѢE >\ (ԩ111U(3t ,^ؔow}W(7s_Rѽ{w UvqB!⿪B]|͛w5tRddd0n8,YyWOy嗉eԩŖa~`>ʢEXv-ϟ/-22ɓ'憳3믿?`Ŋt:233ywLrݛQFqI֮] 7|ٶmX;7kO:|cNJ]fVMB!Ѕ1gp(KL:+Wcwԉ#GUmpϟO߾}˻*/C'BPC7ߐ^{$%%1r vY9PvYB!BXP!\l۶РAVNNNe-^'//d㉌$77ٻw/{-j!B!,05wB!BT bȥB!BN!B!*) B!N!B!*) B!N!B!*) B!N!B!*) B!N!B!*) B!N!B!*) B!N!B!*) B!N!B!*) B!RwT*-[N:TR겭V%##$.^ȑ#GtB!Ba )J}YɫC:uhܸ1/Fחw!B!D*ĐƍB(Gpp0M4)B!BTN:u)B!BTJ*%c=ƙ3g^zL2{r1K<== 3d~7Μ9Þ={x饗P(:ӦMcӦM={m۶1h SB_d׮];w͛7ӷobϱF,]6lJ.&LիW->vz'o/!B!*=t2.dٴn77"SL}=w}+Vзo_ ͚5cذa|\pmʕ+K|<~Wy~:k.ȑ#yꩧx׉O>|\|3gX<*Uf֬YÌ3h׮s%77͛7͛ǢE m{ᇙ9s&{-.B!DeT!: ; <]vJS(}dzw^:uĎ;8~8`0j*ڴi?l1u<'xooo V &&>?0WfΝ|W<ôlj@OpefϞ @TTaaa;b@g/mZ2B!BTf"STݻw_fǭ[nIP ^̙3++m7ot֍;v9<<W^aСN:G}Dƍ7ow)J|}}IOO/===^w\ZСCˤ|!B!-c o&Ge…,]T-!R ~!iii%>V^^,\_~ׯrJV\Mk<ݛnݺq16mD.],(T*ILL,kҳgO {B!ұm.T^yBVX]hZoѣO>^\\\#oڶm a/" ܹsL8\&L-KXX۶m3m `0wWvO=T !B!*H]OYI[VjժE֭YfMcϙ3'''&MtG_ӧж ^ _N}=z4 ,V=m1]v]_!BN\re`` 46YlѢ4oޜiӦY`AI>4h /Pdɞ={IMkwׯ3dy6oLLL f*4Tr̘1L49sPJnܸ5k?icBZv?8\xW_}ݻw[cj98;;3x`&O\.!B!*d zfیfխ[ύ?Zl5}",Z2;y777 Th[VVV&!u4B֗#Mi>!Bs8$ v@f?5fϥ&EB!BV!B!BQr2; !B!* Ѝ9\"B!Aʫ.B!BQT{謭W^{ܹWWWBCCٲe 5j(fkǏ*Ϗכ^4-[qFV^#c^7κuhӦM4cיk֬iQWWW/BCCY&˖-c˖-߿W^yTY~ѠAmj (XɓL>b~[.,]p{TRfiaaa,ZM6{nuV>7ҥKvض-27d֬Ycz|???B!D&=tRR>>>̟?ɓ's;(,, &гgOptt+8 P~[eܹ,^۷3l0fϞѣ$ɉ~7nЦMϟOfLuqtt7 --/Ly'AV@kuٳ'ݺu3B!D&=twĈ ㏉rMrrr'++뮵ӧzm.\sΦcǎ_-?G_~<,^(XϸJ"==7nNŕ裏rJ AUfZ|ժUl2I4ӁP(|2i$,YBFFF `V%==f6oɓB!bO?uֱsλÇ̆ 5j^^^wkԨ_ޫ_|*UРAW(_vv6f/7@כҜټy3'N`$'';:tz [RԮ]ӧOҷo_mϒ`Lu:I&MpYZ-͛7ח[ZϬ]kS~}"##M{x !BM; N8?l3@)~4 G^#$$-[裏q{̝;1ci۶-cƌ'!!H/Ynn. bܸq5Ν;hh֬zww} 2j,зo_/OczY%*ut2I3rpp`ƌ|G@A ;ef͚Uk:l0YhNNN|B!D"t}IIIL6T T*鵻{{"##y;v,cƌ;5Æ c 4'OIꫯ:u*͛7g۶mE۷/cEz233ټy3| /Hxx8ˋ_~0Ti߾=ׯoŅ-Z~qj*~ $66LҌfϞƍM܌3Pϟ dtѮjٳ4owwB!\*D@'+)ih֬Æ +~,O̼y,^>3fpMΝٳ (ԩ111fQtuuo߾8q4jzY-#88___zE~ׯ7 4YKbb"=zO>>|2Ix7IMM3/}1#FLj#صkWc||<_|)Rͭغ !BʣBtYW^ƍx"EҢB˵kh4w=37nm۶-~ӧOElڴkעh^:.{aǎt4]|j^|=ӦGP0h W 7-_̂ ظq#7n[q1p"_޽{`o?s=߿iHݻ7FUV޺wnz:Μ9#G??HV۳zjBCCYhQ/ B!Dţ̞CA0f|0{m|nTznղe} 3w\CÌ.]Jf͚Eqzڵkd$((+WT*Z{`kVΗ )ԓo$X~36B֗#Mi>!Bs@DDD; Z[fNT|jj40 ܼyRN#)) 777֭koǿIhhhf֬B!UXX@> 222 77X 5ܧT*Q(ݻ{w5B!DKq=f恘|jժ3hZ|}}qwwGә7 !B!*E^[j|}}ɉrsss"B!A^uҼ7Cѐ+Z{tB!B 7䲸}QTN||i oxgi߿כ 4 ,,Ei&vm2v,]p{ӚmťuܙÇgsΝ;quu5Ø1cXn[neʕ4k֬H!Cf6nիyJU/smw7z׳~&OlJ{ٶmeʔ)K+B!* ՞{ltdeeE@@5j@Vs5ûiZӂ#22'''~mzɔ)S3gżseٲeՋ7ZZZϞ=۷/yyy}-mfҤIcѽ{w>ϟOڵM˴hт'|޽{3l0˜t[mpm;A~С˖-VZ7~ѻwo4iBKfB!]qٍ7pssf͚ꊏyyynDFFr 8B@.|ۢ?ժUcZ-[b3mL"yU*UOףl JJ*]՚<''"=dԹҶu%..)S̙3fҤI3~ǏqG+B!ĽR!-ɱ91,,vc@~~~2CѠP(Aբ˞lILL$< ٳgi޼9dff]ҰҶR$))tW_}ŏ?hw˖-lٲaÆq…;j_!B! CbLZ|t:skm(m+%%Ů:T*wB4+}ĉ曤wYKbb"=zO>>||iw"--7 㥗^b޼y_mj777|-Uh+WOΝh֬gϞ ?l~~~ ,^nB!(s 9y m ƇOƟ^-[oW%~i\mL?_`` ׯgϞ3k,puu~/w̛7'Or~7:uʔ7))ի駟S `5}L8￟sαvZΟ?_dے%KLu޹s'z";;ZͫJn%==ٳg(F̀jrJ~+<UVy7B!BإBt!!!B!Bar %#<–-[ ,ѣGj*֯_ό3pww/O޽Y`[laժU<(Rёdzl2O/_NϞ=M z_~e˖ѵkbϱz̙3p/^LnJ.ŕsϱgv[M!B qk̽=ݙ:u*M6gԨQlْ7|'_c0hԨcٲeDEEѬY3NJRR6l(X`̝;8BCC 3x`}Q>#bbbڵ+\pyz{{3|/h޼9ӧO'//ݻwŕ?rByڵkDŽ 8rȽz!BQ)TNVWޙ5HJJb/ =:ϟ୷bժUnݚriƏ` 66f͚Ѯ];FN͛i߾=`Β,5jB`0D͚5z<;w?(bذaxzz^z |A+B!%~`~WUJ7IZZzuڞEժUkܸ1gΜ)1WNbb"SNeڵ<쳅￧nݺ,XN:駟vZ=jܪUrƍBۢ/q=KZ^9~8׮]+U!BoVz\Vˎ;?~<<ժUcر4myڴiCZK|fϯHo9RYYYgffK>ȬΝy@AO3vX._ Ycȑ߿jWZ5  =h;B!BU:(iӦBǞ6mwT}ҥKmUV899Y322x֩S'=Zd褽5jдi; rB!]eGGGsSZݩ[.~~~mۖ>uq%>/M4aƌ( qvv6Md2i$^yf0aAAAnݚG}~ TN<oA˖-C :۷ʹѥKx /_n5zS8te>B!*!Gm,X(199F1~xݹ|2˗//4G:u:t(W.T>ŋ 0Vbccy饗xWXl|W۷ϔgڴi5iӦ͛7 4c~L(XX%Kv3gWO{srrW^|B!PNfϡNaZaPk,MbѣhѢB;w *-''o̎)ĿI\\qqq_riwc;'Ba82͖"""iКz7{ט6>/:wN"B!eBC'B!*tev\___( $>۬k~%ݧ$ݭ|B!EFY.uBGף_S=B!ݢVoHU!\Z[>e׮ WƎ[dB!=tU{dggRpqqaѢEl޼ %%%>4SzϞ=>|8Z\VXݻy{f˖-,^شlٲŴcǎ :WWW8ziQyk׮BeO4 F×_~IHH/_w^ }7#99{y8q"n:.]  ;v,M6LJM6pBy:wȑ#qpp &&YfWԩSi=ڵ3WV%KpbS!BT,YKI?\jԨŋ9pwK-P(7gy.]ֹ g%;;U6mضmQQQG˖-:u*YYY888Th'|P@Gٸq#Pg}F\\͚5ޣO>L>UV~ǔ)S6m`.\;#^GaСͅ  ֭/͛77o]t //ӧ3|p<==i۶-l >nJӦM9qǎwww:d~u4i+ӧO zHKKcڴi]-Z>}a4 ӦMvߟ `08xWkgN۷ogl2Zj˗IMM5_fMڴiC`` v%66P[k,\Lh"͛W~?///M:uć~hѼysڴi?J*r^}U+r/ .//ӼysyRSSh4ԬY>Fĉ1c<AlݺNC=o53rrrbԨQEb+(44wwwΜ9cmB!D%/L^^}aaa8qGGGM䘂'sZ]h|ǏO?-= ggg[zΦMY&6l0w%>3lԩS_=cIKKVZpaΕ+WL`vK.qU<==ѣ9r z!Ӷ4vɴiLVMmfڵkDDD?Z,_$==_~Ŵ->>dSץK"""L<dNJ|7oru4 mڴQF\tfLCe]\\L=JzB%K2d&L`„ $$$0a:d3Xf?m!BQqU(j5EIKK#88Bi׮]CQzuh4Y 3Ki=z$zIxx8?##++rBCoO?Ă HJJ2}x/?$55yRSSY`}o0doy^::k׮'϶mۘ?>=z9ڵ &ؿ?]v5Mk.w?MC9og8ٳ,\~}Z_|B۾KqP@Jž}8vXͳXn.]6l~û˴ixg7Z˳~90zh\\\pvv|;7SO>>`0y&JNGRRnnnԭ[הV9QU˻sB![rio ei0ʌ 222%66GGGBCCMg1,XG@eo8!BQU襸3@RZ~~>jٙhZ-LAZqeIB!2=t]lc\ .&&'''BBB͵٪B!BT"z)n)8kFCBBhZbbbt___Lw+Rh~!B!(N3mҋ'** JEPP퍃 7|}}y7#99{8q"n:.]j״iS,Y@6mx79r$6˵QzGNecҴiS|||شi .sΌ9bbb5kiiivm+ ёkײqFkv[F/l())_fkhlKqe} B!* Cg=m}$++ ///Qjk׮uݼn믌9;v0e|O?͈#ݻ70-ANڵklkm(ƍGzz^䇂ʬ,^xq֬Yc:^{_|ÇKT4۳e:vh 9yxx׋cm<B!*E@W\@v ܨY&C^^El퀮]v|TZU~6l@ƍqvv&''$`AL]M4ĉ@b|AE}}}ki^xիWeWYx/򻻻CtGRm+GaƍШQ#{;[ylǞ>B!bȥ`(vcvv69;;>4WZ(;oIƖ16C!SPBs4$mhhi&6=9Jhr7؄pln9l}ɖc–,ٲuy^zYy4|=<Ccc#¤qc5uT<غu+ E˗닿2e ~i ެYpii]\+>>t3c СCؼyӲVlj?\;K.ŕ+W/ =^x,Z@BgB7lF|}}|۶msxZ8 Brr2ZZZOCT?T.##wFKK f͚3f=b  q7KG-[i&lڴIJܬ}gen@DDDD-lꘒ2Wt:ݐi!** z <<A2NgCPhkkÊ+믣 IIIxAfiXoo/<Qq뭷X{;7ML4 O= ::ӟ;ҥKȑ#e(,,D||<o><䓸횶^YUV/23f̀hqײUצ&hmVckxǎܟ[\y`0 2{kWz=`0 ,y9qdcʕ?>ގKnf9sz񈈈pB455a̙C^tkn݊[[nűcFUG .־/ɰd`U,TUU#**JjbVkzޡظqԹ[o+V5kel}r? """" HA̟A/_7 ]fMQkk];pz]v܉_#^3tTWWcx7tw}'}6-ku4 qw!!!xo} VIII׿>*++-ִ{衇@tH^x}7iu.~!IZ[Fk믿z̶QG~\[n4 E}""""Y3g,0{q4eA#4iݻ+iZGccs…8{,\㩧£>ꪐaBGDDD;W'tnʕ+x7Q~^^(o\2~QN态ѣ]-:E'NٳHNNFDDBBBT*3:nREt:tuu .]:O!K'Oɓ']] """""$t@o/^t'q&DDDDDD8&tDDDDDD bBGDDDDD䡘y(&tDDDDDD bBGDDDDD hnnv8R(mBDDDDv:""""""ńC1#"""""PL興<:""""""ńC1#"""""PL興<<X.c޼yHMMEdd$===hkkCee%N8UADDDDD@&s1Hd2~a$&&N+Gxx8RSS1sLEիܜ\.wuܣ̙3R K_v """""7P(Й<3RSS]:Md2arZDFFBWWPO=V\in݊ǡC_Ro|7iӦ.oon ɸr oߎ q_tmۆ_6q9s栮_jSO{ː,akHYGgw[$tAAAnsPdW<3X`O~/AEEnFwCss3:zL:բƍ??PWWիW3QZZ:rFFFᅬ_WXx1}YhZڵk\iO"""""rm:{/֭CAA8AG?8 l2߿Oƺu뤫q-Z[ne؄`Æ  Ú5k`0W\(s-mۆ[nͳmذxg.]BJJ 9!"""""7Ir na+"zzz$ndhmmuz=]"""""r{&2n޶>Vgg'[ sY S(ؾ};N>??a;|)))AHHyrssQXXZz[${J%|}} T*qk֬Aff&bccq77;# .He~_`ؼy3d2 uSO'k~:T*~_CRᦛnƒ>o6;v %K ..vo>s<|MWT*V^{ /!"""""6u˸8=zTln8w\bΜ9~`_[o%mdnn.ʐNgo|_]vʕ+okTrӦM7Gdd$^ '0{_9kݘΝ;nm?7/99o>s>|rxבo>|X~ ߎ|۷o]R )))xW[o9ܟ[7tU]n:aԩعs'ߏ˗/#''i~9s&~Gq5gW(?xǥ?8v%}Ś5k{ZZZ ggū}3<{ `0pwZO=/_ƍNx݇'| Xh^xp V:'6BMM ?\ww>g}~[J|Gصk~_z7ga޽ذa4|ժU裏cӦMox!O>p{hp}~~!f͚es z)̘1III ,_\~|%rtwwј4i`{ͳv-AhkkC}}svݭ)++9r @PXNDDDD :B+WBEYKLLOh4|駘>}x\__!S*{{{oo/_b=XcnOn}x7ӟ6%ɐr۶mF>p XAAAիWСC0P*vѣXr%@s\~~~aO=00}}}xK/IB]K.?)>!qq>>Chh4ODݖ/lp""""roqҥKP(HLL2]]]HLLa˗a4VzLƒsv) />_| xӃHWWO7͈mllį~+ر͛qY_|+W~Cdon9se j ݋9sHwa0`4駟Z}O?=?F`` pQC|'_˃ZFOO~>CxנV|%%%ҳoa޽ۡ""""xAv a ˿/ߛΛ7H}Yp ˑ±cu>f˭R /;p\Wu%,, v7_NX+Ȱ wE:fJJr=Wĸz)Zlt"0Zz(oTtCߋř3g``W8e2ƠR&|) (aDž#66& MMMd0hkkC`` Ҥۚx0?`: 3g]'3;)) p"]wuś o#燠 k2 AAAc\kXw#']d΍E p8EK{ʘQZP*HJJh+ˆOs>|)))xW[oik3.u'""""rHii+SEhh(bcc1yd( \|斎w܁!J%?]]]ß}Y۱sN<3c҂'XjnV|̙3'|O~.ZHX:u9G$t#%d  Drr2t:~tww;tϑn׮]! zzzaј4ix0o#;]{ʍemӱ.?EBhl&Y)))7_ =`0DEEAC`0@E}O6mBRR^x@\\~mK)S ..ҳgVk.Fu]R3`Ν8}6448]k,[[c]~?rSNwߍ^z ]]]CNdgg#33P*spqVDEEIɚ5krJj* ~~}7JJJ¦M,cI4x"Ν;$%%ᮻ?l^t eee(++Ckk+yصҒ}5fd2!==ׯwXTWWK15xۃ 2bQY:M W π-UWWcΜ9 ỳ-xIIIxWG^-[>q @ѣx} wPRR>}v۷{ַlyyyxq)wm)::ڮiX[g}kƮUUU[!K?/Ɣ)SpE|gj0l9 AVVcyB8Fyy9rss!֮];Z~~ԛpll,֯_̟?ǎs#Xl-[cǎիãk,O>-֭[vj5 5GfZK_A| E:q]s:tk֬Rti=Z-:dwB,l2 -;qGu ߹s' WT<[ӵlwUamuj 3LRsjA "j5P(xbh4_hZ=J-!!!8B!%tvC1\<{zzl6ojjB~~>>̙3#eil5/ɠP(hh\_|zM $i%?#2\ ]koDJJ bbb "Z[[- h?}kk+PXXS"&& 'N@qqﺕɄTUU)K4FLL ZZZ\ NOib>4 Bo %&#tWU Ɉ"lt+zuFF6B^ k:_ItAAEXAf a ˿/ߛΛ7[xx8gf5oV֑ahOf!331މqNWW]#ř3g``W8e2ƠS1#"""""PL興<:""""""ńC1#"""""PL興(j7;1VZz䮮;Ď u@Ӎj7;1V;Ď EqD$z;1޸*dRAZzUjy.*6EjJJ2#;1Ѹv0Ex^FKJ2gƄF 48RΑwb\?JbBGDDDDD䡘y(&tDDDDDD b/D4jzp=KZ+Ȱ wpl3vWĸz';6 7%@F&JҮd21މqNwr4R'WWƏa$<,wb\ "%ɠT*gĸz';1iNX=\]""#Hgb\WcBGDtug=Wĸz'wk@DDDDDD„C1#"""""PL興<:""""""puFC&!%%k֬+.L&ߏDA@sϡ=T*>#?~q}Ÿٳg#++ P*hooǹs ɐ:޽mmm^]M.#-- {/mۆN)7nJ{ӟ B#;;0 hii#GpCcvDVEKK PUUAø:xM6 gFLL VQ[[CI>Ν2::"8 Xj `4#^HzŴrrrPZZ:+''g|r96l؀t:455A&!66QQQPTtäI<^e+)) wq  {Żヒ.\eeؚ?YYYYjCpp0T*thl%fv$ӊ z$&&BRaÆ x:H_1sL)@hh(f͚ %KpyƎ3&tDqj5b իW|H?BwL6M: 'O%K .O>VP( ֭[zyn#77 `ڵ(++rp! AVVcFB2 [ӡsXNdcu!##hhh`\`xΛ73g˗X\ Z2MN CGDd2AE;zQV# ,Yb1lC~ ,YF?X1G[_&AP@@ѸzybcwCBB O`ibK,:bj2PSSP*WgOAb  !a9` K.X':"8>}:ۇ;Dnn..]N'[rE3&9rbZ%%%;w.RSSQUU8X|T.** ruuu#ld2{3f`׮]{w^y睨CnnEQTTfh4DDD`8>>Cuqdggcɒ%BNN4 N>mcv5Xp!NR>|իˣUVV_Drr2 m6fEEEtxwpm!11 , P^^;w906;w%ӱnٲ#GtjŸxN6 ,brJxFرbǎìYtRTVVJW\L#z\|/"Zs^|ӧpBp Col%<<|ĺeffv3NPSSg}fXo۶o xW1yd̚5 HOOB[oeth)Nc"cZZZ lbϞ=CbǸx-s3Yr JJJ ^__N: bΜ9dLc  1Oȑ#?>h4رcCʴT*"##mv\TT___vuDz~̽M֢GŦMAx@0%Ngbgttt ;w5:v8i$ϟ!˭&tpa̟?Wo8a(Dtƙ3g mjq)d2} /};h4V3?L.z{{ygƒ۩{ML K.:E1c\LJVEqq1r9֮]`im+tD䵮Eۇr\r $&&">>O<^ F8!//OzRZFeeWuN`Ν#<^A.#>>NM%Ӊ嬘ף)))Xh1?ǤIRyf\z("!!l^1ۻw/.^e;zLk]) 0dgNV,Z-v؁L:111E---ҏhDuu5bbb&$4tBVP hjj‰'}p08KnY1)))Xx1N8>uoF!::8s JJJ~WVŋvMz 4 3}6_U|7t޼yEͮ^>"Ghjj4Yk6\S ke6᎖dΞɝ<Wĸz'{狍ř3g``W8e2ƠS1#"""""PL興<:""""""ńC1#"""""PL興(j7;1މqN;&tDDN7qWĸz';Cy9QGCPT裏p!q}Ÿٳg#++ P*hooǹs ɐ:޽mmm^UG.#-- {/mۆN)7nJ¶m1fZ---(((@UUՐrn1{YYYx1}tu؊yŋئwWW._<0{Y>|իãK,vuy4551#:"8 x衇 "F#o} !!!M''' x!r9xu]PT@KK Yf`2׻zUy$lڴ (`0 =BCCNEEJKKRa$$$ )aa2q0R}}}#oFDDT*1sL|Ŕ)SL/^L&̙3o} loѮ^͝bLd\/]2( khh`\+tDqj5b իWDGG#==/^%%% {pɒ%HII '@ABL&C?[nETTU1Q^^\kע̰=An:ddd 33 L&rssQ]] I/̸:H1^d QZZ?F `ٲe馛pwb04lܸqqq1cN<9Kn~9&2,[ ˖-ñcPRR" ?}4:^#"c2 "rQV ,Yb1,''gB%KhKzyd2( h4h4W.2\l{zzJǏGXXrrr>|b,˱h"t:|gdЀ0L>}iz@0**ʮmFb9&2`\GƄmQ.""jڱpBL:la*++/d2AP۶ms-['?9rdpB\c\V~p deeIWfvqKnc3qujG|2^|EhZӧ`̙3ӧOǡC42Eu,33{n=%N~/O\Knqjw{`0h0%濡+,yp455Y$M 8Y+Ȱ w'v߁30މqNw羾X9sf1.FA/ߋ^A/g l~{興<:""""""ńC1#"""""PL興<:""""""ń: Ƒ{c\WcBGDttGqNwb\;Ď Eq w8Ha\W4R\' :""/&"F,ǃ ¸z';1޸N+@Dd2 dgEQZRRL}qNwb\qLhh Hí#e=-GqNwb\QL<:""""""ńC1#"""""PL興<{$QSH͆YZYGfe9r.\ٳX(Jٳ8|WWpu,ϝ;Lu5?O!"bK.7ߌ?%%%CӃ69s%%%>>ظq#0c V0p^!3K,e2W's^bHIIq1W+tDL&DQ0."zzzkz={eu555REn&%%%dP(h4h4^Moq6_}W(`H,YF?XJupXr{u; 9szu5&tD"##{BE`ɒ% `W3 Omm񹹹{ŋ]Btt4f̘]vAEݻ˖-CPP+32 fh4DDD`E||E(rY=sXr{u;("22.m`{"x555xבBW⥗^8k& ɄK.Y߼yT9NZZgzUxJHNNB@cc#mf5ʲ geϣ… 1uT 'ku:yvmHLLĂ `cΝFDD8sXr{ugGd2vĄNCmm-oV+5{ѢLii) f͚^ٳg3۶m=tDӡ>,4ͰL&۷j,Lݻy߉熆꫘_/*|o:o޼"w%nhjjnxp7H[+Ȱ w'vOiLwb\g366gΜY a_⠗i>9tDDDDDD bBGDDDDD䡘y(&tDDDDDD bBGDtEqTȽ1މqNwr1#"tQ#Ƹz';1bDŽˉ8⁄;a$0މqNw) E}}}#a\Wdo\' "e2\]|3(BVCTBTB&>wĸz';1ѸN&tD4jh4AǑNv#Ez';1(DDDDDD bBGDDDDD䡘y(&tDDDDDD\Ѩ_)rf,i#F32b*lƸz';1މ- "M dRa2 @ "< Wĸz'{:!uquh|d2(Jٴ31މqNw)VWWHWĸz';C]lYaŸz';1bѨ0#"""""PL興<:""""""ńC)\]"HIIڵkctuud2|A$&&B@?Z[[q!TWWKxᇡRrjmmm8s JJJmܸ*j]Ο?իcr{ŶmiukZUUUk:MMM@DDDQD]]vލ6W*~8wܐyCCC^yqgFVVbccT*ގgî^5^U(?>9r.\>lux G}PXX={H֭[LhZ  AVVcFW>xbي=2hhh@oo/&^Gll,BBB ` Gqq4}WȣL&`CEjt:/]P*6Ԅ|9s\^oXH pgl+-ɠP(hh\**JjY[[;KiL!gidΎoqq1㑚 Cjj*;6d:ruuuV ;gķؼy3rssEي#Kft6G믿$( 455ᥗ^r}Gud28OUYY_|P(hllĶmۆ-[X|>rΟ??˅ bԩ(--e;v fҥKQYY)];}4/_.6gΈN;#n X`,XrܹSjGg/ssN477^8DFFJL]N2rGII Ў y{n^gƷN… 1gdddCP]^mhhɓ'c֬YDzz: z-W/uV\WRR#u*`Ieaa!f@rrt-GƄ^^ڔnD@@N9s#NWRAPHgici͞={сbܹC g,,**/83{a̟?Wh\KK @Y񭭭Emm-=M6!)) W[cڴiȐ:`HKKCBBZ#hx+0yHio0{)((,]tchx'8s A@qq*Z-N:Laaae2 ~n(0 e2FFo[7^]]]4ic./x+ AJJ .\Z_r%t:0i$`wuFJJ -Z$ Z :c\.dž T*V` 2R|݋/|_|D'իWh2zq;7!!<z{{\.5EM,{╜@;wnHB^UU%5>z(f[ڋcJh"X@vv6BBBPUUW_}$96/XFTWW]jGV|j5.^Zmu:Z;vqDEE!!!| ]_ZB &&QQQhjj§~Έܐ=2\UU5avi$-'HA̟A/_7 7o^9!nhjj[lk:2l4-ɬ5 y;1މqN_3g,0{q4eAyS1#"""""PL興<:""""""ńC1#"""""PL興(j7;1މqN;&tDDN7qWĸz';Cy9QG r9L&:lUTTXl6lnAڵk~zL:Z/_hĬY`4]:3bJ@rrwN ???Z 2e H31c`0 ##Ջx}:ZZZh4B( J`vBGGd2ddd 33sd^^:::|_F?[nETTUQQ^^\逼 & !!!Bss3v!}i-[ ˖-ñcPRR2 \["00QQQhjjb\ǁ:|ttt@[nv;o<̜9/_|nAAAPծ^^a1uv}inV|`2R " Ʉ DGG@'" 444鈍ESSݣ y$Q->j#88By+`dBMM @T]A0 TP@@Ѹz5yq(WGjшnvx߱LVXaH2ɜ5ڮ[Õ+WxWܹsIv\\jT*ŋL>ՋqGӱo>L& ''hiiVExx86mڄ+W"..ήi{Gz-^bL&CaaWɶh̘1v(ػw/-[ 477C ""7oFnnt1ZCNNV^x߿zޢ <;ZQQQCۈqH2G5֘:{\#לMHpBL:8|WGċ/d( 466b۶mwyv`,Xعssrr,>/\uuu =<#[l766bǎ^%o1tNݮ:H񭬬ˑ"$%%hooɓ!t9ijnىfիWHv&tDz=._^xZVW\7|III9s&222NYY ۋ{{Vw۶mCgf>Ӹ{nN``PRRAUSgn^V|+5ٳgUUU?>{㒒. ] y4^?`/_˗q I*%yL1#"[d2F,dloZWWc.d2|||ĒLRiuO"&sD4"YP|LȳBp:"(S"} aC1#"""""PL興<:""""""ńC)\]""=B#;;0 hii#Gp<2e I Ŗ-[hm6hs:7nJZߟeU?ORFբ:-k] w= ++ ۷oG[[ۈؾ};z=`QSS7|Ӯ555!##Euuuؽ{7!D X0UJa0Т6HU?Je R|zf>-ÉK^䅘y5k ++ ZuuuJBqq1?c=i˖-òep1laL~~>::: ֭[ dffI-,& ``93??)))qi,Y~~~/ӧOKɾn݊(o\D afMFx8S|#1#"r= ^uH {"++ 7x#?rٳF# +WDJJ  *++k.Aɓ'P(NcǎXr%ى<YkTd2P*1m4ի/'ıcǠ1k,߶ZǏcF?Vg^֭C||<qacN态n+ h4h4Q׍݄t#:q`h -+ST6&q>2`ZɄU(JLQ4OtcBGD!{ Fl޼ϟGII -VQXX˗cժU1cQVVvOg$ @tt4Ξ= ___̜9~~~͝;hmmERRVZɄ˗/CV#&&֭_X,sKK4\t_hq`QQQ5k2X+o|Gkk+矗͟?W^Essx {AAO9sƑԩSΆJ(O+k׮L&CaaᨧC䎚La뭡8Џ:t2>> 0L['N // `ӦMvo0! ݖ-[,>9rϟRw[T*RSSQ]]~& 7|3.] "??}m_.MZ{C:Hqd9M&***R;L.\S|DNg0᭣j*\)~X⇋WL4"c}*ljKdcdHBhEl X叜T?$G)HSj/~X>ՋO^ 1_U3khhɓ'c֬YDzz: z-^GAAV^K.fTӱ%::sZ:0R2Y__Ł&I& ߰lm۶+--`@vv6z{{gϞa:*`scҥ2@__E2gpTVVJXn FNNL&|r޽ۮ]+33{n^#Tn=@3&)1- Y vrd_K 7+|JA߯jü-bBGDjkkQ[[GbӦMHJJ ^ m%Lvb=zb99ihٳ@jj*Νcǎ9TgLգ[g}{r^~;|}}'`ٲeXhΟ?+W8<"}USմPjj-_Q }ݩ:Z|G~$?ʿMʼn<ȴiӤ(hqeG.8;gL V455I\vGtR WUy^:wttСC tL>/_Fqq1vApwJ1tFz"73"Lv\m@K]FenU=iq>0oJ nS4xCb^xJS:ptN@> ___,]111ze,-- YYY/sᘓŋ# r& oΝ;PL2xm>V3˳:r| ӧ-h4⦛nBTTh4nIz4"Vhѭ,GtM]F|\܋Wx/ +t`07 xH R 2PwF$qR jR+IDATHA̟A/_7 7o^QssQxx8&Z#5I v?Vppb4#cS3답{U#"{G,3g,0{q4eAyS1#"""""PL興<:""""""ńC1#"""""PLȣhudr`JDt=/W]a<^:NӹzD!l/ -]]="`BGDC:[g݉}N_-κ{W?j0#" "4͈U(or 2#"DUh/|j-& :N:.ˆ{{{R 筈諫r66iڡ9 |AYP܀ Cy2gƄFMJW'ZǑ6g<돸ՁѵxꚈC1#"""""PL興<:""""""ńCK"5???K=El%5Lvw5nvc ͒=^y/G[`T*"v_2[Fd|@@ȂL&J% /!k9/:DDds6K{%RWW^2 >>>VdzYC&ATZ} c}Ʉ "rH =FJ興 &tDQl5g&Dd/[^#"{5 """""QaBGDDDDD䡘y(&tDDDDDD ]BCCjy=(\]""oP(0|dgg#""---8r.\7BRYK裏 gir\ŋ#55111Acc#ۇN˗-Z?ORFբd2|}}Od2띾fϞ,BTgϞÇG^+**bs}v Yw===hkkÙ3gPRRbs=999@DDDQD]]vލq7j#h>Ƶ5LECCߏ&@@@~ӗzÄI֬Y,hZ!88* K.AVFbz3f dddXh::-gC=x:** 3gĴi555ߩhĤI0sL$%%_DEkf\QQ^DT*lذyCRg֛NCKK DQ`p@7l؀t:455A&!66ѣ^iiiHOOGyyux"z="""d̘1o6L&Ӱaחd¬YPWWI&!==x%ގg٧ĉESNŴiӠR?Fq\zĄ BBBfرCR(}I-[e˖رc())2=A"==MG,K,A||}:Ο??.z%%%CTTԨ׻dBMM 222T* ._ ZFII `2,G?Bgg'~ӟBg`6mqU|hhh /ǏCP ==(ѣ(**?a2dh4|WL&z=rDZ`v&Ü9spر!a!ɠP(hhFq?6w2 шnj\)))P(Į]xL興F!((H Css34 """yf?%%%hll333U G±c FZ, 娫ŋHHH|c1<77:N؈aYfjkk("55ǔ)Sl28}4BBBÇjo 55hmmEzz:~a}:rrrp̙ϾVQQQ A+8f._ `ڵk!PXX8>4?iiiqhݧ81o>{h x8{,|}}1sL bBGD4 ]]]xP(wyv`,XعsktvvpU!22iFT755ĉR/==;&%,--ⳏϐ-[X|>rt&^VKgnOMMQ\\nA:2r-JTTWWK|Xt).\]v8 ܾ};L&t!99|crXXبk?q"77סɄW:(3eN.\ST$l?C?.=G7rrr,>/\uuuR2|mpI|goHKKϸvZ RYY熆꫘Nuu5:;;t\zŋ, ZAAA0!Ʉ} jm۶0`0 ;;سgŕ=aqqq 0|qqq:0OXtř(ufnu]pTVVJXZ 00jzH27 ݻyu|GyƟgtuu7trrr|rCm^ƹsbܹЍ ֢GŦM4l6k6mŸ d9ۋ۷cڴi6m222~z+Cn7y4i>Xjj*Hgm***ׇ\xq7ٳ@jj*Ν+ݍg2w\b`BE3%WTVlv{rssFRAPXD":t+glSFQXXoÞ|2\*..ѣG-YI_aBGD4JӦM\.Gii)I.8p`ܤE,&MBHH]! t`((--Eii)444X,_?1{lyxs"%%C6,HMMҥKQ\\ Nɓ'C\p/_ߐ;Qzp*0LҁիWj8u̙ųϥz5C|rX~[-7Q 4Ͱ1#۸gѰOd2:;;4'IIIߐ}Bhh^R#<^A.#>>@aJNNF`` Ν;7G sAFFƐ3C[["##yf#%%b^wuˡ0{lL&\re򵴴`Ϟ=HJJBjj*~!!!F~:&sް;wzTWW#%%-BAAtpB!99y;(((RPTxG!;?҂/OHJJNS.6f댌`ڵ(//W>`Lo:"?? /ġC'Saa!JJJr@֭[7nZZ~TWWظqckq$IѣGqu ^mmm8r䈪aÇqܿXr%zruݨ :bu}݀./y;::QHƟp@1%FYY*++vZe ٳgvQ^^KĉC||<*++17]X=^3I^x/?_?~-?OD۲e۫, vpd,Y$jP;=u 6Q j!gffڵk[px~-z<$l#"""""UL興b:"""""ń(F1#"""""QL興b:")(Me*FDi1 &tDS\.WiNsWbDxXBDj-xb(ap7Q&t%DNX2_QLEv=|QP(brr2|%DX2t DDHө!FVD͙tgEQfC\\c )"% Ep(fVׁD2o$\.WsDYl7""_V(9Q BQKe]zh4A[ht:c .z, E"\BGDFH/QL u֜Zb [H/~ (*L興b:"""""ń(F1#""`@jjB@+@D(t(++Cii)F#ߏ/͛x]yrJ߿PSSs)"]ljغu+L&2220>>n?###Aott/6/ؘ<ƭ[T|/)H/ IkrzyƧz k֬??k3Ip>znkAVEggg}KK V\˗>2>>]t:ݨ t_p](0LFWWV^۷crr/ :,'0Lf3~_୷Ryahhw]tuuattԫUm33[-j׮]kW& gFAMM [ QZc׿uߡK$bT㫩 Xr%:::xUUUկ~]vNHmm-}z'5+T\򔻢644ҥK^ָ:"yTTTVj*V `B#wCx׼7 VX5b(h4EQIPEhnn***}SSShhh {n8qBIr6mڄ /7[a2PYY8NZ ͛wN400׺:H$===Q&Ԓ] 999hwH 'vLv{rGϣܸqiiip8uj̓/԰lZl6jjj0>> 'OhP ڥ[nM?+j|GFRRt:rQ=0]pddk׮Eyy9v;>m0sF]]FGGA_СCQ%%%^c ree֭HJJ7P__VRXV ҂ lܸ1ീ$ѣ~: V^69rD=Y$(evQUUFGG2'=8-߸)1 =dɒ%AqP3C$@Q =["vV=ů_!{5[興b:"""""ń(F1#"""""QL興b:"""""ńb(AEsj"z4%yZ t\#*^0Z!^0#!b؄n1)#MŰ c .&tDDQn;$+bD( ;c 6BQ($t*gA;z=}s&]tQaXBDHc|`BGDQs8Jgu  {\|'=|[ōO7(&tDDDDDD1 QbBGDDDDD(rIDQKHH@bb2RdgY%+I\.Wģ޶@hPmym "$a!IRX""/ SupFXBD~"%N DDjh4$&&0" ENa,!PƒyY^""4 z}EDjh4XBDj% DD.#"Rc1 &tDSB5&DVX9"Rk1ċ_"""""" :"""""ń(F1#"""""QL興( .j$>466܎/ [7$Ixː$ \.׬'A?===_7=)) ى{kÆ ())Aff&044 uuu'z}ǏcWĵkz X,FN={s Ɵe>Ɵ?j+" [^I011Պ .wֶQ(())@gg',Y\444ܹX|9ݭTDV֮] b'fC||<݋ll6XVaݺu(**qW߇+Wx_])Ӊ~Y/jϣNh4x'ⓞr?l65:rh4"//Xv->HzHt+Vlh[oлm^00̗P%$yr DQc="??vHb:"RSSQRR>>|X3ϟW߾};oߎ˗/oy bjbbbfH5[mۆl\v 'OTw{nݯdffbϞ=(((@YY._g{9rSSSHOOGRR&''`oƟ|_ML [TSSQhZHNNFzzzy)0&tDDZ-~CWtt?h"55W\nlFqqqD-[ǎܹ[l҂RlٲFvJ7{B߇(x'p8PUUUidªUP\\Y+g5緿-FFFozt:z=v؁"$''}Ve:f(ҥKEjj*v؁|f^D?E~~>P]]ׯܾ$ܹthooǙ3g099 V$I¶m`'( 0Syr\jx't:駟*%I.\{ +WOؼy3***_?8}4~ӟbƍ|_,FN>k#iQ1%ߚ144tPbBGD!%%K.E__v;F#^y455Q-͚5VbDT';;?1::˗/#>>znA,] @ݻ^gYKK VZtԮ]t:ݨUU_~%RSSa0PWW& ]]]l/~ [Jw2 w. d2]]]Xz5oߎI+a00>>۷ol6G?000. g?/_ Xn*1yhZhZtvv(iiiʕ+Suu5QQQk׮= ("-- \wR< 4 jjj¶"lO6D[{p8tRdgg?h۾G:""ot:ݱc}999ؼy36oތV:u*?y_rzzzY!==L+˕+Wnt8qB> Z^R/ [[[ \o}KPװͅdBGGrדO>J̙3f8x $IRZq=L;ͅ&ɫB588{$ O?4PUUYYYz*>S/KBҥK'\iOSSS8}4{9ڵ+ $I`@||R)r<r~!$쟻(뜜 1׿Vj˥.],|<777hK~+JL&(g}UUUWvwV>\tTAJ=L|s6OBŔhk. 555زe rrr&}7'"QTTǢjT\ӗvOG1::+VV$_kT" ](*!222ojj ؽ{7z=p)!''###u[*ߗ jUx!)**R''8===acժU7oĽ{F%$$((/?Pr$A^^۫<׿hH^)V'٦MPPPC'.]{(x.\:|nu&V102W'Zbʃh0>>fEl#"`0sA:tqqqطo&&&088Vl!|$''~tnݺ7bq drrHKK+!x}}tbÆ $ ߇`P:t8wPTT0n… (**¶m`20::$''̙3~ߋԩS0ʵؽ{7Q]]WmmmCnn.ߏaB!Ũ 8ҥK~b@$\xSSSp֭[Q[[vL&۷7n@ZZΜ9p|gAvv6^~en#++ 7n@UUL&~j"558yd MMMr@z)8N Xz.\P2>}qqqlhooWw#((D[ۺu+P=BGDAmoo/FFF`PSSqddd(9ydD3gCoݺ7Mb^G}n$%%A)3yFFFvZ+m0sFF]]DZzjLш;w"ua"%%V?2XXX^W]hiiAFF6n̮$I8z(_իW GQ57P__VRXր72tDQDqq1ngϞFyy9.]'N񨬬DFF2$z}p8pa\pGzz:V\!~E~~>A_~C@bAii)RSSq-+cѡbaY Sk׮U~/tUxL'x|&<Ϻ_φAl2*L=˂݄44Y~K, %KMWG;W4 q޽CŪ`E;">jĵk׶0,~ZxH=<˯咈Bkkk[U GQxrIDDDDD(&tDDDDDD1 QbBGDDDDDQLE1P7U&"*FDi1 &tDS\.WiNsWbDxXBDj-xb(ap7Q&t%DNX2_QLEv=|QP(brr2|%DX2t DDHө!FVD͙tgEQfC\\c )"% Ep(fVׁD2o$\.WsDYl7""_V(9Q BQKe]zh4A[ht:c .z, E"\BGDFH/QL u֜Zb [H/~ (*L興b:"""""ń(F1#"G`@jjBќ`{tz(vmڴ ?`zUN2h4bzzx"n޼_|A ߕ+W5558w2-eV[d2!##122(WVV''|ƐcccabSSS$ _~$^$?_'%%w:;;{E멧š5kϟ3`ݺu8vUCy~>X,0E8{,t_ wL?իgV;n7߄(3ʳ>;'Ǖpոur50#effb˖-8{Bʢ%%%p8Ē%K;wDxHOOGwwYV]0== E{";;6 ViiiXnpqܾ};eUF^x_Wt(bzzzc!+fYf٫)L&> UBf]'} I֯_ӉNXfFoB!=pQQQWbjj m6h4TWWt*'f+fΕ:r\Ajq݀----Xj/_պڵ$Aww7jkkU_~T )gO~Ʉ. l6z-WYYߏ||EWW`2ݍ.^۷o$0 ۷a6cccZA ˗/W_}x[ ~ca {gl6nYj׮]kyA3<FG>~ĒhcfCMM v؁z k׮Eww7nܸ3GM6a``SO=Ip=l6dddgo$co.+Yzz:֯_{σĸ{)eucBGDQyͣbtt'NNS*ǎ=`ؼy3Z[[qԩI/===BZZڬ]`{ԕ+W0::tf3`bbkz.KپhG[+,,[nmm-Ngrmhh-%6`Onn.L&:::@$<䓨Dyy9Μ9!IҢ{)go1L^ {=H2<(++CUU6geeիO/QXX^7o^ZF˖-Cccc%ӧsa׮]~x܌~#0$aӦMJg)Ɂc[pǑܢ5>>CA$|;AEE\*^z uz<Ձ_xQMFx &tD7o*#=32Պw}V땋u:=zyyyXd DZg3.>555llFOO m\AL֯_JoSCϤ0țoz*׬,3ȕʦ&TVVz,nezWWW YYYHNN0˓RO?R>ܴi6m5-!!.7\.aXle]"]7o] %+8={gcPro;wdƱ8cWZE3]V+222pjnn4JKK111syl8k`BGDQQpwݻwq%K˃ 1,Y"i%N |щ d<^co,ND4 3L߳BI&rwKݎ?Oc2}SSShhh^ݻЀSN!-- 999QZquطnƍaXD299AW^ >Z[[t:aHm_?Ν;<>F<ۍdl6\pEEEضmL&FGGd9s/@N:Ѩ\{{{ݻw] yjkkC__rss~ +sr$$$ ???|K.IpELMMv#++ [nEmm-a2o>ܸqiiip88sL}Ra@Q-WMMrcOV?8l6-kZ<*֭\rV8m:с<|4<^c [(ja!X###ʈnʅ8ydDgoݺ7MLLGIIItʠLW]O}Y~uuuի?F;w0EhmmEJJ VZ!?~<`2ZXX^W]hiiAFF6nS$=zׯ_`իֆ#Gҍ7P__VRXր]t ( ۍgvK.ʼn'PWWxTVV"##C!>W^u S,OnoPvCUb\źZll: [nERRRT1K$OL~/xگu_ ?x<"=-[^;FgY YDrɒ%A2n% iQ v]P#ѣI5vV=ů_!{5\kkk[U ""z$%QbBGDDDDD$t  (FJԴȱՎhDiT!Ѣ bi7&" &T, 5"\QLq\A9΅^="c :"(M2"ZDQ 1Q8b|aBGD1AEMNN"FDAɰ1Q(jc|FF`HDB$8N a矘^G\\4"oΤ=."l6KHi,FIj%t!{[1^tjjj֝PZ<`dH\3;iōȗ^$I8wBgׁ2T!z<p\游.?"""""@>;yT@PA$$ E6xBBBтIHHY76CN Aܹsv[ ]rr2$IZ72X \0A5=j}Ll"""""EG#%%###LA}Wp-v^4jf P>@ܹS311 G"""""GFAjj*ZM5sn ( :( B,$ ƍ[ꈈ衦l2AkkQΕy SC&>;]oľϗ-[e0T %ND^f0-dyjDDD4[a0t:OKK;옹vN::ϑ.]N%tA[ h|遁ڸ攔u)))Z @$HR4BcBGDDD2F8$%%`0@ ?w9`޷(9gYk| \LgM3M~<<˟?^o!U bRbb"NB:"""Z,$IEv7}vŅo8n3g.wwLO $߄ηMg"%udO~.+"""""Z|-9Y-r.+؝. >s^t>/: #b,L|Z&qZB}dNz&s SzZMh@"""""3 4Ze#MT 4YX-ry~܂y/ϳt$NN咈;rn$.N35-tgr"'']0}WRB۽h1 4xIn&z9J'`;dFwL ;V3ebd&xwWQ,l:? ųeͳN'&yDDDDD4",!|>r A[-tncN\fy-unZNDDDDDJ fdjE3 v@  n 3#""""XlГPJB%xL݊^k|fP`}J""""",XWI-mZ0˔ ZRt)r} wE` {1g)B;ږ`NMǖ;"""""Z(>A9oB'uQN >RLHU.D.Դc$ ]i$|6ыfziԃ$uj9&wDDDDDبIIENDB`lxi-tools-2.1/man/000077500000000000000000000000001420007711700140605ustar00rootroot00000000000000lxi-tools-2.1/man/lxi.1.in000066400000000000000000000052221420007711700153440ustar00rootroot00000000000000.TH "lxi" "1" "@version_date@" "lxi-tools @version@" "User Commands" .SH "NAME" lxi \- a tool for managing LXI compatible instruments. .SH "SYNOPSIS" .PP .B lxi .RB [\| \-\-help \|] .RB [\| \-\-version \|] .I .I [] .SH "DESCRIPTION" .PP lxi is a commandline tool for controlling LXI compatible instruments such as modern oscilloscopes, power supplies, spectrum analyzers, etc. .SH "OPTIONS" .TP .B \-h, \--help Display help .TP .B \-v, \--version Display program version .SH COMMANDS .PP .B discover .I [] .RS Search available networks for LXI devices .RE .PP .B scpi .I [] .RS Send SCPI command .RE .PP .B screenshot .I [] [] .RS Capture screenshot .RE .PP .B benchmark .I [] .RS Benchmark .RE .PP .B run .I .RS Run Lua script .RE .SH "DISCOVER OPTIONS" .TP .B \-t, \--timeout Timeout in seconds .TP .B \-m, \--mdns Search via mDNS/DNS-SD .SH "SCPI OPTIONS" .TP .B \-a, \--address IP address of LXI device .TP .B \-p, \--port Use port .TP .B \-t, \--timeout Timeout in seconds .TP .B \-x, \--hex Print response in hexadecimal .TP .B \-i, \--interactive Enter interactive mode .TP .B \-r, \--raw Use raw/TCP protocol .SH "SCREENSHOT OPTIONS" .TP .B \-a, \--address IP address of LXI device .TP .B \-t, \--timeout Timeout in seconds .TP .B \-p, \--plugin Use screenshot plugin by name If this option is omitted the tool will automatically try to select the most suitable plugin. .TP .B \-l, \--list List available screenshot plugins .TP To write screenshot image to stdout simply use '-' as the output filename. .SH "BENCHMARK OPTIONS" .TP .B \-a, \--address IP address of LXI device .TP .B \-p, \--port Use port .TP .B \-t, \--timeout Timeout in seconds .TP .B \-c, \--count Number of request messages .TP .B \-r, \--raw Use raw/TCP protocol .SH "EXAMPLES" .TP Search for LXI instruments: lxi discover .TP Search for LXI instruments using mDNS/DNS-SD: lxi discover --mdns .TP Send SCPI command: lxi scpi --address 10.0.0.42 "*IDN?" .TP Send SCPI command and dump response to file: lxi scpi --address 10.0.0.42 "*IDN?" > response.txt .TP Capture screenshot from a Rigol 1000Z series oscilloscope: lxi screenshot --address 10.0.0.42 --plugin rigol-1000z Or by using screenshot plugin autodetection simply: lxi screenshot --address 10.0.0.42 .PP Note: Some LXI devices are slow to process SCPI commands, in which case you might need to take care to increase the timeout value. .SH "WEBSITE" .PP Visit https://lxi-tools.github.io .SH "AUTHOR" .PP Written by Martin Lund lxi-tools-2.1/man/meson.build000066400000000000000000000005731420007711700162270ustar00rootroot00000000000000mandir = join_paths(get_option('prefix'), get_option('mandir')) man1dir = join_paths(mandir, 'man1') conf = configuration_data() conf.set('version', meson.project_version()) conf.set('version_date', version_date) manpage = configure_file( input: files('lxi.1.in'), output: 'lxi.1', configuration: conf, ) install_man( manpage, install_dir: man1dir, ) lxi-tools-2.1/meson.build000066400000000000000000000010211420007711700154410ustar00rootroot00000000000000project('lxi-tools', 'c', version : '2.1', license : [ 'BSD-3-Clause'], meson_version : '>= 0.53.2', default_options : [ 'warning_level=2', 'buildtype=release', 'c_std=gnu11', 'b_lundef=false' ] ) # The tag date of the project_version(), update when the version bumps. version_date = '2022-02-07' devel_mode = 0 subdir('src') subdir('man') enable_gui = get_option('gui') if enable_gui i18n = import('i18n') subdir('data') subdir('po') meson.add_install_script('build-aux/meson/postinstall.py') endif lxi-tools-2.1/meson_options.txt000066400000000000000000000003401420007711700167370ustar00rootroot00000000000000option('bashcompletiondir', type : 'string', description : 'Directory for bash completion scripts ["no" disables]') option('gui', type : 'boolean', value: false, description : 'Install lxi-gui') lxi-tools-2.1/po/000077500000000000000000000000001420007711700137235ustar00rootroot00000000000000lxi-tools-2.1/po/LINGUAS000066400000000000000000000000001420007711700147360ustar00rootroot00000000000000lxi-tools-2.1/po/POTFILES000066400000000000000000000003001420007711700150640ustar00rootroot00000000000000data/io.github.lxi-tools.lxi-gui.desktop.in data/io.github.lxi-tools.lxi-gui.appdata.xml.in data/io.github.lxi-tools.lxi-gui.gschema.xml src/lxi_gui-window.ui src/main.c src/lxi_gui-window.c lxi-tools-2.1/po/meson.build000066400000000000000000000000501420007711700160600ustar00rootroot00000000000000i18n.gettext('lxi-gui', preset: 'glib') lxi-tools-2.1/src/000077500000000000000000000000001420007711700140745ustar00rootroot00000000000000lxi-tools-2.1/src/.gitignore000066400000000000000000000000441420007711700160620ustar00rootroot00000000000000*.o *.a /lxi rigol_1000z_screenshot lxi-tools-2.1/src/bash-completion/000077500000000000000000000000001420007711700171605ustar00rootroot00000000000000lxi-tools-2.1/src/bash-completion/lxi000066400000000000000000000042561420007711700177060ustar00rootroot00000000000000# # Bash completion script for lxi # _lxi() { local cur prev firstword opts discover_opts scpi_opts screenshot_opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" firstword=$(get_firstword) # The options we'll complete. opts="-h --help \ -v --version \ discover \ scpi \ screenshot \ benchmark \ run" discover_opts="-t --timeout \ -m --mdns" scpi_opts="-a --address \ -p --port \ -t --timeout \ -x --hex \ -i --interactive \ -r --raw" screenshot_opts="-a --address \ -t --timeout \ -p --plugin \ -l --list" benchmark_opts="-a --address \ -p --port \ -t --timeout \ -c --count \ -r --raw" # Complete the options case "${COMP_CWORD}" in 1) COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) ;; *) case ${firstword} in discover) COMPREPLY=( $(compgen -W "${discover_opts}" -- ${cur}) ) ;; scpi) COMPREPLY=( $(compgen -W "${scpi_opts}" -- ${cur}) ) ;; screenshot) COMPREPLY=( $(compgen -W "${screenshot_opts}" -- ${cur}) ) ;; benchmark) COMPREPLY=( $(compgen -W "${benchmark_opts}" -- ${cur}) ) ;; run) COMPREPLY=( $(compgen -o filenames -A file -- ${cur}) ) ;; *) COMPREPLY=() ;; esac ;; esac return 0 } get_firstword() { local firstword i firstword= for ((i = 1; i < ${#COMP_WORDS[@]}; ++i)); do if [[ ${COMP_WORDS[i]} != -* ]]; then firstword=${COMP_WORDS[i]} break fi done echo $firstword } # Bind completion to lxi command complete -o default -F _lxi lxi lxi-tools-2.1/src/bash-completion/lxi.snap000066400000000000000000000043021420007711700206360ustar00rootroot00000000000000# # Bash completion script for lxi # get_firstword() { local firstword i firstword= for ((i = 1; i < ${#COMP_WORDS[@]}; ++i)); do if [[ ${COMP_WORDS[i]} != -* ]]; then firstword=${COMP_WORDS[i]} break fi done echo $firstword } _lxi() { local cur prev firstword opts discover_opts scpi_opts screenshot_opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" firstword=$(get_firstword) # The options we'll complete. opts="-h --help \ -v --version \ discover \ scpi \ screenshot \ benchmark \ run" discover_opts="-t --timeout \ -m --mdns" scpi_opts="-a --address \ -p --port \ -t --timeout \ -x --hex \ -i --interactive \ -r --raw" screenshot_opts="-a --address \ -t --timeout \ -p --plugin \ -l --list" benchmark_opts="-a --address \ -p --port \ -t --timeout \ -c --count \ -r --raw" # Complete the options case "${COMP_CWORD}" in 1) COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) ;; *) case ${firstword} in discover) COMPREPLY=( $(compgen -W "${discover_opts}" -- ${cur}) ) ;; scpi) COMPREPLY=( $(compgen -W "${scpi_opts}" -- ${cur}) ) ;; screenshot) COMPREPLY=( $(compgen -W "${screenshot_opts}" -- ${cur}) ) ;; benchmark) COMPREPLY=( $(compgen -W "${benchmark_opts}" -- ${cur}) ) ;; run) COMPREPLY=( $(compgen -o filenames -A file -- ${cur}) ) ;; *) COMPREPLY=() ;; esac ;; esac return 0 } # Bind completion to lxi-tools.lxi command complete -o default -F _lxi lxi-tools.lxi lxi-tools-2.1/src/bash-completion/meson.build000066400000000000000000000006471420007711700213310ustar00rootroot00000000000000bashcompletiondir = get_option('bashcompletiondir') if bashcompletiondir == '' bash_completion_dep = dependency('bash-completion', required: false) if bash_completion_dep.found() bashcompletiondir = join_paths(get_option('datadir'), 'bash-completion', 'completions') endif endif if (bashcompletiondir != 'no') and (bashcompletiondir != '') install_data('lxi', 'lxi.snap', install_dir: bashcompletiondir) endif lxi-tools-2.1/src/benchmark.c000066400000000000000000000072741420007711700162040ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include #define ID_LENGTH_MAX 65536 int benchmark(const char *ip, int port, int timeout, lxi_protocol_t protocol, int count, bool no_gui, double *result, void (*progress)(unsigned int count)) { struct timespec start, stop; double elapsed_time; int device, i, bytes_received; char id[ID_LENGTH_MAX]; char *command = "*IDN?"; // Check for required options if (strlen(ip) == 0) { error_printf("Missing address\n"); exit(EXIT_FAILURE); } if (protocol == RAW) command = "*IDN?\n"; // Connect device = lxi_connect(ip, port, NULL, timeout, protocol); if (device != LXI_OK) { error_printf("Unable to connect to LXI device\n"); return 1; } if (no_gui) printf("Benchmarking by sending %d ID requests. Please wait...\n", count); // Start time if ( clock_gettime(CLOCK_MONOTONIC, &start) == -1 ) { error_printf("Failed to get start time\n"); return 1; } // Run benchmark for (i=0; i #include #include #include #include #include #include #include "error.h" #include int benchmark(const char *ip, int port, int timeout, lxi_protocol_t protocol, int count, bool no_gui, double *result, void (*progress)(unsigned int count)); #ifdef __cplusplus } #endif #endif lxi-tools-2.1/src/discover.c000066400000000000000000000061511420007711700160610ustar00rootroot00000000000000/* * Copyright (c) 2016-2018 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "misc.h" #include static int device_count = 0; static int service_count = 0; static void broadcast(const char *address, const char *interface) { UNUSED(address); printf("Broadcasting on interface %s\n", interface); } static void device(const char *address, const char *id) { printf(" Found \"%s\" on address %s\n", id, address); device_count++; } static void service(const char *address, const char *id, const char *service, int port) { printf(" Found \"%s\" on address %s\n %s service on port %u\n", id, address, service, port); service_count++; } int discover(bool mdns, int timeout) { lxi_info_t info; // Set up info callbacks info.broadcast = &broadcast; info.device = &device; info.service = &service; printf("Searching for LXI devices - please wait...\n\n"); // Search for LXI devices / services if (mdns) { lxi_discover(&info, timeout, DISCOVER_MDNS); if (service_count == 0) printf("No services found\n"); else printf("\nFound %d service%c\n", service_count, service_count > 1 ? 's' : ' '); } else { lxi_discover(&info, timeout, DISCOVER_VXI11); printf("\n"); if (device_count == 0) printf("No devices found\n"); else printf("Found %d device%c\n", device_count, device_count > 1 ? 's' : ' '); } printf("\n"); return 0; } lxi-tools-2.1/src/discover.h000066400000000000000000000032171420007711700160660ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef DISCOVER_H #define DISCOVER_H #include int discover(bool mdns, int timeout); #endif lxi-tools-2.1/src/error.h000066400000000000000000000032701420007711700154000ustar00rootroot00000000000000/* * Copyright (c) 2017-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef ERROR_H #define ERROR_H #include #define error_printf(format, args...) \ fprintf(stderr, "Error: " format, ## args) #endif lxi-tools-2.1/src/gtk/000077500000000000000000000000001420007711700146615ustar00rootroot00000000000000lxi-tools-2.1/src/gtk/help-overlay.ui000066400000000000000000000033521420007711700176320ustar00rootroot00000000000000 True shortcuts 10 General Search for instruments action.search Show/hide instrument list action.toggle_flap Show Shortcuts win.show-help-overlay Quit app.quit lxi-tools-2.1/src/gtkchart.c000066400000000000000000000620611420007711700160540ustar00rootroot00000000000000/* * Copyright (c) 2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "gtkchart.h" #define UNUSED(expr) do { (void)(expr); } while (0) struct chart_point_t { double x; double y; }; struct _GtkChart { GtkWidget parent_instance; int type; char *title; char *label; char *x_label; char *y_label; double x_max; double y_max; double value; double value_min; double value_max; int width; void *user_data; GSList *point_list; GtkSnapshot *snapshot; }; struct _GtkChartClass { GtkWidgetClass parent_class; }; G_DEFINE_TYPE (GtkChart, gtk_chart, GTK_TYPE_WIDGET) static void gtk_chart_init (GtkChart *self) { // Defaults self->type = GTK_CHART_TYPE_UNKNOWN; self->title = NULL; self->label = NULL; self->x_label = NULL; self->y_label = NULL; self->x_max = 100; self->y_max = 100; self->value_min = 0; self->value_max = 100; self->width = 500; self->snapshot = NULL; //gtk_widget_init_template (GTK_WIDGET (self)); } static void gtk_chart_finalize (GObject *object) { GtkChart *self = GTK_CHART (object); G_OBJECT_CLASS ( gtk_chart_parent_class)-> finalize (G_OBJECT (self)); } static void gtk_chart_dispose (GObject *object) { GtkChart *self = GTK_CHART (object); GtkWidget *child; while ((child = gtk_widget_get_first_child (GTK_WIDGET (object)))) gtk_widget_unparent (child); // Cleanup g_free(self->title); g_free(self->label); g_free(self->x_label); g_free(self->y_label); gdk_display_sync(gdk_display_get_default()); g_slist_free_full(g_steal_pointer(&self->point_list), g_free); g_slist_free(self->point_list); G_OBJECT_CLASS (gtk_chart_parent_class)->dispose (object); } static void chart_draw_line_or_scatter(GtkChart *self, GtkSnapshot *snapshot, float h, float w) { GdkRGBA bg_color, white, blue, red, line, grid; cairo_text_extents_t extents; char value[20]; //gdk_rgba_parse (&bg_color, "#2d2d2d"); gdk_rgba_parse (&bg_color, "black"); gdk_rgba_parse (&white, "rgba(255,255,255,0.75)"); gdk_rgba_parse (&blue, "blue"); gdk_rgba_parse (&red, "red"); gdk_rgba_parse (&line, "#325aad"); gdk_rgba_parse (&grid, "rgba(255,255,255,0.1)"); // Set background color gtk_snapshot_append_color (snapshot, &bg_color, &GRAPHENE_RECT_INIT(0, 0, w, h)); // Assume aspect ratio w:h = 2:1 // Set up Cairo region cairo_t * cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT(0, 0, w, h)); cairo_set_antialias (cr, CAIRO_ANTIALIAS_FAST); cairo_set_tolerance (cr, 1.5); gdk_cairo_set_source_rgba (cr, &white); cairo_select_font_face (cr, "Ubuntu", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); // Move coordinate system to bottom left cairo_translate(cr, 0, h); // Invert y-axis cairo_scale(cr, 1, -1); // Draw title cairo_set_font_size (cr, 15.0 * (w/650)); cairo_text_extents(cr, self->title, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.9 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, self->title); cairo_restore(cr); // Draw x-axis label cairo_set_font_size (cr, 11.0 * (w/650)); cairo_text_extents(cr, self->x_label, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.075 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, self->x_label); cairo_restore(cr); // Draw y-axis label cairo_text_extents(cr, self->y_label, &extents); cairo_move_to (cr, 0.035 * w, 0.5 * h - extents.width/2); cairo_save(cr); cairo_rotate(cr, M_PI/2); cairo_scale(cr, 1, -1); cairo_show_text (cr, self->y_label); cairo_restore(cr); // Draw x-axis cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.1 * w, 0.2 * h); cairo_line_to (cr, 0.9 * w, 0.2 * h); cairo_stroke (cr); // Draw y-axis cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.1 * w, 0.8 * h); cairo_line_to (cr, 0.1 * w, 0.2 * h); cairo_stroke (cr); // Draw x-axis value at 100% mark g_snprintf(value, sizeof(value), "%.1f", self->x_max); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.9 * w - extents.width/2, 0.16 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw x-axis value at 75% mark g_snprintf(value, sizeof(value), "%.1f", (self->x_max/4) * 3); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.7 * w - extents.width/2, 0.16 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw x-axis value at 50% mark g_snprintf(value, sizeof(value), "%.1f", self->x_max/2); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.16 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw x-axis value at 25% mark g_snprintf(value, sizeof(value), "%.1f", self->x_max/4); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.3 * w - extents.width/2, 0.16 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw x-axis value at 0% mark cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, "0", &extents); cairo_move_to (cr, 0.1 * w - extents.width/2, 0.16 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, "0"); cairo_restore(cr); // Draw y-axis value at 0% mark cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, "0", &extents); cairo_move_to (cr, 0.091 * w - extents.width, 0.191 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, "0"); cairo_restore(cr); // Draw y-axis value at 25% mark g_snprintf(value, sizeof(value), "%.1f", self->y_max/4); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.091 * w - extents.width, 0.34 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw y-axis value at 50% mark g_snprintf(value, sizeof(value), "%.1f", self->y_max/2); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.091 * w - extents.width, 0.49 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw y-axis value at 75% mark g_snprintf(value, sizeof(value), "%.1f", (self->y_max/4) * 3); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.091 * w - extents.width, 0.64 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Draw y-axis value at 100% mark g_snprintf(value, sizeof(value), "%.1f", self->y_max); cairo_set_font_size (cr, 8.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to (cr, 0.091 * w - extents.width, 0.79 * h); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, value); cairo_restore(cr); // Set color of grid gdk_cairo_set_source_rgba (cr, &grid); // Draw grid x-line 25% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.1 * w, 0.35 * h); cairo_line_to (cr, 0.9 * w, 0.35 * h); cairo_stroke (cr); // Draw grid x-line 50% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.1 * w, 0.5 * h); cairo_line_to (cr, 0.9 * w, 0.5 * h); cairo_stroke (cr); // Draw grid x-line 75% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.1 * w, 0.65 * h); cairo_line_to (cr, 0.9 * w, 0.65 * h); cairo_stroke (cr); // Draw grid x-line 100% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.1 * w, 0.8 * h); cairo_line_to (cr, 0.9 * w, 0.8 * h); cairo_stroke (cr); // Draw grid y-line 25% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.3 * w, 0.8 * h); cairo_line_to (cr, 0.3 * w, 0.2 * h); cairo_stroke (cr); // Draw grid y-line 50% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.5 * w, 0.8 * h); cairo_line_to (cr, 0.5 * w, 0.2 * h); cairo_stroke (cr); // Draw grid y-line 75% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.7 * w, 0.8 * h); cairo_line_to (cr, 0.7 * w, 0.2 * h); cairo_stroke (cr); // Draw grid y-line 100% cairo_set_line_width (cr, 1); cairo_move_to (cr, 0.9 * w, 0.8 * h); cairo_line_to (cr, 0.9 * w, 0.2 * h); cairo_stroke (cr); // Move coordinate system to (0,0) of drawn coordinate system cairo_translate(cr, 0.1 * w, 0.2 * h); gdk_cairo_set_source_rgba (cr, &line); cairo_set_line_width (cr, 2.0); // Calc scales float x_scale = (w - 2 * 0.1 * w) / self->x_max; float y_scale = (h - 2 * 0.2 * h) / self->y_max; // Draw data points from list GSList *l; for (l = self->point_list; l != NULL; l = l->next) { struct chart_point_t *point = l->data; switch (self->type) { case GTK_CHART_TYPE_LINE: if (l == self->point_list) { // Move to first point cairo_move_to(cr, point->x * x_scale, point->y * y_scale); } else { // Draw line to next point cairo_line_to(cr, point->x * x_scale, point->y * y_scale); cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND); cairo_stroke(cr); cairo_move_to(cr, point->x * x_scale, point->y * y_scale); } break; case GTK_CHART_TYPE_SCATTER: // Draw square //cairo_rectangle (cr, point->x * x_scale, point->y * y_scale, 4, 4); //cairo_fill(cr); // Draw point cairo_set_line_width(cr, 3); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); cairo_move_to(cr, point->x * x_scale, point->y * y_scale); cairo_close_path (cr); cairo_stroke (cr); break; } } cairo_destroy (cr); } static void chart_draw_number(GtkChart *self, GtkSnapshot *snapshot, float h, float w) { GdkRGBA bg_color, white, blue, red, line, grid; cairo_text_extents_t extents; char value[20]; gdk_rgba_parse (&bg_color, "black"); gdk_rgba_parse (&white, "rgba(255,255,255,0.75)"); gdk_rgba_parse (&blue, "blue"); gdk_rgba_parse (&red, "red"); gdk_rgba_parse (&line, "#325aad"); gdk_rgba_parse (&grid, "rgba(255,255,255,0.1)"); // Set background color gtk_snapshot_append_color (snapshot, &bg_color, &GRAPHENE_RECT_INIT(0, 0, w, h)); // Assume aspect ratio w:h = 1:1 // Set up Cairo region cairo_t * cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT(0, 0, w, h)); cairo_set_antialias (cr, CAIRO_ANTIALIAS_FAST); cairo_set_tolerance (cr, 1.5); gdk_cairo_set_source_rgba (cr, &white); cairo_select_font_face (cr, "Ubuntu", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); // Move coordinate system to bottom left cairo_translate(cr, 0, h); // Invert y-axis cairo_scale(cr, 1, -1); // Draw title cairo_set_font_size (cr, 15.0 * (w/650)); cairo_text_extents(cr, self->title, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.9 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, self->title); cairo_restore(cr); // Draw label cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, self->label, &extents); cairo_move_to(cr, 0.5 * w - extents.width/2, 0.2 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, self->label); cairo_restore(cr); // Draw number g_snprintf(value, sizeof(value), "%.1f", self->value); cairo_set_font_size (cr, 140.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to(cr, 0.5 * w - extents.width/2, 0.5 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, value); cairo_restore(cr); cairo_destroy (cr); } static void chart_draw_gauge_linear(GtkChart *self, GtkSnapshot *snapshot, float h, float w) { GdkRGBA bg_color, white, blue, red, line, grid; cairo_text_extents_t extents; char value[20]; gdk_rgba_parse (&bg_color, "black"); gdk_rgba_parse (&white, "rgba(255,255,255,0.75)"); gdk_rgba_parse (&blue, "blue"); gdk_rgba_parse (&red, "red"); gdk_rgba_parse (&line, "#325aad"); gdk_rgba_parse (&grid, "rgba(255,255,255,0.1)"); // Set background color gtk_snapshot_append_color (snapshot, &bg_color, &GRAPHENE_RECT_INIT(0, 0, w, h)); // Assume aspect ratio w:h = 1:2 // Set up Cairo region cairo_t * cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT(0, 0, w, h)); cairo_set_antialias (cr, CAIRO_ANTIALIAS_FAST); cairo_set_tolerance (cr, 1.5); gdk_cairo_set_source_rgba (cr, &white); cairo_select_font_face (cr, "Ubuntu", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); // Move coordinate system to bottom left cairo_translate(cr, 0, h); // Invert y-axis cairo_scale(cr, 1, -1); // Draw title cairo_set_font_size (cr, 15.0 * (2*w/650)); cairo_text_extents(cr, self->title, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.95 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, self->title); cairo_restore(cr); // Draw label cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, self->label, &extents); cairo_move_to(cr, 0.5 * w - extents.width/2, 0.05 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, self->label); cairo_restore(cr); // Draw minimum value g_snprintf(value, sizeof(value), "%.0f", self->value_min); cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to(cr, 0.7 * w, 0.1 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, value); cairo_restore(cr); // Draw maximum value g_snprintf(value, sizeof(value), "%.0f", self->value_max); cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to(cr, 0.7 * w, 0.9 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, value); cairo_restore(cr); // Draw minimum line gdk_cairo_set_source_rgba (cr, &grid); cairo_move_to(cr, 0.375 * w, 0.1 * h); cairo_line_to(cr, 0.625 * w, 0.1 * h); cairo_set_line_width (cr, 1); cairo_stroke (cr); // Draw maximum line cairo_move_to(cr, 0.375 * w, 0.9 * h); cairo_line_to(cr, 0.625 * w, 0.9 * h); cairo_set_line_width (cr, 1); cairo_stroke (cr); // Move coordinate system to (0,0) of gauge line start cairo_translate(cr, 0.5 * w, 0.1 * h); // Draw gauge line gdk_cairo_set_source_rgba (cr, &line); cairo_move_to(cr, 0, 0); float y_scale = (h - 2 * 0.1 * h) / self->value_max; cairo_set_line_width (cr, 0.2 * w); cairo_line_to(cr, 0, self->value * y_scale); cairo_stroke (cr); cairo_destroy (cr); } static void chart_draw_gauge_angular(GtkChart *self, GtkSnapshot *snapshot, float h, float w) { GdkRGBA bg_color, white, blue, red, line, grid; cairo_text_extents_t extents; char value[20]; gdk_rgba_parse (&bg_color, "black"); gdk_rgba_parse (&white, "rgba(255,255,255,0.75)"); gdk_rgba_parse (&blue, "blue"); gdk_rgba_parse (&red, "red"); gdk_rgba_parse (&line, "#325aad"); gdk_rgba_parse (&grid, "rgba(255,255,255,0.1)"); // Set background color gtk_snapshot_append_color (snapshot, &bg_color, &GRAPHENE_RECT_INIT(0, 0, w, h)); // Assume aspect ratio w:h = 1:1 // Set up Cairo region cairo_t * cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT(0, 0, w, h)); cairo_set_antialias (cr, CAIRO_ANTIALIAS_FAST); // cairo_set_tolerance (cr, 1.5); gdk_cairo_set_source_rgba (cr, &white); cairo_select_font_face (cr, "Ubuntu", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); // Move coordinate system to bottom left cairo_translate(cr, 0, h); // Invert y-axis cairo_scale(cr, 1, -1); // Draw title cairo_set_font_size (cr, 15.0 * (2*w/650)); cairo_text_extents(cr, self->title, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.9 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, self->title); cairo_restore(cr); // Draw label cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, self->label, &extents); cairo_move_to(cr, 0.5 * w - extents.width/2, 0.1 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, self->label); cairo_restore(cr); // Draw minimum value g_snprintf(value, sizeof(value), "%.0f", self->value_min); cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to(cr, 0.225 * w, 0.25 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, value); cairo_restore(cr); // Draw maximum value g_snprintf(value, sizeof(value), "%.0f", self->value_max); cairo_set_font_size (cr, 25.0 * (w/650)); cairo_text_extents(cr, value, &extents); cairo_move_to(cr, 0.77 * w - extents.width, 0.25 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text(cr, value); cairo_restore(cr); // Draw minimum line gdk_cairo_set_source_rgba (cr, &grid); cairo_move_to(cr, 0.08 * w, 0.25 * h); cairo_line_to(cr, 0.22 * w, 0.25 * h); cairo_set_line_width (cr, 1); cairo_stroke (cr); // Draw maximum line cairo_move_to(cr, 0.78 * w, 0.25 * h); cairo_line_to(cr, 0.92 * w, 0.25 * h); cairo_set_line_width (cr, 1); cairo_stroke (cr); // Re-invert y-axis cairo_scale(cr, 1, -1); // Draw arc gdk_cairo_set_source_rgba (cr, &line); double xc = 0.5 * w; double yc = -0.25 * h; double radius = 0.35 * w; double angle1 = 180 * (M_PI/180.0); double angle = self->value * (180 / (self->value_max)); double angle2 = 180 * (M_PI/180.0) + angle * (M_PI/180.0); cairo_set_line_width (cr, 0.1 * w); cairo_arc (cr, xc, yc, radius, angle1, angle2); cairo_stroke (cr); cairo_destroy (cr); } static void chart_draw_unknown_type(GtkChart *self, GtkSnapshot *snapshot, float h, float w) { UNUSED(self); GdkRGBA bg_color, white; cairo_text_extents_t extents; const char *warning = "Unknown chart type"; gdk_rgba_parse (&bg_color, "black"); gdk_rgba_parse (&white, "rgba(255,255,255,0.75)"); // Set background color gtk_snapshot_append_color (snapshot, &bg_color, &GRAPHENE_RECT_INIT(0, 0, w, h)); // Set up Cairo region cairo_t * cr = gtk_snapshot_append_cairo (snapshot, &GRAPHENE_RECT_INIT(0, 0, w, h)); gdk_cairo_set_source_rgba (cr, &white); cairo_select_font_face (cr, "Ubuntu", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); // Move coordinate system to bottom left cairo_translate(cr, 0, h); // Invert y-axis cairo_scale(cr, 1, -1); // Draw title cairo_set_font_size (cr, 30.0 * (w/650)); cairo_text_extents(cr, warning, &extents); cairo_move_to (cr, 0.5 * w - extents.width/2, 0.5 * h - extents.height/2); cairo_save(cr); cairo_scale(cr, 1, -1); cairo_show_text (cr, warning); cairo_restore(cr); cairo_destroy (cr); } static void gtk_chart_snapshot (GtkWidget *widget, GtkSnapshot *snapshot) { GtkChart *self = GTK_CHART(widget); float width = gtk_widget_get_width (widget); float height = gtk_widget_get_height (widget); // Draw various chart types switch (self->type) { case GTK_CHART_TYPE_LINE: case GTK_CHART_TYPE_SCATTER: chart_draw_line_or_scatter(self, snapshot, height, width); break; case GTK_CHART_TYPE_NUMBER: chart_draw_number(self, snapshot, height, width); break; case GTK_CHART_TYPE_GAUGE_LINEAR: chart_draw_gauge_linear(self, snapshot, height, width); break; case GTK_CHART_TYPE_GAUGE_ANGULAR: chart_draw_gauge_angular(self, snapshot, height, width); break; default: chart_draw_unknown_type(self, snapshot, height, width); break; } self->snapshot = snapshot; } static void gtk_chart_class_init (GtkChartClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); object_class->finalize = gtk_chart_finalize; object_class->dispose = gtk_chart_dispose; widget_class->snapshot = gtk_chart_snapshot; } GtkWidget * gtk_chart_new (void) { return g_object_new (GTK_TYPE_CHART, NULL); } void gtk_chart_set_user_data(GtkChart *chart, void *user_data) { chart->user_data = user_data; } void * gtk_chart_get_user_data(GtkChart *chart) { return chart->user_data; } void gtk_chart_set_type(GtkChart *chart, GtkChartType type) { chart->type = type; } void gtk_chart_set_title(GtkChart *chart, const char *title) { chart->title = g_strdup(title); } void gtk_chart_set_label(GtkChart *chart, const char *label) { chart->label = g_strdup(label); } void gtk_chart_set_x_label(GtkChart *chart, const char *x_label) { chart->x_label = g_strdup(x_label); } void gtk_chart_set_y_label(GtkChart *chart, const char *y_label) { chart->y_label = g_strdup(y_label); } void gtk_chart_set_x_max(GtkChart *chart, double x_max) { chart->x_max = x_max; } void gtk_chart_set_y_max(GtkChart *chart, double y_max) { chart->y_max = y_max; } void gtk_chart_set_width(GtkChart *chart, int width) { chart->width = width; } void gtk_chart_plot_point(GtkChart *chart, double x, double y) { // Allocate memory for new point struct chart_point_t *point = g_new0(struct chart_point_t, 1); point->x = x; point->y = y; // Add point to list to be drawn chart->point_list = g_slist_append(chart->point_list, point); // Queue draw of widget if (GTK_IS_WIDGET(chart)) { gtk_widget_queue_draw(GTK_WIDGET(chart)); } } void gtk_chart_set_value(GtkChart *chart, double value) { chart->value = value; // Queue draw of widget if (GTK_IS_WIDGET(chart)) { gtk_widget_queue_draw(GTK_WIDGET(chart)); } } void gtk_chart_set_value_min(GtkChart *chart, double value) { chart->value_min = value; } void gtk_chart_set_value_max(GtkChart *chart, double value) { chart->value_max = value; } bool gtk_chart_save_csv(GtkChart *chart, const char *filename) { struct chart_point_t *point; GSList *l; // Open file FILE *file = fopen(filename, "w"); // write only if (file == NULL) { g_print("Error: Could not open file\n"); return false; } // Write CSV data for (l = chart->point_list; l != NULL; l = l->next) { point = l->data; fprintf(file, "%f,%f\n", point->x, point->y); } // Close file fclose(file); return true; } bool gtk_chart_save_png(GtkChart *chart, const char *filename) { int width = gtk_widget_get_width (GTK_WIDGET(chart)); int height = gtk_widget_get_height (GTK_WIDGET(chart)); // Get to the PNG image file from paintable GdkPaintable *paintable = gtk_widget_paintable_new (GTK_WIDGET(chart)); GtkSnapshot *snapshot = gtk_snapshot_new (); gdk_paintable_snapshot (paintable, snapshot, width, height); GskRenderNode *node = gtk_snapshot_free_to_node (snapshot); GskRenderer *renderer = gsk_cairo_renderer_new (); gsk_renderer_realize (renderer, NULL, NULL); GdkTexture *texture = gsk_renderer_render_texture (renderer, node, NULL); gdk_texture_save_to_png (texture, filename); // Cleanup g_object_unref(texture); gsk_renderer_unrealize(renderer); g_object_unref(renderer); gsk_render_node_unref(node); g_object_unref(paintable); return true; } lxi-tools-2.1/src/gtkchart.h000066400000000000000000000055771420007711700160720ustar00rootroot00000000000000/* * Copyright (c) 2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #pragma once #include G_BEGIN_DECLS #define GTK_TYPE_CHART (gtk_chart_get_type ()) G_DECLARE_FINAL_TYPE (GtkChart, gtk_chart, GTK, CHART, GtkWidget) typedef enum { GTK_CHART_TYPE_UNKNOWN, GTK_CHART_TYPE_LINE, GTK_CHART_TYPE_SCATTER, GTK_CHART_TYPE_GAUGE_ANGULAR, GTK_CHART_TYPE_GAUGE_LINEAR, GTK_CHART_TYPE_NUMBER } GtkChartType; GtkWidget * gtk_chart_new (void); void gtk_chart_set_type(GtkChart *chart, GtkChartType type); void gtk_chart_set_title(GtkChart *chart, const char *title); void gtk_chart_set_label(GtkChart *chart, const char *label); void gtk_chart_set_x_label(GtkChart *chart, const char *x_label); void gtk_chart_set_y_label(GtkChart *chart, const char *y_label); void gtk_chart_set_x_max(GtkChart *chart, double x_max); void gtk_chart_set_y_max(GtkChart *chart, double y_max); void gtk_chart_set_width(GtkChart *chart, int width); void gtk_chart_plot_point(GtkChart *chart, double x, double y); void gtk_chart_set_value(GtkChart *chart, double value); void gtk_chart_set_value_min(GtkChart *chart, double value); void gtk_chart_set_value_max(GtkChart *chart, double value); bool gtk_chart_save_csv(GtkChart *chart, const char *filename); bool gtk_chart_save_png(GtkChart *chart, const char *filename); void gtk_chart_set_user_data(GtkChart *chart, void *user_data); void * gtk_chart_get_user_data(GtkChart *chart); G_END_DECLS lxi-tools-2.1/src/icons/000077500000000000000000000000001420007711700152075ustar00rootroot00000000000000lxi-tools-2.1/src/icons/128x128/000077500000000000000000000000001420007711700161445ustar00rootroot00000000000000lxi-tools-2.1/src/icons/128x128/status/000077500000000000000000000000001420007711700174675ustar00rootroot00000000000000lxi-tools-2.1/src/icons/128x128/status/dialog-information-symbolic.symbolic.png000066400000000000000000000047001420007711700274170ustar00rootroot00000000000000PNG  IHDR>asBIT|d wIDATxkUw  8#(M)ly|R 6VIS>PcڴiEP$5m4&FV҈UU; 8XFak. 3sϽkǹws{ug.QL)$`,0hOK xl^6{D)CZ|`.0K?'Ifp8rfgc@V&X` >\N}=Qcp9 ;} X| &d0WHd ݡȀ4Q%@/;Q[{H\|8chc+ Y.+f# SA߁/Z;wp .wF bAY̱Х Tiqy*])J"gŋx_^D"{#SÁ/G{FX-l |k jGؾ'LhBa ZKjz p=_)gb;mkg v˻]{bko!A3cy_@O26]YK&/^-gc-]0r8ګQ - i[=}v#q u{P$Ak| _7ǾE`z;=]uп:Rӊljl@EZwhknŌyt;Q5G`3Ƭ/98DgK %]uxY~DUhvS-To0Q4P^Ck(y E3",@bYYKZ0IY_k"EY_k{8DY- EMe(@+bjo>!SGVk҃BJ]2H|ڹe[tS;3gdM{2uP#DJ»;mQ!F tiNc+dz1N9HR5֒ }g5d䈣:kZuӦU,@;Wy yd<eԟ]f~ED 4ɨZ t P~E8 4ɐb%:A50[Y_k{הhFQ]CNP[AK:i1WY_;lЊga Hrfu~w5-O +'(VhEL&@v *э|>߷~|BpW?@VdJd:\%K8V"bS?wa8ΟoIeQ/!g'pO|X\|UQ qry&oo~߂>Ov5aeV !#0ғ`/rW|O>,s%S ۑ=+nCтUT߆jV0 4dN@y3f5z<]uXdFk7N&e\ gBkeڥ+U ̀U;nllķZA W{`cDj(nĦ]Cr!vbY ؝Y/`6/C"@5\M3dv,U\mKʷ|ZE#+ߖ=e q>Ŷ"~j! }&)?~Xe\JRwtAv7Ѓ#fp+b@99uE߲IENDB`lxi-tools-2.1/src/icons/16x16/000077500000000000000000000000001420007711700157745ustar00rootroot00000000000000lxi-tools-2.1/src/icons/16x16/actions/000077500000000000000000000000001420007711700174345ustar00rootroot00000000000000lxi-tools-2.1/src/icons/16x16/actions/benchmark.symbolic.png000066400000000000000000000005731420007711700237210ustar00rootroot00000000000000PNG  IHDRasBIT|d2IDAT8?KQDJa-DRD!vY ؋vP,`B!(Tj `;);] {޻!Vq,Y.WW d=rpdCW\>a O*nu|ٴxR> 1:^`.v3O :"Kh6R78@/8nh_L6nS(4'2n0[8P?Hx\ g\/Ɍڧg7}_$HIENDB`lxi-tools-2.1/src/icons/16x16/actions/script.symbolic.png000066400000000000000000000003551420007711700232710ustar00rootroot00000000000000PNG  IHDRasBIT|dIDAT8A @ "!!3:%rqP? O:oG= = 0ET̃_ƀX9FJJ|2VT~j ZIJM?nܽ4:C ⁺Gc{<(nIENDB`lxi-tools-2.1/src/icons/16x16/actions/view-fullscreen-symbolic.symbolic.png000066400000000000000000000003171420007711700267140ustar00rootroot00000000000000PNG  IHDRasBIT|dIDAT8 @@FO/R+R. 8f6R4WnӜ>ćJA{M2?x ``2HYPH9`w,Rk,w?;Pj|i@LbĜ,G1IENDB`lxi-tools-2.1/src/icons/16x16/actions/view-sidebar-start.symbolic.png000066400000000000000000000003071420007711700254760ustar00rootroot00000000000000PNG  IHDRasBIT|d~IDAT8ӱ ` !Q)WXX]KUX`]2epbxGܐʀ-OG hU_1H12&ĜQ>1?Dn[1*U=v@YIENDB`lxi-tools-2.1/src/icons/lxi-instrument.png000066400000000000000000000030731420007711700207220ustar00rootroot00000000000000PNG  IHDR(2.iCCPICC profile(}=H@_S";NDE EjVL.4$).kŪ "%/)=B4m tL%b&"^ z0,cV_.Ƴ9ԜŀH< &^'ڴ VUsQ.Hu71ө9XhaYԈ'SXY+UX᜾uH` BA(FV )ڏ]D.\`Gd^R880U>v |\?I6н \\75e ٔ])HS3,{ tz5q pp({{gr}bKGDC pHYs B(xtIME #"R8IDATXnFƿm 04$"@Ratɲj7}DMgT l*E +eSQuY](# {nj b!W F9?s"+@NNNjGEQ$iW5Bo!i\լQ( 8ZZjUU !Xde+]׿ 5Mzp~QU_Q*R&,ȕ$̲2ƾRJe$(Q4 v`* (,H(/h*HG_8S pQcS[AoBL)fV(˾UPeXblB|||QJ+?)ğgzzoKEn"^b0CP=k۸GPicڂim|~9'r-; !D3]CvaY4M$il8LOld8&noo ۶tJPT`Yc΃3uj㇭ò,Z-(m!}4z98,VVV lQJ!I ylfX,²pbL25ض;$ ' .rS0a$ |inCuȲ4;Ο?" <<< NcccR 148+GD]777HR(#L"4Mz=>"19H[!X]"*`}}=PZrpV]ǢK7iJH18\.\.qu\EP@#":NDMqB z7O괻;qJ9!Ǻcmm m:!?tiN^^^v~~n~d4ߛ3?3-؀P2IENDB`lxi-tools-2.1/src/icons/lxi-tools-icon-128px.png000066400000000000000000000461401420007711700214620ustar00rootroot00000000000000PNG  IHDR>a!zTXtRaw profile type exifxڭi\9sr8foozHRYU)C>K@X˥:j#8ϟ~K"O%=_0B #]tyH~?__JBLxͤ9a}RB)/4y!7=F‚:?ᅤq$:c9ʓOO0+ʪƚy]w'pN?L F*Yb՚u6/vͷzw=j}߿-jEJolߣG[v 8)9Q1=BeQpNPĈ` c7-rN'"D׸IԎf^TZT(3d"f*K@K|m봵\wj7 >nkwvN( ,d}21{ns9So''ܵe9o87[gX--V'G 0}KmrʷAߒnZwYns:X/K\W?+]B}l^/DņI%YM-gZ]Pߝp8`m[!f"V %[P+n,6mխvz$)G~XHϜDZ(gr]hRTYDnJr ]?BuknꬕPcL״=V;gϮ԰ʹPz| z 8_PL$z֡\XɚccQv\p›eFAfrc-djW koݷdofs2qrc.bCFq[CCD^2#h̉aT(l{63!5r*RUI@0:w! Ċ0%f)C;ɴDAD)ɥe`Oh-rl*d`h#y^ FK-\..a' 1IxИVgS8NXFj!kۀBn ]p1Cx14VA`(Z6DqP1$L`h2,T#$?: lU"ؐxI;H"dW@Y(==@.3o[= / [ ˌ8=V9JLJkt2(shĂÀݑ+1AKLǢ18]RveH6^ Q2":pi35r7R2(oYvD@2bpV20R=%p Bߍ2$ aV)kѵ/P'z~{1O=I&@3EqZCK(6 :m-n/}Hd6Pgxj_eU8Y RԒ_JU깯)p0#u$8@P1Ea :"# >*rLǃX%hB:yV$kZEL YIn=Ip@`\j*H#dP .o"R @ 3)@LQ'~V)#D$6|g`нHZ"dOȼ4-fL"nE5Z@7Efj` y@=G. XԽŊY@ Q+y)>0m$v`E4|hXͫvJQi&Qrxx5KP2c6%f(?9C-^ 9Yj^0n`MYfe`@KEs#?i3G5E0@P#\O6M;_jC| ⲱQ/ AlCIbP$J zƅ%ѷ#>1l`r'pl!؏oױw$0n1mF-BVeX(j+esp8V0U >ж$rS?,$\׬R-6H+wwDjn; qPv!h'~^Xg}=¤ {yU&S !šhsLZQu5zˁBm.'Z{H-0 CO!pQ܁!Kס7JߴWPk}Flp7W!î6 `̍r!E6C&az(WOu9/WLQA,EM!p9rPh`^Zd!iT251Ld~֝W_,ZtJn}&؋tK=VKȇjүDtB~(J1hKzFw@{e3f[$,"=N{9BܦvFl!!)ct ]z 'R2e6t2DpXF~  rLA^=͸5{$R@+:CSN2?}how c=~L.% 8?r/jkJ@_#.}6Nl}U߽Rm|8g`+ =A3 NW<GJR鷯\)2VE6b7u^ $HYp?bͯ[Oܷ m% 0 _qr!v Z؂q}~KGsfO-Ep%k҇]kcw݃;@QT~Ȑw4pՅP1a㔕g~BԤ[gs D<σR oנcJ& b5AxՍf`W.xli=SR+Bf!?DJuI/ya1hzK?}1o"GQ ^ xŬ"0ëYS+ xx#Q\vK]u=S@/$.AϷ M"ehP j#Hwh>ͱ1I C)~Z@İۣl;rx } [eudPE7Ԡ{c%=4P&*cȩHb|8 %|kpv=_ uIf9[K9ܛ{;R%emUU<,q/wIT! XG ortpU{*M u:[YAZ記Ԣ]o5O`GkNc{48Ezᛨk;-^l6^"VօÒaLoo+j.m0@m#4;{)K܈Z!;Q[+&Ԡyh@Wxƈ" 6MKUVÞUm&LץvP#An2CwJ7@xĸ06LcbcNLjyr7/ed$qhx:40ט6 "Y> fT34$hKd̄AQQƙM6y߆*wlޭL 8S{I-LаO A\!=.|F:U?ZJZ֒􃠺\uc EG" a&\@ M.c`!x+2[G}M:vqTmE>| fo*(h)Tԫ2E4'l-_0m% I H6 ZqDFqˌ5E.qAoXE>\A CuHA|K:-SL$!K>Erţ3A:&P}:P:g@eNܨ*!t?AM ]-Lˇ ,ڢcҥ=D ݵYUb:Ihz;:<ɋS΅DXFbNj*U*7)}]TkW R5z$&DQT{RԴjejN\DtjE D١06R~m"l1p3u)cZTk@I+$7t!q!kH\=܂ioP;m:?*#r'8=tnqDP/ 0rN1ߗA8N\]f -0@u$K"MUkOKdpӷDMaox7~{gx:cEMsxW*dM*3;N[]uMs>g\z92%<9[pJ- A#_G^Y 12+xҙS1DLgt!+Ed^D8PHkshP*J8+4;i&'鐹}3V123mE dxWRA,i#*f SGOj=АWQ "D ӑNk.;2FVx4P{9N *Ktҷ̐c^aaeʬ[_X~QQM$r{(G' W{21NS즯GF 5N 9e2m-|I[AtѠ ,+cVi bgt0̂Qr"_NiCCPICC profilex}=H@_SED2NDE EjVL.& IZpc⬫ ~9)HK -b<8ǻ{wP/346Sɮ]AD1"3˘$|=|,s^5g1 2ô77m>qex̤ ?r]segtj8L,XicV45)∪/d #bKGDC pHYs  tIME (0fvPIDATx]y\Ue>ܕ +;+⒚iI6Me5L44ee6KNS[Ki. dp ܋$p}~=@N:T*455MIQT$!D R^pPjjj~W_Vg4(aw߭ZpaYsi,YTHH*rIhԖ>>>~]6mwDT͠8`;+`Æ Yf$|0[ 8q׫ŋiz$rƓE%K"x`YvEQT$ (ZI-݁ f@D $H @D $H @D $HpSC΋3,d3(\z&E`Vpl|dz|/c9 O!1,F  h2=U]SR_,4~8 $,}b.sNww*@6E16WmovyzGق.r]xу]~R>]g{:t Q> hLPTǍŗPa >oj5 06 1.?S`(f,׭-(Ê'B?UZ阺ZڅMpox_Bp<2@Y-4f҇S!`('A/Jª(Ɂ^Xtt1i p 9 0*k81$Q15_p\i Dz O+uۑQ 8vafEvb9 EO LJBx /5{`V~z*=߄u? @ o.8GKjĄW5i#.<[Sp{ro; q+?܎YDH/ŭ;iq `m8UXf-~PnOx)A_Pt9tu0,l؏nA$ǦaQL !rK"F$CQoPU^ FC₺]ic1>R8[ӌ: 5େ'ba$-!OYLxJ~5.VFaVԊףKO{&Bam@}b",xc+X<% \{Ym ʊ&B;8[V/JMW8O#İm ! / X=V#VqJj-` .!%RGyX3D%q餹; / gApKRn<0oڈ%G.,82E ,n΅YS!8.S F}@C{JVnl '!A&3 $zȑ^nԱ` >|I wuDے"t)nc}{ /?q(r;U M*)0Bpd Yfw?q`s]YHeHJ' _&رJEuBϗvTrl?}4p6Kjܓ !ؗyWo]h20' OQCqpa_t PSMNKՎYgJ>x,}|6r@RU= "JxU&bEi} H-FUT7ŷ7J8_#8UeP :sͻM":gGh *^Gv  t2h[^}F/}2| yrؐH Sgq L B8j34P}aL<}{j[4z$'#9)^0o0<&I w'^_mf;;O!x-4jL^y[ۇܖtz~F%vr[F_̀!2=&o$@|`4r^+z(@!feWN`^e\a5 ݸ(@/#8\fwE2izVXmv, p 4{,ˡlnךh jjN Q=vLf6oB@h(rԧ`Y?k8X/nh۝`X*D )@vEXXQEbl LHQah`oF.!|%r+q֒5UcR#cƤ$:/ɲݰUm*?poy{'ˑup!|iq}qK|Վ9\i=PШU&/FIs͎' 񛷷*H6-akv / { Af70`lƦ]ڟ%,6:wM< *̳wA3ke'0O_`JS@NgS!ǵ';`:vܻrLɧ[3com;2:.fu`/ѓoذx'S-D/aDLKp.0;.IxUuMȸP3!2Y5AQ¿ӓ4& v{3kH,'1*.9'Po3!{F#&2ԌgXѕk6o|c12~01l(n36! Qi'],$ J`P߈o23pk*] ?s 1I3|2>w"md(ќ"_&?CU)#y Ϝ=XuO|vsѦ7'yk$%T&ooĦm]TX}ƄAF=Cޅʖھhg1ul,06]Ov]rx\8S^nbcf1ct=cyE! mQ]VmQUgvǯS6 ehRjo6]fü_{aaS(e4u 6K+qAճF mܔYMCȨ0L3:O켺 p>"6͋jJ|L _(?}FByW`\,*`bJom]q #GuK=??;;F"6;a[N(rZOg0Kf*+NëĈ، :.ثSq}\įiP2 eUNo2$DPM6`k:OI[ES I^ƠG&"Av|;_ .tbv_ |5;l64TB)НdFi5?饄5htJ"hJeհSwD\>q0~?H#sZ ,{~a6NAT }M-&nwL/(i:/Xv/MWhB% ]+XCZʝgfr5d!OoUd4{gb-x@E_¾Ch=G^UWjal`_wu=q5Y_c0mȁJBjI:v~:0=&fV%bJj=nr~A˽Tny*>5!s&]s<}N='K;9Xv D mЕz# aHLYgt'D́:$u!!O_ a.b8.c;'~$~pXpziaQ/G$B߼8Zw5 ҅^!YspHIBP\!rW>8wur!h4Yp9^q7d'HWo5]&GCq18`` 'pΟ Of 685 󿞀v8)|yLƼ@.p@u+[%wbp?,Y?Xg }i1qG;|7d"*I@8UvLeO=M0ם0WcZ[V/V;c#> λP?xplDNMZjr]J6xrr|)#6PI?rZ[nݺ:?I/ADIENDB`lxi-tools-2.1/src/icons/scalable/000077500000000000000000000000001420007711700167555ustar00rootroot00000000000000lxi-tools-2.1/src/icons/scalable/actions/000077500000000000000000000000001420007711700204155ustar00rootroot00000000000000lxi-tools-2.1/src/icons/scalable/actions/benchmark-symbolic.svg000066400000000000000000000107071420007711700247140ustar00rootroot00000000000000lxi-tools-2.1/src/icons/scalable/actions/lxi-instrument.svg000066400000000000000000000117161420007711700241460ustar00rootroot00000000000000LXILXIlxi-tools-2.1/src/icons/scalable/actions/scpi-symbolic.svg000066400000000000000000000043761420007711700237250ustar00rootroot00000000000000lxi-tools-2.1/src/icons/scalable/actions/screenshot-symbolic.svg000066400000000000000000000007221420007711700251330ustar00rootroot00000000000000lxi-tools-2.1/src/icons/scalable/actions/script-symbolic.svg000066400000000000000000000031761420007711700242700ustar00rootroot00000000000000lxi-tools-2.1/src/icons/scalable/actions/view-fullscreen-symbolic.svg000066400000000000000000000045411420007711700260730ustar00rootroot00000000000000 lxi-tools-2.1/src/icons/scalable/actions/view-sidebar-start-symbolic.svg000066400000000000000000000011371420007711700264730ustar00rootroot00000000000000 lxi-tools-2.1/src/images/000077500000000000000000000000001420007711700153415ustar00rootroot00000000000000lxi-tools-2.1/src/images/photo-camera.png000066400000000000000000000120211420007711700204220ustar00rootroot00000000000000PNG  IHDRI#sBIT|d pHYsetEXtSoftwarewww.inkscape.org<IDATx{t}ǿ][eGBZަ`'MedŊS|ߟ`>3_p՚ u`ŤI̟?TWfϞ=8ahdH$N0n k xrxxx'oqR̬0e0Wnu"ZJ\? = s#lS^΢Eӛh3=` \.׷7 vkk?piC|Z^烝qlټyIf0ăK:::j' 96$b{{y/1&a1!itmڴ鶏CҼ!4:MC`9 d```zV{L r@WDd!wИ]MD/1fm{Ge˖Qhkk`""ID2f8ʾҜh RiFhU(L7F*6|.V3!-#DfRt3ߊxX.fvkګv3И!acYaW\3T*a!|=Nl(A1G0_ x)G Ǩ\.SOM}de%յֲb)#j s EO۶ݽAfGlSϪ@D汾{eu$ +md2U LfcKKE=Ix?cYָ?ǘN ^,+ḵk͛;۶Rmoݺ~fttעu$ oXfGT ;L-"ZȘv]Gry̆N +2P![vUEa>pMeim&UV8A^1crYnmm}jCA I+WVFEY- ?hN\Np99N'#x>u5tAWUVYF  N_JuORVC#{vjedĖ9Acت aJ(yfRF숸uKd,KJ3պBP"Ot\R/fU ,Jf<Ǿ2})7D3qUA/B9̜W!4R 1A~+c 鶤|_t\."ߊ K=`3DǍ{y qSZ`Enj SB!'ETV}rJ 46;P0*NyqEd/BN8JB6]+2J1vqCwq.AYIq]?+2fL9mŊSq̈́6!"'>xͤZ&zA kY*i "4wl3[R8Vd )%A,s-1"&戾lOD+^c"΅21mۢOJc ]l C6n(z.8^z1pR61dAM&/G3BAh3< N6Ä1 N#3 'exqF1HPKDc@̷1H "Y.1^ l>DdvLfk _r~> @UAKz{{d̰͛'C\ߐ;hkJy/~Zm-a9ɇAp9ߓ_5:nV'om ݲ[yYZ]d&d؞4)ՓM6%e5d󼧙>e5F'/;#c[:":Bv;*ѽ}u]C\.eY,m۟rQTfRF{a#lvqX-t!xrd2oDѠwBpN8B몺E\qQR0 lDtU{us>IA^#r{Q7wp:)&e~d>}}}Um$ B6]DDʾma,{v,{>(6X 0 -W  3yE9U&Q"z.CK@(IM0R:&uDM `RR.b>iZ&,*W*ʠR `đTOR._lHA3mT/Ӄ (8I$ jsQ,G(JZ)g֢ɉ-J[<;2 gj-q#$?Z9l ㄈhooZXzoC21{6̼LQ.'ag̼aLDAwi x]!fjժ}F"!F|qяT 2B- {l6;> poww:`-m/^$!l=A2F" aW-Z^!iC]Q28cۿ&jzD`-[,wA<`tYb/J]Ҭy;͋dV {0^;3d{\]$A[6 qw=fVt^B}B1vC z}֞ٞJ2\{)`Pkwvvyo\OmY<z߇l5dd@#aUV Iߴ8pIENDB`lxi-tools-2.1/src/images/runner.png000066400000000000000000000133171420007711700173650ustar00rootroot00000000000000PNG  IHDRg- pHYs%%LtEXtSoftwarewww.inkscape.org<\IDATx{|UnE҂EAPۀ bvnS5"Xn*/\,Y,t̮K \򪴈B69G$;sl<˙syB \Mѡ!`џR,ki===ʬb!&*|PԷ`Uy |]TQ^`4 0SN/NBHdiRnE~DteY?Ǚ0?y[Bs 8|Qm&S:ת8\d>eDD_C2̼²-yq|} 'O#nkYC>R8\. e] ӦlFfuk^Fq&~-+]~VJd2VO---gPq=5e\T*jo|,擎_bc;;;}]urѷ}ubX€|~BX:'NW5UJ `9 !]blq̜?#Rjt:ht+J'|3iYV1I&Ńx"z\2aB3| /u_x>RfL4 %׶.5kPyM\/Xx<,^xD"0.!ıЈ~`UfT*-p8; oCDI&iomm#c3T*5;}Lj^@D"kZh,_|Rв!ѣ00V*gX scw)mhmWs]J+W0xR, ѵ×tuum0-&~IJ_wJ=nʗr{^#XPxH)p3/-8f PJ+;=1y jrW 1b\g#mf{Yu?]th^`+'MtxVlٲɛ7ozXfj*upҥSoywDd2<- ;*NboѻĪCj.݀Ba;u߱'k%3k)kKz{{wbQ7FZ@hف3Dd"8Wf2iT1DR˲܊G4g*~bΜ9U/1ֶ2a>i5 5AD`]Qaj18ޯx5W#D3?jժomkdb'Oލ+,kf>^47#XJ9v ;]׽c͚5+GDOaSyy^g\ng{L6k׮&* !ίf?D=:~.e]v4rm2e,K*yBG tw ? s̏m>|e[~%y5QF)`hh4W3Dt<<? ;)̗ !zBciDt-6 3<2լ%֋R*-7 x!gP/!Ma"'f>)a̜YֱB^f>Mq+T\+~rS{{~ْ hYS~/ѕB| '0sdhe !LRWR*HUΖd2J&\ny#gY}̶>)`h93'XXN/7K)p?0CZjCPuݧl3Oa~˲ηm{Eй=B;J c'G3~3gO:;;lZo)G\U\|b\EJ 4=J#HH `5]5>"H)!c3އn3gMvgGGǰ߹Gyl %m&iokkG+ȄNuiF{>OYȦMР>;ys2u- I>`3UG___|```g;DD:PD"޲g^ch=1U崴@u@x<^{*})/ ;,eϧR)SBEÖHs]"|~+bo$hH:7L 44*\JI&΀R#6CX컦E2`&оR'ׄa!l4NB8O$Fƀlv[ֱ5jM4ƀD7mtia!&+]D8+`u84hYe&r2L f A dY֕]TwEHPJy43lZVlYwL5`___+]jZ(ܔL&_2-" Dր7nֱRa4ŋw"sLD0NbZGT%Ol0jg&I X9}wipF HDW[%]kiiδ)J)32c`#VjRX,ȴ( ̃?|.4|:D€f8a-ɓ4-"D€D˴ADy#E8tf~U Um(osܧ~:FBCM:{zz," m;"iZΜ9+f1 ҶߘҀ˖- uAiB( 844t.iuJGrW<޵!`BL *2D|p$Rۗ.]:մ(0]v加 7*D|̗]vu>i1Q!4\.MDJoEB3LK[[ۓ0g^PJNVBnkk&|>˲I)okGŋH$A8+:&ƌQǿ70D`t\d>X1Nsi!1~}滖n0)D"X8N;x1J);|FGl"zX,g)e̷ |F|738馅#tʍ>gaeٝL": [ԩSO+(F 8| !Rw8 7IC=<vvvjZHn)xY9V,kF2|| /_}Ti#mO ՘f͚Җ̼2eZHP:j>bBse& }y0odl֡@G@fX^P`كBkX>`{ jF@)a4} 춱Xtf>ȣV:Gʯ@FғʡDt1F۶ <al=P˟۶kdܹsJ$3!m dڡe\.)۰my!\fDb9+|8\݀mmm@+^{J_) *3\&к P(4kKKbo)aD#f'r@DDtvP54˲p4sŰ̱6J)pN&0Oc`/IC{9:bRg˗f;n<ĪU̯-R/[Glf%J#6 ]׽ #pLW<+JgPv|3L]wuf̘q CGh0`kkYŲG~9) 78u|A*Ĵ ՀlvʡOM:?V^ T׫NHRBWZ@1D)u_[֙ǕJ+GLXaYdri!AKv1;Y]Y"#P>ߓQϹ"]E#z _F@f&qB0cRm:@gU˲NL&Ϙb _ @׫z $'\pHDgZ|#`&iT5bq\FfN%#~{+Gֳo/Dt0DDC7>B4_i.UT~ B?6 |J) /x\7&"_,noXv9G-~N=91ub۱kdfp]~KqC{xFD'!ko|9'|&W lReɣHvTxX,^5R15fJFCFѠ|fwweCO03>4_}4V]ţR_hpp𹶶#D5!Dmj/i!˲+Xwww+b83;Udf]jb\2g8%J5|uMb]zu/? !kN(KUKqRcLl۾MGdoQZ0c,/ߚθ#ZeiGBn_ϤDtM飚Giޭ!73w !~ kJU޲ SNϘB0u~+nl6˲0Z~jYedtMt .60HpDt$3 הR3.6aё.1^*x ^'JA 9,kM"Ș$"~guvvnI`~O?,BHc60pD4xM1 Z um4֤AӀte"cIQG1ϙ]]] text/x-lua *.lua -- --[[ ]] false Communication Discover timeout [ms] adjustment_timeout_discover 1 Instrument discovery timeout in milliseconds center SCPI timeout [ms] adjustment_timeout_scpi 1 SCPI communications timeout in milliseconds center Screenshot timeout [ms] adjustment_timeout_screenshot 1 Screenshot communications timeout in milliseconds center Use mDNS discovery GTK_ALIGN_START 1 Use mDNS for instrument discovery center Communications protocol 0 Communications protocol used for SCPI and benchmark center VXI11/TCP RAW/TCP RAW/TCP port adjustment_raw_port 1 RAW/TCP network port center Appearance Show sent SCPI message GTK_ALIGN_START 1 Show sent SCPI message center Show SCPI message timestamp GTK_ALIGN_START 1 Show SCPI message timestamp center Show SCPI message IP GTK_ALIGN_START 1 Show SCPI message IP center Show SCPI message type GTK_ALIGN_START 1 Show SCPI message timestamp center Prefer dark color theme GTK_ALIGN_START 1 Prefer dark theme center 99900 1000 100 1000 99900 1000 100 1000 99900 1000 100 1000 65535 0 1 100 lxi-tools-2.1/src/lxi_gui-window.c000066400000000000000000002255451420007711700172220ustar00rootroot00000000000000/* * Copyright (c) 2021-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include "config.h" #include "lxi_gui-window.h" #include "screenshot.h" #include "benchmark.h" #include "misc.h" #include "lxilua.h" #include #include #include #include #include #include #include "gtkchart.h" #include "lxi_gui-resources.h" static lxi_info_t info; struct _LxiGuiWindow { GtkApplicationWindow parent_instance; /* Template widgets */ GSettings *settings; GtkListBox *list_instruments; GMenuModel *list_widget_menu_model; GtkWidget *list_widget_popover_menu; GtkViewport *list_viewport; GdkClipboard *clipboard; GtkEntry *entry_scpi; GtkTextView *text_view_scpi; GtkToggleButton *toggle_button_scpi_send; GtkPicture *picture_screenshot; GtkToggleButton *toggle_button_screenshot_grab; GtkButton *button_screenshot_save; GThread *screenshot_worker_thread; GThread *screenshot_grab_worker_thread; GThread *search_worker_thread; GThread *send_worker_thread; GtkProgressBar *progress_bar_benchmark; GThread *benchmark_worker_thread; GtkToggleButton *toggle_button_benchmark_start; GtkToggleButton *toggle_button_search; GtkSpinButton *spin_button_benchmark_requests; GtkLabel *label_benchmark_result; GtkImage *image_benchmark; GdkPixbuf *pixbuf_screenshot; GtkSourceView *source_view_script; GtkTextView *text_view_script_status; GThread *script_run_worker_thread; GtkInfoBar *info_bar; GtkLabel *label_info_bar; GtkViewport *viewport_screenshot; GtkToggleButton *toggle_button_script_run; AdwFlap *flap; AdwStatusPage *status_page_instruments; unsigned int benchmark_requests_count; const char *id; const char *ip; char *image_buffer; int image_size; char image_format[10]; char image_filename[1000]; GFile *script_file; lua_State *L; gboolean screenshot_ready; gboolean screenshot_loaded; int screenshot_size; double progress_bar_fraction; char *benchmark_result_text; gboolean lua_stop_requested; GMutex mutex_gui_chart; GMutex mutex_discover; GMutex mutex_save_png; GMutex mutex_save_csv; bool no_instruments; }; G_DEFINE_TYPE (LxiGuiWindow, lxi_gui_window, GTK_TYPE_APPLICATION_WINDOW) static LxiGuiWindow *self_global; #define CHARTS_MAX 1024 struct chart_t { bool allocated; int handle; GtkChartType type; char *title; char *label; char *x_label; char *y_label; double x; double y; double x_max; double y_max; double value; double value_min; double value_max; int width; bool autoscale; bool no_csv; GtkWidget *widget; GtkWindow *window; char *filename_png; char *filename_csv; }; static struct chart_t gui_chart[CHARTS_MAX]; struct show_data_t { LxiGuiWindow *self; gchar *buffer; }; static gboolean show_error_thread(gpointer user_data) { struct show_data_t *data = user_data; // Show error message gtk_label_set_text (GTK_LABEL(data->self->label_info_bar), data->buffer); gtk_info_bar_set_message_type(data->self->info_bar, GTK_MESSAGE_ERROR); gtk_info_bar_set_show_close_button(data->self->info_bar, true); gtk_widget_show (GTK_WIDGET(data->self->info_bar)); g_free(data->buffer); return G_SOURCE_REMOVE; } static void show_error(LxiGuiWindow *self, const char *buffer) { struct show_data_t *data = g_new0(struct show_data_t, 1); data->self = self; data->buffer = g_strdup(buffer); g_idle_add(show_error_thread, data); } static gboolean show_info_thread(gpointer user_data) { struct show_data_t *data = user_data; // Show info message gtk_label_set_text (GTK_LABEL(data->self->label_info_bar), data->buffer); gtk_info_bar_set_message_type(data->self->info_bar, GTK_MESSAGE_INFO); gtk_info_bar_set_show_close_button(data->self->info_bar, false); gtk_widget_show (GTK_WIDGET(data->self->info_bar)); g_free(data->buffer); return G_SOURCE_REMOVE; } static void show_info(LxiGuiWindow *self, const char *buffer) { struct show_data_t *data = g_new0(struct show_data_t, 1); data->self = self; data->buffer = g_strdup(buffer); g_idle_add(show_info_thread, data); } static void hide_info_bar(LxiGuiWindow *self) { gtk_widget_hide(GTK_WIDGET(self->info_bar)); } static GtkWidget* find_child_by_name(GtkWidget* parent, const gchar* name) { GtkWidget *child; GList *children = NULL; g_assert(GTK_IS_WIDGET(parent) == true); if (g_strcmp0(gtk_widget_get_name(parent), name) == 0) return parent; for (child = gtk_widget_get_first_child(parent); child != NULL; child = gtk_widget_get_next_sibling(child)) { children = g_list_append(children, child); } while (children != NULL) { GtkWidget* widget = find_child_by_name(children->data, name); if (widget != NULL) return widget; children = children->next; } return NULL; } static void pressed_cb (GtkGestureClick *gesture, guint n_press, double x, double y, LxiGuiWindow *self) { GtkWidget *child; GtkListBoxRow *row; GtkAdjustment* adjustment; double y_adjustment, y_adjusted; UNUSED(gesture); UNUSED(n_press); // Adjust y value to account for scrolling offset so we can pick the right row adjustment = gtk_list_box_get_adjustment(self->list_instruments); y_adjustment = gtk_adjustment_get_value(adjustment); y_adjusted = y + y_adjustment; row = gtk_list_box_get_row_at_y(self->list_instruments, y_adjusted); if (row != NULL) { child = find_child_by_name(GTK_WIDGET(row), "list-title"); if (child != NULL) { // Save IP selected via GUI self->ip = gtk_label_get_text(GTK_LABEL(child)); } child = find_child_by_name(GTK_WIDGET(row), "list-subtitle"); if (child != NULL) { // Save ID selected via GUI self->id = gtk_label_get_text(GTK_LABEL(child)); } // If right click if (gtk_gesture_single_get_current_button(GTK_GESTURE_SINGLE(gesture)) == GDK_BUTTON_SECONDARY) { /* Place our popup menu at the point where * the click happened, before popping it up. */ gtk_popover_set_pointing_to (GTK_POPOVER (self->list_widget_popover_menu), &(const GdkRectangle){ x, y, 1, 1 }); gtk_popover_popup (GTK_POPOVER (self->list_widget_popover_menu)); } } } static void action_cb (GtkWidget *widget, const char *action_name, GVariant *parameter) { LxiGuiWindow *self = LXI_GUI_WINDOW (widget); UNUSED(parameter); if (g_str_equal (action_name, "action.copy_ip")) gdk_clipboard_set (self->clipboard, G_TYPE_STRING, self->ip); if (g_str_equal (action_name, "action.copy_id")) gdk_clipboard_set (self->clipboard, G_TYPE_STRING, self->id); if (g_str_equal (action_name, "action.open_browser") && self->ip != NULL) { #ifndef __APPLE__ gchar *uri = g_strconcat("http://", self->ip, NULL); gtk_show_uri(GTK_WINDOW(self), uri, GDK_CURRENT_TIME); #else gchar *uri = g_strconcat("open http://", self->ip, NULL); system(uri); #endif g_free(uri); } } static gboolean gui_update_search_add_instrument_thread(gpointer data) { GtkWidget *list_box = data; // Add list box to list (GtkListBoxRow automatically inserted inbetween) gtk_list_box_append(self_global->list_instruments, list_box); g_mutex_unlock(&self_global->mutex_discover); return G_SOURCE_REMOVE; } /* Add instrument to list */ static void list_add_instrument (LxiGuiWindow *self, const char *ip, const char *id) { UNUSED(self); GtkWidget *list_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); GtkWidget *list_text_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); GtkWidget *list_title = gtk_label_new(ip); GtkWidget *list_subtitle = gtk_label_new (id); // Set properties of list box gtk_widget_set_size_request(list_box, -1, 60); // Set properties of list text box gtk_widget_set_hexpand(list_text_box, true); gtk_widget_set_hexpand_set(list_text_box, true); gtk_widget_set_margin_top(list_text_box, 8); gtk_widget_set_margin_end(list_text_box, 5); gtk_widget_set_halign(list_text_box, GTK_ALIGN_START); // Add image to list box GtkWidget *image = gtk_image_new_from_resource("/io/github/lxi-tools/lxi-gui/icons/lxi-instrument.png"); gtk_widget_set_margin_start(image, 2); gtk_widget_set_margin_end(image, 2); gtk_image_set_pixel_size(GTK_IMAGE(image), 50); gtk_box_append(GTK_BOX(list_box), image); // Add title to list text box gtk_widget_set_name(list_title, "list-title"); gtk_widget_set_halign(list_title, GTK_ALIGN_START); gtk_box_append(GTK_BOX(list_text_box), list_title); // Add subtitle to list text box gtk_widget_set_name(list_subtitle, "list-subtitle"); gtk_widget_add_css_class(list_subtitle, "subtitle"); GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (list_subtitle)); GtkCssProvider *provider = gtk_css_provider_new (); gtk_css_provider_load_from_data (provider, "label.subtitle {opacity: 1; font-size: x-small;}", -1); gtk_style_context_add_provider (context, GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_USER); gtk_widget_set_vexpand(list_subtitle, true); gtk_widget_set_vexpand_set(list_subtitle, true); gtk_widget_set_valign(list_subtitle, GTK_ALIGN_START); gtk_label_set_wrap(GTK_LABEL(list_subtitle), true); gtk_label_set_natural_wrap_mode(GTK_LABEL(list_subtitle), GTK_NATURAL_WRAP_NONE); gtk_label_set_wrap_mode(GTK_LABEL(list_subtitle), PANGO_WRAP_CHAR); gtk_box_append(GTK_BOX(list_text_box), list_subtitle); // Add text box to list box gtk_box_append(GTK_BOX(list_box), list_text_box); // Add list box to instrument list g_idle_add(gui_update_search_add_instrument_thread, list_box); // Mark instrument list populated self->no_instruments = false; } static void mdns_service(const char *address, const char *id, const char *service, int port) { UNUSED(service); UNUSED(port); GtkWidget *child, *subtitle_child; g_mutex_lock(&self_global->mutex_discover); // Traverse list of instruments for (child = gtk_widget_get_first_child(GTK_WIDGET(self_global->list_instruments)); child != NULL; child = gtk_widget_get_next_sibling(child)) { subtitle_child = find_child_by_name(GTK_WIDGET(child), "list-subtitle"); if (subtitle_child != NULL) { if (strcmp(id, gtk_label_get_text(GTK_LABEL(subtitle_child))) == 0) { // Instruments already exists, do not add g_mutex_unlock(&self_global->mutex_discover); return; } } } // No match found, add instrument to list box list_add_instrument(self_global, address, id); } static void vxi11_broadcast(const char *address, const char *interface) { UNUSED(address); char *text = g_strdup_printf ("Broadcasting on interface %s", interface); show_info(self_global, text); g_free(text); } static void vxi11_device(const char *address, const char *id) { g_mutex_lock(&self_global->mutex_discover); list_add_instrument(self_global, address, id); } static gboolean gui_update_script_run_worker_function_finished_thread(gpointer data) { LxiGuiWindow *self = data; // Restore search button gtk_toggle_button_set_active(self->toggle_button_script_run, false); gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_script_run), true); return G_SOURCE_REMOVE; } static gboolean gui_update_search_finished_thread(gpointer data) { LxiGuiWindow *self = data; // Restore search button gtk_toggle_button_set_active(self->toggle_button_search, false); gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_search), true); // Hide broadcasting info bar hide_info_bar(self); // Manage instruments status page if (self->no_instruments) { gtk_widget_set_visible(GTK_WIDGET(self->status_page_instruments), true); } // Reenable search shortcut gtk_widget_action_set_enabled (GTK_WIDGET (self), "action.search", true); return G_SOURCE_REMOVE; } static gboolean gui_update_send_worker_finished_thread(gpointer data) { LxiGuiWindow *self = data; // Restore search button gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_scpi_send), true); gtk_toggle_button_set_active(self->toggle_button_scpi_send, false); return G_SOURCE_REMOVE; } static gpointer search_worker_thread(gpointer data) { LxiGuiWindow *self = data; unsigned int timeout = g_settings_get_uint(self->settings, "timeout-discover"); bool use_mdns_discovery = g_settings_get_boolean(self->settings, "use-mdns-discovery"); // Reset selected IP and ID self->ip = NULL; self->id = NULL; // Search for LXI devices if (use_mdns_discovery) lxi_discover(&info, timeout, DISCOVER_MDNS); else lxi_discover(&info, timeout, DISCOVER_VXI11); g_idle_add(gui_update_search_finished_thread, self); return NULL; } static gboolean gui_update_search_start_thread(gpointer data) { LxiGuiWindow *self = data; GtkWidget *child; // Hide instruments status page gtk_widget_set_visible(GTK_WIDGET(self->status_page_instruments), false); self->no_instruments = true; // Reveal flap adw_flap_set_reveal_flap(self->flap, true); // Only allow one search activity at a time gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_search), false); // Clear instrument list child = gtk_widget_get_first_child (GTK_WIDGET(self->list_instruments)); while (child != NULL) { gtk_list_box_remove (GTK_LIST_BOX (self->list_instruments), child); child = gtk_widget_get_first_child (GTK_WIDGET(self->list_instruments)); } // Start thread which searches for LXI instruments self->search_worker_thread = g_thread_new("search_worker", search_worker_thread, (gpointer)self); return G_SOURCE_REMOVE; } static void button_clicked_search(LxiGuiWindow *self, GtkToggleButton *button) { UNUSED(button); g_idle_add(gui_update_search_start_thread, self); } struct dispatch_data_t { GtkTextView *text_view; gchar *buffer; }; static gboolean text_view_add_buffer_thread(gpointer user_data) { struct dispatch_data_t *data = user_data; GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(data->text_view); GtkTextIter iter; // Append text gtk_text_buffer_get_end_iter(text_buffer, &iter); gtk_text_buffer_insert (text_buffer, &iter, data->buffer, -1); // Scroll down gtk_text_buffer_get_end_iter(text_buffer, &iter); gtk_text_iter_backward_line(&iter); GtkTextMark *end_mark = gtk_text_buffer_create_mark(text_buffer, NULL, &iter, FALSE); gtk_text_view_scroll_mark_onscreen(data->text_view, end_mark); gtk_text_buffer_delete_mark(text_buffer, end_mark); // Cleanup g_free(data->buffer); g_free(data); return G_SOURCE_REMOVE; } static void text_view_add_buffer(GtkTextView *view, const char *buffer) { struct dispatch_data_t *data = g_new0(struct dispatch_data_t, 1); data->text_view = view; data->buffer = g_strdup(buffer); g_idle_add(text_view_add_buffer_thread, data); } static gboolean text_view_add_markup_buffer_thread(gpointer user_data) { struct dispatch_data_t *data = user_data; GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(data->text_view); GtkTextIter iter; // Append text gtk_text_buffer_get_end_iter(text_buffer, &iter); gtk_text_buffer_insert_markup(text_buffer, &iter, data->buffer, -1); // Scroll down gtk_text_buffer_get_end_iter(text_buffer, &iter); GtkTextMark *end_mark = gtk_text_buffer_create_mark(text_buffer, NULL, &iter, FALSE); gtk_text_view_scroll_mark_onscreen(data->text_view, end_mark); gtk_text_buffer_delete_mark(text_buffer, end_mark); // Cleanup g_free(data->buffer); g_free(data); return G_SOURCE_REMOVE; } static void text_view_add_buffer_in_dimgray(GtkTextView *view, const char *buffer) { struct dispatch_data_t *data = g_new0(struct dispatch_data_t, 1); data->text_view = view; data->buffer = g_strdup_printf("%s", buffer); g_idle_add(text_view_add_markup_buffer_thread, data); } static gboolean text_view_clear_buffer_thread(gpointer data) { GtkTextView *view = data; GtkTextIter start, end; GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(view); gtk_text_buffer_get_bounds(text_buffer, &start, &end); gtk_text_buffer_delete(text_buffer, &start, &end); return G_SOURCE_REMOVE; } static void text_view_clear_buffer(GtkTextView *view) { g_idle_add(text_view_clear_buffer_thread, view); } static void save_text_buffer_to_file(GFile *file, GtkTextBuffer *text_buffer) { GtkTextIter start, end; gboolean status = true; GError *error = NULL; char *buffer; // Get buffer of script text view gtk_text_buffer_get_bounds(text_buffer, &start, &end); buffer = gtk_text_buffer_get_text(text_buffer, &start, &end, true); // Write output stream to file status = g_file_replace_contents (file, buffer, strlen(buffer), NULL, false, 0, NULL, NULL, &error); if (status != true) { g_print("Could not write output stream: %s\n", error->message); g_error_free(error); return; } // TODO: Report errors to GUI } static void on_scpi_save_as_response (GtkDialog *dialog, int response, gpointer user_data) { LxiGuiWindow *self = user_data; if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); GFile *file = gtk_file_chooser_get_file (chooser); GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(self->text_view_scpi); save_text_buffer_to_file(file, text_buffer); } gtk_window_destroy (GTK_WINDOW (dialog)); } static void scpi_save_as (LxiGuiWindow *self) { GtkWidget *dialog; // Show file save dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (self), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); GtkFileChooser *chooser = GTK_FILE_CHOOSER(dialog); gtk_file_chooser_set_current_name (chooser, "Untitled.txt"); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_scpi_save_as_response), (gpointer *) self); } static void scpi_action_cb (GtkWidget *widget, const char *action_name, GVariant *parameter) { LxiGuiWindow *self = LXI_GUI_WINDOW (widget); UNUSED(parameter); if (g_str_equal (action_name, "scpi_clear_all")) { text_view_clear_buffer(self->text_view_scpi); } if (g_str_equal (action_name, "scpi_save_as")) { scpi_save_as(self); } } static void scpi_print(LxiGuiWindow *self, const char *text, bool sent, const char *ip, const char *timestamp) { bool show_ip = g_settings_get_boolean(self->settings, "scpi-show-message-ip"); bool show_type = g_settings_get_boolean(self->settings, "scpi-show-message-type"); bool show_timestamp = g_settings_get_boolean(self->settings, "scpi-show-message-timestamp"); GString *string = g_string_new(NULL); // Build text string if ((show_timestamp) || (show_ip) || (show_type)) { g_string_append(string, "["); } if (show_timestamp) { // Add timestamp g_string_append(string, timestamp); } if (show_ip) { // Add IP if (show_timestamp) { g_string_append(string, " "); } g_string_append(string, ip); } if (show_type) { // Add type const char *type; if ((show_timestamp) || (show_ip)) { g_string_append(string, " "); } if (sent) { type = "REQ"; } else { type = "RSP"; } g_string_append(string, type); } if ((show_timestamp) || (show_ip) || (show_type)) { g_string_append(string, "] "); } g_string_append(string, text); if (sent) { text_view_add_buffer_in_dimgray(self->text_view_scpi, string->str); text_view_add_buffer(self->text_view_scpi, "\n"); } else { text_view_add_buffer(self->text_view_scpi, string->str); } // Cleanup g_string_free(string, true); } static gpointer send_worker_thread(gpointer data) { LxiGuiWindow *self = data; int device = 0; const char *input_buffer; GString *tx_buffer; char rx_buffer[65536]; int rx_bytes; unsigned int timeout = g_settings_get_uint(self->settings, "timeout-scpi"); bool show_sent_scpi = g_settings_get_boolean(self->settings, "show-sent-scpi"); unsigned int com_protocol = g_settings_get_uint(self->settings, "com-protocol"); unsigned int raw_port = g_settings_get_uint(self->settings, "raw-port"); if (self->ip == NULL) { show_error(self, "No instrument selected"); goto error_no_instrument; } // Prepare buffer to send GtkEntryBuffer *entry_buffer = gtk_entry_get_buffer(GTK_ENTRY(self->entry_scpi)); input_buffer = gtk_entry_buffer_get_text(entry_buffer); if (strlen(input_buffer) == 0) goto error_no_input; tx_buffer = g_string_new_len(input_buffer, strlen(input_buffer)); strip_trailing_space(tx_buffer->str); if (com_protocol == VXI11) { device = lxi_connect(self->ip, 0, NULL, timeout, VXI11); } if (com_protocol == RAW) { tx_buffer = g_string_append(tx_buffer, "\n"); device = lxi_connect(self->ip, raw_port, NULL, timeout, RAW); } if (device == LXI_ERROR) { show_error(self, "Error connecting"); goto error_connect; } if (lxi_send(device, tx_buffer->str, tx_buffer->len, timeout) == LXI_ERROR) { show_error(self, "Error sending"); goto error_send; } if (show_sent_scpi) { GDateTime* date_time = g_date_time_new_now_local(); char *timestamp = g_strdup_printf("%02d:%02d:%02d:%03d", g_date_time_get_hour(date_time), g_date_time_get_minute(date_time), g_date_time_get_second(date_time), g_date_time_get_microsecond(date_time)/1000); g_date_time_unref(date_time); // Print sent command to output view if (com_protocol == RAW) { // Remove newline g_string_erase(tx_buffer, tx_buffer->len - 1, 1); } scpi_print(self, tx_buffer->str, true, self->ip, timestamp); g_free(timestamp); } if (question(tx_buffer->str)) { rx_bytes = lxi_receive(device, rx_buffer, sizeof(rx_buffer), timeout); if (rx_bytes == LXI_ERROR) { show_error(self, "No response received"); goto error_receive; } // Terminate received string/data rx_buffer[rx_bytes] = 0; GDateTime* date_time = g_date_time_new_now_local(); char *timestamp = g_strdup_printf("%02d:%02d:%02d:%03d", g_date_time_get_hour(date_time), g_date_time_get_minute(date_time), g_date_time_get_second(date_time), g_date_time_get_microsecond(date_time)/1000); g_date_time_unref(date_time); // Print received response to text view scpi_print(self, rx_buffer, false, self->ip, timestamp); g_free(timestamp); } // Clear text in text input entry gtk_entry_buffer_delete_text(entry_buffer, 0, -1); error_send: error_receive: lxi_disconnect(device); error_connect: g_string_free(tx_buffer, true); error_no_instrument: error_no_input: // Restore send button state // Defer! g_idle_add(gui_update_send_worker_finished_thread, self); return NULL; } static void button_clicked_scpi_clear (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); // Clear SCPI input entry GtkEntryBuffer *entry_buffer = gtk_entry_get_buffer(self->entry_scpi); gtk_entry_buffer_delete_text(entry_buffer, 0, -1); gtk_entry_set_buffer(self->entry_scpi, entry_buffer); } static void button_clicked_scpi_send(LxiGuiWindow *self, GtkButton *button) { UNUSED(button); // Update send button state gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_scpi_send), false); // Start thread which sends the SCPI message self->send_worker_thread = g_thread_new("send_worker", send_worker_thread, (gpointer)self); } static void entry_scpi_enter_pressed (LxiGuiWindow *self, GtkEntry *entry) { UNUSED(entry); // Start thread which sends the SCPI message self->send_worker_thread = g_thread_new("send_worker", send_worker_thread, (gpointer)self); // Update send button state gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_scpi_send), false); gtk_toggle_button_set_active(self->toggle_button_scpi_send, true); } static void button_clicked_scpi(LxiGuiWindow *self, GtkButton *button) { // Insert button label at entry cursor position const char *button_label = gtk_button_get_label(button); int cursor_position = gtk_editable_get_position(GTK_EDITABLE(self->entry_scpi)); GtkEntryBuffer *entry_buffer = gtk_entry_get_buffer(self->entry_scpi); gtk_entry_buffer_insert_text(entry_buffer, cursor_position, button_label, strlen(button_label)); gtk_entry_set_buffer(self->entry_scpi, entry_buffer); cursor_position = cursor_position + strlen(button_label); gtk_editable_set_position(GTK_EDITABLE(self->entry_scpi), cursor_position); } static bool grab_screenshot(LxiGuiWindow *self) { char *plugin_name = (char *) ""; char *filename = (char *) ""; unsigned int timeout = g_settings_get_uint(self->settings, "timeout-screenshot"); int status; // Check for instrument if (self->ip == NULL) { show_error(self, "No instrument selected"); return 1; } // Allocate 20 MB for image data self->image_buffer = g_malloc(0x100000*20); if (self->image_buffer == NULL) { show_error(self, "Failure allocating memory for image data"); return 1; } // Capture screenshot status = screenshot((char *)self->ip, plugin_name, filename, timeout, false, self->image_buffer, &(self->image_size), self->image_format, self->image_filename); if (status != 0) { show_error(self, "Failed to grab screenshot"); g_free(self->image_buffer); return 1; } return 0; } static gboolean gui_update_grab_screenshot_finished_thread(gpointer user_data) { LxiGuiWindow *self = user_data; GdkPixbufLoader *loader; if (self->screenshot_ready) { // Show screenshot //loader = gdk_pixbuf_loader_new (); loader = gdk_pixbuf_loader_new_with_type(self->image_format, NULL); gdk_pixbuf_loader_write(loader, (const guchar *) self->image_buffer, (gsize)self->image_size, NULL); self->pixbuf_screenshot = gdk_pixbuf_loader_get_pixbuf (loader); if (self->pixbuf_screenshot == NULL) { show_error(self, "Failure handling image format"); self->screenshot_loaded = false; } else { self->screenshot_size = gdk_pixbuf_get_width(self->pixbuf_screenshot); self->screenshot_loaded = true; gtk_widget_set_valign(GTK_WIDGET(self->picture_screenshot), GTK_ALIGN_FILL); gtk_widget_set_halign(GTK_WIDGET(self->picture_screenshot), GTK_ALIGN_FILL); gtk_picture_set_pixbuf(self->picture_screenshot, self->pixbuf_screenshot); gdk_pixbuf_loader_close(loader, NULL); g_object_unref(loader); // Make screenshot picture zoomable //gtk_widget_set_sensitive(GTK_WIDGET(self->viewport_screenshot), true); } g_free(self->image_buffer); } // Restore screenshot buttons gtk_toggle_button_set_active(self->toggle_button_screenshot_grab, false); gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_screenshot_grab), true); // Activate screenshot "Save" button if picture was successfully loaded if (self->screenshot_loaded) gtk_widget_set_sensitive(GTK_WIDGET(self->button_screenshot_save), true); return G_SOURCE_REMOVE; } static gpointer screenshot_grab_worker_thread(gpointer data) { LxiGuiWindow *self = data; if (grab_screenshot(self) == 0) { self->screenshot_ready = true; } else { self->screenshot_ready = false; } g_idle_add(gui_update_grab_screenshot_finished_thread, self); return NULL; } static void button_clicked_screenshot_grab(LxiGuiWindow *self, GtkButton *button) { UNUSED(button); if (self->ip == NULL) { show_error(self, "No instrument selected"); gtk_toggle_button_set_active(self->toggle_button_screenshot_grab, false); return; } // Disable grab button while grabbing the screenshot gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_screenshot_grab), false); // Start worker thread that will perform the grab screenshot work self->screenshot_grab_worker_thread = g_thread_new("screenshot_grab_worker", screenshot_grab_worker_thread, (gpointer) self); } static void on_screenshot_file_save_response (GtkDialog *dialog, int response) { GError *error = NULL; gboolean status = true; if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); g_autoptr(GFile) file = gtk_file_chooser_get_file (chooser); status = gdk_pixbuf_save(self_global->pixbuf_screenshot, g_file_get_path(file), "png", &error, NULL); if (status == false) { g_error ("Error: %s\n", error->message); } } gtk_window_destroy (GTK_WINDOW (dialog)); } static void button_clicked_screenshot_save (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); GtkWidget *dialog; GtkFileChooser *chooser; // Show file save as dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (self), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); chooser = GTK_FILE_CHOOSER(dialog); gtk_file_chooser_set_current_name (chooser, "Untitled screenshot.png"); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_screenshot_file_save_response), NULL); } static gboolean gui_update_progress_bar_fraction_thread(gpointer user_data) { LxiGuiWindow *self = user_data; static int count; gtk_progress_bar_set_fraction(self->progress_bar_benchmark, self->progress_bar_fraction); // Animate the runner if (count++ % 2) { gtk_image_set_pixel_size(self->image_benchmark, 155); gtk_widget_set_margin_start(GTK_WIDGET(self->image_benchmark), 10); } else { gtk_image_set_pixel_size(self->image_benchmark, 160); gtk_widget_set_margin_start(GTK_WIDGET(self->image_benchmark), 0); } return G_SOURCE_REMOVE; } static void benchmark_progress_cb(unsigned int count) { double fraction_count; double total_count = self_global->benchmark_requests_count; // Update progress for every 5% fraction reached fraction_count = total_count / 20; if ((++count % (unsigned int) fraction_count) == 0) { self_global->progress_bar_fraction = count / fraction_count / 20; g_idle_add(gui_update_progress_bar_fraction_thread, self_global); } } static gboolean gui_update_benchmark_finished_thread(gpointer user_data) { LxiGuiWindow *self = user_data; gtk_label_set_text(self->label_benchmark_result, self->benchmark_result_text); g_free(self->benchmark_result_text); gtk_toggle_button_set_active(self->toggle_button_benchmark_start, false); gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_benchmark_start), true); return G_SOURCE_REMOVE; } static gpointer benchmark_worker_function(gpointer data) { double result; LxiGuiWindow *self = data; unsigned int com_protocol = g_settings_get_uint(self->settings, "com-protocol"); unsigned int raw_port = g_settings_get_uint(self->settings, "raw-port"); if (com_protocol == VXI11) { benchmark(self->ip, 0, 1000, VXI11, self->benchmark_requests_count, false, &result, benchmark_progress_cb); } if (com_protocol == RAW) { benchmark(self->ip, raw_port, 1000, RAW, self->benchmark_requests_count, false, &result, benchmark_progress_cb); } // Show benchmark result self->benchmark_result_text = g_strdup_printf("%.1f requests/s", result); g_idle_add(gui_update_benchmark_finished_thread, self); return NULL; } static gboolean gui_update_progress_bar_reset_thread(gpointer user_data) { LxiGuiWindow *self = user_data; // Reset gtk_progress_bar_set_fraction(self->progress_bar_benchmark, 0); gtk_label_set_text(self->label_benchmark_result, ""); return G_SOURCE_REMOVE; } static void button_clicked_benchmark_start (LxiGuiWindow *self, GtkToggleButton *button) { UNUSED(button); // Reset g_idle_add(gui_update_progress_bar_reset_thread, self); self->benchmark_requests_count = gtk_spin_button_get_value(self->spin_button_benchmark_requests); if (self->ip == NULL) { show_error(self, "No instrument selected"); gtk_toggle_button_set_active(self->toggle_button_benchmark_start, true); return; } gtk_widget_set_sensitive(GTK_WIDGET(button), false); self->benchmark_worker_thread = g_thread_new("benchmark_worker", benchmark_worker_function, (gpointer) self); } static void button_clicked_add_instrument (LxiGuiWindow *self, GtkButton *button) { UNUSED(self); UNUSED(button); // Not implemented } static void on_script_file_open_response (GtkDialog *dialog, int response, gpointer user_data) { LxiGuiWindow *self = user_data; if (response == GTK_RESPONSE_ACCEPT) { // Read file contents into script text view GFileInputStream *file_input_stream; GInputStream *input_stream; GtkSourceBuffer *source_buffer_script; gboolean status = true; gsize bytes_read = 0, bytes_written = 0; GError *error = NULL; GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(dialog)); file_input_stream = g_file_read(file, NULL, &error); if (file_input_stream == NULL) { g_print ("Could not open file: %s\n", error->message); g_error_free(error); g_object_unref(file_input_stream); return; } GFileInfo *info = g_file_query_info(file, "*", G_FILE_QUERY_INFO_NONE, NULL, NULL); goffset len_buffer = g_file_info_get_size(info); gchar *buffer = g_malloc(len_buffer); if (buffer == NULL) { g_print("Failure allocating memory for reading file"); g_object_unref(file_input_stream); return; } input_stream = g_buffered_input_stream_new (G_INPUT_STREAM (file_input_stream)); status = g_input_stream_read_all(input_stream, buffer, len_buffer, &bytes_read, NULL, &error); if (status != TRUE) { g_print ("Could not read file input stream: %s\n", error->message); g_error_free(error); g_object_unref(file_input_stream); g_free(buffer); g_free(input_stream); return; } // Convert input file buffer to UTF-8 gchar *utf8_buffer = g_convert (buffer, bytes_read, "UTF-8", "ISO-8859-1", NULL, &bytes_written, &error); if (error != NULL) { g_print ("Couldn't convert to UTF-8\n"); g_error_free (error); g_object_unref(file_input_stream); g_free(buffer); g_free(input_stream); return; } // Get source buffer of script source view source_buffer_script = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->source_view_script))); // Clear existing text buffer GtkTextIter start, end; gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(source_buffer_script), &start, &end); gtk_text_buffer_delete(GTK_TEXT_BUFFER(source_buffer_script), &start, &end); // Read data into text buffer GtkTextIter iter; gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER(source_buffer_script), &iter); gtk_text_buffer_insert(GTK_TEXT_BUFFER(source_buffer_script), &iter, utf8_buffer, bytes_written); // Free old script file if any if (self->script_file != NULL) g_object_unref(self->script_file); // Update script file reference self->script_file = file; // Print status if (self->script_file != NULL) { char *filename = g_file_get_path(self->script_file); char *basename = g_path_get_basename(filename); g_free(filename); char *text = g_strdup_printf ("Opening %s\n", basename); text_view_add_buffer(self->text_view_script_status, text); g_free(text); } // Cleanup g_free(buffer); g_object_unref(file_input_stream); g_object_unref(input_stream); } // TODO: Report errors to GUI gtk_window_destroy (GTK_WINDOW (dialog)); } static void button_clicked_script_new (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); GtkSourceBuffer *source_buffer_script; // Clear existing script file self->script_file = NULL; // Get source buffer of script source view source_buffer_script = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->source_view_script))); // Clear existing text buffer GtkTextIter start, end; gtk_text_buffer_get_bounds(GTK_TEXT_BUFFER(source_buffer_script), &start, &end); gtk_text_buffer_delete(GTK_TEXT_BUFFER(source_buffer_script), &start, &end); // Print status text_view_add_buffer(self->text_view_script_status, "New script\n"); } static void button_clicked_script_open (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); GtkWidget *dialog; gpointer data = self; // Show file open dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (self), GTK_FILE_CHOOSER_ACTION_OPEN, "_Cancel", GTK_RESPONSE_CANCEL, "_Open", GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_script_file_open_response), data); } static void on_script_file_save_response (GtkDialog *dialog, int response, gpointer user_data) { LxiGuiWindow *self = user_data; if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); GFile *file = gtk_file_chooser_get_file (chooser); GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->source_view_script)); save_text_buffer_to_file(file, text_buffer); // Free old script file if any if (self->script_file != NULL) g_object_unref(self->script_file); // Update script file reference self->script_file = file; // Print status if (self->script_file != NULL) { char *filename = g_file_get_path(self->script_file); char *basename = g_path_get_basename(filename); g_free(filename); char *text = g_strdup_printf ("Saving %s\n", basename); text_view_add_buffer(self->text_view_script_status, text); g_free(text); } } gtk_window_destroy (GTK_WINDOW (dialog)); } static void button_clicked_script_save (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); if (self->script_file != NULL) { // Save file GtkTextBuffer *text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->source_view_script)); save_text_buffer_to_file(self->script_file, text_buffer); // Print status char *filename = g_file_get_path(self->script_file); char *basename = g_path_get_basename(filename); g_free(filename); char *text = g_strdup_printf ("Saving %s\n", basename); text_view_add_buffer(self->text_view_script_status, text); g_free(text); } else { GtkWidget *dialog; gpointer data = self; // Show file save dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (self), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_script_file_save_response), data); } } static void button_clicked_script_save_as (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); GtkWidget *dialog; gpointer data = self; // Show file save dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (self), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_script_file_save_response), data); } void initialize_script_engine(LxiGuiWindow *self) { // Print lua engine status char *text = g_strdup_printf ("%s engine ready\n", LUA_VERSION); text_view_add_buffer(self->text_view_script_status, text); text_view_add_buffer(self->text_view_script_status, "Loaded lxi-tools extensions\n"); g_free(text); self->lua_stop_requested = false; } static void lua_print_error(LxiGuiWindow *self, const char *string) { text_view_add_buffer(self->text_view_script_status, string); text_view_add_buffer(self->text_view_script_status, "\n"); } static void lua_print_string(const char *string) { text_view_add_buffer(self_global->text_view_script_status, string); text_view_add_buffer(self_global->text_view_script_status, "\n"); } static void chart_destroyed_cb (GtkWidget *widget, gpointer user_data) { UNUSED(user_data); int handle; // Mark widget deallocated for (handle=0; handlewidget), g_file_get_path(file)); if (status == false) { g_error ("Error: %s\n", error->message); } } gtk_window_destroy (GTK_WINDOW (dialog)); } static void chart_save_image (GSimpleAction *action, GVariant *state, gpointer user_data) { UNUSED(action); UNUSED(state); GtkWidget *dialog; GtkFileChooser *chooser; struct chart_t *chart = user_data; // Show file save as dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (chart->window), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); chooser = GTK_FILE_CHOOSER(dialog); gtk_file_chooser_set_current_name (chooser, "Untitled screenshot.png"); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_chart_save_image_response), chart); } static void on_chart_save_csv_response (GtkDialog *dialog, int response, struct chart_t *chart) { GError *error = NULL; gboolean status = true; if (response == GTK_RESPONSE_ACCEPT) { GtkFileChooser *chooser = GTK_FILE_CHOOSER (dialog); g_autoptr(GFile) file = gtk_file_chooser_get_file (chooser); status = gtk_chart_save_csv(GTK_CHART(chart->widget), g_file_get_path(file)); if (status == false) { g_error ("Error: %s\n", error->message); } } gtk_window_destroy (GTK_WINDOW (dialog)); } static void chart_save_csv (GSimpleAction *action, GVariant *state, gpointer user_data) { UNUSED(action); UNUSED(state); GtkWidget *dialog; GtkFileChooser *chooser; struct chart_t *chart = user_data; // Show file save as dialog dialog = gtk_file_chooser_dialog_new ("Select file", GTK_WINDOW (chart->window), GTK_FILE_CHOOSER_ACTION_SAVE, "_Cancel", GTK_RESPONSE_CANCEL, "_Save", GTK_RESPONSE_ACCEPT, NULL); chooser = GTK_FILE_CHOOSER(dialog); gtk_file_chooser_set_current_name (chooser, "Untitled.csv"); gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); gtk_widget_show (dialog); g_signal_connect (dialog, "response", G_CALLBACK (on_chart_save_csv_response), chart); } static GActionEntry win_actions[] = { { "save-image", chart_save_image, NULL, NULL, NULL, {} }, { "save-csv", chart_save_csv, NULL, NULL, NULL, {} } }; static void chart_button_clicked_fullscreen (GtkButton *button, gpointer data) { UNUSED(button); GtkWindow *window = GTK_WINDOW(data); gtk_window_fullscreen(window); } static bool chart_key_pressed_cb (GtkEventControllerKey* self, guint keyval, guint keycode, GdkModifierType state, gpointer user_data) { UNUSED(self); UNUSED(state); GtkWindow *window = GTK_WINDOW(user_data); // If key pressed if ((keyval == 0xff1b) && (keycode == 0x9)) { // Exit fullscreen if (gtk_window_is_fullscreen(window)) { gtk_window_unfullscreen(window); } } return true; } static gboolean gui_chart_save_csv_thread(gpointer user_data) { struct chart_t *chart = user_data; gtk_chart_save_csv(GTK_CHART(chart->widget), chart->filename_csv); g_free(chart->filename_csv); // Signal we are finished saving csv file g_mutex_unlock(&self_global->mutex_save_csv); return G_SOURCE_REMOVE; } // lua: chart_save_csv(handle) static int lua_gui_chart_save_csv(lua_State* L) { int handle = lua_tointeger(L, 1); const char *filename = lua_tostring(L, 2); if (gui_chart[handle].allocated == true) { gui_chart[handle].filename_csv = g_strdup(filename); char *text = g_strdup_printf ("Saving %s\n", filename); text_view_add_buffer(self_global->text_view_script_status, text); g_free(text); g_idle_add(gui_chart_save_csv_thread, &gui_chart[handle]); // Wait for save csv operation finished g_mutex_lock(&self_global->mutex_save_csv); } return 0; } static gboolean gui_chart_save_png_thread(gpointer user_data) { struct chart_t *chart = user_data; gtk_chart_save_png(GTK_CHART(chart->widget), chart->filename_png); g_free(chart->filename_png); // Signal we are finished saving png file g_mutex_unlock(&self_global->mutex_save_png); return G_SOURCE_REMOVE; } // lua: chart_save_png(handle) static int lua_gui_chart_save_png(lua_State* L) { int handle = lua_tointeger(L, 1); const char *filename = lua_tostring(L, 2); if (gui_chart[handle].allocated == true) { gui_chart[handle].filename_png = g_strdup(filename); char *text = g_strdup_printf ("Saving %s\n", filename); text_view_add_buffer(self_global->text_view_script_status, text); g_free(text); g_idle_add(gui_chart_save_png_thread, &gui_chart[handle]); // Wait for save png operation finished g_mutex_lock(&self_global->mutex_save_png); } return 0; } static gboolean gui_chart_close_thread(gpointer user_data) { GtkWindow *window = user_data; gtk_window_close(window); return G_SOURCE_REMOVE; } // lua: chart_close(handle) static int lua_gui_chart_close(lua_State* L) { int handle = lua_tointeger(L, 1); if (gui_chart[handle].allocated == true) { g_idle_add(gui_chart_close_thread, gui_chart[handle].window); } return 0; } static gboolean gui_chart_plot_thread(gpointer user_data) { struct chart_t *chart = user_data; gtk_chart_plot_point(GTK_CHART(chart->widget), chart->x, chart->y); return G_SOURCE_REMOVE; } // lua: chart_plot(handle, x_value, y_value) static int lua_gui_chart_plot(lua_State* L) { int handle = lua_tointeger(L, 1); double x = lua_tonumber(L, 2); double y = lua_tonumber(L, 3); gui_chart[handle].x = x; gui_chart[handle].y = y; if (gui_chart[handle].allocated == true) { g_idle_add(gui_chart_plot_thread, &gui_chart[handle]); } return 0; } static gboolean gui_chart_set_value_thread(gpointer user_data) { struct chart_t *chart = user_data; gtk_chart_set_value(GTK_CHART(chart->widget), chart->value); return G_SOURCE_REMOVE; } // lua: chart_set_value(handle, value) static int lua_gui_chart_set_value(lua_State* L) { int handle = lua_tointeger(L, 1); double value = lua_tonumber(L, 2); gui_chart[handle].value = value; if (gui_chart[handle].allocated == true) { g_idle_add(gui_chart_set_value_thread, &gui_chart[handle]); } return 0; } static gboolean gui_chart_new_thread(gpointer data) { struct chart_t *chart = data; GAction *action; GActionGroup *actions; /* Construct a GtkBuilder instance from UI description */ GtkBuilder *builder = gtk_builder_new_from_resource("/io/github/lxi-tools/lxi-gui/lxi_gui-chart.ui"); // Get UI objects GtkWindow *window = GTK_WINDOW(gtk_builder_get_object (builder, "window")); GObject *button_fullscreen = gtk_builder_get_object (builder, "button_fullscreen"); GtkWidget *widget = GTK_WIDGET(gtk_builder_get_object (builder, "chart")); // Map window actions actions = G_ACTION_GROUP (g_simple_action_group_new ()); g_action_map_add_action_entries (G_ACTION_MAP(actions), win_actions, G_N_ELEMENTS(win_actions), chart); gtk_widget_insert_action_group (GTK_WIDGET (window), "chart", G_ACTION_GROUP (actions)); // Disable "Save CSV" if chart features no CSV data action = g_action_map_lookup_action (G_ACTION_MAP (actions), "save-csv"); if (chart->no_csv) { g_simple_action_set_enabled (G_SIMPLE_ACTION (action), false); } // Prepare window chart->window = window; gtk_window_set_decorated(window, true); gtk_window_set_modal(window, false); gtk_window_set_transient_for(window, GTK_WINDOW(self_global)); gtk_window_set_resizable(window, true); switch (chart->type) { case GTK_CHART_TYPE_LINE: gtk_window_set_title(window, "Line Chart"); gtk_window_set_default_size(window, chart->width, chart->width/2); break; case GTK_CHART_TYPE_SCATTER: gtk_window_set_title(window, "Scatter Chart"); gtk_window_set_default_size(window, chart->width, chart->width/2); break; case GTK_CHART_TYPE_NUMBER: gtk_window_set_title(window, "Number Chart"); gtk_window_set_default_size(window, chart->width, chart->width/2); break; case GTK_CHART_TYPE_GAUGE_LINEAR: gtk_window_set_title(window, "Linear Gauge"); gtk_window_set_default_size(window, chart->width, chart->width*2); break; case GTK_CHART_TYPE_GAUGE_ANGULAR: gtk_window_set_title(window, "Angular Gauge"); gtk_window_set_default_size(window, chart->width, chart->width); break; default: // Do nothing break; } // Prepare chart widget chart->widget = widget; gtk_chart_set_type(GTK_CHART(widget), chart->type); gtk_chart_set_title(GTK_CHART(widget), chart->title); g_free(chart->title); gtk_chart_set_width(GTK_CHART(widget), chart->width); switch (chart->type) { case GTK_CHART_TYPE_LINE: case GTK_CHART_TYPE_SCATTER: gtk_chart_set_x_label(GTK_CHART(widget), chart->x_label); g_free(chart->x_label); gtk_chart_set_y_label(GTK_CHART(widget), chart->y_label); g_free(chart->y_label); gtk_chart_set_x_max(GTK_CHART(widget), chart->x_max); gtk_chart_set_y_max(GTK_CHART(widget), chart->y_max); break; case GTK_CHART_TYPE_NUMBER: gtk_chart_set_label(GTK_CHART(widget), chart->label); g_free(chart->label); break; case GTK_CHART_TYPE_GAUGE_LINEAR: case GTK_CHART_TYPE_GAUGE_ANGULAR: gtk_chart_set_label(GTK_CHART(widget), chart->label); g_free(chart->label); gtk_chart_set_value_min(GTK_CHART(widget), chart->value_min); gtk_chart_set_value_max(GTK_CHART(widget), chart->value_max); break; default: // Do nothing break; } // Install event controller to listen for key presses GtkEventController *controller = gtk_event_controller_key_new(); gtk_widget_add_controller(GTK_WIDGET(window), controller); // Associate window with application for signals etc. to propagate GtkApplication *app = gtk_window_get_application(GTK_WINDOW(self_global)); gtk_application_add_window(app, window); // Connect signals g_signal_connect (button_fullscreen, "clicked", G_CALLBACK (chart_button_clicked_fullscreen), window); g_signal_connect (controller, "key-pressed", G_CALLBACK (chart_key_pressed_cb), window); g_signal_connect (widget, "destroy", G_CALLBACK (chart_destroyed_cb), NULL); // Show window gtk_window_present(window); // Cleanup g_object_unref(builder); // Signal we are finished creating chart g_mutex_unlock(&self_global->mutex_gui_chart); return G_SOURCE_REMOVE; } // lua: handle = chart_new(...) static int lua_gui_chart_new(lua_State* L) { int handle; // Find free chart handle for (handle=0; handletype = GTK_CHART_TYPE_LINE; } else if (strcmp(type, "scatter") == 0) { chart->type = GTK_CHART_TYPE_SCATTER; } else if (strcmp(type, "number") == 0) { chart->type = GTK_CHART_TYPE_NUMBER; } else if (strcmp(type, "linear-gauge") == 0) { chart->type = GTK_CHART_TYPE_GAUGE_LINEAR; } else if (strcmp(type, "angular-gauge") == 0) { chart->type = GTK_CHART_TYPE_GAUGE_ANGULAR; } else { chart->type = GTK_CHART_TYPE_UNKNOWN; } chart->handle = handle; // Parse arguments depending on chart type switch (chart->type) { case GTK_CHART_TYPE_LINE: case GTK_CHART_TYPE_SCATTER: chart->title = g_strdup(lua_tostring(L, 2)); chart->x_label = g_strdup(lua_tostring(L, 3)); chart->y_label = g_strdup(lua_tostring(L, 4)); chart->x_max = lua_tonumber(L, 5); chart->y_max = lua_tonumber(L, 6); chart->width = lua_tointeger(L, 7); chart->autoscale = lua_toboolean(L, 8); chart->no_csv = false; break; case GTK_CHART_TYPE_NUMBER: chart->title = g_strdup(lua_tostring(L, 2)); chart->label = g_strdup(lua_tostring(L, 3)); chart->width = lua_tointeger(L, 4); chart->no_csv = true; break; case GTK_CHART_TYPE_GAUGE_LINEAR: case GTK_CHART_TYPE_GAUGE_ANGULAR: chart->title = g_strdup(lua_tostring(L, 2)); chart->label = g_strdup(lua_tostring(L, 3)); chart->value_min = lua_tonumber(L, 4); chart->value_max = lua_tonumber(L, 5); chart->width = lua_tointeger(L, 6); chart->no_csv = true; break; default: break; } // Create new chart window g_idle_add(gui_chart_new_thread, chart); // Wait for chart ready (sleeps here until unlocked) g_mutex_lock(&self_global->mutex_gui_chart); // Return chart handle lua_pushinteger(L, handle); return 1; } // lua: print(string) // Note: Overrides lua builtin print() static int lua_print(lua_State* L) { int nargs = lua_gettop(L); for (int i=1; i <= nargs; i++) { if (lua_isstring(L, i)) { lua_print_string(lua_tostring(L,i)); } else { /* non-strings */ } } return 0; } // lua: ip = selected_ip() static int lua_gui_ip(lua_State* L) { // Return currently GUI selected IP lua_pushstring(L, self_global->ip); return 1; } // lua: id = selected_id() static int lua_gui_id(lua_State* L) { // Return currently GUI selected ID lua_pushstring(L, self_global->id); return 1; } // lua: version = version() static int lua_gui_version(lua_State* L) { // Return GUI version lua_pushstring(L, PACKAGE_VERSION); return 1; } static const struct luaL_Reg gui_lib [] = { {"chart_new", lua_gui_chart_new}, {"chart_plot", lua_gui_chart_plot}, {"chart_set_value", lua_gui_chart_set_value}, {"chart_close", lua_gui_chart_close}, {"chart_save_csv", lua_gui_chart_save_csv}, {"chart_save_png", lua_gui_chart_save_png}, {"selected_ip", lua_gui_ip}, {"selected_id", lua_gui_id}, {"version", lua_gui_version}, {"print", lua_print}, {NULL, NULL} }; static void lua_line_hook(lua_State *L, lua_Debug *ar) { if (ar->event == LUA_HOOKLINE) { if (self_global->lua_stop_requested == true) { luaL_error(L, "Stopped by user"); } } } extern int lua_register_gui(lua_State *L) { // Register gui functions lua_getglobal(L, "_G"); luaL_setfuncs(L, gui_lib, 0); lua_pop(L, 1); // Install line hook to manage run/stop execution lua_sethook(L, &lua_line_hook, LUA_MASKLINE, 0); return 0; } static void load_log_script(lua_State *L) { gsize size; int error; GResource *resource = lxi_gui_get_resource(); GBytes *script = g_resource_lookup_data (resource, "/io/github/lxi-tools/lxi-gui/log.lua", G_RESOURCE_LOOKUP_FLAGS_NONE, NULL); gconstpointer script_buffer = g_bytes_get_data (script, &size); error = luaL_loadbuffer(L, script_buffer, strlen(script_buffer), "lxi-gui") || lua_pcall(L, 0, 0, 0); if (error) { lua_print_error(self_global, lua_tostring(L, -1)); lua_pop(L, 1); /* pop error message from the stack */ } } static gpointer script_run_worker_function(gpointer data) { LxiGuiWindow *self = data; GtkTextBuffer *buffer_script = gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->source_view_script)); GtkTextIter start, end; gchar *code_buffer; int error; char *chunkname = NULL; char *filename; // Reset lua control state self->lua_stop_requested = false; // Initialize new Lua session lua_State *L = luaL_newstate(); // Open all standard Lua libraries luaL_openlibs(L); // Bind GUI functions lua_register_gui(L); // Bind lxi functions lua_register_lxi(L); // Load data logger script load_log_script(L); // Hardcode locale so script handles number conversion correct etc. setlocale(LC_ALL, "C.UTF-8"); // Get buffer of script text view gtk_text_buffer_get_bounds(buffer_script, &start, &end); code_buffer = gtk_text_buffer_get_text(buffer_script, &start, &end, true); // Use filename as chunk name if working with a file if (self->script_file != NULL) { filename = g_file_get_path(self->script_file); chunkname = g_path_get_basename(filename); g_free(filename); } else { chunkname = strdup("buffer"); } // Let lua load buffer and do error checking before running error = luaL_loadbuffer(L, code_buffer, strlen(code_buffer), chunkname) || lua_pcall(L, 0, 0, 0); if (error) { lua_print_error(self, lua_tostring(L, -1)); lua_pop(L, 1); /* pop error message from the stack */ } // Cleanup g_free(chunkname); lua_close(L); // Restore script run button g_idle_add(gui_update_script_run_worker_function_finished_thread, self); return NULL; } static void toggle_button_clicked_script_run (LxiGuiWindow *self, GtkButton *button) { UNUSED(button); // Only allow to run once until execution is done gtk_widget_set_sensitive(GTK_WIDGET(self->toggle_button_script_run), false); text_view_clear_buffer(self->text_view_script_status); // Start thread which starts interpreting the Lua script self->script_run_worker_thread = g_thread_new("script_worker", script_run_worker_function, (gpointer) self); } static void button_clicked_script_stop (LxiGuiWindow *self, GtkButton *button) { UNUSED(self); UNUSED(button); // Signal lua script engine to stop execution self->lua_stop_requested = true; } static void info_bar_clicked (LxiGuiWindow *self, GtkInfoBar *infobar) { UNUSED(self); UNUSED(infobar); // TODO: Fix and use callback parameters gtk_widget_hide(GTK_WIDGET(self_global->info_bar)); } static void lxi_gui_window_dispose (GObject *object) { LxiGuiWindow *window = (LxiGuiWindow *)object; g_object_unref (window->settings); // Remove list view port as parent to list popover menu gtk_widget_unparent(GTK_WIDGET(window->list_widget_popover_menu)); G_OBJECT_CLASS (lxi_gui_window_parent_class)->dispose (object); } static void lxi_gui_window_action_search_cb (GtkWidget *widget, const char *action_name, GVariant *param) { UNUSED(action_name); UNUSED(param); LxiGuiWindow *self = LXI_GUI_WINDOW (widget); g_assert (LXI_GUI_IS_WINDOW (self)); // Disable shortcut action temporarily gtk_widget_action_set_enabled (GTK_WIDGET (self), "action.search", false); button_clicked_search(self, NULL); } static void lxi_gui_window_action_toggle_flap_cb (GtkWidget *widget, const char *action_name, GVariant *param) { UNUSED(action_name); UNUSED(param); LxiGuiWindow *self = LXI_GUI_WINDOW (widget); g_assert (LXI_GUI_IS_WINDOW (self)); bool flap_state = adw_flap_get_reveal_flap(self->flap); // Toggle flap adw_flap_set_reveal_flap(self->flap, !flap_state); } static void lxi_gui_window_class_init (LxiGuiWindowClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); object_class->dispose = lxi_gui_window_dispose; // Bind widgets gtk_widget_class_set_template_from_resource (widget_class, "/io/github/lxi-tools/lxi-gui/lxi_gui-window.ui"); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, list_instruments); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, list_viewport); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, entry_scpi); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, text_view_scpi); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, toggle_button_scpi_send); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, picture_screenshot); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, toggle_button_screenshot_grab); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, button_screenshot_save); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, progress_bar_benchmark); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, toggle_button_benchmark_start); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, spin_button_benchmark_requests); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, label_benchmark_result); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, image_benchmark); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, toggle_button_search); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, source_view_script); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, text_view_script_status); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, info_bar); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, label_info_bar); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, viewport_screenshot); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, toggle_button_script_run); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, flap); gtk_widget_class_bind_template_child (widget_class, LxiGuiWindow, status_page_instruments); // Bind signal callbacks gtk_widget_class_bind_template_callback (widget_class, button_clicked_search); gtk_widget_class_bind_template_callback (widget_class, button_clicked_add_instrument); gtk_widget_class_bind_template_callback (widget_class, entry_scpi_enter_pressed); gtk_widget_class_bind_template_callback (widget_class, button_clicked_scpi); gtk_widget_class_bind_template_callback (widget_class, button_clicked_scpi_clear); gtk_widget_class_bind_template_callback (widget_class, button_clicked_scpi_send); gtk_widget_class_bind_template_callback (widget_class, button_clicked_screenshot_grab); gtk_widget_class_bind_template_callback (widget_class, button_clicked_screenshot_save); gtk_widget_class_bind_template_callback (widget_class, button_clicked_benchmark_start); gtk_widget_class_bind_template_callback (widget_class, button_clicked_script_new); gtk_widget_class_bind_template_callback (widget_class, button_clicked_script_open); gtk_widget_class_bind_template_callback (widget_class, button_clicked_script_save); gtk_widget_class_bind_template_callback (widget_class, button_clicked_script_save_as); gtk_widget_class_bind_template_callback (widget_class, toggle_button_clicked_script_run); gtk_widget_class_bind_template_callback (widget_class, button_clicked_script_stop); gtk_widget_class_bind_template_callback (widget_class, info_bar_clicked); /* These are the actions that we are using in the menu */ gtk_widget_class_install_action (widget_class, "action.copy_ip", NULL, action_cb); gtk_widget_class_install_action (widget_class, "action.copy_id", NULL, action_cb); gtk_widget_class_install_action (widget_class, "action.open_browser", NULL, action_cb); gtk_widget_class_install_action (widget_class, "action.search", NULL, lxi_gui_window_action_search_cb); gtk_widget_class_install_action (widget_class, "action.toggle_flap", NULL, lxi_gui_window_action_toggle_flap_cb); gtk_widget_class_install_action (widget_class, "scpi_clear_all", NULL, scpi_action_cb); gtk_widget_class_install_action (widget_class, "scpi_save_as", NULL, scpi_action_cb); /* Create shortcuts */ gtk_widget_class_add_binding_action (widget_class, GDK_KEY_s, GDK_CONTROL_MASK, "action.search", NULL); gtk_widget_class_add_binding_action (widget_class, GDK_KEY_h, GDK_CONTROL_MASK, "action.toggle_flap", NULL); // Initialize LXI library lxi_init(); // Set up search information callbacks info.broadcast = &vxi11_broadcast; info.device = &vxi11_device; info.service = &mdns_service; // For mDNS } static gboolean scroll_screenshot ( GtkEventControllerScroll* controller, gdouble dx, gdouble dy, gpointer data ) { UNUSED(controller); UNUSED(dx); LxiGuiWindow *self = data; int width; width = gtk_widget_get_width(GTK_WIDGET(self->picture_screenshot)); if (self->screenshot_loaded) { gtk_widget_set_size_request(GTK_WIDGET(self->picture_screenshot), width, -1); gtk_widget_set_valign(GTK_WIDGET(self->picture_screenshot), GTK_ALIGN_CENTER); gtk_widget_set_halign(GTK_WIDGET(self->picture_screenshot), GTK_ALIGN_CENTER); self->screenshot_loaded = false; } if (dy > 0) { // Scroll down -> zoom in width = width * 0.9; } else { // Scroll up -> zoom out width = width * 1.1; } gtk_widget_set_size_request(GTK_WIDGET(self->picture_screenshot), width, -1); return TRUE; } static void lxi_gui_window_init (LxiGuiWindow *self) { GtkGesture *list_widget_gesture = gtk_gesture_click_new(); gtk_widget_init_template (GTK_WIDGET (self)); self_global = self; // Required for GtkSourceView to be recognized by builder gtk_source_view_get_type(); // Required for GtkChart to be recognized by builder gtk_chart_get_type(); // Load settings self->settings = g_settings_new ("io.github.lxi-tools.lxi-gui"); // Set up clipboard GdkDisplay* gdk_display = gdk_display_get_default(); self->clipboard = gdk_display_get_clipboard(gdk_display); // Manage dark theme setting bool prefer_dark_theme = g_settings_get_boolean(self->settings, "prefer-dark-theme"); if (prefer_dark_theme) { AdwStyleManager *adw_style_manager = adw_style_manager_get_default(); adw_style_manager_set_color_scheme(adw_style_manager, ADW_COLOR_SCHEME_PREFER_DARK); } // Load and apply CSS GtkCssProvider *provider = gtk_css_provider_new (); gtk_css_provider_load_from_resource (provider, "/io/github/lxi-tools/lxi-gui/lxi_gui.css"); gtk_style_context_add_provider_for_display (gdk_display_get_default (), GTK_STYLE_PROVIDER (provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); // Load instrument popover menu from model GtkBuilder *builder = gtk_builder_new_from_resource ("/io/github/lxi-tools/lxi-gui/lxi_gui-window_list_widget_menu_model.ui"); self->list_widget_menu_model = G_MENU_MODEL (gtk_builder_get_object (builder, "list-widget-menu-model")); // Load popover menu from menu model self->list_widget_popover_menu = gtk_popover_menu_new_from_model(self->list_widget_menu_model); gtk_popover_set_has_arrow(GTK_POPOVER(self->list_widget_popover_menu), false); // Add list view port as parent to list popover menu gtk_widget_set_parent (GTK_WIDGET(self->list_widget_popover_menu), GTK_WIDGET(self->list_viewport)); // Add event controller to handle any click gesture on list item widget gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (list_widget_gesture), 0); g_signal_connect (list_widget_gesture, "pressed", G_CALLBACK (pressed_cb), self); gtk_widget_add_controller (GTK_WIDGET(self->list_viewport), GTK_EVENT_CONTROLLER (list_widget_gesture)); // Add event controller to capture scroll events on the surface of screenshot viewport GtkEventController *event_controller_screenshot; event_controller_screenshot = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL); gtk_widget_add_controller(GTK_WIDGET(self->viewport_screenshot), event_controller_screenshot); g_signal_connect(event_controller_screenshot, "scroll", G_CALLBACK (scroll_screenshot), self); // Set up SCPI command entry gtk_editable_set_enable_undo (GTK_EDITABLE (self->entry_scpi), TRUE); g_object_unref (builder); g_object_unref (provider); self->ip = NULL; self->id = NULL; // Register LXI screenshot plugins screenshot_register_plugins(); // Set greeting image on screenshot page and make it not zoomable gtk_widget_set_size_request(GTK_WIDGET(self->picture_screenshot), 200, 200); gtk_picture_set_resource(self->picture_screenshot, "/io/github/lxi-tools/lxi-gui/images/photo-camera.png"); gtk_widget_set_sensitive(GTK_WIDGET(self->viewport_screenshot), false); // Set greeting image on benchmark page gtk_image_set_pixel_size(self->image_benchmark, 160); gtk_image_set_from_resource(self->image_benchmark, "/io/github/lxi-tools/lxi-gui/images/runner.png"); // Grab focus to SCPI input entry gtk_widget_grab_focus(GTK_WIDGET(self->entry_scpi)); // Disable screenshot "Save" button until image is present gtk_widget_set_sensitive(GTK_WIDGET(self->button_screenshot_save), false); // Initialize script file self->script_file = NULL; // Set language of source buffer to "lua-lxi-gui" GtkSourceBuffer *source_buffer_script = GTK_SOURCE_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(self->source_view_script))); GtkSourceLanguageManager *language_manager = gtk_source_language_manager_get_default(); gtk_source_language_manager_append_search_path(language_manager, "resource:///io/github/lxi-tools/lxi-gui/language-specs"); GtkSourceLanguage *language = gtk_source_language_manager_get_language(language_manager, "lua-lxi-gui"); gtk_source_buffer_set_language(source_buffer_script, language); // Enable line numbers gtk_source_view_set_show_line_numbers(self->source_view_script, true); // Enable syntax highlighting according to language gtk_source_buffer_set_highlight_syntax(source_buffer_script, true); // Highlight current line gtk_source_view_set_highlight_current_line(self->source_view_script, true); // Set script view theme to "classic" GtkSourceStyleSchemeManager* style_manager = gtk_source_style_scheme_manager_new(); GtkSourceStyleScheme *style = gtk_source_style_scheme_manager_get_scheme(style_manager, "classic-dark"); gtk_source_buffer_set_style_scheme(source_buffer_script, style); // Initialize mutexes g_mutex_lock(&self->mutex_gui_chart); g_mutex_lock(&self->mutex_save_png); g_mutex_lock(&self->mutex_save_csv); // Initialize lua script engine initialize_script_engine(self); // Mark instrument list unpopulated self->no_instruments = true; // Add extra menu model for SCPI text view (right click menu) GMenu *menu = g_menu_new (); g_menu_append (menu, "Clear all", "scpi_clear_all"); g_menu_append (menu, "Save as..", "scpi_save_as"); gtk_text_view_set_extra_menu (self->text_view_scpi, G_MENU_MODEL(menu)); #if DEVEL_MODE gtk_widget_add_css_class(GTK_WIDGET(self), "devel"); #endif } lxi-tools-2.1/src/lxi_gui-window.h000066400000000000000000000033701420007711700172150ustar00rootroot00000000000000/* * Copyright (c) 2021-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #pragma once #include G_BEGIN_DECLS #define LXI_GUI_TYPE_WINDOW (lxi_gui_window_get_type()) G_DECLARE_FINAL_TYPE (LxiGuiWindow, lxi_gui_window, LXI_GUI, WINDOW, GtkApplicationWindow) G_END_DECLS lxi-tools-2.1/src/lxi_gui-window.ui000066400000000000000000003166471420007711700174210ustar00rootroot00000000000000
_Preferences app.preferences _Keyboard Shortcuts win.show-help-overlay _About lxi-gui app.about
99900 100 1000 100 1000
lxi-tools-2.1/src/lxi_gui-window_list_widget_menu_model.ui000066400000000000000000000010051420007711700241760ustar00rootroot00000000000000 Copy IP action.copy_ip Copy ID action.copy_id Open in browser action.open_browser lxi-tools-2.1/src/lxi_gui.css000066400000000000000000000026701420007711700162530ustar00rootroot00000000000000/* SCPI page */ .text-view-scpi { background-color: shade(@theme_base_color, .90); border-color: alpha(black, 0.8); border-top-left-radius: 5px; border-top-right-radius: 5px; padding: 5px; } .text-view-scpi text { background-color: rgba(0,0,0,0); } .entry-scpi { background-color: shade(@theme_base_color, .80); border: solid @borders 0px; border-top-width: 1px; border-color: @theme_bg_color; border-top-color: alpha(black, 0.2); border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; outline-width: 0px; } .scpi-label { font-weight: bolder; font-size: 0.7em; color: alpha(@theme_text_color, 0.3); } #button-scpi-clear { background-color: @warning_bg_color; } /* Screenshot page */ /* Benchmark page */ .page-benchmark trough { min-height: 60px; } .page-benchmark progress { min-height: 60px; } .label-benchmark-result { font-weight: bold; font-size: 1.8em; } /* Script page */ .box-script-toolbar { margin-top: 10px; } .source-view-script { border-top-left-radius: 5px; border-top-right-radius: 5px; padding: 10px; } .text-view-script-status { background-color: shade(@theme_base_color, .80); border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; padding: 10px; border-top-width: 1px; border-top-color: alpha(black, 0.2); } .text-view-script-status text { background-color: rgba(0,0,0,0); } lxi-tools-2.1/src/lxi_gui.gresource.xml000066400000000000000000000023161420007711700202550ustar00rootroot00000000000000 lxi_gui-window.ui lxi_gui-chart.ui lxi_gui-prefs.ui lxi_gui-window_list_widget_menu_model.ui gtk/help-overlay.ui language-specs/lua-lxi-gui.lang icons/128x128/status/dialog-information-symbolic.symbolic.png icons/16x16/actions/view-sidebar-start.symbolic.png icons/16x16/actions/view-fullscreen-symbolic.symbolic.png icons/16x16/actions/scpi.symbolic.png icons/16x16/actions/screenshot.symbolic.png icons/16x16/actions/benchmark.symbolic.png icons/16x16/actions/script.symbolic.png icons/lxi-tools-icon-128px.png icons/lxi-instrument.png images/photo-camera.png images/runner.png lxi_gui.css log.lua lxi-tools-2.1/src/lxilua.c000066400000000000000000000207551420007711700155470ustar00rootroot00000000000000/* * Copyright (c) 2018-2022, Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "error.h" #include "misc.h" #include #define RESPONSE_LENGTH_MAX 0x400000 #define SESSIONS_MAX 1024 #define CLOCKS_MAX 1024 struct session_t { int timeout; int protocol; }; static struct session_t session[SESSIONS_MAX]; struct lua_clock_t { double time_start; bool allocated; }; static struct lua_clock_t lua_clock[CLOCKS_MAX]; // lua: device = lxi_connect(address, port, name, timeout, protocol) static int connect(lua_State *L) { int device; const char *address = lua_tostring(L, 1); int port = lua_tointeger(L, 2); const char *name = lua_tostring(L, 3); int timeout = lua_tointeger(L, 4); const char *protocol = lua_tostring(L, 5); // Default connect arguments int arg_port = 5025; const char *arg_name = "inst0"; int arg_timeout = 2000; int arg_protocol = VXI11; // Handle port if (port != 0) arg_port = port; // Handle name if (name != NULL) arg_name = name; // Handle timeout if (timeout != 0) arg_timeout = timeout; // Handle protocol if (strcmp(protocol, "VXI11") == 0) arg_protocol = VXI11; if (strcmp(protocol, "RAW") == 0) arg_protocol = RAW; // Connect to LXI instrument using VXI11 device = lxi_connect(address, arg_port, arg_name, arg_timeout, arg_protocol); if (device == LXI_ERROR) error_printf("Failed to connect\n"); // Save session data for later reuse session[device].timeout = arg_timeout; session[device].protocol = arg_protocol; // Return status lua_pushinteger(L, device); return 1; } // lua: lxi_disconnect(device) static int disconnect(lua_State *L) { int status = 0; int device = lua_tointeger(L, 1); // Disconnect status = lxi_disconnect(device); // Return status lua_pushnumber(L, status); return 1; } // lua: scpi(device, command, timeout) static int scpi(lua_State *L) { char* response = malloc(RESPONSE_LENGTH_MAX); int status = 0, length; int device = lua_tointeger(L, 1); const char *command = lua_tostring(L, 2); int timeout = lua_tointeger(L, 3); char command_buffer[1000]; // Use session timeout if no timeout provided if (timeout == 0) timeout = session[device].timeout; strip_trailing_space((char *) command); if (session[device].protocol == RAW) { // Add newline to command string strcpy(command_buffer, command); command_buffer[strlen(command)] = '\n'; command_buffer[strlen(command)+1] = 0; command = command_buffer; } // Send SCPI command length = lxi_send(device, command, strlen(command), timeout); if (length < 0) { error_printf("Failed to send message\n"); status = length; goto error; } // Only expect response in case we are firing a question command if (question(command)) { length = lxi_receive(device, response, RESPONSE_LENGTH_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); status = length; goto error; } } if (length > 0) { // Strip newline if (response[length-1] == '\n') response[--length] = 0; // Strip carriage return if (response[length-1] == '\r') response[--length] = 0; } lua_pushlstring(L, response, length); free(response); return 1; error: // Return status lua_pushnumber(L, status); free(response); return 1; } // lua: scpi_raw(device, command, timeout) static int scpi_raw(lua_State *L) { char* response = malloc(RESPONSE_LENGTH_MAX); int status = 0, length; int device = lua_tointeger(L, 1); const char *command = lua_tostring(L, 2); int timeout = lua_tointeger(L, 3); // Use session timeout if no timeout provided if (timeout == 0) timeout = session[device].timeout; // Send SCPI command length = lxi_send(device, command, strlen(command), timeout); if (length < 0) { error_printf("Failed to send message\n"); status = length; goto error; } // Only expect response in case we are firing a question command if (question(command)) { length = lxi_receive(device, response, RESPONSE_LENGTH_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); status = length; goto error; } } lua_pushlstring(L, response, length); free(response); return 1; error: // Return status lua_pushnumber(L, status); free(response); return 1; } // lua: sleep(seconds) static int sleep_(lua_State *L) { long seconds = lua_tointeger(L, 1); sleep(seconds); return 0; } // lua: msleep(miliseconds) static int msleep(lua_State *L) { long mseconds = lua_tointeger(L, 1); long useconds = mseconds * 1000; usleep(useconds); return 0; } // lua: handle = clock_new() static int clock_new(lua_State *L) { int handle; // Find free clock for (handle=0; handle #include #include int lua_register_lxi(lua_State *L); lxi-tools-2.1/src/main.c000066400000000000000000000063751420007711700151770ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "options.h" #include "error.h" #include "discover.h" #include "scpi.h" #include "screenshot.h" #include "benchmark.h" #include "run.h" #include int main(int argc, char* argv[]) { int status = EXIT_SUCCESS; double result; // Parse options parse_options(argc, argv); // Initialize LXI library lxi_init(); switch (option.command) { case DISCOVER: if (option.mdns) status = discover(true, option.timeout); else status = discover(false, option.timeout); break; case SCPI: if (option.interactive) status = enter_interactive_mode(option.ip, option.port, option.timeout, option.protocol); else status = scpi(option.ip, option.port, option.timeout, option.protocol, option.scpi_command); break; case SCREENSHOT: screenshot_register_plugins(); if (option.list) { screenshot_list_plugins(); return EXIT_SUCCESS; } status = screenshot(option.ip, option.plugin_name, option.screenshot_filename, option.timeout, true, NULL, NULL, NULL, NULL); break; case BENCHMARK: status = benchmark(option.ip, option.port, option.timeout, option.protocol, option.count, true, &result, NULL); break; case RUN: status = run(option.lua_script_filename, option.timeout); break; } return status; } lxi-tools-2.1/src/meson.build000066400000000000000000000065031420007711700162420ustar00rootroot00000000000000config_h = configuration_data() config_h.set_quoted('PACKAGE_VERSION', meson.project_version()) config_h.set_quoted('GETTEXT_PACKAGE', 'lxi-gui') config_h.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir'))) config_h.set10('DEVEL_MODE', devel_mode) configure_file(output: 'config.h', configuration: config_h) common_sources = [ 'benchmark.c', 'lxilua.c', 'misc.c', 'screenshot.c', 'plugins/screenshot_keysight-dmm.c', 'plugins/screenshot_rigol-dl3000.c', 'plugins/screenshot_siglent-sdg.c', 'plugins/screenshot_keysight-ivx.c', 'plugins/screenshot_rigol-dm3068.c', 'plugins/screenshot_siglent-sdm3000.c', 'plugins/screenshot_rigol-1000z.c', 'plugins/screenshot_rigol-dp800.c', 'plugins/screenshot_siglent-sds.c', 'plugins/screenshot_rigol-2000.c', 'plugins/screenshot_rigol-dsa.c', 'plugins/screenshot_siglent-ssa3000x.c', 'plugins/screenshot_rigol-dg.c', 'plugins/screenshot_rohde-schwarz-hmo-rtb.c', 'plugins/screenshot_rohde-schwarz-ng.c', 'plugins/screenshot_tektronix.c', 'plugins/screenshot_tektronix-3000.c', ] lxi_sources = [ 'benchmark.c', 'discover.c', 'lxilua.c', 'main.c', 'options.c', 'run.c', 'scpi.c', common_sources, ] lxi_deps = [ dependency('readline', required: true), dependency('lua-5.3', required: true), dependency('liblxi', version: '>=1.13', required: true), ] executable('lxi', lxi_sources, dependencies: lxi_deps, install: true, ) subdir('bash-completion') enable_gui = get_option('gui') if enable_gui libglib_dep = dependency('glib-2.0', version: '>= 2.70', required: true, fallback : ['glib', 'libglib_dep'], default_options: ['tests=false']) libgtk_dep = dependency('gtk4', version: '>= 4.5.0', required: true, fallback : ['gtk', 'libgtk_dep'], default_options: ['introspection=disabled', 'demos=false', 'build-examples=false', 'build-tests=false']) libgtksourceview_dep = dependency('gtksourceview-5', version: '>= 5.3.3', required: true, fallback : ['gtksourceview', 'gtksource_dep'], default_options: ['introspection=disabled']) libadwaita_dep = dependency('libadwaita-1', version: '>= 1.0.1', required: true, fallback : ['libadwaita', 'libadwaita_dep'], default_options: ['introspection=disabled', 'examples=false', 'tests=false']) lxi_gui_sources = [ 'lxi_gui-main.c', 'lxi_gui-window.c', 'lxi_gui-application.c', 'lxi_gui-prefs.c', 'gtkchart.c', common_sources, ] lxi_gui_deps = [ lxi_deps, libglib_dep, libgtk_dep, libgtksourceview_dep, libadwaita_dep, ] gnome = import('gnome') lxi_gui_sources += gnome.compile_resources( 'lxi_gui-resources', 'lxi_gui.gresource.xml', c_name: 'lxi_gui', ) executable('lxi-gui', lxi_gui_sources, dependencies: lxi_gui_deps, install: true, ) endif lxi-tools-2.1/src/misc.c000066400000000000000000000046701420007711700152020ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include void hex_print(void *data, int length) { char *bufferp; int i; bufferp = data; (void)bufferp; for (i=0; i= 0) { if ( isspace(line[i]) ) line[i] = '\0'; else break; i--; } } int question(const char *string) { int i; for (i = 0; string[i] != '\0'; i++) { if (string[i] == '?') return true; } return false; } lxi-tools-2.1/src/misc.h000066400000000000000000000033611420007711700152030ustar00rootroot00000000000000/* * Copyright (c) 2021-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef MISC_H #define MISC_H #define UNUSED(expr) do { (void)(expr); } while (0) void hex_print(void *data, int length); void strip_trailing_space(char *line); int question(const char *string); #endif lxi-tools-2.1/src/options.c000066400000000000000000000327741420007711700157500ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include "config.h" #include "options.h" #include "error.h" #include // Default timeouts in seconds #define TIMEOUT 3 #define TIMEOUT_SCREENSHOT 15 #define TIMEOUT_DISCOVER 1 #define TIMEOUT_DISCOVER_MDNS 6 #define PORT_VXI11 111 #define PORT_RAW 5025 struct option_t option = { NO_COMMAND, // Default command TIMEOUT, // Default timeout in seconds "", // Default IP address "", // Default SCPI command false, // Default no hexadecimal print false, // Default no interactive mode "", // Default lua script filename "", // Default screenshot plugin name false, // Default no list "", // Default screenshot filename VXI11, // Default protocol 0, // Default port (set later) false, // Default no mDNS discover 100, // Default number of requests in benchmark }; void print_help(char *argv[]) { printf("Usage: %s [--version] [--help] []\n", argv[0]); printf("\n"); printf(" -v, --version Display version\n"); printf(" -h, --help Display help\n"); printf("\n"); printf("Commands:\n"); printf(" discover [] Search for devices\n"); printf(" scpi [] Send SCPI command\n"); printf(" screenshot [] [] Capture screenshot\n"); printf(" benchmark [] Benchmark\n"); printf(" run Run Lua script\n"); printf("\n"); printf("Discover options:\n"); printf(" -t, --timeout Timeout (default: Normal: %d, mDNS: %d)\n", TIMEOUT_DISCOVER, TIMEOUT_DISCOVER_MDNS); printf(" -m, --mdns Search via mDNS/DNS-SD\n"); printf("\n"); printf("Scpi options:\n"); printf(" -a, --address Device IP address\n"); printf(" -p, --port Use port (default: VXI11: %d, RAW: %d)\n", PORT_VXI11, PORT_RAW); printf(" -t, --timeout Timeout (default: %d)\n", option.timeout); printf(" -x, --hex Print response in hexadecimal\n"); printf(" -i, --interactive Enter interactive mode\n"); printf(" -r, --raw Use raw/TCP\n"); printf("\n"); printf("Screenshot options:\n"); printf(" -a, --address Device IP address\n"); printf(" -t, --timeout Timeout (default: %d)\n", TIMEOUT_SCREENSHOT); printf(" -p, --plugin Use screenshot plugin by name\n"); printf(" -l, --list List available screenshot plugins\n"); printf("\n"); printf("Benchmark options:\n"); printf(" -a, --address Device IP address\n"); printf(" -p, --port Use port (default: VXI11: %d, RAW: %d)\n", PORT_VXI11, PORT_RAW); printf(" -t, --timeout Timeout (default: %d)\n", option.timeout); printf(" -c, --count Number of requests (default: %d)\n", option.count); printf(" -r, --raw Use raw/TCP\n"); printf("\n"); } void print_version(void) { printf("lxi v%s\n", PACKAGE_VERSION); } void parse_options(int argc, char *argv[]) { int c; // Print help if no arguments provided if (argc == 1) { print_help(argv); exit(EXIT_SUCCESS); } // Convert default timeout to milliseconds option.timeout = option.timeout * 1000; // getopt_long stores the option index here int option_index = 0; // Skip ahead past command optind = 2; if (strcmp(argv[1], "discover") == 0) { option.command = DISCOVER; static struct option long_options[] = { {"timeout", required_argument, 0, 't'}, {"mdns", no_argument, 0, 'm'}, {0, 0, 0, 0 } }; static bool no_timeout_provided = true; /* Parse discover options */ c = getopt_long(argc, argv, "t:m", long_options, &option_index); while (c != -1) { switch (c) { case 't': option.timeout = atoi(optarg) * 1000; no_timeout_provided = false; break; case 'm': option.mdns = true; break; case '?': exit(EXIT_FAILURE); } c = getopt_long(argc, argv, "t:m", long_options, &option_index); } // Set discover timeout if none provided if (no_timeout_provided) { if (option.mdns) option.timeout = TIMEOUT_DISCOVER_MDNS * 1000; else option.timeout = TIMEOUT_DISCOVER * 1000; } } else if (strcmp(argv[1], "scpi") == 0) { option.command = SCPI; static struct option long_options[] = { {"address", required_argument, 0, 'a'}, {"port", required_argument, 0, 'p'}, {"timeout", required_argument, 0, 't'}, {"hex", no_argument, 0, 'x'}, {"interactive", no_argument, 0, 'i'}, {"raw", no_argument, 0, 'r'}, {0, 0, 0, 0 } }; do { /* Parse scpi options */ c = getopt_long(argc, argv, "a:p:t:xir", long_options, &option_index); switch (c) { case 'a': strncpy(option.ip, optarg, 499); break; case 'p': option.port = atoi(optarg); break; case 't': option.timeout = atoi(optarg) * 1000; break; case 'x': option.hex = true; break; case 'i': option.interactive = true; break; case 'r': option.protocol = RAW; break; case '?': exit(EXIT_FAILURE); } } while (c != -1); } else if (strcmp(argv[1], "screenshot") == 0) { option.command = SCREENSHOT; // Set default timeout for screenshots option.timeout = TIMEOUT_SCREENSHOT * 1000; static struct option long_options[] = { {"address", required_argument, 0, 'a'}, {"timeout", required_argument, 0, 't'}, {"plugin", required_argument, 0, 'p'}, {"list", no_argument, 0, 'l'}, {0, 0, 0, 0 } }; do { /* Parse screenshot options */ c = getopt_long(argc, argv, "a:t:p:l", long_options, &option_index); switch (c) { case 'a': strncpy(option.ip, optarg, 499); break; case 't': option.timeout = atoi(optarg) * 1000; break; case 'p': option.plugin_name = optarg; break; case 'l': option.list = true; break; case '?': exit(EXIT_FAILURE); } } while (c != -1); } else if (strcmp(argv[1], "benchmark") == 0) { option.command = BENCHMARK; static struct option long_options[] = { {"address", required_argument, 0, 'a'}, {"port", required_argument, 0, 'p'}, {"timeout", required_argument, 0, 't'}, {"count", required_argument, 0, 'c'}, {"raw", no_argument, 0, 'r'}, {0, 0, 0, 0 } }; do { /* Parse benchmark options */ c = getopt_long(argc, argv, "a:p:t:rc:", long_options, &option_index); switch (c) { case 'a': strncpy(option.ip, optarg, 499); break; case 'p': option.port = atoi(optarg); break; case 't': option.timeout = atoi(optarg) * 1000; break; case 'c': option.count = atoi(optarg); break; case 'r': option.protocol = RAW; break; case '?': exit(EXIT_FAILURE); } } while (c != -1); } else if (strcmp(argv[1], "run") == 0) { option.command = RUN; static struct option long_options[] = { {"timeout", required_argument, 0, 't'}, {0, 0, 0, 0 } }; do { /* Parse run options */ c = getopt_long(argc, argv, "t:", long_options, &option_index); switch (c) { case 't': option.timeout = atoi(optarg) * 1000; break; case '?': exit(EXIT_FAILURE); } } while (c != -1); } else { // No command provided so we restore index optind = 1; static struct option long_options[] = { {"version", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0 } }; do { /* Parse options */ c = getopt_long(argc, argv, "vh", long_options, &option_index); switch (c) { case 'v': print_version(); exit(EXIT_SUCCESS); case 'h': print_help(argv); exit(EXIT_SUCCESS); case '?': exit(EXIT_FAILURE); } } while (c != -1); } if ((option.command == NO_COMMAND) && (optind != argc)) { error_printf("Unknown command\n"); exit(EXIT_FAILURE); } if (option.command == SCPI) { if (optind != argc) strncpy(option.scpi_command, argv[optind++], 499); if (strlen(option.ip) == 0) { error_printf("No IP address specified\n"); exit(EXIT_FAILURE); } if ((strlen(option.scpi_command) == 0) && (option.interactive == false)) { error_printf("No SCPI command specified\n"); exit(EXIT_FAILURE); } } if ((option.command == SCREENSHOT) && (optind != argc)) { strncpy(option.screenshot_filename, argv[optind++], 999); } if ((option.command == RUN) && (optind != argc)) { strncpy(option.lua_script_filename, argv[optind++], 999); } /* Print any unknown arguments */ if (optind < argc) { error_printf("Unknown arguments: "); while (optind < argc) fprintf(stderr, "%s ", argv[optind++]); fprintf(stderr, "\n"); exit(EXIT_FAILURE); } /* Configure port */ if (option.port == 0) { // See http://www.lxistandard.org/About/LXI-Protocols.aspx if (option.protocol == RAW) option.port = PORT_RAW; // Default TCP/RAW port else option.port = PORT_VXI11; // Default TCP/VXI11 port } } lxi-tools-2.1/src/options.h000066400000000000000000000042161420007711700157430ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef OPTIONS_H #define OPTIONS_H #include #include #include /* Options */ struct option_t { int command; int timeout; char ip[500]; char scpi_command[500]; bool hex; bool interactive; char lua_script_filename[1000]; char *plugin_name; bool list; char screenshot_filename[1000]; lxi_protocol_t protocol; int port; bool mdns; int count; }; enum command_t { DISCOVER, SCPI, SCREENSHOT, BENCHMARK, RUN, NO_COMMAND }; extern struct option_t option; void parse_options(int argc, char *argv[]); #endif lxi-tools-2.1/src/plugins/000077500000000000000000000000001420007711700155555ustar00rootroot00000000000000lxi-tools-2.1/src/plugins/screenshot_keysight-dmm.c000066400000000000000000000064761420007711700225750ustar00rootroot00000000000000/* * Copyright (c) 2017-2018 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int keysight_dmm_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI commands to grab image command = "HCOP:SDUM:DATA:FORM BMP"; lxi_send(device, command, strlen(command), timeout); command = "HCOP:SDUM:DATA?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip IEEE 488.2 Data Block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Strip ending newline length--; // Dump remaining image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin keysight_dmm = { .name = "keysight-dmm", .description = "Keysight Truevolt Digital Multimeter", .regex = "Agilent Keysight Technologies 34...A", .screenshot = keysight_dmm_screenshot }; lxi-tools-2.1/src/plugins/screenshot_keysight-ivx.c000066400000000000000000000065461420007711700226240ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int keysight_ivx_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI commands to grab image command = ":hardcopy:inksaver off"; lxi_send(device, command, strlen(command), timeout); command = ":display:data? BMP, color"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip IEEE 488.2 Data Block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Strip ending newline length--; // Dump remaining image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin keysight_ivx = { .name = "keysight-ivx", .description = "Keysight InfiniiVision 2000X/3000X series oscilloscope", .regex = "AGILENT KEYSIGHT TECHNOLOGIES [MD]SO-X.[23]...", .screenshot = keysight_ivx_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-1000z.c000066400000000000000000000063051420007711700220460ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_1000z_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab PNG image command = "display:data? on,0,png"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining PNG image data to file screenshot_file_dump(image, length, "png"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_1000z = { .name = "rigol-1000z", .description = "Rigol DS/MSO 1000Z series oscilloscope", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DS1...Z MSO1...Z", .screenshot = rigol_1000z_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-2000.c000066400000000000000000000063411420007711700216550ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_2000_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = ":display:data?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Strip ending newline length--; // Dump remaining BMP image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_2000 = { .name = "rigol-2000", .description = "Rigol DS/MSO 2000 series oscilloscope", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DS2... MSO2...", .screenshot = rigol_2000_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-dg.c000066400000000000000000000064431420007711700216710ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_dg_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = ":HCOPy:SDUMp:DATA:FORMat BMP"; lxi_send(device, command, strlen(command), timeout); command = ":HCOPy:SDUMp:DATA?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining BMP image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_dg = { .name = "rigol-dg", .description = "Rigol DG 4000 & 1000Z series function generator", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DG4... DG1...Z", .screenshot = rigol_dg_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-dl3000.c000066400000000000000000000063271420007711700222020ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund, 2020 Heiko Jakob * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_dl3000_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = ":PROJ:WND:DATA?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining BMP image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_dl3000 = { .name = "rigol-dl3000", .description = "Rigol DL3000 Series Programmable DC Electronic Load", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DL30..", .screenshot = rigol_dl3000_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-dm3068.c000066400000000000000000000062521420007711700222160ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_dm3068_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = ":DISP:DATA?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining BMP image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_dm3068 = { .name = "rigol-dm3068", .description = "Rigol DM 3068 digital multimeter", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DM3068", .screenshot = rigol_dm3068_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-dp800.c000066400000000000000000000062541420007711700221320ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_dp800_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = ":SYSTem:PRINT? BMP"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining BMP image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_dp800 = { .name = "rigol-dp800", .description = "Rigol DP 800 series power supply", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DP8..", .screenshot = rigol_dp800_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rigol-dsa.c000066400000000000000000000062571420007711700220510ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int rigol_dsa_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command, *image; int device, length, n; char c; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = ":PRIV:SNAP? BMP"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip TMC block header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining BMP image data to file screenshot_file_dump(image, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rigol_dsa = { .name = "rigol-dsa", .description = "Rigol DSA 700/800 series spectrum analyzer", .regex = "RIGOL TECHNOLOGIES Rigol Technologies DSA[78]..", .screenshot = rigol_dsa_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rohde-schwarz-hmo-rtb.c000066400000000000000000000066451420007711700243170ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x100000 * 20 // 20 MB int rs_hmo_rtb_screenshot(char *address, char *id, int timeout) { char *command, *image; int device, length, n; char c; UNUSED(id); // Prepare response buffer char* response = malloc(IMAGE_SIZE_MAX); if (response == NULL) { error_printf("Failed to allocate response buffer\n"); return 1; } // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI commands to grab image command = "HCOPy:FORMat PNG"; lxi_send(device, command, strlen(command), timeout); command = "HCOPy:DATA?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining image data to file screenshot_file_dump(image, length, "png"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rs_hmo_rtb = { .name = "rs-hmo-rtb", .description = "Rohde & Schwarz HMO 1000/2000/3000 / RTB 2000 series oscilloscope", .regex = "Rohde&Schwarz HAMEG HMO[123]... RTB2...", .screenshot = rs_hmo_rtb_screenshot }; lxi-tools-2.1/src/plugins/screenshot_rohde-schwarz-ng.c000066400000000000000000000064671420007711700233550ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x100000 * 20 // 20 MB int rs_ng_screenshot(char *address, char *id, int timeout) { char *command, *image; int device, length, n; char c; UNUSED(id); // Prepare response buffer char* response = malloc(IMAGE_SIZE_MAX); if (response == NULL) { error_printf("Failed to allocate response buffer\n"); return 1; } // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI commands to grab image (device only supports PNG) command = "HCOPy:DATA?"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Strip header c = response[1]; n = atoi(&c); image = &response[0]; image += n+2; length -= n+2; // Dump remaining image data to file screenshot_file_dump(image, length, "png"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin rs_ng = { .name = "rs-ng", .description = "Rohde & Schwarz NGL200/NGM200 series power supplies", .regex = "Rohde&Schwarz NGM2.. NGL2..", .screenshot = rs_ng_screenshot }; lxi-tools-2.1/src/plugins/screenshot_siglent-sdg.c000066400000000000000000000060451420007711700224030ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int siglent_sdg_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command; int device, length; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = "scdp"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Dump received BMP image data to file screenshot_file_dump(response, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin siglent_sdg = { .name = "siglent-sdg", .description = "Siglent SDG 1000X/2000X/6000X series waveform generator", .regex = "SIGLENT TECHNOLOGIES Siglent Technologies SDG[126]...", .screenshot = siglent_sdg_screenshot }; lxi-tools-2.1/src/plugins/screenshot_siglent-sdm3000.c000066400000000000000000000060521420007711700227120ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int siglent_sdm3000_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command; int device, length; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = "scdp"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Dump received BMP image data to file screenshot_file_dump(response, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin siglent_sdm3000 = { .name = "siglent-sdm3000", .description = "Siglent SDM 3000/3000X series digital multimeter", .regex = "SIGLENT TECHNOLOGIES Siglent Technologies SDM3...", .screenshot = siglent_sdm3000_screenshot }; lxi-tools-2.1/src/plugins/screenshot_siglent-sds.c000066400000000000000000000060341420007711700224150ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int siglent_sds_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command; int device, length; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = "scdp"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Dump received BMP image data to file screenshot_file_dump(response, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin siglent_sds = { .name = "siglent-sds", .description = "Siglent SDS 1000X/2000X series oscilloscope", .regex = "SIGLENT TECHNOLOGIES Siglent Technologies SDS[12]...", .screenshot = siglent_sds_screenshot }; lxi-tools-2.1/src/plugins/screenshot_siglent-ssa3000x.c000066400000000000000000000060511420007711700231040ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int siglent_ssa3000x_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command; int device, length; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI command to grab BMP image command = "scdp"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Dump received BMP image data to file screenshot_file_dump(response, length, "bmp"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin siglent_ssa3000x = { .name = "siglent-ssa3000x", .description = "Siglent SSA 3000X series spectrum analyzer", .regex = "SIGLENT TECHNOLOGIES Siglent Technologies SSA3...X", .screenshot = siglent_ssa3000x_screenshot }; lxi-tools-2.1/src/plugins/screenshot_tektronix-3000.c000066400000000000000000000126311420007711700225700ustar00rootroot00000000000000/* * Copyright (c) 2019 Sam harry Tzavaras * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 308278 // 302KB #define PARAM_STR_SIZE 10 typedef struct{ char Header[PARAM_STR_SIZE]; char Format[PARAM_STR_SIZE]; char Compression[PARAM_STR_SIZE]; char Layout[PARAM_STR_SIZE]; char Port[PARAM_STR_SIZE]; }restore; void length_check(int length); int tektronix_screenshot_3000(char *address, char *id, int timeout) { restore param; char* response = malloc(IMAGE_SIZE_MAX); int length, device; char *command, command_str[100]; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Check the device command = "*IDN?"; lxi_send(device, command, strlen(command), timeout); length_check(lxi_receive(device, response, IMAGE_SIZE_MAX, timeout)); if (strstr(response,"TDS 3") != NULL) { // Send SCPI commands to grab current image parameters and config for grab image command = "hardcopy:Format?"; lxi_send(device, command, strlen(command), timeout); length_check(lxi_receive(device, param.Format, IMAGE_SIZE_MAX, timeout)); command = "hardcopy:Format bmpc"; lxi_send(device, command, strlen(command), timeout); command = "hardcopy:compression?"; lxi_send(device, command, strlen(command), timeout); length_check(lxi_receive(device, param.Compression, IMAGE_SIZE_MAX, timeout)); command = "hardcopy:compression off"; lxi_send(device, command, strlen(command), timeout); command = "hardcopy:layout?"; lxi_send(device, command, strlen(command), timeout); length_check(lxi_receive(device, param.Layout, IMAGE_SIZE_MAX, timeout)); command = "hardcopy:layout Portrait"; lxi_send(device, command, strlen(command), timeout); command = "hardcopy:Port?"; lxi_send(device, command, strlen(command), timeout); length_check(lxi_receive(device, param.Port, IMAGE_SIZE_MAX, timeout)); command = "hardcopy:Port gpib"; lxi_send(device, command, strlen(command), timeout); // Send SCPI commands to grab image command = "hardcopy start"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); length_check(length); // Dump PNG image data to file screenshot_file_dump(response, length, "bmp"); // Restore old configuration sprintf(command_str,"hardcopy:Format %s", param.Format); lxi_send(device, command_str, strlen(command_str), timeout); sprintf(command_str,"hardcopy:compression %s", param.Compression); lxi_send(device, command_str, strlen(command_str), timeout); sprintf(command_str,"hardcopy:layout %s", param.Layout); lxi_send(device, command_str, strlen(command_str), timeout); sprintf(command_str,"hardcopy:Port %s", param.Port); lxi_send(device, command_str, strlen(command_str), timeout); } else printf("Device doesn't match\n"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: // Free allocated memory for screenshot free(response); return 1; } void length_check(int length) { if (length <= 0) error_printf("Failed to receive message\n"); } // Screenshot plugin configuration struct screenshot_plugin tektronix_3000 = { .name = "tektronix-3000", .description = "Tektronix TDS 3000 series e*Scope oscilloscope (experimental)", .regex = "TEKTRONIX TDS3... ", .screenshot = tektronix_screenshot_3000 }; lxi-tools-2.1/src/plugins/screenshot_tektronix.c000066400000000000000000000063301420007711700222070ustar00rootroot00000000000000/* * Copyright (c) 2017 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include "error.h" #include "screenshot.h" #define IMAGE_SIZE_MAX 0x400000 // 4 MB int tektronix_screenshot(char *address, char *id, int timeout) { char* response = malloc(IMAGE_SIZE_MAX); char *command; int device, length; UNUSED(id); // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Send SCPI commands to grab PNG image command = "save:image:fileformat PNG"; lxi_send(device, command, strlen(command), timeout); command = "hardcopy:inksaver off"; lxi_send(device, command, strlen(command), timeout); command = "hardcopy start"; lxi_send(device, command, strlen(command), timeout); length = lxi_receive(device, response, IMAGE_SIZE_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Dump PNG image data to file screenshot_file_dump(response, length, "png"); // Free allocated memory for screenshot free(response); // Disconnect lxi_disconnect(device); return 0; error_connect: error_receive: // Free allocated memory for screenshot free(response); return 1; } // Screenshot plugin configuration struct screenshot_plugin tektronix_2000 = { .name = "tektronix-2000", .description = "Tektronix DPO/MSO 2000 series oscilloscope (experimental)", .regex = "TEKTRONIX DPO2... MSO2...", .screenshot = tektronix_screenshot }; lxi-tools-2.1/src/run.c000066400000000000000000000043761420007711700150560ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "options.h" #include "error.h" #include "lxilua.h" #include "misc.h" #include #include #include #include int run(char *filename, int timeout) { lua_State *L; UNUSED(timeout); if (strlen(filename) == 0) { error_printf("Missing filename\n"); return 1; } L = luaL_newstate(); luaL_openlibs(L); // Add lxi functions lua_register_lxi(L); if (luaL_dofile(L, filename)) { error_printf("%s\n", lua_tostring(L, -1)); lua_close(L); return 0; } lua_close(L); return 0; } lxi-tools-2.1/src/run.h000066400000000000000000000035431420007711700150560ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef RUN_H #define RUN_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include "options.h" #include "error.h" #include int run(char *filename, int timeout); #ifdef __cplusplus } #endif #endif lxi-tools-2.1/src/scpi.c000066400000000000000000000124271420007711700152040ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include "options.h" #include "error.h" #include "misc.h" #include #define RESPONSE_LENGTH_MAX 0x500000 #define ID_LENGTH_MAX 65536 int scpi(char *ip, int port, int timeout, lxi_protocol_t protocol, char *command) { char* response = malloc(RESPONSE_LENGTH_MAX); char command_buffer[1000]; int device, length;; strip_trailing_space(command); if (protocol == RAW) { // Add newline to command string strcpy(command_buffer, command); command_buffer[strlen(command)] = '\n'; command_buffer[strlen(command)+1] = 0; command = command_buffer; } // Connect device = lxi_connect(ip, port, NULL, timeout, protocol); if (device != LXI_OK) { error_printf("Unable to connect to LXI device\n"); goto error_connect; } // Send SCPI command length = lxi_send(device, command, strlen(command), timeout); if (length < 0) { error_printf("Failed to send message\n"); goto error_send; } // Only expect response in case we are firing a question command if (question(command)) { length = lxi_receive(device, response, RESPONSE_LENGTH_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Print response if (option.hex) hex_print(response, length); else { int i; for (i=0; i "); if (input == NULL) break; add_history(input); strip_trailing_space(input); // Skip empty lines if (strlen(input) == 0) continue; // Send entered input as SCPI command length = lxi_send(device, input, strlen(input), timeout); if (length < 0) error_printf("Failed to send message\n"); // Only expect response in case we are firing a question command if (question(input)) { length = lxi_receive(device, response, RESPONSE_LENGTH_MAX, timeout); if (length < 0) { error_printf("Failed to receive message\n"); } else { // Make sure we terminate response string response[length] = 0; // Print response printf("%s", response); } } } printf("\n"); // Disconnect lxi_disconnect(device); free(response); return 0; error_connect: free(response); return 1; } lxi-tools-2.1/src/scpi.h000066400000000000000000000041401420007711700152020ustar00rootroot00000000000000/* * Copyright (c) 2016-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef SCPI_H #define SCPI_H #ifdef __cplusplus extern "C" { #endif #include #include #include #include #include #include #include #include #include #include "options.h" #include "error.h" #include int scpi(char *ip, int port, int timeout, lxi_protocol_t protocol, char *command); int enter_interactive_mode(char *ip, int port, int timeout, lxi_protocol_t protocol); void strip_trailing_space(char *line); #ifdef __cplusplus } #endif #endif lxi-tools-2.1/src/screenshot.c000066400000000000000000000265441420007711700164300ustar00rootroot00000000000000/* * Copyright (c) 2017-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include "screenshot.h" #include "error.h" #include #define PLUGIN_LIST_SIZE_MAX 50 #define ID_LENGTH_MAX 65536 extern struct screenshot_plugin keysight_dmm; extern struct screenshot_plugin keysight_ivx; extern struct screenshot_plugin rigol_1000z; extern struct screenshot_plugin rigol_2000; extern struct screenshot_plugin rigol_dg; extern struct screenshot_plugin rigol_dl3000; extern struct screenshot_plugin rigol_dm3068; extern struct screenshot_plugin rigol_dp800; extern struct screenshot_plugin rigol_dsa; extern struct screenshot_plugin rs_hmo_rtb; extern struct screenshot_plugin rs_ng; extern struct screenshot_plugin siglent_sdm3000; extern struct screenshot_plugin siglent_sdg; extern struct screenshot_plugin siglent_sds; extern struct screenshot_plugin siglent_ssa3000x; extern struct screenshot_plugin tektronix_2000; extern struct screenshot_plugin tektronix_3000; static struct screenshot_plugin *plugin_list[PLUGIN_LIST_SIZE_MAX] = { }; static char *screenshot_filename = NULL; static char *screenshot_address = NULL; static bool screenshot_no_gui; static void *screenshot_image_buffer; static int *screenshot_image_size; static char *screenshot_image_format; static char *screenshot_image_filename; static int get_device_id(char *address, char *id, int timeout) { int device, bytes_sent, bytes_received; char *command; // Connect to LXI instrument device = lxi_connect(address, 0, NULL, timeout, VXI11); if (device == LXI_ERROR) { error_printf("Failed to connect\n"); goto error_connect; } // Get instrument ID command = "*IDN?"; bytes_sent = lxi_send(device, command, strlen(command), timeout); if (bytes_sent < 0) goto error_send; bytes_received = lxi_receive(device, id, ID_LENGTH_MAX, timeout); if (bytes_received < 0) { error_printf("Failed to receive message\n"); goto error_receive; } // Disconnect lxi_disconnect(device); // Remove trailing newline if (id[bytes_received-1] == '\n') id[bytes_received-1] = 0; return 0; error_receive: error_send: lxi_disconnect(device); error_connect: return 1; } static bool regex_match(const char *string, const char *pattern) { regex_t regex; int status; if (regcomp(®ex, pattern, REG_EXTENDED | REG_NOSUB) != 0) return false; // No match status = regexec(®ex, string, (size_t) 0, NULL, 0); regfree(®ex); if (status != 0) return false; // No match return true; // Match } static char *date_time(void) { static char date_time_string[50]; time_t t = time(NULL); struct tm tm = *localtime(&t); sprintf(date_time_string, "%d-%02d-%02d_%02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); return date_time_string; } void screenshot_file_dump(void *data, int length, char *format) { char automatic_filename[1000]; char *filename; char *image_data = data; int i = 0; FILE *fd; // Resolve screenshot output filename if (strlen(screenshot_filename) == 0) { // Automatically resolve screenshot filename if no filename is provided sprintf(automatic_filename, "screenshot_%s_%s.%s", screenshot_address, date_time(), format); filename = automatic_filename; } else { // Write image data to specified filename filename = screenshot_filename; } if (screenshot_no_gui) { if (strcmp(screenshot_filename, "-") == 0) { // Write image data to stdout in case filename is '-' for (i=0; i= PLUGIN_LIST_SIZE_MAX) { error_printf("Screenshot plugin list full\n"); exit(EXIT_FAILURE); } // Add plugin plugin_list[i] = plugin; } void screenshot_list_plugins(void) { int length, length_max = 0; int i = 0, j = 0; // Find length of longest plugin name while ((i < PLUGIN_LIST_SIZE_MAX) && (plugin_list[i] != NULL)) { length = strlen(plugin_list[i]->name); if (length_max < length) length_max = length; i++; } // Pretty print list of available plugins i=0; for (j=0; j<(length_max-4); j++) putchar(' '); printf("Name Description\n"); while ((i < PLUGIN_LIST_SIZE_MAX) && (plugin_list[i] != NULL)) { for (j=0; j<(length_max-(int)strlen(plugin_list[i]->name)); j++) putchar(' '); printf("%s", plugin_list[i]->name); printf(" %s\n", plugin_list[i]->description); i++; } } void screenshot_register_plugins(void) { // Register screenshot plugins screenshot_plugin_register(&keysight_dmm); screenshot_plugin_register(&keysight_ivx); screenshot_plugin_register(&rigol_1000z); screenshot_plugin_register(&rigol_2000); screenshot_plugin_register(&rigol_dg); screenshot_plugin_register(&rigol_dl3000); screenshot_plugin_register(&rigol_dm3068); screenshot_plugin_register(&rigol_dp800); screenshot_plugin_register(&rigol_dsa); screenshot_plugin_register(&rs_hmo_rtb); screenshot_plugin_register(&rs_ng); screenshot_plugin_register(&siglent_sdm3000); screenshot_plugin_register(&siglent_sdg); screenshot_plugin_register(&siglent_sds); screenshot_plugin_register(&siglent_ssa3000x); screenshot_plugin_register(&tektronix_2000); screenshot_plugin_register(&tektronix_3000); } int screenshot(char *address, char *plugin_name, char *filename, int timeout, bool no_gui, void *image_buffer, int *image_size, char *image_format, char *image_filename) { static char id[ID_LENGTH_MAX]; bool no_match = true; bool token_found = true; char *token = NULL; int plugin_winner = -1; int match_count = 0; int match_count_max = 0; char *regex_buffer; int i = 0; // Check parameters if (strlen(address) == 0) { error_printf("Missing address\n"); return 1; } // Save variables screenshot_address = address; screenshot_filename = filename; screenshot_no_gui = no_gui; screenshot_image_buffer = image_buffer; screenshot_image_size = image_size; screenshot_image_format = image_format; screenshot_image_filename = image_filename; if (strlen(plugin_name) == 0) { // Get instrument ID if (get_device_id(address, id, timeout) != 0) { error_printf("Unable to retrieve instrument ID\n"); return 1; } // Find relevant screenshot plugin (match instrument ID to plugin) while ((i < PLUGIN_LIST_SIZE_MAX) && (plugin_list[i] != NULL)) { // Skip plugin if it has no .regex entry if (plugin_list[i]->regex == NULL) { i++; continue; } // Walk through space separated regular expressions in regex string regex_buffer = strdup(plugin_list[i]->regex); while (token_found == true) { if (token == NULL) token = strtok(regex_buffer, " "); else token = strtok(NULL, " "); if (token != NULL) { // Match regular expression against ID if (regex_match(id, token)) match_count++; // Successful match } else token_found = false; } free(regex_buffer); // Plugin with most matches wins if (match_count > match_count_max) { plugin_winner = i; match_count_max = match_count; } // Reset match_count = 0; token_found = true; i++; } if (plugin_winner == -1) { error_printf("Could not autodetect which screenshot plugin to use\n"); return 1; } if (isatty(fileno(stdout)) && screenshot_no_gui) printf("Loaded %s screenshot plugin\n", plugin_list[plugin_winner]->name); no_match = false; i = plugin_winner; } else { // Find relevant screenshot plugin (match specified plugin name to plugin) while ((i < PLUGIN_LIST_SIZE_MAX) && (plugin_list[i] != NULL)) { if (strcmp(plugin_list[i]->name, plugin_name) == 0) { no_match = false; break; } i++; } } if (no_match) { error_printf("Unknown plugin name\n"); return 1; } // Call capture screenshot function return plugin_list[i]->screenshot(address, id, timeout); } lxi-tools-2.1/src/screenshot.h000066400000000000000000000043751420007711700164330ustar00rootroot00000000000000/* * Copyright (c) 2017-2022 Martin Lund * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the copyright holders nor 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 * HOLDERS 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. */ #ifndef SCREENSHOT_H #define SCREENSHOT_H #ifdef __cplusplus extern "C" { #endif #include #include "misc.h" void screenshot_register_plugins(void); void screenshot_list_plugins(void); int screenshot(char *address, char *plugin_name, char *filename, int timeout, bool no_gui, void *image_buffer, int *image_size, char *image_format, char *image_filename); // Screenshot helper function used by plugins to dump image file void screenshot_file_dump(void *data, int length, char *format); struct screenshot_plugin { const char *name; const char *description; const char *regex; int (*screenshot)(char *address, char *id, int timeout); }; #ifdef __cplusplus } #endif #endif lxi-tools-2.1/subprojects/000077500000000000000000000000001420007711700156505ustar00rootroot00000000000000lxi-tools-2.1/subprojects/glib.wrap000066400000000000000000000010021420007711700174510ustar00rootroot00000000000000[wrap-file] directory = glib-2.70.2 source_url = https://download.gnome.org/sources/glib/2.70/glib-2.70.2.tar.xz source_filename = glib-2.70.2.tar.xz source_hash = 0551459c85cd3da3d58ddc9016fd28be5af503f5e1615a71ba5b512ac945806f [provide] dependency_names = gthread-2.0, gobject-2.0, gmodule-no-export-2.0, gmodule-export-2.0, gmodule-2.0, glib-2.0, gio-2.0, gio-win32-2.0, gio-unix-2.0 program_names = glib-genmarshal, glib-mkenums, glib-compile-schemas, glib-compile-resources, gio-querymodules, gdbus-codegen lxi-tools-2.1/subprojects/gtk.wrap000066400000000000000000000003461420007711700173330ustar00rootroot00000000000000[wrap-file] directory = gtk-4.6.0 source_url = https://download-fallback.gnome.org/sources/gtk/4.6/gtk-4.6.0.tar.xz source_filename = gtk-4.6.0.tar.xz source_hash = 782d5951fbfd585fc9ec76c09d07e28e6014c72db001fb567fff217fb96e4d8c lxi-tools-2.1/subprojects/gtksourceview.wrap000066400000000000000000000002121420007711700214370ustar00rootroot00000000000000[wrap-git] directory=gtksourceview url=https://gitlab.gnome.org/GNOME/gtksourceview.git revision=407af3954ea0e3b0ea86046780ac20b0c4ae9805 lxi-tools-2.1/subprojects/libadwaita.wrap000066400000000000000000000001411420007711700206400ustar00rootroot00000000000000[wrap-git] directory=libadwaita url=https://gitlab.gnome.org/GNOME/libadwaita.git revision=1.0.1 lxi-tools-2.1/test/000077500000000000000000000000001420007711700142645ustar00rootroot00000000000000lxi-tools-2.1/test/lua/000077500000000000000000000000001420007711700150455ustar00rootroot00000000000000lxi-tools-2.1/test/lua/basics.lua000066400000000000000000000035071420007711700170210ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Basic Lua tests --[[ Why Lua? Lua provides a set of unique features that makes it distinct from other languages. These include: * Extensible * Simple * Efficient * Portable * Free and open Official Lua documentation: http://www.lua.org/docs.html Lua quick guide: https://www.tutorialspoint.com/lua/lua_quick_guide.htm Lua tutorial: https://www.tutorialspoint.com/lua/index.htm --]] -- Print -- a = 42 print("Hello lxi-tools") print("Value of a is " .. a) print("Running " .. _VERSION) print("Is " .. a .. " the answer?") -- Conditional -- a = true if (a) then print("a is true") else print("a is false") end -- Loop -- for i=10, 1, -1 -- for init, max/min value, increment do print("loop count " .. i) end -- Conditional loops i = 0 j = 5 while (i < j) do print("loop count " .. i) i = i + 1 end repeat print("loop count " .. i) i = i - 1 until (i == 0) -- Function -- function add(a, b) return (a + b) end print("10 + 10 = " .. add(10,10)) -- Array -- array = {"duck", 42, "dog"} print(array[1]) print(array[2]) print(array[3]) -- File I/O -- file = io.open("test.txt", "a") io.output(file) io.write("Hello lxi-tools\n") io.close(file) -- String to number conversion a_string = "+5.111E+02" a_number = tonumber(a_string) print("a_number = " .. a_number) print(type(a_string)) print(type(a_number)) -- Math print("2*2 = " .. 2 * 2) print("2^4 = " .. math.pow(2,4)) print("sin(2) = " .. math.sin(2)) print("sqrt(16) = " .. math.sqrt(16)) print("pi = " .. math.pi) print("a_number * 2 = " .. a_number * 2) -- OS functions os.execute ("echo 'Hello lxi-tools'") print(os.date("The time is %X")) print("TERM = " .. os.getenv("TERM")) print("Done")lxi-tools-2.1/test/lua/chart-gauge-angular.lua000066400000000000000000000012741420007711700213720ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Angular gauge chart test -- Init clock0 = clock_new() chart0 = chart_new("angular-gauge", -- chart type "Engine", -- title "Tachometer [ RPM ]", -- label 0, 5000, 400) -- value min, value max, window width -- Manipulate gauge for 10 seconds clock = 0 while (clock < 10) do value = 3000 + 1000*math.sin(clock) clock = clock_read(clock0) chart_set_value(chart0, value) msleep(50) end -- Cleanup clock_free(clock0) chart_close(chart0) print("Done") lxi-tools-2.1/test/lua/chart-gauge-linear.lua000066400000000000000000000012521420007711700212070ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Linear gauge chart test -- Init clock0 = clock_new() chart0 = chart_new("linear-gauge", -- chart type "Engine", -- title "Throttle [ % ]", -- label 0, 100, 400) -- value min, value max, window width -- Manipulate gauge for 10 seconds clock = 0 while (clock < 10) do clock = clock_read(clock0) value = 50 + 20*math.sin(10*clock) chart_set_value(chart0, value) msleep(20) end -- Cleanup clock_free(clock0) chart_close(chart0) print("Done") lxi-tools-2.1/test/lua/chart-line.lua000066400000000000000000000017271420007711700176050ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Line chart test - plotting a sine wave function -- Init clock0 = clock_new() chart0 = chart_new("line", -- chart type "Sine wave plot, f(t) = 5 + 2sin(10t)", -- title "Time [ s ]", -- x-axis label "Value [ ]", -- y-axis label 10, 10, 800) -- x max, y max, window width -- Sample and plot sine wave at 100 Hz for 10 seconds clock = 0 while (clock < 10) do clock = clock_read(clock0) value = 5 + 2*math.sin(10*clock) chart_plot(chart0, clock, value) msleep(10) end -- Save chart data chart_save_csv(chart0, "chart0.csv") chart_save_png(chart0, "chart0.png") -- Cleanup clock_free(clock0) --chart_close(chart0) print("Done") lxi-tools-2.1/test/lua/chart-number.lua000066400000000000000000000011361420007711700201400ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Number chart test -- Init clock0 = clock_new() chart0 = chart_new("number", -- chart type "PSU Voltage", -- title "[ V ]", -- label 800) -- window width -- Manipulate number for 10 seconds clock = 0 while (clock < 10) do clock = clock_read(clock0) chart_set_value(chart0, clock) msleep(100) end -- Cleanup clock_free(clock0) chart_close(chart0) print("Done") lxi-tools-2.1/test/lua/chart-scatter.lua000066400000000000000000000017321420007711700203170ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Scatter chart test - plotting a sine wave function -- Init clock0 = clock_new() chart0 = chart_new("scatter", -- chart type "Sine wave plot, f(t) = 5 + 2sin(10t)", -- title "Time [ s ]", -- x-axis label "Value [ ]", -- y-axis label 10, 10, 800) -- x max, y max, window width -- Sample and plot sine wave at 100 Hz for 10 seconds clock = 0 while (clock < 10) do clock = clock_read(clock0) value = 5 + 2*math.sin(10*clock) chart_plot(chart0, clock, value) msleep(10) end -- Save chart data chart_save_csv(chart0, "chart0.csv") chart_save_png(chart0, "chart0.png") -- Cleanup clock_free(clock0) --chart_close(chart0) print("Done") lxi-tools-2.1/test/lua/log.lua000066400000000000000000000007531420007711700163360ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Data logger test - logging data and writing it to CSV file -- Init log0 = log_new() -- Log some data log_add(log0, 12, "text", 34, "text") log_add(log0, 56, "text", "text", "text", 78) log_add(log0, "text", 12, "text", 345, "text", 6) -- Dump data to CSV file log_save_csv(log0, "log0.csv") -- Cleanup log_free(log0) print("Done")lxi-tools-2.1/test/lua/multi-device.lua000066400000000000000000000026071420007711700201440ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Example: Working with multiple devices -- Connect to instruments dso = connect("192.168.0.157", nil, nil, 6000, "VXI11") -- R&S RTB2004 psu = connect("192.168.0.107", 5025, nil, 2000, "RAW") -- R&S NGM202 -- Print instrument IDs print("Digital Storage Oscilloscope ID = " .. scpi(dso,"*IDN?")) print("Power Supply ID = " .. scpi(psu,"*IDN?")) -- Set power supply voltage on channel 1 to 1.2V scpi(psu, "voltage 1.2, (@1)") -- Turn on power supply scpi(psu, "output on") -- Wait for voltage to stabilize msleep(1000) -- Read out power supply voltage volt_psu = scpi(psu, "voltage? (@1)") volt_psu = tonumber(volt_psu) print("volt_psu = " .. volt_psu) -- Autoset oscilloscope scpi(dso, "autoscale") -- Start measurement on channel 1 scpi(dso, ":measurement1 on") scpi(dso, ":measurement1:main rms") -- Measure for 4 seconds msleep(4000) -- Read out DSO voltage of channel 1 volt_dso = scpi(dso, ":measurement1:result? rms") volt_dso = tonumber(volt_dso) print("volt_dso = " .. volt_dso) -- Do voltage comparison if (volt_psu < volt_dso) then print("Power supply voltage is lower") else print("Power supply voltage is higher") end -- Turn off power supply scpi(psu, "output off") -- Disconnect disconnect(psu) disconnect(dso) print("Done") lxi-tools-2.1/test/lua/psu-data-log.lua000066400000000000000000000025051420007711700200470ustar00rootroot00000000000000------------------------------------- -- lxi-tools -- -- https://lxi-tools.github.io -- ------------------------------------- -- Example: Data logging from a NGM202 PSU for 100 seconds at 10 Hz -- Connect to power supply psu = connect("192.168.0.107", nil, nil, 2000, "VXI11") print("Power Supply ID = " .. scpi(psu,"*IDN?")) -- Set power supply voltage on channel 1 to 5V scpi(psu, "voltage 5.0, (@1)") -- Turn on power supply scpi(psu, "output on") -- Wait for voltage to stabilize msleep(1000) -- Setup line chart and clock chart0 = chart_new("line-chart", -- chart type "PSU Channel 1 Data Log", -- title "Time [ s ]", -- x-axis label "Voltage [ V ]", -- y-axis label 100, 10, 800) -- x max, y max, window width clock0 = clock_new() -- Capture and plot samples at 10 Hz for 100 seconds clock = 0 while (clock < 100) do voltage = scpi(psu, "voltage? (@1)") voltage = tonumber(voltage) clock = clock_read(clock0) chart_plot(chart0, clock, voltage) msleep(100) end -- Save data chart_save_csv(chart0, "chart0.csv") chart_save_png(chart0, "chart0.png") -- Cleanup clock_free(clock0) chart_close(chart0) -- Turn off power supply scpi(psu, "output off") -- Finish print("Done") lxi-tools-2.1/test/shell/000077500000000000000000000000001420007711700153735ustar00rootroot00000000000000lxi-tools-2.1/test/shell/test.sh000077500000000000000000000005761420007711700167210ustar00rootroot00000000000000IP=$1 SCPI="lxi scpi --address $IP" $SCPI "*IDN?" $SCPI ":autoscale" $SCPI ":stop" $SCPI ":run" $SCPI ":clear" $SCPI ":tforce" $SCPI ":single" $SCPI ":CHANnel1:DISPlay on" $SCPI ":CHANnel2:DISPlay on" $SCPI ":CHANnel3:DISPlay on" $SCPI ":CHANnel4:DISPlay on" $SCPI ":CHANnel1:DISPlay off" $SCPI ":CHANnel2:DISPlay off" $SCPI ":CHANnel3:DISPlay off" $SCPI ":CHANnel4:DISPlay off"