nodeunit-0.11.2/000077500000000000000000000000001317343222700134245ustar00rootroot00000000000000nodeunit-0.11.2/.gitignore000066400000000000000000000000731317343222700154140ustar00rootroot00000000000000dist node_modules stamp-build *~ gmon.out v8.log .DS_Store nodeunit-0.11.2/.npmignore000066400000000000000000000000441317343222700154210ustar00rootroot00000000000000dist stamp-build test/fixtures/dir2 nodeunit-0.11.2/.travis.yml000066400000000000000000000001461317343222700155360ustar00rootroot00000000000000language: node_js node_js: - "stable" - "6.5" - "6.4" - "6.3" - "5.12" - "4.4" - "0.12" nodeunit-0.11.2/CONTRIBUTORS.md000066400000000000000000000032541317343222700157070ustar00rootroot00000000000000Nodeunit contributors (sorted alphabetically) ============================================ * **[Alex Gorbatchev](https://github.com/alexgorbatchev)** * Deeper default object inspection * Timeout to ensure flushing of console output (default reporter) * **[Alex Wolfe](https://github.com/alexkwolfe)** * HTML test reporter * **[Caolan McMahon](https://github.com/caolan)** * Author and maintainer * Most features develpopment * **[Carl Fürstenberg](https://github.com/azatoth)** * Debian-friendly Makefile, supports both 'node' and 'nodejs' executables * Sandbox utility * Minimal test reporter * **[Gerad Suyderhoud](https://github.com/gerad)** * First comand-line tool * **[Kadir Pekel](https://github.com/kadirpekel)** * Improvements to default test reporter * HTTP test utility * **[Λlisue](https://github.com/lambdalisue)** * Add machineout reporter * **[Matthias Lübken](https://github.com/luebken)** * Utility functions for tracking incomplete tests on exit * **[Oleg Efimov](https://github.com/Sannis)** * Adding 'make lint' and fixing nodelint errors * Option parsing, --help text and config file support * Reporters option for command-line tool * **[Orlando Vazquez](https://github.com/orlandov)** * Added jUnit XML reporter * **[Ryan Dahl](https://github.com/ry)** * Add package.json * **[Sam Stephenson](https://github.com/sstephenson)** * Coffee-script support * **[Thomas Mayfield](https://github.com/thegreatape)** * Async setUp and tearDown support for testCase * **[Maciej Małecki](https://github.com/mmalecki)** * Removal of `testCase` **[Full contributors list](https://github.com/caolan/nodeunit/contributors).** nodeunit-0.11.2/LICENSE000066400000000000000000000020421317343222700144270ustar00rootroot00000000000000Copyright (c) 2010 Caolan McMahon Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. nodeunit-0.11.2/Makefile000066400000000000000000000204031317343222700150630ustar00rootroot00000000000000PACKAGE = nodeunit NODEJS = $(if $(shell test -f /usr/bin/nodejs && echo "true"),nodejs,node) PREFIX ?= /usr/local BINDIR ?= $(PREFIX)/bin DATADIR ?= $(PREFIX)/share MANDIR ?= $(PREFIX)/share/man LIBDIR ?= $(PREFIX)/lib NODEJSLIBDIR ?= $(LIBDIR)/$(NODEJS) BUILDDIR = dist DOCS = $(shell find doc -name '*.md' \ |sed 's|.md|.1|g' \ |sed 's|doc/|man1/|g' \ ) $(shell if [ ! -d $(BUILDDIR) ]; then mkdir $(BUILDDIR); fi) all: build doc browser: # super hacky build script for browser version! mkdir -p $(BUILDDIR)/browser rm -rf $(BUILDDIR)/browser/* # build browser version of nodeunit.js cat share/license.js >> $(BUILDDIR)/browser/nodeunit.js echo "nodeunit = (function(){" >> $(BUILDDIR)/browser/nodeunit.js cat deps/json2.js >> $(BUILDDIR)/browser/nodeunit.js # make assert global echo "var assert = this.assert = {};" >> $(BUILDDIR)/browser/nodeunit.js echo "var types = {};" >> $(BUILDDIR)/browser/nodeunit.js echo "var core = {};" >> $(BUILDDIR)/browser/nodeunit.js echo "var nodeunit = {};" >> $(BUILDDIR)/browser/nodeunit.js echo "var reporter = {};" >> $(BUILDDIR)/browser/nodeunit.js cat deps/async.js >> $(BUILDDIR)/browser/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js cat lib/assert.js >> $(BUILDDIR)/browser/nodeunit.js echo "})(assert);" >> $(BUILDDIR)/browser/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js cat lib/types.js >> $(BUILDDIR)/browser/nodeunit.js echo "})(types);" >> $(BUILDDIR)/browser/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js cat lib/core.js >> $(BUILDDIR)/browser/nodeunit.js echo "})(core);" >> $(BUILDDIR)/browser/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js cat lib/reporters/browser.js >> $(BUILDDIR)/browser/nodeunit.js echo "})(reporter);" >> $(BUILDDIR)/browser/nodeunit.js echo "nodeunit = core;" >> $(BUILDDIR)/browser/nodeunit.js echo "nodeunit.assert = assert;" >> $(BUILDDIR)/browser/nodeunit.js echo "nodeunit.reporter = reporter;" >> $(BUILDDIR)/browser/nodeunit.js echo "nodeunit.run = reporter.run;" >> $(BUILDDIR)/browser/nodeunit.js echo "return nodeunit; })();" >> $(BUILDDIR)/browser/nodeunit.js cp $(BUILDDIR)/browser/nodeunit.js $(BUILDDIR)/browser/.nodeunit.js sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.nodeunit.js > $(BUILDDIR)/browser/nodeunit.js rm $(BUILDDIR)/browser/.nodeunit.js # copy nodeunit.css cp share/nodeunit.css $(BUILDDIR)/browser/nodeunit.css # create nodeunit.min.js node_modules/uglify-js/bin/uglifyjs $(BUILDDIR)/browser/nodeunit.js > $(BUILDDIR)/browser/nodeunit.min.js # create test scripts mkdir -p $(BUILDDIR)/browser/test cp test/test.html $(BUILDDIR)/browser/test/test.html # test-base.js echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-base.js cat test/test-base.js >> $(BUILDDIR)/browser/test/test-base.js echo "})(this.test_base = {});" >> $(BUILDDIR)/browser/test/test-base.js cp $(BUILDDIR)/browser/test/test-base.js $(BUILDDIR)/browser/.test-base.js sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-base.js > $(BUILDDIR)/browser/test/test-base.js rm $(BUILDDIR)/browser/.test-base.js # test-runmodule.js echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-runmodule.js cat test/test-runmodule.js >> $(BUILDDIR)/browser/test/test-runmodule.js echo "})(this.test_runmodule = {});" >> $(BUILDDIR)/browser/test/test-runmodule.js cp $(BUILDDIR)/browser/test/test-runmodule.js $(BUILDDIR)/browser/.test-runmodule.js sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-runmodule.js > $(BUILDDIR)/browser/test/test-runmodule.js rm $(BUILDDIR)/browser/.test-runmodule.js # test-runtest.js echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-runtest.js cat test/test-runtest.js >> $(BUILDDIR)/browser/test/test-runtest.js echo "})(this.test_runtest = {});" >> $(BUILDDIR)/browser/test/test-runtest.js cp $(BUILDDIR)/browser/test/test-runtest.js $(BUILDDIR)/browser/.test-runtest.js sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-runtest.js > $(BUILDDIR)/browser/test/test-runtest.js rm $(BUILDDIR)/browser/.test-runtest.js # test-testcase.js echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-testcase.js cat test/test-testcase.js >> $(BUILDDIR)/browser/test/test-testcase.js echo "})(this.test_testcase = {});" >> $(BUILDDIR)/browser/test/test-testcase.js cp $(BUILDDIR)/browser/test/test-testcase.js $(BUILDDIR)/browser/.test-testcase.js sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-testcase.js > $(BUILDDIR)/browser/test/test-testcase.js rm $(BUILDDIR)/browser/.test-testcase.js # test-testcase-legacy.js echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-testcase-legacy.js cat test/test-testcase-legacy.js >> $(BUILDDIR)/browser/test/test-testcase-legacy.js echo "})(this.test_testcase_legacy = {});" >> $(BUILDDIR)/browser/test/test-testcase-legacy.js cp $(BUILDDIR)/browser/test/test-testcase-legacy.js $(BUILDDIR)/browser/.test-testcase-legacy.js sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-testcase-legacy.js > $(BUILDDIR)/browser/test/test-testcase-legacy.js rm $(BUILDDIR)/browser/.test-testcase-legacy.js # copy nodeunit.js to dist/browser/test to make it easier for me to host and # run on windows VMs with IE cp $(BUILDDIR)/browser/nodeunit.js $(BUILDDIR)/browser/test/nodeunit.js cp $(BUILDDIR)/browser/nodeunit.css $(BUILDDIR)/browser/test/nodeunit.css commonjs: # super hacky build script for browser commonjs version! ##### make commonjs browser module ###### mkdir -p $(BUILDDIR)/commonjs rm -rf $(BUILDDIR)/commonjs/* mkdir -p $(BUILDDIR)/commonjs/deps cp deps/json2.js $(BUILDDIR)/commonjs/deps cp deps/async.js $(BUILDDIR)/commonjs/deps echo "var async = require('async');" >> $(BUILDDIR)/commonjs/nodeunit.js echo "var assert = {};" >> $(BUILDDIR)/commonjs/nodeunit.js echo "var types = {};" >> $(BUILDDIR)/commonjs/nodeunit.js echo "var core = {};" >> $(BUILDDIR)/commonjs/nodeunit.js echo "var nodeunit = {};" >> $(BUILDDIR)/commonjs/nodeunit.js echo "var reporter = {};" >> $(BUILDDIR)/commonjs/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/commonjs/nodeunit.js cat lib/assert.js >> $(BUILDDIR)/commonjs/nodeunit.js echo "})(assert);" >> $(BUILDDIR)/commonjs/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/commonjs/nodeunit.js cat lib/types.js >> $(BUILDDIR)/commonjs/nodeunit.js echo "})(types);" >> $(BUILDDIR)/commonjs/nodeunit.js echo "(function(exports){" >> $(BUILDDIR)/commonjs/nodeunit.js cat lib/core.js >> $(BUILDDIR)/commonjs/nodeunit.js echo "})(core);" >> $(BUILDDIR)/commonjs/nodeunit.js echo "module.exports = core;" >> $(BUILDDIR)/commonjs/nodeunit.js echo "(function(exports, nodeunit){" >> $(BUILDDIR)/commonjs/nodeunit.js cat lib/reporters/browser.js >> $(BUILDDIR)/commonjs/nodeunit.js echo "})(reporter, module.exports);" >> $(BUILDDIR)/commonjs/nodeunit.js echo "module.exports.assert = assert;" >> $(BUILDDIR)/commonjs/nodeunit.js echo "module.exports.reporter = reporter;" >> $(BUILDDIR)/commonjs/nodeunit.js echo "module.exports.run = reporter.run;" >> $(BUILDDIR)/commonjs/nodeunit.js sed -i "/\@REMOVE_LINE_FOR_BROWSER/d" $(BUILDDIR)/commonjs/nodeunit.js sed -i "/\@REMOVE_LINE_FOR_COMMONJS/d" $(BUILDDIR)/commonjs/nodeunit.js ##### end of commonjs browser module ##### build: stamp-build stamp-build: $(wildcard deps/* lib/*.js) touch $@; mkdir -p $(BUILDDIR)/nodeunit cp -R bin node_modules deps index.js lib package.json share $(BUILDDIR)/nodeunit printf '#!/bin/sh\n$(NODEJS) $(NODEJSLIBDIR)/$(PACKAGE)/bin/nodeunit $$@' > $(BUILDDIR)/nodeunit.sh test: $(NODEJS) ./bin/nodeunit test install: build install -d $(NODEJSLIBDIR) cp -a $(BUILDDIR)/nodeunit $(NODEJSLIBDIR) install -m 0755 $(BUILDDIR)/nodeunit.sh $(BINDIR)/nodeunit install -d $(MANDIR)/man1/ cp -a man1/nodeunit.1 $(MANDIR)/man1/ uninstall: rm -rf $(NODEJSLIBDIR)/nodeunit $(NODEJSLIBDIR)/nodeunit.js $(BINDIR)/nodeunit rm -rf $(MANDIR)/man1/nodeunit.1 clean: rm -rf $(BUILDDIR) stamp-build lint: nodelint --config nodelint.cfg ./index.js ./bin/nodeunit ./bin/nodeunit.json ./lib/*.js ./lib/reporters/*.js ./test/*.js doc: man1 $(DOCS) @true man1: @if ! test -d man1 ; then mkdir -p man1 ; fi # use `npm install ronn` for this to work. man1/%.1: doc/%.md ronn --roff $< > $@ .PHONY: browser test install uninstall build all nodeunit-0.11.2/README.md000066400000000000000000000407001317343222700147040ustar00rootroot00000000000000Nodeunit ======== [![Build Status](https://travis-ci.org/caolan/nodeunit.svg?branch=master)](https://travis-ci.org/caolan/nodeunit) Simple syntax, powerful tools. Nodeunit provides easy async unit testing for node.js and the browser. * Simple to use * Just export the tests from a module * Works with node.js and in the browser * Helps you avoid common pitfalls when testing asynchronous code * Easy to add test cases with setUp and tearDown functions if you wish * Flexible reporters for custom output, built-in support for HTML and jUnit XML * Allows the use of mocks and stubs __Contributors__ * [alexgorbatchev](https://github.com/alexgorbatchev) * [alexkwolfe](https://github.com/alexkwolfe) * [azatoth](https://github.com/azatoth) * [kadirpekel](https://github.com/kadirpekel) * [lambdalisue](https://github.com/lambdalisue) * [luebken](https://github.com/luebken) * [orlandov](https://github.com/orlandov) * [Sannis](https://github.com/Sannis) * [sstephenson](https://github.com/sstephenson) * [thegreatape](https://github.com/thegreatape) * [mmalecki](https://github.com/mmalecki) * and thanks to [cjohansen](https://github.com/cjohansen) for input and advice on implementing setUp and tearDown functions. See [cjohansen's fork](https://github.com/cjohansen/nodeunit). Also, check out gerad's [nodeunit-dsl](https://github.com/gerad/nodeunit-dsl) project, which implements a 'pretty dsl on top of nodeunit'. More contributor information can be found in the [CONTRIBUTORS.md](https://github.com/caolan/nodeunit/blob/master/CONTRIBUTORS.md) file. Usage ----- Here is an example unit test module: exports.testSomething = function(test) { test.expect(1); test.ok(true, "this assertion should pass"); test.done(); }; exports.testSomethingElse = function(test) { test.ok(false, "this assertion should fail"); test.done(); }; When run using the included test runner, this will output the following: Installation ------------ There are two options for installing nodeunit: 1. Clone / download nodeunit from [github](https://github.com/caolan/nodeunit), then: make && sudo make install 2. Install via npm: npm install nodeunit -g API Documentation ----------------- Nodeunit uses the functions available in the node.js [assert module](http://nodejs.org/docs/v0.4.2/api/assert.html): * __ok(value, [message])__ - Tests if value is a true value. * __equal(actual, expected, [message])__ - Tests shallow, coercive equality with the equal comparison operator ( == ). * __notEqual(actual, expected, [message])__ - Tests shallow, coercive non-equality with the not equal comparison operator ( != ). * __deepEqual(actual, expected, [message])__ - Tests for deep equality. * __notDeepEqual(actual, expected, [message])__ - Tests for any deep inequality. * __strictEqual(actual, expected, [message])__ - Tests strict equality, as determined by the strict equality operator ( === ) * __notStrictEqual(actual, expected, [message])__ - Tests strict non-equality, as determined by the strict not equal operator ( !== ) * __throws(block, [error], [message])__ - Expects block to throw an error. * __doesNotThrow(block, [error], [message])__ - Expects block not to throw an error. * __ifError(value)__ - Tests if value is not a false value, throws if it is a true value. Useful when testing the first argument, error in callbacks. Nodeunit also provides the following functions within tests: * __expect(amount)__ - Specify how many assertions are expected to run within a test. Very useful for ensuring that all your callbacks and assertions are run. * __done()__ - Finish the current test function, and move on to the next. ALL tests should call this! Nodeunit aims to be simple and easy to learn. This is achieved through using existing structures (such as node.js modules) to maximum effect, and reducing the API where possible, to make it easier to digest. Tests are simply exported from a module, but they are still run in the order they are defined. __Note:__ Users of old nodeunit versions may remember using `ok`, `equals` and `same` in the style of qunit, instead of the assert functions above. These functions still exist for backwards compatibility, and are simply aliases to their assert module counterparts. Asynchronous Testing -------------------- When testing asynchronous code, there are a number of sharp edges to watch out for. Thankfully, nodeunit is designed to help you avoid as many of these pitfalls as possible. For the most part, testing asynchronous code in nodeunit _just works_. ### Tests run in series While running tests in parallel seems like a good idea for speeding up your test suite, in practice I've found it means writing much more complicated tests. Because of node's module cache, running tests in parallel means mocking and stubbing is pretty much impossible. One of the nicest things about testing in javascript is the ease of doing stubs: var _readFile = fs.readFile; fs.readFile = function(path, callback) { // it's a stub! }; // test function that uses fs.readFile // we're done fs.readFile = _readFile; You cannot do this when running tests in parallel. In order to keep testing as simple as possible, nodeunit avoids it. Thankfully, most unit-test suites run fast anyway. ### Explicit ending of tests When testing async code it's important that tests end at the correct point, not just after a given number of assertions. Otherwise your tests can run short, ending before all assertions have completed. It's important to detect too many assertions as well as too few. Combining explicit ending of tests with an expected number of assertions helps to avoid false test passes, so be sure to use the `test.expect()` method at the start of your test functions, and `test.done()` when finished. Groups, setUp and tearDown -------------------------- Nodeunit allows the nesting of test functions: exports.test1 = function (test) { ... } exports.group = { test2: function (test) { ... }, test3: function (test) { ... } } This would be run as: test1 group - test2 group - test3 Using these groups, Nodeunit allows you to define a `setUp` function, which is run before each test, and a `tearDown` function, which is run after each test calls `test.done()`: module.exports = { setUp: function (callback) { this.foo = 'bar'; callback(); }, tearDown: function (callback) { // clean up callback(); }, test1: function (test) { test.equals(this.foo, 'bar'); test.done(); } }; In this way, it's possible to have multiple groups of tests in a module, each group with its own setUp and tearDown functions. Running Tests ------------- Nodeunit comes with a basic command-line test runner, which can be installed using `sudo make install`. Example usage: nodeunit testmodule1.js testfolder [...] If no entry file specified, `test` defaults. The default test reporter uses color output, because I think that's more fun :) I intend to add a no-color option in future. To give you a feeling of the fun you'll be having writing tests, lets fix the example at the start of the README: Ahhh, Doesn't that feel better? When using the included test runner, it will exit using the failed number of assertions as the exit code. This means it exits with 0 when all tests pass. ### Command-line Options * __--reporter FILE__ - you can set the test reporter to a custom module or on of the modules in nodeunit/lib/reporters, when omitted, the default test runner is used. * __--list-reporters__ - list available built-in reporters. * __--config FILE__ - load config options from a JSON file, allows the customisation of color schemes for the default test reporter etc. See bin/nodeunit.json for current available options. * __-t testName__ - run specific test only. * __-f fullTestName__ - run specific test only. fullTestName is built so: "outerGroup - .. - innerGroup - testName". * __--version__ or __-v__ - report nodeunit version * __--help__ - show nodeunit help Running tests in the browser ---------------------------- Nodeunit tests can also be run inside the browser. For example usage, see the examples/browser folder. The basic syntax is as follows: __test.html__ Example Test Suite

Example Test Suite

Here, `suite1` and `suite2` are just object literals containing test functions or groups, as would be returned if you did `require('test-suite')` in node.js: __suite1.js__ this.suite1 = { 'example test': function (test) { test.ok(true, 'everything is ok'); test.done(); } }; If you wish to use a commonjs format for your test suites (using exports), it is up to you to define the commonjs tools for the browser. There are a number of alternatives and it's important it fits with your existing code, which is why nodeunit does not currently provide this out of the box. In the example above, the tests will run when the page is loaded. The browser-version of nodeunit.js is created in dist/browser when you do, `make browser`. You'll need [UglifyJS](https://github.com/mishoo/UglifyJS) installed in order for it to automatically create nodeunit.min.js. Adding nodeunit to Your Projects -------------------------------- If you don't want people to have to install the nodeunit command-line tool, you'll want to create a script that runs the tests for your project with the correct require paths set up. Here's an example test script, that assumes you have nodeunit in a suitably located node_modules directory. #!/usr/bin/env node var reporter = require('nodeunit').reporters.default; reporter.run(['test']); If you're using git, you might find it useful to include nodeunit as a submodule. Using submodules makes it easy for developers to download nodeunit and run your test suite, without cluttering up your repository with the source code. To add nodeunit as a git submodule do the following: git submodule add git://github.com/caolan/nodeunit.git node_modules/nodeunit This will add nodeunit to the node_modules folder of your project. Now, when cloning the repository, nodeunit can be downloaded by doing the following: git submodule init git submodule update Let's update the test script above with a helpful hint on how to get nodeunit, if it's missing: #!/usr/bin/env node try { var reporter = require('nodeunit').reporters.default; } catch(e) { console.log("Cannot find nodeunit module."); console.log("You can download submodules for this project by doing:"); console.log(""); console.log(" git submodule init"); console.log(" git submodule update"); console.log(""); process.exit(); } process.chdir(__dirname); reporter.run(['test']); Now if someone attempts to run your test suite without nodeunit installed they will be prompted to download the submodules for your project. Built-in Test Reporters ----------------------- * __default__ - The standard reporter seen in the nodeunit screenshots * __minimal__ - Pretty, minimal output, shows errors and progress only * __html__ - Outputs a HTML report to stdout * __junit__ - Creates jUnit compatible XML reports, which can be used with continuous integration tools such as [Hudson](http://hudson-ci.org/). * __machineout__ - Simple reporter for machine analysis. There is [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) which is useful for TDD on VIM. Writing a Test Reporter --------------------- Nodeunit exports runTest(fn, options), runModule(mod, options) and runFiles(paths, options). You'll most likely want to run test suites from files, which can be done using the latter function. The _options_ argument can contain callbacks which run during testing. Nodeunit provides the following callbacks: * __moduleStart(name)__ - called before a module is tested * __moduleDone(name, assertions)__ - called once all test functions within the module have completed (see assertions object reference below) ALL tests within the module * __testStart(name)__ - called before a test function is run * __testReady(test)__ - called before a test function is run with the test object that will be passed to the test function * __testDone(name, assertions)__ - called once a test function has completed (by calling test.done()) * __log(assertion)__ - called whenever an assertion is made (see assertion object reference below) * __done(assertions)__ - called after all tests/modules are complete The __assertion__ object: * __passed()__ - did the assertion pass? * __failed()__ - did the assertion fail? * __error__ - the AssertionError if the assertion failed * __method__ - the nodeunit assertion method used (ok, same, equals...) * __message__ - the message the assertion method was called with (optional) The __assertionList__ object: * An array-like object with the following new attributes: * __failures()__ - the number of assertions which failed * __duration__ - the time taken for the test to complete in msecs For a reference implementation of a test reporter, see lib/reporters/default.js in the nodeunit project directory. Sandbox utility --------------- This is a function which evaluates JavaScript files in a sandbox and returns the context. The sandbox function can be used for testing client-side code or private un-exported functions within a module. var sandbox = require('nodeunit').utils.sandbox; var example = sandbox('example.js'); __sandbox(files, sandbox)__ - Evaluates JavaScript files in a sandbox, returning the context. The first argument can either be a single filename or an array of filenames. If multiple filenames are given their contents are concatenated before evaluation. The second argument is an optional context to use for the sandbox. Note: When working with the sandbox if your script depends on outside sources (i.e. using `require`) then you will want to pass that into the optional context when setting up the sandbox. var sandbox = require('nodeunit').utils.sandbox; // pass in some node globals var box_globals = { // Passing module.exports into the sandbox will give your code access to it. module: {exports: exports}, // Passing require into the sandbox will give your code access to use it AND // will share the cache with modules already required from outside the sandbox. require: require, // Passing console into the sandbox will give your code access to it console: console }; var example = sandbox('example.js', box_globals); Running the nodeunit Tests -------------------------- The tests for nodeunit are written using nodeunit itself as the test framework. However, the module test-base.js first does some basic tests using the assert module to ensure that test functions are actually run, and a basic level of nodeunit functionality is available. To run the nodeunit tests do: make test __Note:__ There was a bug in node v0.2.0 causing the tests to hang, upgrading to v0.2.1 fixes this. __machineout__ reporter ---------------------------------------------- The default reporter is readable for human but not for machine analysis. When you want to analyze the output of nodeunit, use __machineout__ reporter and you will get nodeunit with vim ---------------------------------- There is [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) so you can use nodeunit with VIM. That compiler uses __machineout__ reporter and it is useful to use with [vim-makegreen](https://github.com/reinh/vim-makegreen). Contributing ------------ Contributions to the project are most welcome, so feel free to fork and improve. When submitting a pull request, please run `make lint` first to ensure we're following a consistent coding style. nodeunit-0.11.2/bin/000077500000000000000000000000001317343222700141745ustar00rootroot00000000000000nodeunit-0.11.2/bin/nodeunit000077500000000000000000000104321317343222700157470ustar00rootroot00000000000000#!/usr/bin/env node var fs = require('fs'), path = require('path'); //require.paths.push(process.cwd()); var args = (process.ARGV || process.argv).slice(2); var files = []; var testrunner, config_file, config_param_found = false, output_param_found = false, reporter_file = 'default', reporter_param_found = false, testspec_param_found = false, testFullSpec_param_found = false; var usage = "Usage: nodeunit [options] testmodule1.js testfolder [...] \n" + "Options:\n\n" + " --config FILE the path to a JSON file with options\n" + " --reporter FILE optional path to a reporter file to customize the output\n" + " --list-reporters list available build-in reporters\n" + " -r recursively run tests in sub-directories\n" + " -t testName, specify a test to run\n" + " -f fullTestName, specify a specific test to run. fullTestName is built so: \"outerGroup - .. - innerGroup - testName\"\n" + " -h, --help display this help and exit\n" + " -v, --version output version information and exit"; // load default options var content = fs.readFileSync(__dirname + '/nodeunit.json', 'utf8'); var options = JSON.parse(content); // a very basic pseudo --options parser args.forEach(function (arg) { if (arg.slice(0, 9) === "--config=") { config_file = arg.slice(9); } else if (arg === '--config') { config_param_found = true; } else if (config_param_found) { config_file = arg; config_param_found = false; } else if (arg.slice(0, 9) === "--output=") { options.output = arg.slice(9); } else if (arg === '--output') { output_param_found = true; } else if (output_param_found) { options.output = arg; output_param_found = false; } else if (arg.slice(0, 11) === "--reporter=") { reporter_file = arg.slice(11); } else if (arg === '--reporter') { reporter_param_found = true; } else if (reporter_param_found) { reporter_file = arg; reporter_param_found = false; } else if (arg === '-r') { options.recursive = true; } else if (arg === '-t') { testspec_param_found = true; } else if (testspec_param_found) { options.testspec = arg; testspec_param_found = false; } else if (arg === '-f') { testFullSpec_param_found = true; } else if (testFullSpec_param_found) { options.testFullSpec= arg; testFullSpec_param_found = false; } else if (arg === '--list-reporters') { var reporters = fs.readdirSync(__dirname + '/../lib/reporters'); reporters = reporters.filter(function (reporter_file) { return (/\.js$/).test(reporter_file); }).map(function (reporter_file) { return reporter_file.replace(/\.js$/, ''); }).filter(function (reporter_file) { return reporter_file !== 'index'; }); console.log('Built-in reporters: '); reporters.forEach(function (reporter_file) { var reporter = require('../lib/reporters/' + reporter_file); console.log(' * ' + reporter_file + (reporter.info ? ': ' + reporter.info : '')); }); process.exit(0); } else if ((arg === '-v') || (arg === '--version')) { var content = fs.readFileSync(__dirname + '/../package.json', 'utf8'); var pkg = JSON.parse(content); console.log(pkg.version); process.exit(0); } else if ((arg === '-h') || (arg === '--help')) { console.log(usage); process.exit(0); } else { files.push(arg); } }); // defaults to `test` if (files.length === 0) { files = ['test']; } if (config_file) { content = fs.readFileSync(config_file, 'utf8'); var custom_options = JSON.parse(content); for (var option in custom_options) { if (typeof option === 'string') { options[option] = custom_options[option]; } } } var builtin_reporters = require(__dirname + '/../lib/reporters'); if (reporter_file in builtin_reporters) { testrunner = builtin_reporters[reporter_file]; } else { testrunner = require(reporter_file); } testrunner.run(files, options, function(err) { process.exit(err ? 1 : 0); }); nodeunit-0.11.2/bin/nodeunit.json000066400000000000000000000004221317343222700167120ustar00rootroot00000000000000{ "error_prefix": "\u001B[31m", "error_suffix": "\u001B[39m", "ok_prefix": "\u001B[32m", "ok_suffix": "\u001B[39m", "bold_prefix": "\u001B[1m", "bold_suffix": "\u001B[22m", "assertion_prefix": "\u001B[35m", "assertion_suffix": "\u001B[39m" } nodeunit-0.11.2/doc/000077500000000000000000000000001317343222700141715ustar00rootroot00000000000000nodeunit-0.11.2/doc/nodeunit.md000066400000000000000000000033771317343222700163520ustar00rootroot00000000000000nodeunit(1) -- simple node.js unit testing tool =============================================== ## SYNOPSIS nodeunit [options] [ ...] ## DESCRIPTION Nodeunit is a simple unit testing tool based on the node.js assert module. * Simple to use * Just export the tests from a module * Helps you avoid common pitfalls when testing asynchronous code * Easy to add test cases with setUp and tearDown functions if you wish * Allows the use of mocks and stubs ## OPTIONS __--config FILE__: Load config options from a JSON file, allows the customisation of color schemes for the default test reporter etc. See bin/nodeunit.json for current available options. __--reporter FILE__: You can set the test reporter to a custom module or on of the modules in nodeunit/lib/reporters, when omitted, the default test runner is used. __--list-reporters__: List available build-in reporters. __-t testName__: Run specifc test only. __-f fullTestName__: Run specific test only. fullTestName is built so: "outerGroup - .. - innerGroup - testName". __-h__, __--help__: Display the help and exit. __-v__, __--version__: Output version information and exit. ____: You can run nodeunit on specific files or on all *\*.js* files inside a directory. ## AUTHORS Written by Caolan McMahon and other nodeunit contributors. Contributors list: . ## REPORTING BUGS Report nodeunit bugs to . ## COPYRIGHT Copyright © 2010 Caolan McMahon. Nodeunit has been released under the MIT license: . ## SEE ALSO node(1) nodeunit-0.11.2/examples/000077500000000000000000000000001317343222700152425ustar00rootroot00000000000000nodeunit-0.11.2/examples/browser/000077500000000000000000000000001317343222700167255ustar00rootroot00000000000000nodeunit-0.11.2/examples/browser/suite1.js000066400000000000000000000004771317343222700205050ustar00rootroot00000000000000this.suite1 = { 'test one': function (test) { test.ok(true, 'everythings ok'); setTimeout(function () { test.done(); }, 10); }, 'apples and oranges': function (test) { test.equal('apples', 'oranges', 'comparing apples and oranges'); test.done(); } }; nodeunit-0.11.2/examples/browser/suite2.js000066400000000000000000000006141317343222700204770ustar00rootroot00000000000000this.suite2 = { 'another test': function (test) { setTimeout(function () { // lots of assertions test.ok(true, 'everythings ok'); test.ok(true, 'everythings ok'); test.ok(true, 'everythings ok'); test.ok(true, 'everythings ok'); test.ok(true, 'everythings ok'); test.done(); }, 10); } }; nodeunit-0.11.2/examples/browser/suite3.js000066400000000000000000000002551317343222700205010ustar00rootroot00000000000000this.suite3 = { 'test for ie6,7,8': function (test) { test.deepEqual(["test"], ["test"]); test.notDeepEqual(["a"], ["b"]); test.done(); } }; nodeunit-0.11.2/examples/browser/test.html000066400000000000000000000005671317343222700206020ustar00rootroot00000000000000 Example tests nodeunit-0.11.2/examples/nested/000077500000000000000000000000001317343222700165245ustar00rootroot00000000000000nodeunit-0.11.2/examples/nested/nested_reporter_test.unit.js000066400000000000000000000043711317343222700243100ustar00rootroot00000000000000var testCase = require('nodeunit').testCase; /* This is an example test suite to demonstrate the nested test reporter. Run with --reporter nested, e.g., nodeunit --reporter nested nested_reporter_test.unit.js The test output should be something like: nested_reporter_test.unit.js Test 0.1 (pass) TC 1 TC 1.1 Test 1.1.1 (pass) TC 2 TC 2.1 TC 2.1.1 Test 2.1.1.1 (pass) Test 2.1.1.2 (pass) TC 2.2.1 Test 2.2.1.1 (pass) TC 2.2.1.1 Test 2.2.1.1.1 (pass) Test 2.2.1.2 (pass) TC 3 TC 3.1 TC 3.1.1 Test 3.1.1.1 (should fail) (fail) ✖ AssertionError: false == true // stack trace here. FAILURES: 1/8 assertions failed (6ms) */ module.exports = testCase({ "Test 0.1": function(test) { test.ok(true); test.done(); }, "TC 1": testCase({ "TC 1.1": testCase({ "Test 1.1.1": function(test) { test.ok(true); test.done(); } }) }), "TC 2": testCase({ "TC 2.1": testCase({ "TC 2.1.1": testCase({ "Test 2.1.1.1": function(test) { test.ok(true); test.done(); }, "Test 2.1.1.2": function(test) { test.ok(true); test.done(); } }), "TC 2.2.1": testCase({ "Test 2.2.1.1": function(test) { test.ok(true); test.done(); }, "TC 2.2.1.1": testCase({ "Test 2.2.1.1.1": function(test) { test.ok(true); test.done(); }, }), "Test 2.2.1.2": function(test) { test.ok(true); test.done(); } }) }) }), "TC 3": testCase({ "TC 3.1": testCase({ "TC 3.1.1": testCase({ "Test 3.1.1.1 (should fail)": function(test) { test.ok(false); test.done(); } }) }) }) }); nodeunit-0.11.2/img/000077500000000000000000000000001317343222700142005ustar00rootroot00000000000000nodeunit-0.11.2/img/example_fail.png000066400000000000000000001133621317343222700173420ustar00rootroot00000000000000PNG  IHDR)sBITOtEXtSoftwaregnome-screenshot> IDATxwxU3-nzPtB,"`|JQʋ4"RPi )R& $v7uKM6I6$y>er3wB!B!B!B9EydӟC16!)C;8' ߐEgE w~]vV%"i_8O:YTt-'Nl{p3?虃nYd$d%SJA;罹}ݔ͗Xc.gµ0˨&BѦ^^7<@ rܿ1Y3}ƕ'S 2.>k%?7}CWuץ39ZBq~s@氞VOLǗW@oX+/YreFwrF59BiʂSS2{!uǘn}mwZ 8Qwtj7Vgo6_<;Li_܎wvi$A{rX8C28<4/aמ۲5{y6/{z"ۆ۵y⌦'rF8_Qt|GY+_|q(z|^_#*6\Z5^Ɂq5-eSҎ+1ڧ̺*?;2~cN26v7^OGݾ+AW-;_E}/Vn6Rͼ*q9(Fǘ]PÏN8[b6Lb1 !a'sS90ijֿe@9gA"<="vXwKcv\v6 񅜇9ԇ]hqHYLDg+ͅ\Kݿ_t6j'?nP`f{7SHlEifZ~9K^X%lx$9FS.)r2翎3'RxwˆA-߹{ñ@iDs ܄ ݛthO(Tv\x?}]b&P`! t8[w)Bsg? uc*/93H&UmB=XrK 7wշih7SHV5J 2Eۓ@7iqK{SL^#}f]&niX#蟬vZ 2SmR2 x'J̎)`d-){jaSu~_8w%.Scj֦z͙$ٵPfY'~ߒ}I˧i$\vӻOZ~a;ԗ@tb8{;jyȉ8?E$yΘ2?;aFW_>}_+OT3ܨ'|/ٟ8q7[™qBoH;/*zҵҶ;BOow_4BEs{zֳǼcJ1Ϯz% +O{oK޹aa7T&eBJe寻q(y%7N/ԍ`o(~Il|ExT~ol^d&ũs|ԥ,\\`SO7~O:՞T'DOkZ1=ܬ/Ner !ş\z8:-9RD!ĨxѠ};۝/QߜM3saʹT~7L}nTsQ,e7̹^wĮ2)CGMQ*)\ㄆ= U7>au1BʸEF9\[:T AUёA8<\:,1,RvG9 ĴTMho~Q"< }}G~VSq_|wWY wET-=T~[hl|?|uݎǨ&R=>#vjs⠾u$/W5’{eǺu=~axJ7AWw>[ǭmq-ZyEB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B*u^3B19É|055>BN:U{i5)w#_j.cji!Pmuj߿~]!"yw3B!0/xZA d|󂻨'Ę}qՈ@IP䅄kiS %)[k4h xP:AQ2=Oo2uY(ig{xJk4̈́X/i<Bǎ(G[NأgPg^-(z;=(L.2\3v} [g)Ԙ37hyͨ4luTO/_ˍy96()6Jed+\2+(lӰ㊤dUљqu ?VjF΍Zm`O-~qp5_ 0o{Ni#HB=YXy5'q'w!T;yƄ ~*R=݉FTEZ̆z~b lЛ,l[a0,`$: |F`d)/)thrN%\ZF[9N!,4L}N!isRƆe}gFu7DF1W2iP7XQ;|\_68Sed=."G"^XTifeH*s0»{k!o:/oBpNn#^K>뺉}ٳ~ G{ܳ~!Gε<*[o%Hێ* 5B `y?gI#eG'BLY~FnKzB, 2~B qc~ Fc"Ĥ^, (|ܞov^J-#tƴc=W>`o-{1Pˆޘbۢfa-1֕ƭb?f=h{zݝ!c؀1o`JjrLcߘSl8ɺ|n41O:Y9AR8BnSVFɵY,[͏5\m"Le%(jWo&]GW4RCY|B&ڞ᜜k.a_=ek|jd1ӉB?:'-rmސhD^M\'TiZVsjJE)~S~~+)k>}̹'fȻ%+Qc{Dʤz >!>"b6Lb1 !az{̚ da<fKS__m1V)浼ƃz0ǰWfVR!m\u՝:z mub4,rYOr({saɈs.(Bɞ9u'ƞƛrF ٩:D@%OH.z7ЧwSX {iz\0gG k.G?aƹ[K^iт!R5`zu{譥{56ej^g;tx.썕57Br >(G5B!*ncxB?MDLez @ѸU B!IصgTlUNҵ G4k!B!B!B!B:7 Sg 3iz^.B|BO,`t2,x[c36x>򊪲^~TҎeYLjB۬:| `=I\)hS-3'$_5J˯#W0?B6 9 ߰@ 0x mo$\W =N-XP(L M1vh yJ{xt  X @0@mor,RYHab 0ʳ/g,<#zZ֗^)OQ@.8 p~'`hUYNްa%"p 5@h 򶇶0=.4r^eNj; |ؾ|G3aZxB)RzoXp]s)08@ /-@('pY1 6@Z%Ic  Ep/<BM4ϔ\v7 >r'!.فx `RpԙX "fLxM?(ln_ h30G@IaK^ľ|,$_wLe c:y^B=lp?#@bbVsk|W!f>&mr;4BuCC*_ lThUbފ/BO %\GS `h#P!;@( 4` "̊q!b @@=F&4`8AO{8[ @?1Z䍿_!"a3bt8I?; 0 `, rO*L=72}$qPY+*=2r)Ck?MoG W˳z3TwXr"?H$>EOB41//۟3QǍB!$˱~]!#[ @ QU!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!pi~޹ !3zBIsϢ/'tBI|GȽO[j_\_mG>!ǿT[خ<(kc7Y.qb|N*f*i? ӷ/B!`KKbc=CΞsɿwQ[Ջ<}pHW ,bR!Bs/v.Ok"mu3vS6_Jbɏ=cߗ=sm2Pˎ^O'r23334@amMgsB~hLT7݋؟}w͂c24긃syna4[|ν^I'N\EuYǯKBH~vffhLBIWtq6v9pn$`w<ۗ;os7t]Z` IDATp9+oG4teb/==Ny<,BYpj3RXv/t}%'P/!+ksV)%[ɿrxc)Wf? g|^;_uRziXl敢mceԼSEpvZ[W cc4iEa^lsrJg.MC}z/gxM4v}ۗ;oi.ۏB_tKvҚC0xBew:^WsJQrUt㥉,X?FT84,n5?pF0d-C̬f"_=4kmٚ=`7li+iy\ӰvK'Gx~Rqvz>4\1oiNۏBz,s0qtWgG]LI? }돀)??Mkm&"&.O^Ω)v\{"&^D?M#0奩mȲBv|\==?[oMN6}ܺq5ݓI:ۅC ]Wyu!B8i7 iҸ#zzVF [=ȳ;zo8U) &2K\Sf"d$g#NVֿT 9sl %YHJ}~Ѱ~,h_Dg?߱GĎcSRALCWGވ0Bue$> @5ڏBO'XwnRrrrr#NJMP_eKӋ%OH.z7ЧwSY%k!;U\4?&-"eYQ 7^'1#qzֻϒ SHV5d5]j )3|WBmmu~uv4{Ko:2CvpY%R!5/TzFHזWxXH!$/^ ܬ/rߥ,\\`SO7`}GQ*2tRy{K9콷FXu{0_ C{O:՞TV =SY|vȨ/y᛿S* !d2]dP8TܾԼFk 1]Y'!B!B!B!B!B!B!BqQGnVR-l*k[OΟ?d_NV1Ncg.~sot(Y Q< rޓZ*ߏTYxq×:n}CAlԗEU3co_|oɏ:,_(:#0Q5䪾#iek/ԠJ*D{ £&gZPd|>BUֳԍgMRĥ]b\B!S^7ps'-T}Agń?g*5(HYav_ܵ_WÞ3hn)}[_W֝h'UΆE ҿ ݂][䘮Oo*o:j M ڛ.;evFU;@Q͓'S 2.o_{fmoE_/g*7o0}g edmEx撙NzV:ħLA=O:YTt- #vg)Ww5ZmcrªP)98}JjRUa|GKXἚzq{fnkzzzLb{ɗri馫o Q?Q}XĠ2CUo%俊 k"7y(yۘf,+o35Tdc0p?YMa@i5Ą@{Ӱ e)H`]۽vHW@oX+;q‘O-1֕ƭ☹- q(6nЧ'!*\Ao<0zi;o[6`R[|ͯ÷gZSSxL+lсJKHCW%^uFLԢb~No"'׌oXxb#W9b&^YMYcClI7~oBUD|txEvCݹ-Ċ(.j- _ui_܎-NLVc kdW!obf5JvqiǦw•OǴY{p]fnMKK^ uO:Y9A2+WcWK*Ʒ)/%ʍζǎk:',*Yl͞~rjWO~o,aGtp}L\ o|>Q#lΥ;\'(£{K?/C}Yn@n\Q_aQieMoL&*݁q9cOْ;rX;.LWGZJ*4ǵfri3uv :qLFXUݷ0{gwp.&u3>7j)xp=|T #P*o<ۋkRgyd>gxuڀ.'_?RcDލ:-Lx?S!,Iۉ3#v I X l>bT?ۘ6S~=WVwo\|>*VW6)Y;x0oz'kxռu{)D?+`ea o(=ZFިܿR~1],vm%~NiUEEWv?QpW|`dadMG-(zݞ\CLMOo/?ad%O[;u(w3 3IkLѐr=ç+]} ޜa;ԗ@tbsǧOPC'5_{%s41 3[>Qu{U+ק[Ǿ9UWNFrܜ&Լ #oֻϒ)ٶ5/In#排y@Ԡ~-}$ =یbv؟~K(xuυ`E$au|k펈e+`Q.]rqBO_QߜM3saʹTٟoE[/_V㳎FmuHqHRהx*£3fۥ"3)Nu)ygdMeqNi''yYhS:BH?m!ф7 !Ģ R!}"g7MnzoK5b.H<vX@wm3%4R /n8fcޅDnJ=>ݘZ~Y8 i<Ǹc8SEh9fBѧ]2?{ڰn-[qs<4K_ [[!KVbdпCʃ)3, _AMNõΚQ۽צG"1]{af*:̼M؍wg`>-)S9*iإUHe }Pt}V κ|9+F\/ɧ6@~V>3<@/qf#.K7x|=U; wq&1^l0|٠3Ũ+&e˳sɲ87zYxpUe 5KWn捚2Ż ;?e 5D{=cZ>ޜȃӜ,G z m0x/{=R\Pdc]saał8jy'Ng+3ι^';QSUVEQÇZ_|ۋw)Bsg? ֤8[`W[:9ˢ,ũǗ-=cUް{vWz 8a2P5R^f^';޼9굞7J~ݩe9E^O_"?1quoZt*o<6oezGAظ^ɗme91iK~7@,?`5TW̻<8).s;<<.~u#2NaġNzYuy}Y[_pD+k_LZ(nwZvj9+ ]}|CoVg(>hym/<@g|1UksA_+^ q]޾\>:BTћ^o^7BOu*rڇ,+W}_(IQgb3rpFU%·z !-Ei&=0!B!B!B!Bi*-te՟r/'tjywi~޹K:T:>k**sJ~9H8jS _Q_Taw2siRjNCh?8도 8ȋ}t]svrwB]ߗ7amG>ai2\>km:/ VqG `/jRֳԍgMR} !:_G|/Yr1Y TqK/Z O}/۫aG4gvuze # B{ԻyBvoLh-\ ;{.GjOg Su}L'捦'6  $9@M -3b8~#QSUeMFoJC vA?(뚡:];'Y;6{׌ik;KAoYFBSK˳zzy}3Mv-HH PϾf Iu9<vy=]a_Pi,_^=I}w\}6}2QZzpј1n<{{#mw=.IBΏ+u|I ^z2@!gۦq8W VG=/k̢oP jgyVgLvg)WwR1^Mwj#y _x=37z(.jwzg Lbrx㟴tշ(џ(S۾{,O[<;Zz*y}$፥ Ro_ Nkqalq*LwWq6VOL: SÝZ| oqWiʲ;SNE6vCζFr 'xWEyGqc>]?XL Q 88/qy^ʽ{g`8(LIIRz{誤4, ]wzWcr1QQ :9+)K{lH)i8pƵu =* G31%.m_KvCݹ-Ċ(.j- ١S+1\tݸP{=ek+mS~)n96ksnj{߭i)z94Zj۔?|[͏5\m_LeLĻKmt3>95he|_=<qRqty^ywNvSӚ䒋ҊGI9=|E O?.CYn@n\Q_aVyjZ9w&b&P`]:~U SvN4ǵpi3uv :q~#?܌q9cOvw/<̡njC'Ç:>+ZGsU7Njf¼U? IDATk zyRW\\^/?P$ m'ԌUdycL}~^Z߽qX]nn0WWLü9˿s^_~y Rw\YV~{]P {{jgwL=8Sݐr=ç+]} ޜޒj^^\yRpTw.M1^as&Iv-<Q[ w|⇻#C #k:jF$iۑw@{PgqI1e +vŒ֯OqRCh V8_w%.c[t.Eppp#glɧ @mkJ_ ZG%9f-0,boye&ߥgҩ;5=*Zz+TF#_D!qQ_ 'Pʸh7>LQ:29ʹB[gQZBE)gWfIck0'[.ޙ<qMe25ꅍDOkZ~C%᛿S* !d2֯^V-bs|[s;!5a}GQ*2tRy{K9ħZE F|s6H̅)N[|Se{89iW9ĮqwO:՞y̽a4TRpOz;(+[m&Bg7ٳi%tfoxwn-[q<z,Բe/B!B!B!B!T Xv阷GeWNkPj;iɿwQo?~0o%kPsfogXlD̵[a nF7r;=>BRnZSXv /;_%q#aixy+[o¹ZE \!+^Xvwy,y{R=tOv7){8K]c/e mj28ӸBe+/1oOhy;Qȇ7gb#.KwIsqeɺnG xT: ^t[s|)N3f4=hkŖ"F뢐 :'[UnW|:j켝ް] _JhzoؽY;+J}u[_1>BO1 [w=Xt[eyIz&Zq#ý?}Ēf{>qXC%qh8#֭(Geyۃӱ^vcv^Tg"!Uכ;~7LB==eK#BCu$ߨ!B!jTv!B!B!B!B=xA|,_jOq_߽P],U8d^)A5S;ChS%pk;5_SOco_|oɏrYEM JߤZ嚊bɺ~lm|\R~q-P<4Q>3K( }&Vpuʏp:,,__vV'?}%B4n.ү.=و k㷢}b`\tk~tT(k5SҦo7)B2yUcLE^čZ yWdoܽ*[DV\_FAS],2RxzrKU.O+W]LBIsgjx;,__fTțsTGn.IjCsݹ0}g v@'?Fxy?5555=җSKY~=:I+ ޣOvW)GuiZ\_ɿrxc)Wķ0ʹ俊 k"KPI;,_O闳TGWE€3 my-wϵ(۝ǥg&6c,P:*SѼb8(LIRz{誤L9.u4󷩅Gn]$P +>Ⱥ+,po>r?Ϟk"r9˭sOԲ ,-^rr lMcisnaz~9NEx6OyzkxSv6zROZS.*7Na~qFJOXY H-ן{q_c=G\%|_9O!vŻj_:z2={)wOSy9|eY:bU/O+"K?N|}TWuiif[YkW>i۝ǔ^GWQWi}k͏ 7gƭ'O# pKqAERRuQH̅FƸw"EI/ +n;3~k߅CZ8j,N/Sp>DxZ9w0ijֿe@a~9N{^Ğ7X/vıd_3:m@ϯw|SUsof&mKDTP **x  "*S?2(Cl 0[HwӦi6iq~$mrMS}u=ܓܑC=O$5nbys5N!jkkhJ6+ȫK{ްgtKrˌKIz,&J-+15Jl57 pR֘YE1ƭYc_>)ק}C<|wv=zGyP a/glDт3{J9(cD,FW%wY}E|>Mr CoVn=dUWg~SL'aّ#lnΌ 8zGq/?uFo֬'@ZmtƟB׿7B7].c͓c,$IG|XaMΙͳ{>^hn$h}k>f2GZjdu~1|z4lnW[)'BH2p\wA-6pZw-{*5aZe&1)i  ^+/)uZ| .Mj$곡Hc=nrhiz>:1]Q^ed-`Il;IKǪ7,_6gHֶۧO;B}Yٱbnzv9?]@"d;k俭Ro>.ĕlc\[taXk0|>rwm\? ǶU Ǫ?l~Ln{Sͳ*cb?jz:Ckm9mbG;.o͓~͵zJdʫKv7\^H㊰_qg*DoC*Ŏ!7J:lWzAAAAQƥuY:=:eZ 8q[bc+,KfMի rqL[ղάƼ5=/ pwz0cL=4L1'`_p'Yʷr.UmN⸉ *SgFK ;w>VLyz\sR.-J5ܟrN9U]ylV'gхZ%IGPV27EOܫ:ec B}طzJdz`BQ;FWE8r]>-!~WpcxsnMivKZ_ :g Ţ~# GQ9gm@!ă~Tcƈ)k'J#4 {קaƘzic.N<99֗]Mm>F&kGn ZiX݋¥To'O'{1Fݓs_t:YQSum4D-2M ٦aX{Rb?r$V/Q\oqܟ ?rᯥUXG|ixcd7 74LU1aoAVr]$sϠ2Tu^>\xޝ_ޒck ֹ7ܔ{ g17i :b˷Dz9*/2F1MׇI]TnA]NY3˓ˑU9J>ze%( jZ,59̕wc}8)4TZk,Q]-6tIsotwEZkkS?*v1|ZvD{z?+K6q/ʳע{~0fM-`\[2"d(%' \apIc1,1JyO*,3b؛.ԇ v_SFbדw'פ)VBl۹b?wBUrNTd!R'V1/X`hD+78v KO,ߋ^3|yޓ^ CoP<׸/,&0gD ]PEI2[e%&ƗpxJ߂`4wN,1#c j3|})c(J_^/@agfZڨ0>BWGyaos;/#hc&!d.=sB<%Հ ֝ xO7MK10k}Sڔpxz{c&{IM1v,GtT,F>iߊZ16m(.ILSՃ8!hnԩ%oJQoZ@aX /hŝ/|KŮ~< !Aqyp}hݵ~ԄMK_?karÓO0Ƹ¦)c\Zy1OȘ峾^uizW.55PY9X=z/22$cM3Sk[w> XKQ@L=sծG?25yqYS VcuV;N*Ʒgsڢ 'KҞ66bl,6h"7LjZ0OnlW}$I2M:ֳfOQy>~XբlP*/zLEݜe; %9o=v/-5\y;ʲ^ ;[>ϧcϝǶ8#Ř_7l+%Nhp!.!8q}xʈQyu~ea'ƿw>®)bEVn0`\[P/؟xyR{A×1_ܱmHq-iE5G/~|8k$ɔW[rnni^aT9pGrok;)T%,Co$tخ􂂂 Kdm7tzJuuʴ|q~U6)*Wtis1mV:(__s{cꙧab8rTh7?RôǏw:ohwMUP:3XbTb3riq׏Wjd'vʩc:y\>.b,I?ʔ=(z^E0.4kOhBǾ]S$cՏ/Q\e7"/q'#m9!DFKǛ3vkJ_rВHɰ9+N~#6LӰN'K_O(/Oj/bj'ґt$ ǧ7ھiz[dHLMÌv!6~r=%I2z_n{߈㊹?Ip_K('4?Өnfm#nhcϯ߂ ze%( jZ,59̕wc}8)4TZkQ]-6tIsotwEZkkS?*v1|ZvD{z?+KQݛۄ1oXPc9[jkPu b(?NkLM'a'ȳĘcĔ X>3C2: #CeeR {x{kJH̶zr4*Wm;WA!JW,\JĪ;k rqFD&MtB\zb+$y'}j8"ƞ#cIHqyr8@b[G0 s^9|[.Ub򬋫, _/7͵{)]7zM<t IDATX1ȗ׷&$-dWoe 哟<'vg T9K*mO MXs* cqeV^xKjqƉ$%؞VTmµuFW?q|"'xJ;!%fnKoL7=\0k}Sڔzt-}sM=Yf ĊK}GʋyJƖ :t| .MZ&@С]ǼwE{1N%'$-ް|mڼ!mZR?p^ g^gNJ #zbdE! |ramMJ7m%جH[RY^sʺs_vO |e4̓.czI]Ʉ7~cKsS\V_ۿ!6k{[h_vva釶J_GpC^޸R]PC;31D1MޮWzJWzѐ׏-GvsWcϝǶ8#Ř_7l+%Nhp!.!, ᡛ*#Fս['9N*.=L1 :TX€qmAzbI _X_|qJԶE"]`lVgY<ПveloS$S^]6o]ʵzFW;S9%}#|FR)v aPa *0.[̒]))Qș寲Jm'n˳OAVg|ԑO~=|^𠉃CzSN])e  9aƘzic.N<꿿F!ODo0]>>ڝqwTΌ!vr?0j}̻=\ZZk|=?I崝rجN4׷Ϣ X/K D2eno.-WQu:9: 3څo$X +XkpuA/#<ɯg)!Biyf_i'YWرw}fg1c}.fc=~3n;zѼŰCdžido)[ I^LQ|\:N$AT]F7 Qo iSii1֞.ƏC\$IUKmq\1g;nkiU7&'5Mìb)\ֳx:.KjΎHwJg4̋zxεݓ0WW8[IS1s^ '۬QYo[7ʗGaoJ?4>lLrku r_O.)^^7QZ+-<@aVjeɁfTpVcı]MYZo"5m7qԟN*ǘ|;/:^[Z!7Wgd͙3 ps,H %SU^d=mwfɶ;&6x4ܤ{ƘzrBWGyaos;/#hc&!d.=sZx ?Tj&奯 n0'Lc\SxaӔX?ʋyJFdV/®K+ϾZպPl(Xgܬ庇Z?+ރ5?Nb :}|{8|NQ>41',6]%au#1IgMle_z>m(f170ol [7俭҈ 9/a;'Y9 .d~ <Z$aga K.K3*y۟Bu8¾ԲF ^+GK7eͶ^-&d*ANUILSu:iY203EG Gshʌӎ*/zLEݜ#k>hV\_wFO N^*9yl;+Jһ˺[Oxa_)6`\uza;c}qdcq_<*<1œ/$ų|+onT16*:X{RGu9eZ]k RW<˱?Ko]双bU# Jir/Oc/cO%j.[Ҋj063,a;^2uPE$S^]6o]ʵz3y<Pa *0.[ni/ 436^n!q~UE)*W-ڴ])e\`%qA qq. 2R}٫ĉ4X"(Dh!ŭ;C%wgP+x4Lg'|+o~KyGӴ8n⮂ԙ</O>LZ+e=9n)w~x6ejHSgtvڛ crN9U]ylV'gхZ%IGPV27EOܫ:eKjB7R}HILU?C8jGq|Rdz3vkbC{/9thIct=.B!ɰ9+~mVhM(Q>+_J.KΎh[S.޵iXҽC<Ci^֏kg P<~ R4XFܤ ~>޾>#fvkr'j5wĽԱm}_Tot74 CV-vr ;)np<}8y Lq u[<;o6+rTJ7ʗGom|}ؘE4Ȗ]\PiلiMn/GƛV(ze%k( jZ,59̕ 6̓7fYҚ/RiiC7*!\` E}:˚pʷBܭ_>h٥e^g,Sz=mwf6CE^7P ZcnR=G~zCDdTTdDǗ~⏞Ľ91;lgK:r)>SUaw_wngG0XH |%ޕ,X>3C2: Bj=;D2)^Iׅx{Z;r%m$BTI.;&MbsBȨ+t" !<ꎁx1IX1"_8!gO7./T:]z߱2l(Oo!@!CO{yuw3YsF~2{LY?\UϘqhhi59׌S~{ )3z*k}q.ħa͍<n0#}_ž_E\~o,xd j3|})c(J_^/@gfZڨ0>BWGy\9ns;/#hc&Z>KO:6}圄p1-v"x5}JxЂ3{J9(cD綟+~c.Xˡ}9,ޭw4BGĐtN=tEB}7;'t[bg|TΚkӻ47y{bmg9xR/R+{{"$NYf Z=$..>#~R)]Cgl5[G3c޻=5H+q+e+6m1Ӵv/|c &AŪ\q|߳cuOdY@6gHۧ/[M`Q>4!Yאw?>u]I8}go>]89@q_O.czI3Wó uӄbۏ*~h62//Y 3>./l.Y',%ʅX~hˡtmS yzO>fj v=o'妱Qn\Qyg7z5Dz!d*m3_y+w@K`won#~JsxHP^ClXIy?sPU ON~9!3]i%; uC}ib;K?bʼn/6kjUg47~Bw_aQuc6.7h۪_ ~nᲝI>_ǃ )a;1\Kg |hkW!+7`ЇnWg[w4|yJc}*Q$wJ:lWzAAAAQƥu;"nOeF1\\7* zQߍyk#II9☶l: !Dw)oq:D GF[Rvq'y_ƳcC4}wL-t㣤#˴ĉ4X"(DzY [²q>B( {GoBy.+ߝfEb2F86޴z\W gQ¹{n6E;f K˯p 'ngCyZttoo\}Bָ@1U4v~VbL:eqUJoPFnj{ -!cۢ0b]P9tzKο>jrg*[~q]Μs<0w,:UveZq\JRW^O*,34*Wm;WαVt|qխM"{>1:i{Blٲ {0k,<)N\G G~}u!d_isn͑BB,laޯH3loR]Ig|;H'׮G(\\,Qeߔ0&ߗޖǺT$騾kqFymUHQoR- D'J>LRx/}Q BVz#{:#4..Q O>Yf :|q~UIDATx$ .Maעcl/.nwG @T_}{EWz 7bgņ őm+7ܨz{?G!DOtPO {LI& cKw((D {TO_k[r$?}~i/Dztܛo6'Xn{gñczy+cAiptQ TiDoq#7)ks'2}v#hťO/m*WBnW5(Dw2(LÛK'UTN1'`_p'Շw&k EiAOԟ.UmN⸉ *SgF>3s:SYFͅ|x{<?zZ9LäᴝrجN4׷Ϣ XlF/K+ǽn;'d柆/{zsڹκ\~|&4K־mx>U.w16NW[ӞBnBQUB;Qr/ ' WQc@;yʂĢ*%BQB.-ʭcn{ ?͢DfŴ?յn4)*PU5zL<7' L}->!Y˭{tFl,`$ڟBō,/ h \gN|E.ڌiN`}gȬSjÈn\cQm6kn`Un7_!Yw[Ucn8_x[K]Fא7_v\2T?6"N}d6pqw^GfU<0B]En)p87}sq;{ Mݜj0 F4yΠA9}U٘~KD}8}BFӜH7S b)ɽ[se?l .1%z2!/d,~ZY-?;ɬbm5B.M.VO?p"'Yn?Wޤ&Y} n@;kyܞks=cw+rjrg1vwd0`FRjڲ@3W*~0i $Dz9*`Tf"(_B+ יMlw\?86޴*GiLW;|TU0} wؤfAWS4՘~3TUp}pYi#k:ݟ:>h6ItɔZ3Zm2x>&-LơB|#2;WiT4K`2#d2ި^SsCo(1zsЫ?),ϥqv5%[3jl$=do%ϖ8Pq{?ONܙoxխM"{ݨ+t" !<ꎭ0G wJ('eYnj qLb+.1TUqwe< 8~BׄGی*vJ$kue4ũœݜôCKhZBB2dF/}R>=;S^qC'F[-OJ# !X CӂWܻpiOYLI֏AS'7ް#;~tώ<$ez!o8BP(tŗHܲLK:8w\[W~h|b6"a]qX@KO:6}圄p1-v"'X_Zx !e;R{1Qn%jw/ۗ2'r?4 Lj(ZؤՇ57R| lpst]7^޽74 bzDN.h#oa{(3mL^` ޷}@7 ^"w#)D?){͎#`poҺiۏyc1qōxRBgCGP]#z܀`_[{N:lQrLYgBHsj1UK|쓶#=nšSUc+R<+Nګk[e|[`fg+O<{gLI_33B[$Ō::`e?Y<گk!Mpo:d5aG;>ohjq-G<>`ٍN%}`{=Skb;M?%piIgX`zsү{[o]>V$^mt$~|!7pԎ⪔! w&kIvС%u_Ex/n+޿tb0v,[og~nl+\8rTh7?B!%ae)s{xsiQĽa\2>u_-פ&wܥwW֨TcX̀Vč|!kik.˲)w0C3Ψwo{h]9H<`3^??To4>⩊iQ 9?q^څzD;Z$IUK(mQq~pfi.rH|'Ҏ5t\0󀺆'Ԝ`_MÔT]ƾ iSi8 sCTN/;0lyMF}i _T 0u!5lq11jU>qm$O":eOz"Ǿ^Ο;9G&oּ֩FHMK$ćJ9H}vgKkT7-}?뭟l79}05 |@k0?<@aVjeɁfT!Ocwv20y݊߾Y\7}!ƣBȨqvs)=.a1g҆-vݔ6-ܴ'Bڻ]|gVo\^&ɳ˕rX ;͚ [R>Fv=jUrNTd!R'V1'\ugH^-Bq|{NzB\n5Efe@ B ?>;;ʃ"ƳZ;H۟;fĮѽn莣ެyiaԔYhX'f+$̟SʡDq//#:\eRyQ.]r}9,cjz/.Y|Ī#nWIx>an'?C3n!C>eG]~sTlۉc/B..Pu _Bj6 z^,tSY:&:U5 dTl/׽YT $4 2 KE|^c Fr7gW`"YU^9zwYPc+QG#u=}B5;z`l>`6 U(x%gTY ExSN(sص[:JLȵ-E/%FM+)WǑG^0\EQ-]~H}/#%2L\ 6Q~?1]Yi_]#8bbc*ظr$m 'Ra1/c.MC+t/tz—5c79DU W,C졄ܯ} bf.A9 﨔V%kyӮ<\<u [XPؖ勤%3f\d[<@>ٴËbJn;m?-sG@^90 8Czܓft^7C3~>03Z`qΚ6mFW"uBCW%3u*3Ϫ;X*)rjI݃.ƪ:9FCc?ROcժȪk̚$W~TRn|DV9(&c$.y˥W2.XYԭY}+yL#GJG5pZ~dJD,wI%oIaƱQ<\~[~t}54[#uBYְ KJHG*VOZOcIf9oSN%~R(Y  WGr #WK,5J ;50*hPoMF wk@죶?; dYǝ; fL~Ŋy 0a%1DH́cj<+m/Z9Pn^ڿUkKsͽkyK\ Uawzj֮[GKWcڋB7sDդ#ca!Ns@ࡕ< kP絏Fr= D,+VAV+  I"ʶL졑3<&C]CoqePd]Z҅Uͨ2znKeR\!:kdDYmU| F =nT@d0ǣ2ͨ}C~=ȒdIudp|#Hȟ#ٌ<6_/cjOpq#EmFp6o>Ez NC4$l j|L6~H@ k gC;X1Ţͯ]r!B՗SD_?Xa@r8!y"!ؑ j4Cjq+b J 4O(soO"g$mGv/%}T4(6#wc`[3_NųguX<Oh\9rLt^>DbQeȒ" OL3ҟ&?~44#=aH-daگUId>oau'l!}j-Yû7n߸)nʽFѫSRee'Wd: oO"':ENZq b~_bf?L"n5|`/ڜ-K|wR6-M8 鎱<`@Q15'L%Vv&mVJS9WE 庘j GReLjmcuC?ze]}+Ώ}"{2K>:ECMKkքo\=snf3/#y_Mgٝ+u$%f~|߱pMno?!ay5?Z{47PʽGUJ-P>;\tӯ~=&z-/ݖٝݞ;yÕk =:L_~ruBṀ_w௽/ZLE57Oouц%oG.w<& (}vG Jȫզ>1qK_K0 %ܳ~,,M[Ͳ{uzǤQk̽Hl[qfF3/ux"gB x!ʾΩ" o4̋@(vEHu]1AoY{XXKIe'Js6ܖ¸'l:@-]s؛ z`s~+5Dt3-cmQ8_ţgTiSLCN~Ƃ6-qM=8kŸ:s庨jvRe'봯м/ Mj?VMkh\2Si/mY0 ?>XX`Vq`k?)~6V:4{Lѣ%EB/0iNA h !z6 yE7BW8YQmż*k4uEY,`KGeJ;D@\¤9ACI0@K2=͝!v&bi{&>#KAz[ĂRf{<^oVWW8 A>Gɲ ٗ6wz[Z4InF uiKK=>i–sY3$-S4[.67se١Ngn^g@l>LEQiAiP"t3!fKeS43JpB%2Nȿ??7?ll>R,ir.!OVZ|uck{-wygL;(M-x4 if=#l<< " )2TW{:tاۗ& ygo_!m.yp+;W Ƭ4~Ι} ၠ%w/H߻a@8M촆| tk6`MuS/孵L0n}RfC2t Q~.\u{-n12鳍 7O?aȍSOw|;6i3dȜ"-}"Z3-,`܆M]&d|%{a/W0?nܟ̙=6 Y'{׏x7V!l=e? ذ_-ğVܸr,|7 mYÓ?mobA駗vaħ7 zvZv|@^M\3f >6zhWuQe;+/*T #^H]jZḖ,1֤goa.K+̍+eByB(($O/;a]jPl38!-F;9 #J5i$,h{w7n?ǯX]"<xYюͻ^ D+-BP _h:%9AR{yѻWfB~}Qa?=wj hE_7=ԟ@}]#nhw 3tǮ5s7M"ƏRGiV}~ӸF6ZSMnB̄v)~ǚք |)gRqpH@8w'zR\;-f"5JX~k_}c^seՁ^(jVaF=m;w š}&tO5<} ~ytz~ܲYԫWAJأG3Otj#:1c[<мUCy7Ft&@~տHqHw']Yv,pM쫞뾷7hDE[;Xd.s ~z}}Hݘy KX򫿂fZ@IP'E57 ~ r .8DO{ɪz*o{E}W+|~uα! i6B'r%vQY_Fo8[#mB.{cI5%ugEcC4cMEV1/"A_Fe1:ƠbF@^m%$FXP,}UgM4zh`BH.) |:*u@DبS.9rD(  G/>ߛ3NFA>wz}q])<~{o0|ԙ}} -_CBy5ȎS.61D,bWcސYI_9d oܨA濡^dG~4DF:[I7Gkoc@k#}ό|o8zIo9dF@,}~aWL/00_ЌUGX]_DR$j?Æ3 lZu8x囦H~X퓇SP;ߗiE 9D-C%9W_Oc|) TH=lWo]Sl ^yB\ݻ&V 3G5!{LH>e <-*0ia!aa'#:SD{䷏j` 14G6[_%,߼oUUS UʙQ;OZ3c.p3!@򋳣!7 >ן!UꙓQ;44gޯ~{_f=l\o_Q$5P!m㸽3MWɷ _4qhh<u] ]w’wLdGvn{&z%{H$t'][rۅ#z.nZ]nK')Wgqktz,rsP#fǟO2,A&VY%Jŭ%bQҖIy(#ۜa}"@B]T ,[I8h}QF_Z* >dJeK[lUzf4&H4HOy\[ms tjIӨ$SR@ k M((T)$V:;RJri!Cp"RA:f&(Z.ҠMDvՍu UQAE.O8{[&.DňrirxyY\I4%Jj ե4 hN(UĤ"JAP+%'$bJR "H]J eOURQ!q!8Y7Ľ% ,h!'#0~EE\A}_ n94Z솬u>}ߟRݏ QM y}fk;q^w>(*9XtE=S*9 /0,$$/|3Ke`u y}fked^}]"9[ G^]ڧibaJefFIOmrRK+s:R-˔t$B}=D۞cs}Ѻ9;GVyvX2#xw%ir"oQL+OgxҊ8w->ܪ{iIn5DşBmVslKijαt9z]✠kN z(^3e(rz$ G$:BPEt0GMub(~ZZf zRezlJ! `8\1o1,Ih$45h 2,!GHfHk&*)/oO Dꑉc1<|THacV#g#%O ,_5ԨCd7gٲπ o.g VGtZz3+8AWmpi0@`e7gƌl۪[|aloC3&m|{X K2R8W>=+z;3ŹJn]+Y~,G׷‡ڗU;QW-CZ!AyWnGk1m;V!BǦЀ 2nNY"H̊8Mwkת@dh'D[+fIiȎ0AF8g[dgHZ(=tJ0Ȋ޴EMQ/nڜHہ!BgH@DPZ%44ԃmk>q9[ DOIYnWCf>Y@bIk4˧ld" @y!!d v.:c~?k/)Z)sEϰ $f*m2L劬bIԦɔXTEWFc 4r9<p P9ByZ?ܯ6?)JXcEMx0*iF IDATȐm*=% L <UH"b2}/%$em NPk? z,ua_?_eJFA@oBXѢ#Kde`ޓxg{E )1Z\ * 5>_յ~˩;bl􉙃۴b8x/"A 84&#[ߍ_X\:ކ 8~۱k?:~K؇_6v H7{%`ι_$g-nTSyX" *ݟ~^ @>χ|ىfonvsTَ0 őQ¬d"ҊdOth&,&}Pķc76aK6XǠ+:Fr؜-4[ ۱ n1vasg z76; ɭLL;~]_cOR3u@tMjIL٨-a]@Z |̳0}ΟЋju92lӧ/FLϿ?*|%8TQN?^PY/V[UPT-˵|)Z֖1'e9pYS/WTMa,`^h1I<3KkO>%Iy^z&<>՝Uv+-QSYG9BJ@lڵM(:Ne3piDzh./8\ )U:=@ȃOjtTݦ'VgJz̞93·廢Ӷ(l?>tل0wn 3ez!;FsWjѝswc yI㕷7׀Rwg~F 1Ji_~Jvm% 18`'e>cl=<ӓg*ujZ;2{GO6%7/hkN~n'k{I|b͍?%j7ލX*w{w M6L|n'ߙt]CK(-;=/ɿW^!UCAE7r5<L=o7S)^iw?=Z"g8KgK<LFs[eCQ*,k.TJ3ė( S8 v }dF#r me'h, , +(Zza):^)RkGVP.t+sK"Y0XsMu,ZV+Jyt (B(%`HE'9ld>3?y?|~ܶ+cz (tjYس]yq[NSNeyu뵹|p*c[)y^Y)jCF}0'𸠒+U*Z߿ti%9PP.+=*:}*ūiڪ[ [s>_Kr?!_xF ]+CaH.WxZGr*OVc1` 9OꞥXycfr~Xt4QZ!k&TRPCc* B{{;%#3@fs~\t@;ӸQ!ꓫ/:q?Y3(rS$za,)bU^5JXrNIɟ&N/bN+d=8zKUOڞN|X~MqAvDI Ey/[. XtkG bB#Ujݗ)>UHb`=+&(rSX`K>LNPa<}a0խs b\s*Sk;Ja?ni!wYP]+wgv/o&jXWvcC]QvRRJRiN>lķKϤiF[$=ʝZ[^eLq%jpJ UfTRjMKgՑ:E/=m$~q: dDH^.Ikq)^Ab gXSa5PS@ѹ$-%G HJs6K^( E/Vp !~!3#0w #C MH"DS2TWdUa S 5'\깾^)$1 )Wjj}a5@hn2瓜\B"+cTLq[9)#yG!zdN&2+R7$劳YMC^8 OzQ. I֠#U1`Tˡ3sГTQ~)X&&K7757CqFF q%XB0QR#N> jOs(OjOsHђVS%QM'yjj8( O5z1c[`":W8DR8`!k&Bi<1@Ӝ@Z@d;tz|[)71KIKOSge&g0Vg;cXND (ʈi{WxN3Cx}.o耜K OR"kW/?OZVf+R2|(=Xp7)wK TW8zVg;طit`Υˎ?T |{늼~=t_ O=cOC|\Oir(ӔRB?HN$+35iznVj|uQտِzM{ T@Sg=HԠaMEs]+f AiJ|5 8+39%=SmB>?arz8ŹԴL`u}ߊ̹4*`uٳ&@V7s1YC{z_>H2ڴR4cw0="՘"1*—ˋJ^ ࣷu*vDoy ٔD #cya1-ˋ 'dԧMo?zyrE&8/Rɤ%zx<% )&25+d,W)he%,qOlvIR bBY(U! 06 PҲ[F6..#&RwU(ϐzBYҳR_!u~ڷū6AG~^jk2-U\1k8ܲUC(hj@$`@T#l$!yFI[$Q-[603=T8Ī5,"M]Wt_Jm4?UN_"`9qw(3fTRgΚ-~?-E!l-.ׁ[Ȳ5Mk䎂͗VEB<ULyTADZUݢ62Y-A6eŕ*Y&E%(JhʠXȐpgԾWBU!Sh4:QT ʰ L 0MphWk "^`b Q˻kճ< l8iU;fƃ͵\V3@qxT%Z0>:dpL={^:dpL] _ESW^CԿWAFBNy"uDf}yQ@@6q'%A[ aۺlWz]?fA9JQp|ӯ IWx?5D.4wbK}֏*áTܙ쿊e^e1U>r;Ȓ+UuiJ׍&5 XQ1CP$.b: "8ũ(,$Oȧ9q @=eE VQ3C4MD4ɨK!dES4M[[R- {z".h4 BDuDsLo @EY>$cˑryQ)U晴DIwRDOZO;*yzCC͇zsN>EfxGLU5Ց1s~Rv 6:*U%5DA[/p[ZeH{=!oGOrТ)s3 >ljļd(c>{Xf)sw-ۆע107W-\F 3dqy6^8wL9ńn9kنAeyv2؅HŻXd/ߪd{ڮTqꦏx MBN jܥ] [}t0WJjxQo\6A}T/D~#ڏv+8ATΓgK*6Kݤr,>}V:,G@|ȨZ|䦏ş9n)nȮv]-8zv?sj v^D5F\t@(ͥ/uI8H 8hʏ |[OAafվ3Z*YZ x~U- y06#؁ELX'ĭ`8o1!n=|P/ʥIM ;)WܚqSyӮ[âF^;rG6ȻTa2-D. ddF5.G6}`Q~嚿}Z%Bj.b_$O(,#FrBc!Jݐ%@Qa{R+t\(^Y@7,l-kc08"dye'xe_qv梘e#J,줴R\Ǽ\!C'&2=y$#5#Wd`>1xwD~`[Jɻ} q1AV\SН5;rʘq@?Rjq&/6gC"\xe~sIw||ay~ȭ_#'Cr8 %7AG:l鍃ZmnC96T_#9iQG+sDrI^`/>ML(;v}P.>wcVwʚ Cb_g{S/\vXr5m$HIk_.u`]Cħǿh(we&|@˶$zʩ3yHe1|N+/%8LnK8]C${Oen#[n\9yvF3/NQ=nI`g ~qc>i×=ԢPr~Wˍόe]| ?¼3\ e)At꒍/\v\Sz ͌yߍ]|~s-C ADxv߶I#W=}/.IӒ&n\/l Wnvie9caөChn~zZ3OdOn/haX+5bf8窵g#2m X6aLr0%z {ba;S#6#7uWnqKnQeG\x:;&%Lɗ+*[c=W涑`0lۑo}0$m.ë74:p?Svdv]Z{iKoθke25c 0Ct䭻綑ģ YzM&[q3ܝŦ ԥθkU. $-Y͝s{ SދMop>@Lވ4f?w؁#+zejMV@1^ؿ҅&=Oob5p;va#SލMopLg`I3I85Euo۪Pk7G jnا& ygo/2C'l7uɃ^ٹƬ4~Ι} 3͔%w/H߻a@8:vZCnk6'T&_W ebzk5Sk۸8弑+w~:svA4f; bn?ϞHz{p|¶ShLㄭ,g?3Y aGQ=`uMWZ;5,`]udϗoinJDJZ|y#w q- )w?_}=,s2]dI4qQf_;3( ecךk+k_5VWq]uEε[$lbji@A}A<=>7meT3ǎ6\:'|[['8 k4 qkdڌ 8O=  ϊȠ?)Ϟkɴ&N&vg6ιӜ!.4`Nkw>-i˚Q$D6q8I\dJuJ<5a³" "^^$Uϼ=!;:ufN52;Ymd}6%";ŃCFXgWԭ 3[kcw}LhfeQd_xT._"ض6$ɠ9(/ip1>Vȡ#Co潂G> b_xT,}5K`?~Y5چt{q6íI`RE4:C-AU:֎Φ%»R KUeAAjTr?;.bB&4I] 9UlH7azOgy iC ~V  ViAAk3yWp}e " c;{:Y*@2 m4y/N߾KfjR~ b&ΦmM(j?xw%w8MޫeS/sbɏq1ࢧc6!EWw9#觟{H}8hpY5 0|.r8t/>FB" ѭZS[S޲'ss2 =@@~M1fjmTO]ØM~~3e8g@P\g B0`T%BϪ$ڼךWqי_L_4_OP98Rj%E1؟]|jܡjspѼ~CFZ4Ȋ 1 =:|R_χmL=jMp+a2V]~82+be$/7S&*.ūhXg:0g¶Aoz{+ ?3=DSر cߤjK,Ii_ lqB]x0:}-8:I`ϘO1ÐU[!t}SC ',?՘V Y \g]NĀ$%&.>]:jѤi+'QrŢ'Sm.Q3-g]VMNZ?ݳ)IupڡCZ/-I`7x ̎5(9XV {+GFM DSDvt6QH{|9ŧ_kedytωCo:`Ӏi mbt ~i 3'\4w٦QǗwbu 7IS ng(?1lPɂcZ-\:؂3|o Tntlb" jix>Z aJn5VIyL=; 51>C&uĴ3UztJ oҎAJ@AZ14 ­Y3w˛ӼuvV y- z- @uR 6WE:ﻩTck6>6x!X-X:؂$WCFhwD32=G2_mAWzZ#qUy{[p( lzg9e3|szlY)3Cf oE7&²JS&$tXb=~ފ~~}|&9.OW F$ʼ:ߟ!u2sx+CC+[CR=o2 l{rD^d`eׄ(/XRD+}z)ŏ}1&6Tc}" L2ny(~t%Ե={-G(ʾ>컅 _9 Z l FȨh[WOR%(h26ŭB⸓rURWCnDRRCC%%v tUjjeE']:/zuz \?{xۯ:C#q)7uZ1ӌ{V>PS. Qb׉9fֲ~hhQ3w۲R&6Z:ɕkTy>v lNW0ggy|;x%Ui6sQ?NN'mv8Ӛέ+yoowe}9ɯj MyQMy!j~$u5DݣOG0?l]"lY8oع-#< Gw#k X$aRTHf B#3c*B2D曀pϜsnN)*Ff:5}dȘk3KO'<أ4gT"ű誫j1tɐ~g\+t,[kY]kcHtSiX~ɒMv8U}vѧ, R~Ā,}r |,!XTVLMj@&RB!MjjKsksJʩ#Λ{Tյ[:}$H&6j(]Q >TgTյ۟X /iPb_d$*}8_a(w=+j  F$)U,#Hj#W @p/:~CI5e@-n*X6t Q-ˆI`gnz=錄n\kUgjˠތg5h ?4@"]|uc3ET6S,(ϕ!ծfS+P(X?7:$)MTE104>v#@>[xXR32>Ѭm];5cKq}(J%VH0-ͬi]/UϞWhuRo]l36kʼnޗcN))onJ#*n$OjѾ=Qew2ٔ<&aE9SRNو5I'VNt$#P#&402>SF 0Tn.Fb̓kH@)6H %ib*4!RV@p,Noվİ14M]?@OZ/4ֳ! }RuA\ucZ;RU)cV5+5HL]^+Q)!̱\V洴3np ]/H>.d8S5Fq5N zXj0%݋G/)} ({|Ĥe ⾫" UoICXXQ \*S2ʧemtKG9t^6ԻwGN_3L=/TfI!kb 46>T Ljf!B=b¾8l~M͇>p>Aħ5o#;<=VmVK%fʠbBĔѳ"MUB&T}[Y 7%R ?9=S$ S؄6fߍ-lFjKM|&FyRQ}RȺ-?%AVfޙt stξ:! +bf Ph-*@X*!h ` IDAT5ٹ:RRNA|uʫlS^z 3n^trFDHRT%9eR:!b@='lt?i>iok\h-=۸N/m)GN=?{͕ qF@!ëMsSr~h&o'cnYFrR4nd}b̶2m詾?odu3SE&_x߾c^|ŶĕfI?XK%R· ,|U>|gx.ATxR|䀌JH;)$aFS Ћso~[s | G='dtsYm(i&2i֢3#$ŀ(<[%qߎ,-):0`U>95),\鰊tJY[ i\vNt )@CB"o?tIF:B1"2PM]ͩuNկ-FOk$V P,Dž_f:\l""B.6ԁt|4S?sL9B rYҥ#Bs YvBKڡ`1riE z5sk1jU6;d(P,n'sSZ$% -R%+kajMsjy*s1 2 0-_! ?yQ!uĈǶG^|J hv-=13h@4V\vwjZO~15Ly8gEXQ0bK }-dl{5N\ԊRqK/FTDfh( ;ŮbUuIСKid7@ZYjzr{w/:d8 ՙ\!5?[\CN)n]EP-Z)_Lg^WpCZx(fQpP 4a$ϋHj_uh]Úg*Yudt7PzU~o3]KCm8P9̢P]ͳ4ɸfB{vv]f1'Н6Ik=.Tdpbݙ&|&}eOMKLV~pr#tYᎰ,1&E:.[=2oÐ2 zXB"_Ij!Ӳw韶ι)> %{3YKL|bgq䑇 t.8)r@2=3~{b *3KMW-ZFB6;w3WӬN|,|ljhAPM&.{eσY:[>|;{_[tG11a)Oz/::R +J ngq# G W 5}g^$SM xvJZ*?9`^擢t D̰J%E% QyS Y!M$>!NEծA_)mEZ=Wiuemx0x%Ggz#p}Y=훓{˩Q*YVeqMV.\L}߃B$tR=0Ep9 h$nAJVerW.\L}BsVgl=z\j?ض'f]-C@ol2Oj?1vʼn9={Վ6&@^I>W{4~ƒЉMYߑ5>Rf?ۏdžj"%փ* hh:2r=d ]N K:[SR 1LOX1vNMLM{4aƒЉϭ{Ț@iasc~>Kq]& S"1 h&w(EG-٠QHXK/ h RxK=P_=sޔJ'$IiI%(ܤOK$+y%yi"}4K<ݛH#9&-28a]Gawo|^ₗFI[>L$7MJO-+Rҳ1ܾ2d^Z{>iyZlu0##Ҳ̌,v& N+;Y&^K^Kc$)z}'ˉk-7߲rsŅg-|[ef5F?D.]vHZ'Vy+f7ype9@v7be=wn~9mö4vG6Te(~4YH_$Wc۷Y>+X{Vo3MkBݽe &r6KfG" 3^+c~QNrj:'V珞9P =|HJHwRl>Ƃ;Y&>ԫ^K`*LsX99!ƂLv~vwm'c:8|%?U^d8|pEއT&; '# BPzN.G N-ג6t ߵ;VnvV2i2@iLjd'TĤ2!-)T<SR':99)j}(CN޵"1}tgbJ- _ɼ$vHQÄgweˍcx8mZ&`yQљ} bK/z3/lqUSv_|?;51hϧNW9//nn\nj33^˩RWJɯQw R6+35'VPKK险 JaqqVF\5,ŀ^L"R{,ht7kyCv? T` kf4y\^rKcKwl\]!75\ s2_+IR}NXN|]@`(`A~tLU;?ۂ_KHRte+Ҷ]b uB>yQQLozʍa7R"쌴*Ie֣%d$XY ofw]kJ`ry9L;A4XzHyLvff^NzfVFA>A~LlU[Cd$fw=!yɉ/ ǖo3lp2*xT@~*9I)ՊU|''(@Hy}eO+7Fɥ;O1BҢw14Gѝ={vydZ-xiLkz=F8iU!+Ғ7X+&BW-ciy!ɔ{fzFcA~LǓrc)e)7^UzYb;W ' iۘ ZKqQy9|BZ!2/UyTbB ܮے_50%Dl1t'7HXzjG5"$OrY3╻6NpsH_Brb5|w 4lwb^@s()r$:]&y>yT[؇@Dd͈+7bê%4$V Iĵ!xy+4ۚᆒ+k_*%1[ggU.uoe(2?T_Ve_k ,zDT0qUT'#Ի1/Amٌba\#SB/Cf8p'K9UIjQAuL A.j,!F9zXR/V%5[dM%шtF(hgCU$N~8h|}V3fh%smQ"[=?z g>ZGԯ;"T㫘 u4Wb\7xno,r/Poo?&E.?n}W\hg >_Q]t:[6`+T'BO'Z[W6H5.Y(ǟ rt6.1 >Ҩ֯o|&e0eGf]5~-҂`,%5D5 +_w4_l0i! D:Vn[T]^O%diFK# L3E^l>=JnuIC#ՖIF\U7FAFW_JpQciavHWGKB3-R#y[?'[:6Yrqm ҂WUR BՁ^9dB'ؓivkbLiҊaGG;Q?OQ(ǰ#jӨͼ5Li' />8ym~6d_u[vrA+:1Z=Q-2mȜWSJ?Ѝ4}§]2S8 m-|~b Lݖ{05󷽏.UELqɔluqnEg@ämٛ n^_H쎵ټi3j)cjSOTn?;[4H[cWI5Nswuy5Oco%p<{w$Ã~[VT.AZ}7nc遁 k +{!2oGh'ᶉwF/O@vڻ۽K  "}FTKIG5]Tj5(tj11qs-,nE~*Es&Ƭ~a>nӧt TM.c n["?뻬) \l]Sirpҋ%dg3/<y7"؈ydeܨV8̄'=yYrnՋ4mW#JVYqz[Cz!HK=Hb.}]&H>Hf]ƍeIZc&!$.F~DOɇKޔtd*^I.GIƟ3w5A*nIRO!>m}֎ǰŴaOULF!Y]PTx6 R *9f/(Z+O4FPk淨A{>z{}|yțrw}ʋYzQ=w9- 1|Σz# v[zv;c[Z[{vɄoILkxs j5en\~.$lKeq.jx~yaM^5y27G.#5yCѸ[|vaFmG{kє&8+-wb O v[&6}#\ 4uQ뢶F6W|;e f\x:LOͶâ\a;. OÎ=w Mc6MkSѪeUg~ZvÔ]\dD!X~sAr:ΌRC|MHHۢiOgŸZy:w7i M}ɤd}T6'?]L] /[ܪWŝ(~S3SUڈyϖLiofh,5r7#|h}xHfotX;0I?,8x<~?}MU [ts#H$} =X릶^qc٨e^_gxG碚w)# lf6)# !2@nzew6=*!.,N1v~(*}&>جEQ|>c7{{J,*D:."5b5Iq|ÚL`7j\7\!J3iCJ*%c }V\4;wGBTV\Z)%[6Ɏ]:?e puh눐E/2؞v]&$|1jlEzętڋnhek^bK#ßClx(orxWyęvѺO>I]M@sz4]׊j;.HKޖ 3&x %;BKs{Gk8^$qbbwDz_ 9̋; `W['жE^_*& -_p\ZE7x,%K<2420=E蛸kpkל}C~)$QF֒m]'υtH٭([VohYn5)fuLH; Nѧ0 й#D]ɬg_8UR%qN+w [S!C e Z-sR2ogx,YnqG N!:JV 1CJ*<^Y2⢓+m Xr+%J&omTVtCKCVLcC&Σ6a ;th^̭].jiquQAf*1EYjrNbnD>$Vt4/~?șL'tYR^X֢ڌNb2<=7}Rw)nnȀ杸H!sS֫jUOݜZv}CL|C!F~d~ӄKްs..l q8EN;@پICxZKRN7%[ШAHVJ(Ѭqc6=)r%@m=w$v7 w#5MrMFE˅dd'kdzȘ*ǛKy&NVT(R[kan@$X jH&IJ<_P&$,䤣;UL^ ϖ8|G,>0QmJ;+6^S=?#U dmU3pUT|f@Z[WOzYѮɷ̛GUHoO7so6J~z^+-IF&Lr%y.ST\LV֘22Nl Ta_>#MWˇO8dꈕgt&U(wRDzK ZO_[p!tmYbT/e)IeexR-jó?+D_Xx H7E:{]ߧ:^M;7Qn!]*?W~M 5'$ncgX:b͡#AOt;l9N>-8J8iŏshs']ȿdT'xB8TxpX.by2OفST4bo6lڭyQk#M$7M<="wQkĒBVsS@ #t`lYs,PQ@W+rs1A46<>i~Z}{g:2v,?+09{qCM{NYdcfvl+2phŔF+1 u.kg}ڈcߔˡ~gz{x)lfX%]K3}[n+!NQM58ja'a>J:4{۴vd ЬZS3H? }I9R f&``o ]Kf&:zϵ_'lz,AsYbWN,0@5kaN3?<ե8ZYF뿡덋y!*?=٬cMQJQ>4>jCTnp/E ,5_x9ͽͻ^(2}t(1ekq6-oąf/:˾qHo4Ҋ3?Kk ]c(5[7  f# c?qiO,[H.UsPǻb j*Z3ͻh?5 ݞ:|#ڲGTw׹'of K?2oPx&Jo{Z*t4pb(/,{#SޫQ*vnR&$a*ܪ}:{ib'Нk?2ﻨm z"!}Bz:שv|NML9=&X1s:&ڷ/[oΟSM;< #kT<8q۲Qd;>dj]U1${\쁒s4lT HOH* xҒK:" IY~JZz2b2SRqi[^/I;Q[7-^jLfzj!2/+-;/鉯 dއW!1//%d0)̌4fOXd2BbNNMO/SsiXT@!񲘲>4+]J~LO6(SzmX9u۹Z dއ$vbW|HNMgĠ-Yȸ2)E,VzJn"b2Q._V9*~8eϥ:ψi$/ᭌDg)~8ޘWAZx2]-#ϥNfLq^R -o3еyR ETKdxbHpvZ1;/ ,(Lc yRYj9wnL|<)WWoH}˒}&lWcA^Ttu;»jCyisJ Ἴ;GX gfſ~[\y)ɬ||{0θ:,b@v7YyWHgNZEZZVVFv;`qɃo\*mY0V~$2 E[_2DS_Xqh]k7/|z' Vs\/Ϻ[f'#ƺ),3V,VFOf9|,13R3i ,6HՖveLVXe! /:iAO~Ǎ/)k.LHx>J'Ve03''$[BϰQT!ELJɯ$$]yY(} v5 vM n*hL3IJy6MoJxLV&S\mLAwΨw켜<>ƂLv~7]OIWb! FZPoBmF_g4jko ֻQ}t5+U6k+R{$ ݐFD7=غ%=1i=tN% `$ Ð$um;ӺٝԩbV6x|ɷn$u-~RߪѳN5Z[n>3) W}˚1jZ 94G_R?[UzZr\ NƔ u'l*(}Z_Z+m ߂ H GoQm[v&z0!UcH-5H+Q\-a]_tSWj|veh#~}:n'՞3"#odQ#%E_XQ؁>B-b;ip{g]Ы QboXPA5|1L4Śc/ƨX= {e|owVfx9wZz/95-&FR[{cG#WM彸t)"m} 5(7sH\Qņ\E2 $K2hJ}["c([-R~o2mM!y[H$IB7u4E N #WL~WABlTT "Q"9j0evX \/Ƥ7taBiiTQ/FiI4 DH8haJC+d5iAu2lbCشZceNoQx2h̑5pʫ?dc`]?w÷urT ʏlz>֍Dy8u\zZ\fܮG 20j  s\pƅ`eX¦QU}#tyMCvXĢ.;Wܺ}}?a!ԐnHsگ졑]PwPJ޳~ں利J$ PHc'VHnǞu҅2c{HL4\oì<0 7qUTNȚl1x(A@9^Gp .xPuS;h㥦 ؘI%̪U׶宫ntΆV'D%dx}Llevm5$;66קf=kjn>91x\Ԭ% S CbuF;Mry}&Ol?#f?\ [ 8T s~;iD^m-wcۑczK1ԟ t5u꜉3V†+]q3ՃvCg$t\Lu޲ MVWQxd0FX3yH:RQQrgw>w|/B6b*.U*qD035i6pS- 6^{M;V8i|\1_Ӆ'"TCCRVf1C,9sq#]!ytb џL9?p6飕U*Q1OFɠ9d0aÔ"Gո&3qLJKZE :ƫ %D5{CT 35q@\E44PS +_JSb&:KXZ4GIhkXU.iL42͹ MZRfA%R)LM,Zbb]3'HX?t5ݫWsD{;ܾGH[YRvKڌuyj>YWIeu6 H7i0)Kl,z3Oʁ4w{`t2~?WnUk#6#~^;=&m8DMawwҕEݬ |%yvHMܼ]\,%)ǯ9CeszúoFE;{9n}[,n w{╅ݬnγJ}23:d9M{ w~]_igw{^?FӘkX(%n5$l ,'yw?~|K;._' se!m{n9~u7NAId+DPzd“+ 4~ v6B6:s[3޺ty:db هGɬ? nʼ? +[_&eT[8nɳo#c*la3?tO\cޡ}u?R' Xqn1A٠a|8ۀe+G" v̐oC(bbwN(m43J}"ɕ3 ='#Tn~ҜluƘ׭^w3nf=vd+ft,ѕWVv?zK0Ep߷~,~9q6QsYMqnO{սm؀ʸr0W !+-"45hs&.-n4`ދ˫Gvn诌{' %4͏vt]G=?.q͏" x~~\(sNj;_=s0-[ B%r{?DsHTVWq;*˨ng3;͏t K=Ft)vt7~05BUN ¦C/hn!pAJ5].P)=ثI nqY+f!ۡCCMHT^P- <}a7 l+2cW`ᢡ;Mˎ{H]YCV3o +C01+K%w/#wEÂ'VN(,g:Frzlvp LXxW=tą@±=lҲ@+JC.9B waMX.Mg̃[N\ 'S&98ߤ,mk)Xȥ~6/Ƭ_K6Ig)rf3 !A ,Pl\esW,sی'@+U1I|`PR1LRi՚QWRS^ Soq;90v#"+Tgɤ*G6PrF¾gy ; Q$V"+[䡄QWR%Y{{X _6ver]K~U;ɺ!XQldaY<u|WLO?qn<-Ѓt>kٻ9w=[(̌8@KU=:6҃ @b~IiyX*(/*"*:yP GNP窥<SkL kDR]:}e8}~3VБ6/V}8r]uQ/U-ZϚ?}kkWMjV: eMYSqkO`=_Cq,Y*5?K!ҒBf|' ]; sm̤1"4g:8>qn,4O;k;kHM&VÁ;'yaiɋe/% IY?SGlDΎ0gQY[#_+j:0"Y,"$p!|hcR,# `%F*pIP۱]z:#-_28iV (Irv~qfM̔RB(ɝ: :9䬓ұN1ظT$iMP$85@Xe70x*?1+/H",x ҃FR@hHrh7a7||tKtel)J\ K]{uҼn@sf<?A+iPVքVOS$?ַa7yگڙi )KI~:.ʬCRl\IHe[<%ئ2ۼ1NZ|Jh @4DŽ>WWM E-k{)w ( SGR'4*8>IArokKn?hԼ;[$MsfT6)COzTMfGo̡*N-:gӰ~.fUM]᾽9K+JX#7Tu)X9Kt9,0Die0+Y43:YIhֱsJ"OxYߎXΟퟗeʄs;'O5S?I7l>Y,?;l:zv_!4U#h@߰~szoiLSl+"D'[BdIL/6kd}u]5*MH K0n_S޼M~+߈@e-q_~T p3}X _6)-LDLa³5 a^zŒyU8xٻҋ ANtt}7w7V /=jݎ[|q.0aB/{V)C쨛I>7F”Դ*qŻ/ qiQZ.eONLMHINKKHkr:۴(OyUkN"9bJ{²K];w x_[_M-yY%B%@oXT?/=&v~v ,1'%@ZGHu3Ǔ Iiٙ)irғ Rzw_v]y˗~\R$ia³D!COU (zVN(/ޝ("-E7}Ujvf6!AntLC7_w]yC4i @RnŒZ @@Z]*;&-J/%Y'갸"?95=9/HuQIޞVҒzڧu݅̂Onr!etAQخ/S3R2䔴Lr &ɸD5F5T%JJ3-9_*ǯEܨoy>;\'%)Nd%)@ٙI):ߴ}3ۓW et:#!"&L{dK'X̓ZMȠ#(ʋEOvUk7qv 5| Fg%)zJ.#-7'9==)_P k{Ÿ蛉 UHBԴH+RR3Sۈ6)5%3d%%f D(Ez$ȉJ6&絷5()7:ա]Q/K}dKNH/"p ߲,H|zC[ ԫ]R0ִ+f"=l¨!C=gImIQq!OBSKւ.:&1^BHn%h`oՏ7B+OVCOGс l+o[B t. i>6K˂|QzՇ0!Uj T: ._y;_UuBJ4GGvqD)oKL EP^&.-NM\=|f8Lv, ~g2c܌xWňo9MDGV<0'o}o>d30\O6MfU1A'9iBzx)҃+kw|숫 sciƲߢ#:k'*EHe Lkyާ"vd@0Et4: kM Rۜ,nq #PI ^ !1r}Cfiċa0e5%L`cV F7_T6 6h!\mį|3.7o6kZhzj4z $X`43_e( aڵ1;-Z{p =BL]-@y=%o *EzYfDRT*zI)*+^֜ ֭HZc1OO{ 9$##hK*J곰t22He^Ssƒ'ϚR IDATy)nc5C>-n3X Ichv=*y=MqֆQmyTK4{,1Ϲ4uʬ~]JsH[O$ jGEug޻}nքq\g;tGcӆ-#ugy:tyfmUk#b7}lGIۈ7ՎWO..bpW3vC[0璞D2@t:3_xw)le3ada!d(ܼ/{r0W5grɦ+Ț£ci8YN~~ `yۥu5wc.]Zcpeeޟ7D_j͛v8=6DO4>}g9zd+gw!~Opg5(R>'ݭ ź]n>E&Mܼood?g+ ]s>\` ڴoMvEf䒑y6q-c1<"\@oҙlhdP,{dL?s  `=o!0֢k/ 9iVtq0pT3ZP^v_b~ L+5" V17"8&`Zޘ9'jraմa6;q0a 9 l.f}'pAiYyQLJ]IwTD6RP !5C5y[µ[>W(mvz>5or3#e>-*WM,+| tL9峽֍YAJQǂ Lzg{E"ZLZ~㰽ɲHT^P-r>~&6/ @Z==nFU]{vBwƮECGwx~Qv V.'ߛÿ{QY²9+ev؍%[Y[e~0tLM7oPF4pAB+Ʊ+Ȇ>54v뽳`\-4=}h$r[}7!?Fɇ\QKzQ!_o@+/lk;Sor?=9,WBevCGMe#lX^[<D%bIeqq~YTUqK/y]Uޣs[zpbOE.)Og-J2s7?t#z_n94OZϿzi6@K/uόóqU?$(*Xʹ/*RSK婷Jh)QOl<%gˊ}q՚7E5U5ř%"Àoߺ]O{ZHҌ}zd!.9[WDGƓ²Eb}6s4lqEuLD2>R ܭ+⪐!^֔ugq]Uޣ٭FRġ3j~bQy q>/H{1ku#'VHi qݢFAAџT$Y{{X _verPȈץ2ys9vu/ߴpd`m*[ A9Fӭ.t>#`za  rȊ8Y\hHʄH,3-Dk35lspUuD J@, SY 0 I1f x sؐUA3B*.\Y5D*uhQuu˂ LLzZkP9F&JjZltG8d̆fCo@rذ^UNw (ȹeAC27g_+i"::<=3?gt J^, M(wMȂiɋe!3d:Ap%KXŰb=b JħרqQ¹fR)1XH D$K`DO4DM18X qP1ɓ&M!ӹߞsX>=[@).9c!YYTb&-IX6n7q!Q(RcB!>.I@ZS&~cV D|Z^cfi!*JAUd `iTDt!INbun=/ݬiߛR*77xdkfV׌:C/tin:I<`rFH2AلOh"` oI+H;lpFT2Um(J5Ov-LIoV:%UjYKDYJ:Sp U 9şl-,ax5M$Q?(ŭ2a]<Ȩ[SF@hVIsd07ن^.%U0Kǎ]Z[ʮ2Yt᳗G9gi#/běp8}KY%8 < éŶ,.5|DIMwdA'ic:wZjӀiˇ[&\}=}eЛ|~ᣃw PsW^ ]!WWM 9Y6wlpkP/||0. M]>JAQ'MI(rur, .`Z4/ĹhY{xyy;$ )_@P4*1u_k@`vAi~r^ˡϒ23y*P/ ܠ\ӐT*nuдwjT-Be%dX*~ XRUvn^S<_0m10 dBM% VbE_ Xk՚3m^`@JɀϲkxьBK( ÛL i+A\ ( ],*a0Du9Ѯףz D~ &2ؓ:'BWqmI"Ӈbs8P~^`_8; y/+D^vc}6l䦟l"b%FYʋY#7dK-1.8E=:I2͗~y\ rI~&e)uphHmR)>5o$6oy)Fbu%״9+m7ʪ\a1Cc,Y?ӀSiSJ[X]\i?4pjyEA=;poy'a~䣽K4# H"FrI~&e$TW|?c.[Hө=M_Lϝ ץv(m|jyϬf?+E$njMnMxru:e{Լ;SL,v}^ȳdXTgau&ܐ< vK~F~K MDiW/vcx 5& wf' #by8'j{I9!+cC,`57>'x AiwɖK"lgCeH1B"1k@8CcfcLV0BBwĺDzq"0ˇ, 7+F#5m2] :W=ЂzV:Czu )S SSOram[΅Mo(xg _Åm ZGO`q:V?HH~<)9}J̤QaFʪ@04_Oӊ%P[2/Uq/}"(Ηr rcui{wΫodv).MJN#*=JeI/yJLJM+'}$Ȏd}smojHRTGUfg&f,7)9-1%=1%=1%mRJz *IJNO.PC]dsoOkk\{+ aQ9fd5++_H)XP Fo b`=wl 4fngl>v`C4gh2R~,>l4Q$'6 #N@6D,o1JKVt3*?R #Hw(M ӎuD I!AZVOGr4rsU iz#g[!HOH`5ZM&DyZ 1l7Sh\)3 I(PݖnA3DJK2fC 4^ꦿ*~JT{ZTjjyP !Pu;$.f *%4C|:!ѮNJ#+.T X 1@ SWt~2 K|X', e6b4$:_\i^ E2W^:7 J5g}Фl!Uh[Cajuy{xC3gn0C{#9H> /9e,pΈNUG!M$4HhXFE(ch'b2u.Ҁ1諒5Z,L'VQyjEx ݀J!Y &&ykY7mh[´ ĭWa%|MpX&3jb`  1aiX F3XÿvPC1_7Ck4jG7囪pw|7() g'߯D̀s<9~A#>U!}} vTXvc8] >U4v{웏xHKOUjjKŨkύe"e\1\@@ Ѣ`(&i֥z(2"<0jjT/6eק.:j>~wߖ(Ԕ3MB_-/}Rm~J; ) d+ 66sB{zz9cPbsnKL=ޜjlqZ˩g[l۷fWR^%ٱ+o,xرtc2i0Nnj' E/{ g8E<(ȴnבKb8 G<,Dڶ@6^>,LU17T'"H{Hg̪U׶V"-uީCw Iv\*p^)dڵՠ6츘IθY2 a49!x24q^tk-RCI\pu𴶸Qk"<yk~M ]ئưs8|ӈZbJEc}ѧG{{3-1> 8{1}q;oͷ=yZdhG m=MCVPIMcȪ d 6ӣCSذI(%=zvw q1E&F-|ycXݷj1dyYe̼ımg11U A\h7xyGw{p9A$퐀R쎳zpx=#d޺rᵪ4!šLH;%Xg9ۃ 59S7OzeVu 0^h2]Tid1^MmPG^4ZG8F/TSi*F@yte jj!HC nASl~OD4q֩ syYP(\&5)RM"D#RkԦ9~fT#);ڜحſK.Y(5&L(KK G~ߌ`#IkM#-+a݇'1q%!HQ V HP­"H"C 9q&F:gL+>H'}-:sZ£c)tqWNsGnlG>;}̡6^qu3޺teAwk-na/vw{(Əmޡ;uLxp[6Qh}=x_Yȝ \X6mySN&<|vzGG@Y. sKjՐ6磲2YN~_8./IJ nwʸr0W3 fe޵c"ׯ[S[B=WN˸$X[ =Rn|tOmatn iB̭aNsݭ <ڙf6mݳ/E nVJfnKV pV[;F1aǯil[>A9m/ęnRXx7vY"3qr(o,ĸC=Ka Xq.ԇK}fo.c m>q& owFGa;9t&Em{n\nڛ7#Hi[z넒aޡ}tݣY2[qv:䩴!9{r##a,+-!|8,A IDATT2:q`-G_~ÃIr}{Х@O8@g߽uB Ka[;=|&a[]!ތO nވ;'\9̸0^}rY/,~01 {Ý]c m>y6q-rznw:]<2 & O >u~m~:Zuup!GS(C^ȩIB0ȩ{k(.wd9楪%Ow1K q;M\9uoM+.IǢO$ br~5,ї+-]-l"wD-B*F&@ ַwaj{? 7,Ƣ~a$` /'}ZNV ևYW޻ts?K@s;oV3gwW/ۡHT_-I@e 8Yxc7ŕ90thI/iAz4{ ]P±bK5Ӆ3{!KFb;ܟqPEN,-Z۳1w&Ote>S^3v77<k!YnϾyYJ~G15 N;r> 14 r=Y=PgnC8xOXx=Ǭq@sKK.w /Z<\2Ɉ3)I~*ntOXu!#/!t)Uѫ^5VQ+D\ge!Br 2 oz0떘|(#kUW0sv]}]HNvO^KwBi=;^cV=tąQ M@Hߗc@mjUS\ A~Ԩ!&HVX{~7 $* C/iށkxcL? -?5r*PMy%Yt7|VN# [D'W.=I/WJ$80 z qsm8犫)7ylb:vq}BY’* kߺQn'G؆{Dv'ĖH>Ob,/΢S:{(ӑ@NO;Dƞ:㎱g K/rF?|x΄S +TgTrE8ߺYQn8' l9W\{|r(ֲS3;{*PAJtoouEP#X^օ<FAAg|(IeJޥ0*ק]\!lXmFٽI7$T>jy!ӢȈ7BXs;G?-cS5O?^H\q52c-Etùg <龢Ȉץ5X<}=J,J䚬W啉j(8N}6s4쾞-¨1P*MץB(ɐ@.l9[RD] |xQWһh')ԔH´Gᜥc,S5be@S.?{GU>g QPQD 011w^[5P;0X 0צKzaqv?8s߮o$J|#H%26SR]b :₃\ Opfwnf%.8O{+od'%+ObK(\ ><*bU_bT"NuI 1+ʋKyp\RY`TK7,畍k(JjKhnsIRwN= ' mS8yj#ؐ+d70W(FiOH]쉿fOPA$NoF6UǦmp\sSv5JuVucٲ[{Wg2~"UE261g`Wd0TEtߤH$Ȫ\VKae#7pCz#b & ou0&iw דذ&8xG!͐tBx ;ź e߿nmq7ʐ?cKM'&{Xx++dJ>?cK'&Cd˾Gnۼ'8@y7_ @+.8SQ&5@_,<۱e_$Srr^/ JϤxT3wE>dg['ߋ'۩;l˟sro Og+%NZgN!RZ Ʊn:{2S6Fq]K/5ta8 %UcvtPf=Tk-FDL% >ouRLyI(Ȗ:1 *ơk^ p:=yF|;o;TU-L>|> {Ȣ{k*dKyWCB <'qX9K޵(D=?ZYTs=ŌW#'tB@h"i|7Lm'qqe#_zwF~;o{T1| MPç> JD)0zJAݘ?'= t|" V9ک- ',]& $Xvm kf%F|vlv_Q0naJd2e6; I1ڹ) 6+6)N= C(j-aYiwT`$q=_R;y.] F~;w[ŀsouA+ n6{ǥqAH+r S&633VUp”b]OClp qRQg|)g em&cc oEl%5e@ЋLd?=7w._H eR1%LT ,c8JQ~lGmlɬ]*1 O,L8G&}V|Li g"n XgJ d&2raԹ9vuO enSlGmNx6Pya=VIH2j-8_fZ0]{ù$@y%SC rS8-\eg L&2D&P0ft@`_Ȩ]Sy6bᦀEz]|^LfBn=bWC0WEGj(R?U:sLKkOU-ߪ2K~_O T1.F%mH.Q-X#K:̋Luwm ȡʦSG;;? ^. ~(fɱ ̏ʠusipx"`?N̸29?/አԴ `9ɩi951"#R;u&"k|5>O%yCPMaNRrzz@|Ʃ=pRZ5[-*ܾ%ɉ"f1bGF(+<hU?neAJҷE_>z^D.JMKOέT^D22jm'KwG zjjF "7;95Ϻd>NE@$*kǶ}J)d!̋|g]x"r Efq`rzjZFrP6o 1 st_. ʲRd0lrR23S3~Y3WQ+݂7lf^DNN?yUĩe`Uf'g3(EQ&bEFӺȋbED$u`븅"ZqCHiYG MsY&bGFӺȏCMҦSG;*Ρ#b-`h7yJQB @> ,ae9Y陙FfVqe{l:Qw½"ӽOҁ273]u҂/o-PfYߊᰩ%Y7ƭMC6H?MUWEoUDLQD ?]OXFJ4{ƙkO=ӫ3UCypzu晲5 (3Hsd=ݩLg85u* b/?%G#?$ӱ3Bf+H!@w@jS )Hz:yTTMv쓣[^V}MAʼn#lj P5PVP3e: Aӛhb@`}܅k߈:h5uB5e=NӰ6!5 {*L:JGph9T]P-FhFۆ7y׷PSN,+(\ɌoT8oN %G̨I[H*,ƊpH*G !Æ|^Z"K[IԷTkGc$MNr 5x۶&ӥO͇ldi[ lJU#okO։=) R3*$DQSv}KhlnݔaQ* Y([9ADm4_$Qr,Qst,)),OuϭPQlDJApLA}JF΂ ] PAZH%:Ӄ:bPDHOHfA oϺ#?MA9UBrԖ.ݻw}[զB[R9{B|Z@}ý v",|8WڕR@X/M;ӼCn! 8L:;E I Vs/lNєvaCu"򬣼!B%w+m0둼Ya4Tis`VdUH6(TgCUԢ_kXmf){V>=u]%Q?D=D(*Ǎ5iRXsr޴ c, my2K\q]?@fiTAAao!(Yx#LFl6& X@U Xz2T1t@'מTyhÝ`#lLR5L\yjljҕ>H 6Yuy;u}:Wg|+JKG <* >cX`wEPʻGiKU5*(n{ u*b5Rwx4l4vU/ltR$5ZVLT_aw=H=P΃zjY|u}{w[m}9K IDATY{7hD؉mZ;u9v S'H]~H &^_C>{5ɰ.ͤ7Fюh=qfCmđۛG1xXSoY!{X+1z+ DiyrN5ʳ[L-sm9ojuY}[?oI(ee5\$b@ #PњroVlDR$".ʜD"4H ([H/ݳwϾ#F6vpsmq{tcA9nӂ ;ǟtr <לLàϻL tC@zׄwȪc=~a݆ȯVXOfgLuLˈ/tIe~'˸S~.mNPsݤߨА*_@+dԚ ŎAVXUǝs|x#eo7vZEMƕƶ9_P)PvιtNڹU^'Sku豋dݧqv#Ƶ!bW &h"vNɼzǓ^i/s(ĩEj,3f`)qrQERPX7MhVQ;acZu0Q6*~|`,>1vi˅% zY.g#j 3+ ’~"7CsH-*x1TZwC+{$:gwZ^Jշ,+IU{XI?5Ha#QH crcT |'&tp+ZHe'P (*KEdַTSVf/ Cfb')TF*Pcq>2<7RboUfڹQGP] ؜")MJc@aUL $^=U"g4SF-R[oV8v)y#cc-_\fHj:hLD5ª8j.YU<+VA27zSw9ԩlsVo#~ڳF~93ٰqT|Y7ђ:W䮚м&/R6kSo=I6Ң:>WaE ٷ`e}N/Wq TPM>zUp)fxmw&żkx"eyP3CJN 4Ve#5iƽՃ[P5լQbMvSsAE.O).=^dЫJ^ٓi3COa Z4WZmR~ 'ȥ0LуL ŌY Ht5 Pd;wË,S5r>Ws y8Rmج [ U2Әmͷ%ulL *CbsѹvfR'FS7Xawz!ߙ^YrZO{\" CD,Z}`7CW24/ouǒyXX#* y)p-*S:N+'$2fZ""=+)$jn^UMܦ$D! ~ƝIe\K McacJhl:+3֛:ֶѣ]=}C +ʪuVRc 0ِ #D,th~ry$33 <?w`{Ѡ_36,O3%go ԝ#JV~y)?`sesgh_WpS$uEooVOrӼ"p>H*PӼVL_o0?DK `%&Ƨ%%'&sĤ$:SҍaSjMW#o %VaFjLǯY\E!(+>!5BUe|OI"ff;[Glw/^x\x&MOWŃ-6I4"f֣GNt6WYNHyt9O:!&SWE?܍ Rd4P+̫[Xu|XsP<2;XCW@y`dfPճ"xWyCF<@ڨ\2 ůo'u1N"Ş&/qJSғWF_}'|`7œĤ 6?pFD$w#ትĩ`Uf'e31vYArrzbjFRjFRjfbrZFS2R+9FA΋|ߩ5C$y.̌{{nWG)} "cMsBeIIx?fWe<6n#|.j}$j ?%s/Z\/VPjL`W=f`kSP*B Tߪ麨7DCT:hlHI4v} ʲ%+֬(f*-uѫJ$.#9s9nB4L|4 %_'W Rw/҂yROny'G{R}su?##LHCD֨K5&J"'3VAL#'?J֑M-geqjsHzj"#h>sl)PLc ?h9^LUԄ1ʒo{uf:Ȝj&f jJ=%*KO!zO~Td\6[G KX/A pAPsΠA!VSl`Tڶu|*]nq,ss6oRT⢺֜+ RhE H%G =R˽HʔVt;Di5nd^ U1O:E@i9ޫ.҄MBc͒Ա_&6HA5搨ƇN T2tA 9d{j @^(@Y30F<xN?M2oSPmg?SԔ`2෋;P5>q@}G{o>~֧Y82Z.J]^MOA>T3j俉޻v-\')ho:zvFTȑ*~^hMֈ7ǸO*F lJpに.teZ6:^ZrM0TLQN?;Xq;tz9<<ý{L"{wӞgFRV [, Nx0`{*%TH#H&Ŏ8bk" ;Y(m oӒ25{H&MtZ x>%L/?56I}+KPU&6<饉'<ꮺ"㤼5^co]Њ&Z=7FӟCuЖ&AUS Ik.mこ^2{4w|RaN</m6煥.u ~֏D~~~C͈i[ ?R!YS}.Lsj G?|t‹Nqd99'T`j%15bD0l"~w%B [t`CUn0IrIɉ}"%A?iC͈zj$Ծk[1\$<Ӵ7SL~?7U6G~_ߩChZU{>KboBL+f]W=Y;'7&"<%$rwL~(d}_7|kht"Hy9jQ '_^ `P[F3-=9L^ #Vonb|Q''.8ˊ$ 2s`? Uw=)HlС6n;|9pT0?ymhX 5^i` (@odJрN5 kJ\ Զs6f^#ؗ6Pߦy/EN(y`_~ iٖ8i.@E ڷVBqs_F>Lmtdq U'_gb\Fsi7KJϗC34PZVԿc|~ّ+:o}/|L5ϸ~F:IJ3TwI"#Ni->$i%/)7֍$ ʆr9WW>:6H٫{_X`24vtn#K*6(4*-C(&4 ,i- .z6V r0eB$6*H^#SCmBz.^^\+Nଔ@PfRJI!H nqs~H"%]//[5zN+&J87tP^BZJvaR(W0CnٍS']Ic Wv' ^M> }ơբw?B{c>Z-z.㫤!_e?Zi&?Ww`lL؉>@02(ݣRnĽwRDo+'SO{Хe@}}ܛt:3dCxwʼnw297-UL&(i~!z:ZڟME4l'mrhYDks9h7_]55zxģc3*0ktчHXO7}V&;ݝsl0÷_LBv|eմCpd%rN\.ƒƽNZmr[ɵC92lޭFJ<}WKu-(ݗ9Ctq6BE{!Jt++'~ǧG$Yy4NjS~G>?~rL+-a_:d_AWm4v Zmg˙ )p7C;0}VI|s/ͭ3✇6N ;:&F n%hDx-海'YW뻩o#R[;2,U+ڸG sO}{?<{~;.s̎σ;s@O(96Z|cӲxo}k#t冷=?Ƃy>6leIe|x=&AWwR^<3-oQ#\ mM>lӝN:5ϓ]8O\z>q~z>Q>6 HID澾z|OCt-{ܮG.}s.ms;x ?=.,)fx"{ܝ \~ګ] mϡ(6C֩Qٷ>Y@ E+YV6d @x Rxn*Y]L22kA?PYZi[>z5oߘ u:)\z5f[o.`namZ;u)f SW:~zq{`o[Qw-fijxxw&/?oׂe17^5-; pc ӑ>ȕԨK^߿^͢}nye ;?~|~ۋk^8Jj=kӫ'GIm9kWO< o\N=!J$zvd{7VҘb$rV8>`8PZteױO>nCM%?ÌKG[S}}nye EȔ]Lg`Ԗ ddz4)BitܗP yspk-:-f}Ҫ1t{tܗↈ! ao.#e a[2aI'_F@#Ds\5?ťuu玍۟-j G1xan,{ڽ{:׺Sw 6K(pI_^|xL֎:PN#'WQ@u_&X- B"viYrW4-ZcumFϙkί3rK #v7cʅCNet8e 9c]-ښkRW+kK"@e^w/ڎ=m9AHib*p m], ڶ@{Nm8H|xlwX2RDV%m}It_ HyQ _gVc~d5i9ZvvP]z2hڊf QTPi6K\ 0jnZKꙿ(j  r)5Ć avLynTq8f\\z9>M.ޥ(_1DQD}'o4ŏ%9=a?>4WK:4ɜǐ<@]K!fo'3W2zKu/s%y,<~BZ/Du&v4ב^Zt҅D|YvGjXlZsv%:!#&ty9uƗV: IZ]Vܮ瞚us6@=筶|8}Wќ|:UnY.[ŷMhTvaCˢ\} f֭ ȂY~a~Sδ+x::hȨvOV(:O?YsdX. IDAToH d]+>{ЏK{$ eQF:ξGQTnq f@>Kw'U>YhUH^̿Fӗ 'Ӕ(ոӔ+8';^8B0г=Y89U;9*9Qx.画gB%F{¬Oȣ7Wz4ƚ5^uab4p/kmYG?O 'f.8Rͬ[+1XŹ5б|Y7o+k[!2#`D^-_5ڄ䳴9g[G(ex u#-_ui]bA= *, 9i#{u(ARS)Fm]־oA=F2GHoi!<2R7s'9n+kL$hGɻēFgwj?2a􉴮;Yh@"N._5Ƅ 99ƅ(ÒYa\~qKϻNܒ:M?z8k_~ @=h#IM  ,FRZjvYJȥN:P4.2x;M(8lXM-1ָc+V`}~ rо\I& Qrȴ9udk Hiځ[yuYúLѫ79}E(}[##)F%Nyw-%ʾTNyY"w$O}fމl29gYG?o 'fg<^Qq%!: e*%=;M9E_5\:֫˪֯o*]˖D>Oe_Yl%r7uzNSN.gi7s&rڭ.^$iz KWq呩4 ~:ҾoΙ' xs$eƖ@y3Hez-^ Y,]א#q LO-ߛZqٻFDu~УxH/i!0Au~pD-?T.RvxQ[ƉՖ18JFQAYmC> K&@1.-Ks2'@l".Nu^tSWbV1l"UEnn;yȔX|WW }/uV@ĵ? ^:zT)$('M!'B@4E*X35 8Kr&y( &P0>JEhVڶqp*wqjkZςDi;2(`rɱ &ثJY t;ޏ*[yG@vq cU*6zثKkSq@cG1g2 >\BŮ.~W}iCg̐ʎ;T a8M'_A ׫ P7M M(IWo"*k1U* } ˼G$LS#Jn⌵qN<8=a#[Q%` )E@H" m+wVL ߇ȅ. ^Lm>8cM{D)pQ*DQ%Wv1:ծ_GTAn"-ڒYnPu㧅GjHnS˯JKSvz Uu<W dyQ᣹Hn4JRˤ]`}"uA+<}5/C7x0ʠ @ [A[zWg Kfz .8Lia3145$'(m.YV0W`:sv)> OF.6|U46<@+Yߪl?y߫'n 9< 1MLqݵuƦ':P̻ϭ) (KIhuݵ/"HfJNlٓi3W*AZDބ,@(}A7 QNVvNA2Gךw |N^ʷ._wB']!zHCRJL\l!.-jrk'Yh ԳqoŇ^PS{,0tͷcrB\puԾ~\z q&6k:hՙp Յ/|G;0L]YLȭAq9 ɥO= [ i[!s,3eٶ3:Q\&q{g -H)6uч|ZNKw`)Ph͙yBdC{cREIzJk[6mΕ Zg3 SQW'N?x{19 ٲ}69i ǖ:H/(@`6lUdA9OS,ۉvIg3ې`híJbժz{`~D[v~q/֢҄2K uЩ .n簳 _[HUaqA}@u~kKFX٣,\΅7CV6! !JNo20L"XsooXrg)Zp e$uWxiX<pzΕ_.~? {y&fiohWYW[׸SVn^rAfϚ*3/ϙ%UwеVXvAde滍`F3176hEIzde-7J<ŏ~eX<P-.b"df0 6XMS &5o_s=lUf Z+' *gh{air)˘~QΓm96~>7 mPc8 ~9"_a5ŕcFO/6g]Q[޾E+ܷ Չ+qk4Q]lGk͖yTN]*;Q't/"MnefVP_Gcu.nΪ/UPFja|%cPx͛Y2K 0>=7wN_tO;^;K_m1,*~a%ӥW?=, JڰQ]lGm18K|xN*ʞ5n=R( P^B&W^ro@ ʨ8J#}+* tq'<6%lĔ=SE?R* bw&uYy(&&Y`wJ"*. ,M`wم̓39 C¨ qWMEǃtU"Ei(zcPy>rK ҺN{m\=KmJ+$h"eL :v.Tol=ۭͮ(pIQg=DQpݧ#*ϥ =eg ̦(6ܗAy`Q`g}:9Vw+|ḖK ӺN{m Jq#{rcFtX~)h-"-c$zEUWZxU^EudFX%p99lNsQ3zHԦ0|́ ӺNwm\*PIO0g<[g UeoX;[l੗5"T!VQʼn,pn4Jeq yQ6P>w64 lR@ª9HsqJ*-G,2Dj.gt!8evXpΊ \%p\\U*q sZdw|vvkԪi\¨%[.#Ǚ^摽 /mrpOW[H\&~~F;[xJΕ .=s>_(#D_ϲ'sd?I3p|ڷ|\HÕ|[t.d&pv% @7/"i&Ş2sk4reф(kNXDbNN~V"`e?~8!@ظ_O SRh)͈ۦc{S;ՁV wPjs55@ IDATxJOɫQ9<9#f$:o!p Sň8} /d&INe0@|",Qq1-<_= # =:PJn.Y?'2KT q"<^~Xelj+CFFݎ*X_2HvKbeI};|*0j d̄ԼjXYNVZzFF^v:3Gg2i,.͏bXt{~x~PхRr'%F5PQj/A 9Vb ݌_2~_7/*a.$]"Lf||ⷜ*S>]+)3X&FgdsEFxQ:0r2y4<2Е1qY9)i ։YWB)x2(b} O'F>aѭ2S>]Z3*~}98#11]z@SDg0fyu#QE!=Icq0*r) (rA4ѧ6n挫vNHaE>cXxyZ習M!k$Ծ?DሯٹLTQHKdTFgQ .f,Tbe9Yl:3Gg0i,n$:.:7/2U:wt>xR< Lgz+EI<7k*PH;"Xf322%ہ#{{8V-\y!=I+48TE)wenvMRHFM~࢘DVAÿ2KH(}Ts&2/yRI# ݨɏvjYnV @XEnVB#R{ߗ!/F,d'&V)',+HI _AYYA/]D$sD VT"ͤyn1g58yn1DZ/Z@s,i"XOסl&sYtq7Dric}!MLj=&ku`9qnh#t;KVBMGBN.j?6FMHSlGCfu;PT9]Z.1›Ϳ|ͦ9xK' δӎ{YT'Y$}uㇾ\ `ӣM0G|\uH'V9-lz^bIPȭcp1P;4S~b$j*Q $KP}6"j EPiѭ;Ѻ Ս!/*1`B#Xk U}}\/mTpGu$*~1ͷufdHL*[DM$oT0xgo~[$ΚէQP%uֲ`zqv&򐖤;Ѻwb^T7c&':R+YJ!dO{JdM巪!ڨ 禆aj༔PF7Lz}@Eo 5"n{ Pړ6zPcԷitsԅpťb] [ ,okLnń-fk|Zx4Qb3e-l( ҉Wˏ4mO]Fv޾i8%X/7om;'ZjU?P\v =:v2skS[0MUK/PLjU:8铮?TN+ɅM2TVkڨ_@/N1Zs` Qz[0Ӂ~LJ7KoYEDOca?Rc7;cZ_(d֥ٞ}G6sdsW*}|x!͘{w$=I:YHGTT?QnLq^K1ܛϮ:y`ӘZ>~l9Nlk5r56v<@Pa-oo!Ƿ]ܿ7waeu3TTi6$O"%O$37}`sBgw!uC j'5$P ~&?tZ/_xX&@j/5kpHgwz)ܫ$#q+JLT&ڵ\G` OJ:nv#CO{Ϋs8!,+Icf2DRa!I: ZzimW=-l,waMkߏzNa٬ 9*`([C W#,]^'Wag,}wK[v˦OΓmt?TaOw2ȞN8386Z(  LOeʝi] zM?փHzvVR/V6&$h"ƛ'}L嫯BCyXh{tۤ sEېY^W3dnW-( *Ce3&]IiXֳ7px W~ zMPG;%'4DO֧wc :<-N;Qjl]w ',@:ҾD>X*>HM{tvm;|jr8+!E\nd[( }]ġΨSwO2߻0 EIn J.K8LiGgֺ/9}PsQ6=랿=).g?a{+:Z>xf`1NxN0_}qj@3ۆP_5Ѱ̫){m쓈M$9 xPّ(N~ꋑ8/:t.n᫻Z)m8~R=d6IswEKבAάqi$jD,꧁rAwB< W$w{K-xu!߶8DË'$N1lH~[G.l;dڎus(<)NY:7Zp mzNC3[Ƭ tjل5nb91/Oh{;t.\ث}KR n СuGX9W;-0עoSu6_Q,dt䝻˺K̯gŁO7zʧ5YWY?i{ s^pC;tF  #?ٓp~DKS#>UmR,]m'YtnF1 ~~_<q+@ܕA-\Ssce\g굳"R mB)ٮGq~DKR?u =|qҪ8u dVsvy{˺ߚxC׏'Ղ3^bnUge5tIzαЌ7_^xߜ@f7^_AAA)Lx},WevkD*,j׷n jj( JG:5R_Z~jA㴜L{-]CF2'Pճ1.?jkLJ#geǑ$Rpf^~޻֭uŲlϏyQoCo%NxbBCκfb+<[˺ Sk*1qwf;[zּGu]/=Y0=g~˷3gp1x1\=idk x: jk c6/f1Ʈ:$;2 -2xm{pstžzXqS;yo-"nyAO!?pu>8qK};5IB@eVYYpqUX.8󘱪Y>:kKN&eg3 EfgԻ#RyS,|;RpƝ}ohNU_\cLH2XY[dӶS,qY,&AdiGՍ'm->׎`K:Q/S|o).‹c[o/]<);yŹLV=P+YOݵkc}͵^xb㟸aƳ9E/TXjx?zu]76c}CWF{MJm>bP:ƶݧusWsKVfYc׺Gn|/ͩf .scweBs}r=Dƽ毴5}I);vuL1k6X2vhR; ٲ"S~`^6K宼T ; (Gn '6)]bXj A}лonj3+W1l}o1w_}:odlA;`}[;2dsJȑ};N:i2o^wkcZ'Q^jʡ/) u5? Ҙ  CpL얽>cE; 좒*WR\PwLXC=<H % PqL7E0X̊Z>Gp˴(x'a.ӎ9큢ほ>CC fTD9bRR(ĕʻ#֫<g8Ɋh*ȼ_D+9a3'oO<- ?Ź]ɓ]<ۘ}ў>&|@/ ƞuT ("H ,5ƸӀ ;w-)p) u'FC^&E}qy\(aEURY$_U8HnYAN ↕jJu^r6E{.D=$侹|+}xW]"(Oq̪V,K< nmƅ,!z, `*kFXAT٨!PS.?Zr a76f/†3ի6 ;@Jw тE Dʦ5W4R.*#@f+^QdihkM̌<u =@.=2BO o @$V}zoX%L'.$;3 ʊٕ",))Tgqv{C*97Oۖ P\ʇ}_ "J_ /T O]oB^=A{YU16ВJٗ_p BkN C wJ,<\'aYC~s:u [AGr2qBdve\>-%MxQ;,.84zt<ܳȎw<+@f˃>3@ф$dD.,5f4?ԭkad6{`RXokQ diͿ$U6i1ŘaFO>Li/3zO0Ъ AM!PC229W C;Io>{`+ h8S3csRjlG ̆$OPFD L[***`)沨49!_Fqc]@ Jn* k4aUJyYH"$GnNJ!(H#=<&+7a5(_ o> *%)GmOKD3sRJ؅l D @~%e|ڨd2spTu}mvi5r PE$p.5.St~fY-^/FXn~HxFnn|f Nx#`\!Zgk#f:uJeS" 杜 !$֜\´B^w!|+m:͓zizOdyYoZB <-DAf- ?<5osN{RJVsOxQ$ 4fмc ?:3oe^!εCFRAz|^3"[O\]@UXc;,'l %TnC]2%rP.+lR*H ل_(Jij kTbfwPI^,YU3 tIX&FOd0G4'J~S#%ٶwdW722gWokFʆ Ѷ;#܊yk!]-X Kg/2Yn 9EOx@3_D,z!dقϩ W~@U L$ڴwt2"(j4j>,@gSf<x%Vy$] ilndc/[=-Q-zDKf/2kU6Eg ^4\nIuIȲHAhA!#Rqor]~TW㵵|KGK{E@[ j[ jNJuEf,'h `"*{s-}}p o;fݍ|Qbe{b&0d ѣSg"Z)R,GQ^-]0 IDAT~,D}rk*W&?6c;_"iQ%Xy"@xׇMo+d/|ȳOVn9YjX'q\кR&Vh6T$)5BaY~X@)g#Lh}8 *K_9%݇qӷ3ƭ=_ ƛ@J #C^-Y|S5C*[~_Gby gqeRjr6/W HKO<+=~O_g v&;쯍/#煍^W!@g<;1Igw&`ewH+tጆJ|6k_CPח9#d((h mO_#T[Lq%_|m[SؖU..iԌʮ{x0[7B~ߓX4p'"ԨNG6M T&޽J,2֨KUeB ? Ӽ&O˻6.+sl?;(7&.F깤+[/'R:6ŰUus6ͱz`1QeIň3+*΃lB₎ݥ [iR!ZsPP01f@KY9UuPے4^ZPR{|쟓Rq9q%̔Ow5O`mڛft"7zHh=瞱V{Yόגwk7ixeζ; n֓iNo;SI&|<,3Sz !'t)vq^"=>!/LMH/! OS9*r3RRYRSY\a~ntC7j8(KIcVq#!íwխ;g $Z sً1@iR{+|SRanܗN9=|Z5@qsÙ;G/#q_vn-T a9xן;G=ɮ+5JPP g{V"\IA~5ܼb~Qd]Tꌵ(y;,MCڒ5֥FÄڭhipkm⨭=-+?z|=߹{Ăm(kN EAy~j =%@<*ӧ4ZFVzFVzF6-I+"g2Va^-=Cl*i쌬ʂ;PJn̨F 6͋bZt{A4?Π27 ,gf/(H]D^Dd5Ѯ#Rx (3 DٴtF6 tfjzF άi4&t%ܼ4w7jңG&$۷4^\ yAqT\P tu q,z?<9#f% @ot&ͦ3r+MyP͜qخ; 9|u,?%RP]ߊ+rRRCA{ N.;\bT$Uҙi HAH9֢|K8BkX$M̙οfӜh.3l-/mzT-qS>P;hߪ3Ц?wh`ҋ/u5hut+bؤJLcG.Q.8IcZ|S6U5MZ uXaSoX=X+@oo.z'l*6V9oaͽ\dÖz}%GM\4)jJ 80ryGNn~-oJֺ2).RPs\!ntzeu%L86w\u#lT:u˦9ܔǒ&J`šFE+I7G5 j\Ӝ5RţZ `)X㣍{bE01-tH)I^/$eJ0 VDIʨ<C-3=*M8HBPZZ<܂Fj-Nx9^[;?fяaN6YpM-z X>״ɭJk nDɭb 7KYeaO yCM[** Ak†N~m `#@Y~ Ԉhrށd3\aC\gvl|Ǵo1{iehW z[PC6lΌSv}W}jSwqn]8=;0 [7<6(:44~xRV$TAUw;] ̿ϥ}`\>;ͅ";JzRJīJ0͙od둫X_qվki{s=2 k =cs3} $x6+ׁy!6gиG9z9рY3kވL)Ǵ mFoڎ?_e=֋ 9ۧo[*7J^Rɬ2 ֋=wзwFI@^|N#@yߴY*PsF4WuѨ|KgK{kAMOzcO$HHh; Ѫހ~8UH-QnL㴊8w0'w! }gLkxwU(M:L>&ɪK=l˯J1mg Un2.?9 >#ED6] MyK+Ej鬁'ʍ|LAR ͼvsqƎ]WmqՉ.ʋ|TkѺ(F8BS4󽱖A̩C,JwJT|[)8g{$\?2`/m#-+z洍:L>MChtʣCVmEmkLK]TO}GF{\ylHޚq_.ٶNM[ i m M4Bûc~&S.,n ,?Iœ'j=\3;}s2;}/\THY }SvK_+kC>U d* . +rQik:ٯ}X[FYpbo8۳b$CO{Sxu$9!ǘ_gvxMJk b.4&W(u;$~Vj*"#mE4(Rj 5k ֳt]S*EJ uxmDkjGŴ_~,j[ކe=p3Iipa)4@kym^S0!h]BA!"_ssgлPPxs܇qRrOA|d}*1~'{|]+bȸZrg;t ^eʐ:ʠDpƓHP2w3P hiJ@DtQ;Wsu^d$ż:Fy"y[yWUhdwaJB##9KдGgֺ/9}P 5 i`/ͥgg?ťL/)`:-FW`$*p8{=^ g 3pkaW 5RZ/ y}'w$>o"^4';, +sE~yѡswϿ}1D J}οP$Zs<дw3k\Z- idiOR y8\N&$UoXuU0L`F0yl6Σ'ވ@26~۽}O+Rqcm'<މRuf uYhF8o8EiⳔb?wгёw.f%݃O_~{j#6_6ׅV ##t̛A+rsզY9C oݹQd>| ?wG mB)Y\j%.bKRa4l魈\C%tYP{}%k}W$~xq{gO{"ޱi'A{E_׺ƁUѰ 7eB໬;t'2@J9 =<ݥć͆oƒAA.)tz\k RAS>ugGCnb&(sjv/c2e/]KIʺ~~_+>|\wW˺Cg 4 ujK/wɩpdǞ;7|44mB޵YCxj}yx8'juŻU]CgGPBf8|k))x~+y|uul~ eE2osZp˿]yLuvP/_^)_eh5wgND?}wy7cy~NV ^z?Lu)\~ _|zukSHXfTpyu;F zw͑ G2 /OU\ŻFg.k)o?SSp/}u}̌|۞$d?& .vX7jrC5'׫Gw[(dC?9 @Kt5}{I#8jyu2s(箼{ѻ &}>0*1 znIޯF@^Z+ ߾`{?몏 ݗ HVa,%2t݁=::e:QO*g b]X5֘XYYq$釨T`hgD]Qֺ(m΋|2~Zč'&=kv+MPٻտ;Ȼjm1%jKfKt˼Gu]/=Kr{hsogμcMc.{qV8 ,guպ`Sw'A njm^7{c]HHƥLˬZՃ=G89e:oaO*Q5;/]<6Z'U%Y1EÚ9O0 .^4zjied@.#Z3ȍb- ~Qv6FqQȜ˫ZﳑVS'< \S]],&ɰ^XAVu7ޔku4~jl*t~E o/vF毴9p\IL'g/P $(f%pٜ/sAbQ>3Κ\3 OszM}T(H}Xj mD߹㰕]MmE#wZύTE:抉bR*͇oyn{ov1Dd;n|Ӛ$dlN/۶z_i9j&suӫK9\xHW%f.mBB)';#gzY!1ؙLiscp*i^S@~KD}pdH_g,$2BGWou#;1C}u+~wU1m/sQ~޾Xc. oLwkR˰@oE~"R[;HHK}Ow P[v;{D~RYE&s7rXש־NPS3nxCa3w,0/4k.܎>^kny]Mn b2'Tny yDП' !gKkňy8T%I1oo'b'yAUy=);wx}" *XFIvSeY=);w t\{nFfe/lk1`ܢ.d k 0>J(ĕ~VA/D % PqLE X슿ZJC^Eq; s1WJ(з~ }1 0>Ůp%Ņ|cϺw<q Er14`(d k2ՀK LR@Mq#xL{: DǹPŠݛWTО>&_ g{,O_ذBM`sG %w Iv-Ev70#o\Bs2!<]Zpr k` jb4ߑNwX@orH+TgG)| FCn}SW,5нߨzVdH;i X U+E"XR’j\>=M޷1GGmF;Sn={G.gq dLPZĮ PP\ʃ}_ " "˪ @$Qvgo-ͺ|dž&pdm{#e]h ݠv(*ezӤCc|V/ TP[A&_E`0F,2W-&,+ְc?oܴ$C@Q b(IBPE2"!hGJ;ݚrNB }SLe̔|YCCdй`g_R"AYQIM"Q TR)TjT d%\\Spv@&[!V}{Ïs|1mDpP,o|y>u0Jb 8ȋ Nar9SKw7]Jؕ"a=Zǃ2R <7ul[jXI%rJBWQ^RZ%lTyv3Z"Qeքj 0pa);# 0JAQnT{BMkB7F{$#ڎ8߿YUgT#-AAQnVq W@)ʑQH* >ʹ;, HOT-Γan H$)?2%T=+D< sR8m{$<qIɤ oWL]vSj-J ,ʺm{%'͑߮7ue46RaLv͸i+B8_M4130!$] ¤O VL_B4rk;',(s*vjB"B}k0 83E m,Qq6 `} lWU钪G4R2*Nl͚Dy0Ʃ-\~cibflnBJ A0vŸ~Ydl4W7yE'(#"TmDrVQqaQ1\!"+yH/;C-8Y\j~"Jj I{ ar5˜vaęM c섍~Y/׉15jDyiUm 'டM/%,oZ,S!2tgck @$3cscRJ~u bsӊŔM%QDm4F5fj؅%:.0'NT2Ns/kc7 2M=T 115TϿr"TW=:ƂPB&8A-J[Gu 8B:,9&԰ II[R.u߼k2? F7"H)*`pbwwz"b؂Hckclc~v=ZñX)`=Ǭd[(ʓ=',=tutUg]jCtM4/7 X6Xj֤cb"JQmqwr<NTL 3XxJ*s2^]T!>̔|&:yb__ }-\v`9女W.VަϺw*OY9/}pZKg5]-Jk䳎Ɉr=u=(0 4TՄ^KW]^C!S}԰|dGjDNu k3c1@-Dɣ7b.Zrk .(%Ri|?O) ~]ur ?K{ o1ýPjrB)ԥ2Q u&ɝ* zRLFוn? >E*8^\htjmUNkαÛZ|ī CmB.Z˔ ԥ20ۖ {7|? X$O~ka`K9k3s5yͧ鍜o|@ Km[xƭ2?ܷeq\EuA|ew|j2fo1 Q;zh/zZ _o=n .ؠ ڰDދ%q2,Oidhy| bey)/d::.)ekoM22zV.bҫSȨTb~>7ړ'^GV.[{fޣz69W05]]=ng'6(;x;(Uu>J'ph쩿ǝ[MYUPQw[-Q9=fgZ2 Cӵ MU:?;ڒ]Gť&MitaNe)qC[ZEwRcڷ"؍k^Vg!_mմR[v?9pFcNpTΗ"3TYFt8s@V&ݟ.D0^1k!T7.'CV+vV/2A;1 yyo: *yMmi|d+l+#jidqۑs^<iRRGoQ1Z" a]ǰ ((PxA;Bm zAY[sItڒj WV=+`0GOs롬U1ןqq`~p5G h(5Ye^(Feێ׌_~D L>zP_N4r>zvy׆-Ĕ77D4~5l~5dJs 9PWnMV9y׆Ĕ7"@\>; k'?&:pK;LKPXs,ɼL1Ku6Ϩ]=zˆpqF#zP_v4r-%C !eێӌ.S9vYY")"Qpkת+\뤼. ( QX"ʃW}1B=\TKAMVon^Hq1ms`WaF2?=rMogco;:_3B;NG:jv-޻Đe7hC d(KH7m!~> co;@!tTU|⠾hTug*Qs 89/ғ~=fŶc 4&8u'k1UqΖYR3}n((vh{.ϫo3y)Ef:29Xjjbծ{&kfbrgD!FcFM [ur֨uB"(,В g˶|xy=vd# V{I?Ce-dZzp"@WW=-껰ic@0X:XU!ҶXT+~׾z {y!AK) 'GsL᧋.LØbJJI,b+SKe!e3"^|w {yF=c_SflrKFU2q,bogXv㯵<b?mlMN}AJM,b*2J>gFʗOK(G[UH2yUg0]VJHc0!V΋TU*\$3[SǜbZb⇷TAvчkz"1>sR䏻|7/>V\nS7Ӡj~2fчL3V$g(NF+/$$SAaAL#RCc ؊Du9ݮGW2~{><5JŕzFVFTt\;u=~8z/Ð]QBIohSV"oEN[9)Ԕ}S^Bixt$'s}{ڳZ>}#wm 6* 䶨o"VeMOm:,27+ `ŀMq%n zY3[ݪ 驩驅<)y]A]L*|_蹩Rt$Odz Y5qM'ψTUfSJ@:l "N{9ĠӞ=,nBO=-SWCM,oVѩ4 :?BUJ!VIg) - z8E*--#3-#3-#+UUg?TΤU2zfxR.%< ߵ;/,TgxӐ1Rs)>WOLRIvfL\RgŮnA*z:-ʧ Nc!*PR*-++?7#3; =3`Xa4~lἬ D>ǟIbȳE#&=/B(?%tÂX[@.KX[zQ.!VAxxv?[9(A5EorJ>}J13hi5/^ifI2g) \|e8gkͭuhe(F9ZVv~nFf6M(HroMVAhHIm뱕\ڤ7DI ֈV!O ,:ֱK)/|@|{a+ӓhjnT „6xO?taI, x]tG'@pN?; &)P-tAoe]y]&E iٴ‚tZ&*OM@V(?t&RfH%ؘ&]DcR)4$d0yQ ~Gبi-\z%umONqME}BjSק/u!i;.';I9ܵ_QefY7 iN Sݲ,TwXRg+0Edʬ^0v zM쭇5*6U(ȍZf=GYfotַx^m&GťZÑAK׷WLfrdxվtRkx[X(FlG[ɤ[ c_8@`[j_Yv Ns\3߸?`+*% OYgjRrᣦŃ_Ok\/|W@̙nߊi;Hid2Dj ?E#Esx:3BѢhʺC4/7 mE7"RCF=ï85Ͼp3@ Zy<ɉh-pvy:0ř*9e lx7i1|~~~~/d&qnӎmL4NwfmfuA(h0i;WBo_ }%ٺX)CC29Na͝v?I~zawfR?_\M } (~Un-n:j,)GmwR4əVVX *g4sjbxmdl[Ydpb1j=$.Ex\kWhvÙS"eQ7g|"y-RF! J9!ORŹU`._m-k[5#cN^TӔ*^{sJK?wХ)7K6@VuctӥE<"'?*YjUkڠ&,y9mK&ĐF_l꿼ʈu-__;[8 P#cowrJ Uͮ}>2ߒKhu&x9u _S 1W4ri\)v+n9 `l9en9vB7B;K7g6V'G?Ȱ#L"YXVm` &פ⅗7C`Ń:O*Uf s IDATT qDV,Ad$iWl=YrX6R NV#Y8ϝ5JBib$xPv$][U3IOtɫp*8 R2gHƅȶ'։SDLŠ; R^oHr^Ҽd*-Ǡ&LӶP!3Gj*ĵN@đI(?9˨i\F"li|"P4"3'x{^s~gm\$6-XP?fLaI6PfkvepH|SkjR<,C4{p M| Iwk%wc>$$䳑b)4@>$@gdl6Vg,se0]nYfȰm--t%:D1>*asքPǒe)L1BP VL8&.=){Dte7NDs;:{SFN󅣬PI?'Ħ]aX<3?G||Y њzɳ]N:P5zyV|fb V)THM }Һ~=oN7h lYn @g;mT8ko"?]]%Njڕ,v_98LsVOI?: `E65iΧ 3{bՆopsZgJ-+=0=*F T-i^s2/I#EW&tukӜȔB t馃K9vNkޏ?3Z8=1 <}w{5P6^s?518h5IX r1SHz,ӆ &%O\&.(r1Qp:ePv›scTn96(?'÷OcacNy&+O=Y x2FG:tsq\e@4Y4xK nŕW\fn1b1~| \ pݷnvK}Duh3ᕘ'7ty*߻qFk-3Μtdă>U|uZ~/'g˺=yf^O7mX4do߾:ݴq ~S=~MO ̈U(b ~1b4oܖsizLH{G} j||yJ;1'e 7taö~͋"~^_;]mKC9*05 !P}`?P5p+FT ʯ?2FF֌tdy)kG0xna{Cr&W̩st<@0:Rí77E};U`=kw#Shǫ_.l\r˯=^O22dәt0S"dtN'Wl_M{݊8*ɸ>yOl#%|̈[P{nNܸy2un1' u9Ј%orI{N{sxcNNJ ~~Jt,+jeRk 6.'Y?}oPv rQږP27S ^ Wۘ&ldߢH}FG c沕UU۶pe*m;%)DV6NshUqsGal-BZvazc l= .VʏmM>c[q]حtw]=ztoͻu1&D~RfQL'{i.[1ClTzjz޴6D !C VU\OR U yG3᣻G]MxYſ͸Xdd_A, z+2CW‹Q1Gɿe4bU;O\8rh ^K.8<{Nٽ(|y˃#M-ww(X3z o-8bXUs]e @ ĪOX8rp^ IZc**>l_̢VN>]d(-ĪwR~|t{|EǚPjѳу&OX|TyL/=iBEFOLLk a(鉢ԀBm3%Tl^Vf$Y޺w:`@^9T2{.`._ĐlP @ ;캜Em͔CQHeKv{fon[3pt)K.Lլ+:w8b @*6st^8FlPk.S4)=0 V$\3~siGDM;-;d8o6Y<}A){; I"3nn_7HtLQ7R~t|g<%BH}m'[9zj Tl_Vgoݗ5ظMh|0zKyL"'!NZb9bKys;*vO7zӴ^ \V6fs=qz]t1IFDX+qk:ǣHni{Lp6>Tz-8;-37Ԅ]7zѱ75L9xD--:7a:OH6n>U &lQ}I^^&<^>C!.zR[%K s; P{w_=y{^Upī׃}S} b ͼӓjpnшDOh"I"XD:>I] x}ɍx,NxUΡO_g:l)@=VI á[ƃ-禄zC;L@HaYŠ7vy3tʙ=u8yeť5NuiIQE]34Hf[?έLZtګ4 Vׂ:~e5٥ѹba5P@Q7%WPBoҪb=rLh ڍ;/+Lg Q\i5qz%Q/qsy]%Hc1ʪҢr-(eU1[Ϻ:yDap9u9Ϧ5~sy]%5Sޑ$/eu0AO sYt.(6RnigT( QVV<]V\ZV Cr!<D Lsjιw] ˋ˪Rq@Pelu ^.+.pkJ%YM6gFײ S:U./.pjJrj +Y5Fׇzξ:ycwe%m=<˭ 5a뽒ݺ^H!Ӓ7WP_ zb: P_tg OA5tq@MzcEЫW3 (`1kUϭgr}QW Tez>K\=jGkPd盔ԪO6h?*pkGfgբVE3;69C4v 6cqxd HM΃@c~}, o8߱-D^^ٻm7MZ¥eKрTŀWlUr]H!5x&ce:S\ N Q /Sr#!  .(`; \~st3'#!)qkxHe>=1D5<OYWjxCijhR\ *Axev:3w9JPqƣjh1q2}9}΄Wޟo 5p+2iy,Ej'F`4=)i*8Fc5~HE^ -⋃zړR6jjihRni^IV|r1^ͧw }k"qS߶ˎ`us^Ls#R|9X +Ki᎘q.GqF2LCK][zӲe@)H#d*TeU2KK!*OI̬.(BR_WUk4MCSe{!]_P{/vo8&~=%.uRԁ?.!@mH8?Y!pp::[q i{f(eڽLU2hQj#/|(@kĐ_al߾A^Ue&<\:{?l .TI8^R?Ρ1}OyJNvnyb_ԏ_ ~)OwndvMO"x;D)j)@L)`")L0`BDMtRIg2._=@'rx5Rayݳ^ZmE]pvkov:^ˈv=O;N)ն c3 QR#axuKM E> S赌K\ CMQKx|Z?;{əNZ"Q2c<.];s{WA\>+欽fh<@ |2ۧ{v=Ap\:DL ӝV %WTˈt+0eڶdA.+ r WķXCBe;qd:L**`DtJ8uWA늘ű<<|oTMCԣ  esxueu-2:HPT3y_R}u񰼎MtIB[< o>:8G,=QSڅnX.ҝГȥS8On22Z]+ *Y(_Z3Զխ$xîlM' +\Mxl2B2[˸D#n`vՃ,6TЫl&xP[Ow(z=?jKb;z:tp";0Kju2&NzV.bҫSH0:Ci~Ty2n@UΨ(7rvejjɇ ^H>+ W[R谤9lUlw5xv6Z/قlR Coݧk-b UV\i´:JG)jmx=vYlFg"J>6ƣk-VN.@ռtqGOQ0:^H.u0oJ=wd 5 .厘{.ounɗ NOyV(*T}ߖ=r[Ֆ9L[TVo`k䑝<̡oル9vKo(/jSK28w_6qMi}LHaj+/{1nHQp3KUڼ%#+)=#]<=/jS<8uPY4aۑ:[6HK\z8#gïEvr;Q9@eJN1к%T$Luo W[R;ecY6ܢ/?Q%Jk&k_^EZtGnH+\}7S8+-&TYoY'j,#ټ%B8zM( J|C?Q%ZsF۬yzoȺ}֫qW?9UDk+_;ry(8W(Kf<@U.ӎӟ[E\._cv\xLUfʝuץooƘ^<+ȐT8ˑl["|W@#Lhϭ*#L9v@Nr> jhnlk1˶AorԹ5YeSݼd,Da!SΞSpo%{vXrT6pRP#/l>*K^L0XzǪ هEW'ݿ]6wa>=@N0Be>GXvٹ hЯK}ruԞV4Zݜ0+d7_0%%!A%ű+u˓9&SoaLy1IlKI(b+KdQ:wѿCK"BMO-b:?+S+'88]Z%%pKW&[Iͦ2 (iE,+EHn;°CvbQ@"9:k ~x4hTnw)u™bĤg'gTAvчfzvU?}*a$+[wf>vgjnN!!JEaN% PZnNՅ)^}.)%&~|K-f"ȫSy5*b,8p1BMO+b*N.E0Uƚh˓d&p˿>衕qu57^+7gaa>H|dm v?gj^N^-[UHf1yUgR3rlBLzNrj:ݨR.=6JK([Iˡfd (iE̲xNn)`Z9dӫ ~\BH3yWFa6!D[YDf ,'"4SAѫ#.ORjy{fcML :pi29 B7cV3?B,"QR c q,JbFi=Π')LȘJרHόO8le6SFiX]n. {VdS3JL TJq{TrB^E^6%#+3?7I+(f̲\n𫇋m*0!~)eCH66̄b* N%AЙMa"!A"G IDATf\k\ET:h[x +?Eg/ڏ'_POkܞ2UePhy,!^x#bt9vI*L~o>MaqgѢcVK#_${ؘV~<{ePA*֮/s|}3>i K]8ٴ5^SYZP@&?#KȤP OS)$EYyĨ1_GO+@un:,+(qBM=,gݢ"9lj| g_qTLcWR4j1K(Q}OE8\eSfE,F^*%V4* {Z${:Vѩ4 7.j-8E*--#3-#3-#+U )1B*5*(ߣ知 =HӞ|M,ΌK_#wcLylgح~nȡl)6`繣f)fַT-iw /I $;Yl*]b͢ј.H[SuzZ/ٲEdtqNK_Z<$C$ZF4*䶑3h"(Q8}RXQilf:(>#$d p3y-K $}(LzDKBBL'AZ ,3&*^=D83d~I9!\%Y%}[ZݡeˁYL?hPwQtIPJe/J6P(Pxw/qRTPHv%E{\VCE&.skD$sP[&ئ |m'oBfdl2>Q3dgRPЉ׷ E_#ckxRu[>HFw\? !C n[3l`gXf, .?([~+]#E4 _P6دVjp} eHCy*Էq Iʹ~L )@ XmWhۅ5P8 a%T?N q߉,Q5 nmBvA; j(o.9 5AhVoAF=vu4B?;yG"LvL]|.0F͜ NUL׷"B B"W7& OdAJfS/p/㙎]ITZg:Z :5t F3$m3!o4JauʹM"p<vڤI0>J3EN׆bu8v*- {!U lf,}0$oR z~`0J#:LRAӤ%Mo0Y7[ SH '**~\;rڪG#Hfcr^o6}B⾥dI:ȻמWTM=&tf)G,t~tbo_r{2msʹ8%'͡#6_ydm톓'aے .H|6P4{D#t&H@WU Շn'Q2Vj8=֌#jȷ8Tc5Yۅ:-oLgVgoAIp0/7pPmkz(V~M#jJ;nyj(ϚURqiP39AxС r>!Yϻ/<  _~}hKP嗰?A [#Ymc0iǓW\ s%ڑ9/3{沃mbm93m=wAwBn{ zwݶ" kșQm˥bx5rwX[0\/m"m11R+39u='i`8S#Q3aKh%Uo639(t9yQ!OSk%8SX"׷օKq3&݈*FN ֑u!7?*YjXa 掕kfVw#'Q5KP͆xm>f2sy7$Ft(V*?|V1϶|ggU P}jA2`w{& raeҜC4IC(ʚy3ݎ :9E6Fլ6y̱dysFkcetbIsGkaےEXҐΣe;u~[Qmu2T5~0}; Aۼ  mD76(^@[e)"(7\j5HSl+TnA)Dr^>yUZ$#RKĨ=C!2ea $FuӘi}c> b|@MyF iރI.DskTB.CpD<H*N Rh\FMc#PAJ5^"/&עE3&.=){Lt5k}8;FG蜱#1 &epinuAKzw`?Rn0<|eY6# m%'S$ ԴK5~ghγOmk={(ОpT8ko"@g xz~Nv݅Q]ݜ(0[yjcwkBϮctDlG|!qa&*9I-y>:=G^e+gzeYG~ol@vM:se(5X-oJ j#'߻3̚[H7>==\:٦~ d:m9bqìY6_>~d.hm9px!o>2T](6 HR+s D]+Xn9Fz$Y*nR6\rNzĸDvf, KN߹*$Zg (ňDПr5%ssrH(onf;]aXc#Y}-6"$)F\b^:7ޘ $փ@ʆE cw]QZH4^Rhj#MEPMcgh> L4Y&dY~Fk6 c8I5~ߺY'nƆ|Qڡ]>=όu~Jn7NIo iFr0#"& DO"@{~gf:\?ܼ'ݾL_qlLè9rpXݣ:"j!dW7,&QҐM.Io>`$J=ޥW/.To7Gk6]>оw\A n& _$t\> Jz6ʹa!A#n!'{ەF]BZw]]?̀qM]ɂ A!(KEqV*ԁ8PqV@qԽW E***#, MBƽ7 $zsy9r_#;iTp~|'q#9$Md#Zӏ{U@ostĎ y~/DNkn#t3޿Έ_]2.I ,:#֊yUd7]j~ӣ+3xŋ³ ,>)&2@\[.1ץ@2t!<%{Rz?LK' p0q_I8uV_ht|Q&$+^NYv8kDճp-fmǎ="dI"5s 3u,OqUy.S&3\f^]jXc2Y,!pX;hJUq!9?zۍ9 Y$ɱ+C !N{Ϡ雦X:4yo]8^3I@f>W=9ý2@d2c̐Lcډ)ft2Di?,h kT ]'N@3#.o9-e 5$0q}FM$niգd1z2ㆎãˀZE/l_zq1;U< /r^;=mqcOAӠ}>5}\gEؗI"Df\yn}! 'ȡDC H7:H%p׻4dcF!K|H֍mɿGV2Rx^e lO*SҔ|3\3wx>cLpo2*6ÇnjBpI ɹBI˖7X8739pN~URp8]%Vl̐rܾo/z5E>oX",Q#d[:ajDTֈ1^z@oLIk`|fqCϯ xuTe9vzofq+Viq&orw[.2?NE5ThkQ^]45-Tȹz?T[Z,)+eWVL6_Rn3']xqcOl5ʼp갧DŽe5"qMY)Su1\PbD@}!6NJ:fcVՈDe\c)'`ڠ^ <.Ǘ窋3M"2hv3.~[#T!dݑ.5K& zc(Ix1\P¤ u+ڱ"6 )"* z2#F_PC&{MESi"&#~Y w 2"_Ra3@JH\GlKbu\:U~*"Zi#p;.&^\PP,e]wٵcvr_zT&x{73_r +J L`30i*W0MXRXWS͓)-xGPT.F&l޷9@P;;*W2jIbTԧ:vcu\d.Qo 3u9Ϯ+jBX^RV#p d}ɩ/l;{bǬ w$pLX U"Kr"ė9}ᮕ ­fBXW G&E'}^x /vk\BpʌZM .K&UF0w"\dcL:2I}{Wb,VI5$ ;x[3*EX]UeiyV+/*5Bqb6^VԷrz#iIxfÎ9äsf~-%5fT *Bcb~e&YJ.MPC10206\8y! u5ĵD þy +Ky%(F<)t@bXb54A-HOIy!Eoké7jXBn^ebc@{{.^.0A ]c7S]Gfk`|N8nաl'4fbX BouU]U 4t48 ;iE!My<ӡ"@TM2&`uLTa-Pi@MpVxX Ӏu2@R4`6 P5dRwM3)O,[ b:bK0_= &<Ư V`%cbRT!dV'KT4VFN?It]b`gOMxv)Zfꯗ Mz;xEҜWK0 icV>;n)dM -V~&l'TW/6;hTV`tVi"Kv6\VnԶi)?I݁SX)NYR sV_6Wa4D~Iun`eV,Y0t͑iG 71PX >jS)W9lN)}SHP]N6prĺ>&u-ukHe"QK7cҢ-#Uc,K]s8qW= PjBc#*h9Ej,q?Ǩe C H aZ=)@8Z"^7roW,Y0t.T?-1n,W0ڭ'?8je[fhƦO]eKnb12>[p)-„|զQ4ȘP^vTSOKgRj6>-TYׄ9[CCE+x2FȓrJh'k)FE7 ISv].Fޮ=eY`É4 QUt ) D|.WFOY($uHNAp*mZp/%1iQgaWtԍ%N!o\4z!A^XK73ңE\M^Gjm] ׻KǮ?q*!-A1 iuY̳1d.NfdVAZ@Hqzqmɓ?N4am"6kb 4n&BXQzyOK:ҶƮ< ?|zѫ/%pӐXO*[B2%9]Bkw.L (.c_]PSlj,kG0'ز*3r&ẗ́ZU.$9ș=ǯeoc1eݷNΚ4%tiB3j+.q fV:ee734-dԌ[cҮt3pf١U}6sؒstj2U+\aM;_Ӣmw#oC8$ηNq|MS% bN:yqܾ므8I+=]?5w/l'-rhf˃Y\C3raӊx-#^cցլtӇXtdZSt{^)%f. !A+뽻qjy.){)CJ·+ga˼$G9,6,eޥ@v+M1'Cy N|q)Nz}Y>*H~#hpwO͝2-%\,h 2@ճ֣JPJ1ګzaaVqaniR){RT}lCjߦ9JN%EV:[i#+.^֮&$mDl^ɳgJe" 〨6M]ǁEs:RѝS9(*5t!mCl5Zp<8%,] 2UF5@:)p>^&aA+]?5gҼsA`dѽCzqvk2x{wI٨|O#n۴V{q~9qX\Cg+Q G=m󣽘*5r騃(nZhA%#+mHIDhZh*ա 4r/sAgP+Ws [+ÝX+{d_ZF#FE,h&7K]g<\089KvO?h~ƞ@q{ ׇ/}?lQձ*T@GEbݹ__=f5k<̖MPO|?cO wǢ.?E xVgsu-ZN3QXզ8S3a,=YX `-c,!Ύ=q&q.x~;B +ZnZ!}Gxz-W@ V\ghٓ@biߜ/V.(dٓoT/EE0o9Og>'`SIN[BA(>^aι1û{Pw*qv`A!}RǝĈ,@c^Z v>zJ%;)8 O?sS _ xRլўCqKauvꅡ􏉻?*€Ĉݢ@1ͷpY72Dj8s>vSᓩ Do8&;y.`$5gJO>|nSU(;tҬߦ4X;}I!Pn_㯗|xt]UFvvznh?%ssॏNݚXپV|.u"zG8Ont<ɑBBGl`jx1 \BOMϋq|29~^wvzq .cS?\W#{<# ;wcPz[t)x}~²Y= v3Os) T &yZ R.e[63pz)/zXex4~|ف=1 ^ DHlfX6ǟcIH̞hq;DM(vܩkI0HQu&hm/OtS9&cUJܰ+%I9Ռm,IQuH"n]vAKd*2Vl8N?+1}~}g澜:xEM]J+e]:OrԢm1\9y:#t$W&?99Rx[|ꪩf|{krʴ~]8B]yj爉U  0q'w*nκO =~qΟ/zŎ?tF W&?%QZvk=`|%4>dZ1u43KtBpcEh$y<:^ťرbGs-?/€9! +@Ķ>zRQ­XYݝp |j8u3CNe2p^O9YgvzzG]Mhrp;KMi pز_79"lSv9|j4hSuS?3Gc˾![&m:)B5Sf4wsK`S+Q#HVO?pe$)"+>(UFy|f0֪=1quAȋeNl;/Q)b8ϻ ǸYQܦ>bsŤk;9wܾdXSL&TlЖUU> ɓw46_f.⼽`ɋ9Z8Z*+j s>|deI>cs\muc-⿯džkOdt ^!3M&Nz2 kJ l7aٟKӅ"{avB^vrvcp{JgJh Mns1TIYeJEP:>KɁrs;x8!{1iNVW;6J*@ǧĖ}خPdBm+y"*(|RX0))]8Y!zgWN_,oDǎȇ!n xpQU1+#+^Uq~,'{z{n>gӕ7|v f3{+zeOnt?⹊*3< 4 u)w6HXenͳbu`@YnCĜ2iu' *,y@<~f=`Iu"?Y4>' ȬSS+~)ˠ0$dFgfde8Oɯ1ΐrtLBX*T-Gowo9JYY|Y -\/3g1\LG].p$6ﲹ uH:/;?HrrPn3Ub˸tG?(D*?75#@~$UID.I֙v4hl:i]Lhf* Ф!F57oG,mqn'f /=Id:fZĊCPLLtxFy&Bta!Z~Q)&&H(0R@ P5d'L:!U 4$7m#w][_CP)náe׋;]onUzKd㓢WoQMַ\ jR[<[UrߌjM`Nkײ_iV_AV.J7y8z0J(j뫯(L S xvg|J#Qjr=O%cm@DE?mmrGn]\No"z/&kYXw`b쏙 ?yE8߂UHnZ$Q.H8Z HpdG|+:THKjԙaama$.Iֵ=ַ"Wo/Q3!, hAJ.d IDATEZvLnVcmo@QfG:yvW@,MKf~VAWeʭBW5,5N޴ h Abզm j6H+TֲԨ*To=yx8qg5ؗ1s}N= ׹6 <@HٌNZMַX ԣo6tiR*hU[VۯS" *qjM;!q}R!:۠P>ƫje]FymnrڬD ٣+s/dZTgfm oMVE-._߶|yB-d(oQcuZWw7ַ$<41MH& Grk&./_41vZ|iͥ+}b7 (k:k)/e˜߅l[77Rer f_ȮBҫM7$u[-R$q@oWFRTdfCҲe 3c*nAEjuk慼fHѓo%-_)ĕjUs_?5N⎛iը/Wk%j4`kܓ77<[1tْ*%Y:I qycFJJjc?ЃW&ݬKu됗 \ٞaÕioGm"/5 ;`)Gz_HWOQm˴lu/hGGmYֹ԰Qh]{0r%# C&di}8)7ހг՝noZ.N/)nۣC]J}M{kz$Ov,ŽGg1z~٣G@h験 WN&\9p~v4/D >TT _o5m̻xїW~BkcA;wۓoq`txgnzv^[5-znlgζDZ7\cx]72'&s 7kţ.}pȍi=fE|OK d]fYКf@sddz{DR-Nl3ڷ۲G-M驅/t-wJfzI Yɓ6;QG=%\vC9hlLIohVr\ScH]I1;DKQSd lT#:Տ|%# P3譥Uw@!hPy (>dЏ~?|1g2;u*Σ]tmx8#k8ب&ŰLllھ]?X5K/n[E6Gݖ6vBwjrbj߹jMA&K97X!I_LV2#jnGM|_p_4.Ԫ;g7o&ZijkB`#J3GvyMDԢ ,µ\~&WT%ēYS!袜Bn 11("S)v]~R.G9@?߼AK$ݾ 2(C޿׳oC9<c5u QX%R54F(.9t@kԸk7t` jFeJh**ONW՘Z KKee>W4E߰,mVf@u%pѲ?KBUSꗆPފme[IԵ5zݥ6 p^>qt׉f|~̋c6ܐ,~ÈߖJ6>VdLUpXjpH92Yo=>LԒ (RV9ߎB+^ٺA\ҍ's {/}Ǩ-Yw`hxǜD Դq2 _gYzC(,ݬODWDSuLuQ't'퓔:Q$~Xե#6)M7/.+Pڋ;/ 2p{3c{{o~8װd/Aw.19݊ F6{^1fpqևO 271I`NJ;>J!dd/~}ǂ&=r{:C)n]cMǛ0f0)>n9soDcOߎ qӗ}N9}~z-TrXaLQEZ^-{L ;SM2+cҶ4('>[!,yAbC|0: 0yU4Afd [p!V7ukoP*R rEmksۺORmaqs=o(:¯ۗAEv51D`WiF魴4'.> o b"~qLkήƈ睸h :~/}2!MU xas/ߜFlRςݯ.H'bƨYLFxaWZ8zіFr~۲dždVd=:`epaF2fK)OJm~U?hHJ$(Yc*`1fcL/e[/:%QeZ~-|9v&+LMX^?=ɞn4ȹcv+CQYϜ] 5 F D}}Kl1vٵ6ta?|p朞z IB9/5M9t13g2J7':;·νID}P\֧PPs;jͭjx{z`w36FܥΒc;U}Ҷ>;~ٌκXm['y?/^`BãJW bm`(SGT;#2>iD7ҕ/Hn󋝼dXEc"?oԱxIV4`8/_=b{]V 0! sk7t{tĀ8uF_lFg.ZgLG;* ?oԱ| sA5>j]1 FXk׸W[󏞶,3&!bcBH۬,40}cP~\&$ĢKz$}.gM kx{e^"&9o&:gkOz΃WD ia+F-ɘ3'Z3ҫUk$DT&nc_.d2c̐$ΕD76צHZqOuYԾlo$?/ewEXEd2Ľ+~D,˘K%cJ+fmt>д4MϙgK)\{j{ ?OmT~a@ sm~Q6<*45]^4sCͩŤՕB4LlY@5ն1fGДNs҂lN-Z[%ˬyi'NjR.8q|3&ҽ+/ɽt#2yE^ΓJDT=\]#ɗ{_5{Ҩ L*CnR[qĝk7s[U a6d3 y}0a4t݋n~|x WtO=!%Nwj ᗯ%F:FZ*>ūÃ;*DZFZ*p=i qރSdzdl!Ȝ@i6"Wө$k6 e JR&s1`^36ݑ[kO"ocF!K| H`l3iPQ7\LE&Aܼ&u81~t7Qj֭1SZB?Rw6[HXytQ]55pEjniqE][abg)/]khLw9[!_ ?ߘ2cѧ<4@uCkYEO>wgP,nqa4UH}gBdYZ߻!'Pt"EiUf|XݍI32t¾7W~>9j}\1ͅ}Um ۿ,iM M˕t?naTBmqYu/6r~!n=ޅ kNM ˙BOl+Qi cs/`CoYagIJeB5K7mP -YK< u=P3b:syѮUOk/jqꗔ p/l;|U Ƅ%e5bQu.=@!6VnMqcEFHjiRԅrAECV$L?0mp@W5r4g 俬UrqRy)u"Ϲ@&*(EM" ESX:QtBJ2!хIy圏~T&|{7:W)RԦ+G=Y wKUev}Km _Y{whhsRRY]Ks|mr=&/ W 4t5HRsI2#15BLM{@Pge(?ܹ!P$I8+4 dc*9e<ӦJgf7I0o4\<}!:E+{G"^1AEUk zNV0ՂZ\8~ĕ.H@qC~kd $8f']xTP y[İԧ)+syw:[y bLشq--2L@>=/|;Y?X{&Mѭ,=tx;[`gSr>G ޭ;eYpÉiHK]&1ig֓|9U\X]-S#Lէb~%SʮzLeΗ UHV0т2T.GmR]P˜ec2)B&̉w" Ctؗ]0u35wS7 +NK>{ CS(HP]N =QhVvNxkT]X+hպ=j.ji6ѷ:6!@m[Rg]:vÉS @04ױ^F"\CGT};#bv4}G̎Uj1>bVt7pY\CN.ߖvt4`ӏd"zHr"lɌ @ֱw*H c{EŬ2C+m@3nK) *L+7eI@V} @"vI<3 1] @5t!XgDºr󞖚 &&Qq:0 ]!b[:Y:5M* 8#;;hs1_^%UjQPAm]b bF 54<ٵçvq&o:hʚo9aNS:i:ݏ&.xf|P l 1O;Rq@3dk0IUJ50v=Y-.~a4e\FmPP}7Vhšxq@Ij'2mE/BrYl^ɳg7Q:ۻt}O~˯4QZt@:9B3;WUju#ƌ-shD3 uCݫ'>})21`1ipwO͝9۠EthҎx)<@?bNJhLf]ZW-4j>ٻvPi?b&rEږ 9sU5Itk\HET5w9bŬ237K:HL&VXH tQf` OwO͝:O*b$r?vV*w1S7+:T3WON%jq>k8s!I@A4@ۜgU Djz;92=nk(m+s}?=))My&{ua ҺMĹ\q_b?xu''?/9 揋| 8!5=giw롇e}Ugsu.ZJxW" HޓlW"J6.(dٓoT) |"n9Og>{փ͊ )=y?B 'P?[`;3ug/} 栐>'b>u?%ϏLW{1^ݹ'~Kl)=49Gd3Aq]> (x^oϭ*W]D IDAT>ۼuNʝ4?rfK\9"b^&rn-Yl/~x|ϟ>uXOk~l_-[W("* \1/֠6BSΓ qj`b.ğ~:=t$M :)3XY簶v-5 / R" '7-}|̭k. (np{֍ZVۺGEԁ '* E@=/ @1_y[gV'Z[5e+{YS"Λh˕3h|.dJ+"!Zc\R,l o ;s1_P[Ir߿($sϼWVH51qk 7cd1bmUJ][urzܙKǫwXG3(̓4".~'|RŒBhvQU &Y-?zy<,m꽛ŧ̟je3ߧLec:sj{Еl1aç +Yw]p0>aQʵ.^H)Sl} kSѭX~^@Jٵś&Y _F@}5-dMTr.|,P=s;X{ h7>VDP\@5lkwH8NiY|c"Ж\W#-R'[G4^и|`s#Ke[LE&UiI|['rN_*@O.2iJN`.g/mX>B+/d!^Iҽ$]O杣ǃ3'BPcUQfVv&S:"$LޠR>7Kh,s%#|Gil@.=;:*>k\c7rśYz\R>s%Oizw]jq+\:V*)^.b槥Ӳg#n.gŔr;.-K$J,acefYH@9=|ilW}}c$;ԂfBfzYG=(w]"<8Q+ˠ Xq Xp'@X=Lhv|c˲վc@W"[Ɇg_hl_SEd (16 =3[%h Fw]b,4)PF Ff4$Q1VHghug|E_b,T!q _E>feri9Y9YFk;t5H:u(8EV5Dtd*ų(@=p];MVp.fuҨ9n<`R+7>!kQ=xB=#9J-r 9rVFtI>sJ ^y^N|bע:"W]I,I 3yٹٹ4zL`Dc_Gz J*sSuvaO?uf cfxԨUEUOlKDo4gXm%"~e"j+٪wY-2LlA]I͟C ]I>; t==yE^#6]f2ghHz}ջ|55"%U}~7n;sk:͙6@u8dÓ 좏T)+⨥|ʴs~2g0thBq:ت)Jmڮ:ͮu≢7ե]x<N]N( ]`ya!$et\d@"x"% T1vER U) þr ?xQ LիbgNh:CA~7qP" mߟ!dŪoqמU7t@n< |jn>5f&;{T%M8h3wVҢ=IJM"Y^ײ;glM`&nV$sFd(WhA9Y#5- ~mYlزV-ƽOzRou(M&cOⷎTSb'u]j ]ZU&Pr)I)E\ ^SP"҉R!r^F䔣 jO$-aj,R$kaѹ$X~̓iղ1SԘ􊥉֡8h\m'6T8\\38A7Rc {HK#b(R B͠YD=jUT5[T.8١$R WS)4D:)NwiÌ++D^$R#N-(5JRz+}Wfmހ+V ;=x)ߖʯzwHvԚ[iO,0QW9jwpjjԓNFC>fUpScLa&"| =م ǮC@rO'>!EO8[#9kKxo"U FlH[^(qbv+z̵ޝX +5n:j\?[ txRm{lY#Yp2mQ&c=i2~׭M' !ZM-hS$p( qC6 ӫvtfrDfs;:~~ώ7$ ) pp>}~iޔNquf!?=4[6XwQ>:u?;^5~ǿ$D_<3F ?܄")DŽ8m;_ydGk'cq/n ' Ҳ4&Fl Y+sY9}}Քm;_7g4 %+~0-f8":VxY{u6JHm:Jq Uڼp\M+&]'MpZMY-{=BBs%+8-8^fw{Oٲř 9vלޓvYt 'Jq XUĘA< ,O x#z.1匘= ''$u7ouBa~ѽD{-:Y}$EVk7M5S=lbg+!ˬLwuĸs L&rZWN|7rȮ:F=P5!ɼ89qǀ"+1ɘR\|3z9"2+Ď`Ttl,rX 6/8^mJ G+QK̢&spђ~Z|ll(#nyQaԌC_~YrQ٭8[:zνl~dcslT _P`|!K;l]Z5țy] uʹW ]OqW?fGM Ɍbo\KlΊ*u1'0d y@+N}>gW ZFӯzUƭNA)͐e5|0]=ʹPЗh` =))V~( q"QH!7]PMf8)?/T0^]E9SZΰiMRZF)V'?)D /Di q%T\Y? kNM|NvlmᡟJrxPּ'7}d-s2iɳzN Z0yb߂UNTrj+!x!QtؓƂ3oSޢ MzAu3lo=[+<.MD} Yvڋo]> 46zc'W[b&$^zjx\2fb#BqC'.][LcsKoӂsR3k.+KkVaò*q}c:ZT˦Y~>^81nuYe=_WYQkG: {Sv: `XVe?vOC T#CUq׃TVgFmNDPdţ|yKXsn܉l(zv#Ada}NX?!;7/8\+sj<ػk[U 51LJwS"j8$IvJ :O&@r~C ew'b@b'.][L̒ش(]ObBJ\dJڢC먅KGX}W&5iō@'^<1?R4)H2KnW5JX8D>ʯ+Iݞ"ҥo*5O%$g1&:EАj)@\ޒ) 1!t-:Rg˧u`_X Ys)}F>k*TQ.0N[ (NjxjnC}CEAe-K,nsCqC'.训ejNDaccAMRu+SBn>e[Lw*UUa~%ZP.:$ܻ(cWVښz.ZAcu=W~!6nϲ_7/C~b+&O2ig񲽛Qtbxbx \L&Wa}bƺk3G2UՕ-%Z ||p+/ZqfaDi3;V~u1=ג/v2=Arc>z̘x!XņDpd}->K( 0$ sL#Yy$،zfZ|NMN83Ye)B\v# PS )DQq5T 'OldL ͌鷂ab@>)G *YP_đeL M !0h,j%،\ eQ2643$?BB-jd2i ox~tnH6Hh5l!X-^s7M}?fwD]Xk6>M]kBXUQVgypV)$ՔNKUe,d1F~u֛x"b& ]S@ [M.۪jrͶ:Waw6ҢR,{9;?AdZCG8>E02605 e^{ZAʔ $pz!n%q(;Ojd M L = 48--Gw95e%FA$F ƺ oi䫌C{9;/к8dQ2^[]Mdzy ]muwSU.E $t>#ʺ-ip-aL&4>Q9@% Nu̪DlD8A}0-} @4t0ný2l%W4*kJLVi`)yxmFn:yiZZk~+Kf `KO\^. Kz>eko-F.9YKg psTHEWxSWr^!9l"X\dW^g?YCuWޝELN?A:9V*3y8ʴ$* Dc]đ yuSdթdLO7 q&~:e[Oz*ݕ*Z1Hۤ-PR[RyATU=snM,qynI9dɵ>A|&.}pI@hG6 Ao8Ԣ7"J+7[2P+Q-2٥/8}G! c Ae4R ֽ'jLKG B~z/vysoƫ@c^紁~in T$SWӆb6R"R*UxkYh#BDʠ" y<^` 4r_d&^~:HZcY%IY3 K"]-"g9aBi?Mmu czuXIV6PVVo# $} A@M%YxׂC$_J+7v :^͖Ϥ2e¸ 3q5yI$[9,&,1 +\6Q?~yknݠJI2Rd;Ty@Pм =Zbr=ٹ൐Xr*g98}E|&¸ N Df hB iYRZ'B4*{zH*e?!yQs'q~}_1;7Q\Íͯuz/+#Eo[$Y,3/E,1Ct&p^~#_K0صq9soɆ34_KP5=;q\2IJx8Њ.6`ÆAi>W:~Kw/iuYï˩߹~3cc.+%nƝ;!OB)8vŦ#L>0(}U&Oy O$V#j*=4ӈV"Ҁy a:)SWֻ0I}ZYu4b1ERgуW?/5+ZdFX?X~s4#饟p~]PG `1RkQtGO#fQ?+:,^^\Zǀݧ}>i.ڔg-fe|^{hzZJ Y" kH+/u\YLv.(j_'>4ltY9 :s+rҷ2T\+lႱ3[,Uz$KAR70Hɰvr/ڏt>v%[Lf)e;]sCypp)rԃ=VK~}nֵ/-@i 7cd1bm~T[ArѭXa^.s+u]/\aq3ݢD`#ƹ,R`%,޴ňnW)jvurwbFwхSSOđUi7w0I%b2>l^}:Xf&ͩ=j@Wa 4a X(jԃ+"|M:\S6$69:8r+}|fy8(K1h1|[ .ooV3>]Z?|V% pj+Xߊ'+ eV^ P=?HfsGcg+)&TbcQAc=}Ok&E.扞2"QQ?][?.(Zr= 4ݦXgd>BD( Zj>>aS?n]cm A~BYHj׉5x㑫] Z'>>1_]KX\$k `tG'ހdJAU8;Ϩݿm?HzeKsrlH{qz/%. eD\~ A#q&VympZu'\PxkIDUiI|['rN_*@KH.2 |Wߥ"R}/݆/B$KbtJa9z<8Spq2hLeR눐2L ƒOiE NT=;?Nc#uٙס߂b$m74F^a|jBc S.UΗ+K!pKhH kOˠeWq:F[U\igŔrYE܊_[Ie1j2hl$ȉp E_qǡ -ԂfBfzYG=(w]b- -ɢ2K@Ey|%ѮR>zBO *zn˲վcW"dyxߴB6Ư-%l `uEYlABjBi 꼬Fw]b,4Z_'CwۧwI25jY48MNx佔z$?Sv?X|X?]!#=`E^ܲ /*JZ'Iuړ,l!TSvYDTZ&A} ڝt[$`7H(]\^}NϠeΪNKHF6(-ԕt`S>,ʦHW@ԤFI` '|-qRB$Rs*@hE<`@3QJ}gSgoE5f}[Ѩ8ɃXeFDJ)?g6"aDu5 )& kJ:s6jJ2L*-EDVW߬aQJ>\Rϟ((ddO]M6:&e6̜ϙ X'!Zb,,JwįeҲsJ@uB*-Isv"GIf_]O2 srsJiZ0sL\ora˧aeIKlQZ+s CZԏ!"!qJ2E䕤JÞR~l)sZB$QS'ХוrwӞB@no?%K"@gnYHXN\Eˆ0[TS̠хti'6:Buve}>q@(8@20#SÕXÈH$8'rڳg 4_wtk ϼ;^$D'q 癑ҍL!Xma^:^$}SqQt't5 º) 8w?;p4ϼ|}F#9GdO,/'>15H6V)ȠebEpSb,EIfD0Gܕŭ}[aZţ |fNd!hiA>Qbd"'{놟tE^0 W/fWu5qN*_0nh|CrkG'${ugۂ%*cZ+3$H%jV[oh{ `{Ԥ¶Ͷe-`ر^yZA͊Pr{8n5WE?<ք_N/oTZ:61Ui+434-TxfDHشB8hPpԸ h2 M|vZlb SE- 8TfcoܥV!EW]j@}]Oa3(R)VX;3a jUHV= . tGxwwջMJM]>fq=v R#o;E=mB+] [:hG]Vtjo#[>{I~3j'.\qkmL58e T H"լ@_MG )ۭ-ӡj6U7r-٦ea:7Vk~([UkL% blq/ pi,ƒcJHi>S3K[ij]ͭ #Θ 0Iz5QӬk,%LDy.}Ljjf:fk#P$iu^g7O,Nk>@ rlɧɲ-GM VߞdX[k74?6z剝3 )8ӾG uXqצm"i̿HSW[IA/c󾇕|%4AQE961Ejxuﱕ-`$3Ҧ SPG@HrVX:G^y&B&i Lqc2BmyW4É8HE(oRV6iLV n+Mj2GTUڄY#ٕ3:{$Bt/5u1xuxxxL!FЉk`&+ ؊6SuYR0y< I 5Ui]7:p`UgĨ5h٫޶#$@Wu!P.QDѐ#+ٰꯁ4Cݣ^&"bm #8~á x[N&<%f4PW񺀶km&Hp՘䶵FJBmNIn{T;v?ǯ.j4;vȨ6h͏B_ |y3=3Mj5#QB;wҺom{WF2c[T㯏mm22wn6Poe_J77V%^sg;eߪcjb:oRFUqle_JAohBK'ݻ܆^8aH˛/o(R$YҀ.eWRwmVS7D4Zi+\ﻱN6Pmʭ{5'.Zw[uʝ"{kGiO֧(/[ye1tFժIڢ/U-`Ĝ)Zod9:TZ`5}22M'XOS2&Nٵ$TrE A_uqvV5jt^gj-R4 ߽x\Z+n!S*.ɜ6ph٭[g,sR+ѢSr+W!b_>a <4;e'XIS`1ͽZ\jmɂ_##~tEZIcЕf:_H_4=c7dɾ'J{־5I *yhz δtW}{ N?,uϜN̕|F\TDq-r^†` ՘,Q6ݮ9Ųx'Ww ;Cb<%*a>zUN{h/8UyyU mnPO>|lR*#8 .,S`**@舣jx kNZP{.TP=D@C]2(Q"J| Dw.N%DiOPW dL^Xecy3+WD=%VQ9Ң&'JS**~nAgizx@7=*t,kٍPQ siu<-b|_}{լץ?B0~EJ>(iʇP/4t7~3ʝr_}UBB|lJ taAlm 6Ă){I`t͚:ܰ_= C.An9ǔ) |B _Ђ |b4_ T0֞8Ӂi0dSi]n2I4fwm2لΚ=QUUBk7qWN VD xNM iIk3ïzw"7He֙i_ ]2nS5zj(|W?]5kjwpjjԓN͍hqQ'? Xg)b* bމJ/]K,cv{ߏ0̓{gV9cE_Qsvg 664@ =iL/;<{"{kX8i4]OU'/(CD+OdH,ys>+g~pd#~c #Sbo3UAoɶk_ =(ZMD3J"K6v Nλ#IVf$zr"9'#_][n Pi/fգNQ++#F<2ur~'n1_^id=2Rwr{5'⽧`u WO9mB $^xѽKHe;Vx}?xڙ8Y)4U?5"'|1gpsԝy5Wj*osk+nRČ[ޒ] .>waͅ_>JFX9{=raȟmy |CڇGa'Mt{m ]`nîu)ۺ~=hKOӈ ^[Xhn_AA!9*TA֦?yKF5lȣqS{UȺmiIiV"5 LK6V\S0@N{+Y/\\f wK< Oyz½_K}x5a w9@i~^^H| 5ϐwq%T6KPGݛCi<+Cdy6+*8H #TLcu:5S*Aͫ_=]dPx8$dϕHoJ7rԠF'U ʗ+g>]pq|Oʰt1%cJDT)G::t"[Xahxoku/YIQ}sFs'UBncY[6~'u7\g骉Z4UG g#TSWOq{&i)UK[V.3]W9K5uuɺK3Goal$wVsxVwuX{&oMu[Qϸibh ybz?q4tF}OsS<QAǰ%q63)n=Gz7K{af@@wԽzN:l:zhD:z:4=N78o(%\f_O|amkk.NY7_7<#7RHܣE?l6 *-t4sOՖ4L8q~tZ1s*s&`!~+uuqRy޼A4eI<}Ob)2~qP5 QAwdƖ٦NfDtzTsq='T{JO @S7ѕ' '0~S!B14/7)6}I^CZo-O޾¥q\>۹4Oߋ_\{xNG%t$(|>gI  i638.sqFmJ7U /RϜ{3~[L~I蚥&\4 FӬubmao& i#3Y[T=MVŃ[D>f 萬c;uõ_ H=+t{X[xl~V؜Ǻ%,n˫24gw^U61N!yU]5;HD,#$lEmOg]b4Ne\&V_Jh[BD]ٛZO}Ŋ^0Hun~|pV; zzҌq&ޢ/t& M#5Ւ#`s]FM94g- lF{PbᆰlbK%5~Mػ*D]ऺom?/w[~[^B &SגC܆K@Xʏbbcu1ԙ!~6s"+Ywz|b)uyg7b/Ȫ)L Ü@ҷComlȍ, *֛O%ػMMSעI=>Dlƶ4lcIhH?uo)>5K/7T[izCc9=nncCndWK'3bS.]य़ǯBVN; $el?hLIR|AnoZʼn~.Nz XKM\*nLmKl͙mn^ mH}tT~?4l0̧.e@uqgw.[>0^gw,[.) /"͕4'Dn v@dNXh0lٗU!Anr1O mzEҥʫz(x!7y{UI OƒsDa2a׀Y{njTqۿwVw*e748o>kKX|[hBi4JW,tf:s?pNQYy,,^&tznEs['n>Kr\xs|Zo9! nyzܪOV>-]ʭo¼|)ɓhToS0=34rs! %n\n]U#UQ(ӛu;E]׈sy)ʓYesx@S$7H*j*ԐJHP+ln LfUԔՕI!AB@bMvc3E5xމIƖ(*k(SC"(a_ook"cN՞ӗ?nr|ѩKUs'FKdo6B5;O!׫vp0ͧ]*>oL]qG1,Qt)=v7Sxߙ/ü;0Lc3X+ u?lBmSXfdP3(Üǩ_~ zTkqN$jNA 4EJ#DI xBhTqE EM:d6[dN}UqIiQI)J-H}7XP  }EPg$8Zn#S7ѵPQ"i WP3}Mjo]}h60\ iR$lB*m2\KB! !JA iGJ*֌5kgO)Ǭ<#L*CM/=}Y]7u[B AڣfotS|{ԟzZe_z?g׈";t9̌R=I}+{Qz'FYi?_0JDO5gH쨟ԗ7UC"TGֈSGD 2&UM5 \Y3.uCjsQGJef-O|w柿}<ad^} |L`Qzڹ둗®ˠNf- 9c xN#~(4+~~C#^ЂuL9Z2U#٨7uO),S1@mfncH܂WsM44P-~S@[XZl]S,- {֓k@r[9$o0XG 3gN>K- [PJ-sRKH~(ֲ5a u2m.;}" +(kMT7ͥ&YZɽ#V@7o9 q9lyj577hu5"5קnY[dk_r%^N_ ~8R2a z׮4:Tiӊ{rċ>t|\kpM۪A ,0M=V ~3A(-IvZɷEf~t`DF#(Li}2]Eqg7Px|@-VsvYatQ׮6"|[ʃ F>tCd|>[Y\w6fe*M-qX?]we;8#Qwɏ+\z>vĈٚ-{6z@~S}Wr Xt3¹?C);Gˇ~xW5p~u6vٝߜ2ōVzp,!35ռU{p׌RP•{稽Pl's|a4Q-@ugUL=`jȓ^*p&K}UV9mVyX0t\GݸSUNuئ֢9++(Vl)W,?=Qe/3s;ꏍώ-=.u=*߳M[5 CY:E'go9'CIfл%~_}VBC~~ߐLEޯt-*f= ۺ}4~cNLnϸ7gq߃WJGt`Wg?e0PuZSR.5 \KKR:Ha-ܸ'>S=2AӖ(9~p<)=+2˒?gQ.؏;-դ\\xpm߄nfrsR"Rw&G"Q5Ymc~Miׯ]#/;qsWnZk"۬Y (T- lɯ+1_f?^8MEfع7Ь{(swUf]wp3`pp^So^4-'{[r̺3K>x+&BZCGY6,]p:ƒgzO&l3oZaZW^\Z6ӷ6ۨ~]+KsA]!Ov屍-dOԥu _q ,ѽ'FyO?7d&-$+*mbYͦFĵfqdP{E W_ՙX[3?lˮOKLc 7(̦o' @l,z1ύPMqup}N̽4y+k㺗~?Xd`R N'*=M)Y/>֓2|,^D]+^MvQ?du9?efU<RgExdlٴ˩*JL+)=+ (ڴG}U}>j6-n>7&:E~dqfF]oy(=#+)rӾ1T}u]>j7e6`\?6[övуm<@TEЯc椦eeUq1+]T5}Vis)#8ySg[-+o3r ݏ>v"?qegHaa|ڲ'C2XfSDŗRǧ9_ *celnj^zc>hd ټCPSLNcqeda\w?:aeezgkPR%uoӦyC杻51|Skleٓ^rcዙ/+VYʂO [lbW~!,N}|-w)Z3,9iy5]Y*ҼKr4YNn?t-Q.-] qNn۫ޅSx;?4;ֵZd${h$~.%99Z.c^gޣJ/,SZ].]eSZ̓?0 6E,.gh>O!ˮ(QnzLLSedg qq },hvjffb]έMEiiYӲ>e}I\M<"6 c,-h&@]Q9ՁүSίJYepfdL&H"w2npfdL&G]2̹503Yos+E:"_RK& D$RuN B@<:\ByXU`FF@  `W}JL+[E1͛o@ RB? ITXFӽ,se7/>Fɞ#|]- i ϫ_3Cʢ촬/_3ed~pkFE}>/gʹ⿐{cO;wvAnA=JM~pC²AQcyBҔןI 간!LV3H b,fdLy)~eѧO|~"yrӧ̴B#2DNXV @ֳ[2*vts=sǐxO=;J9"irTTjlƀ5D C#~l@R5+Am|,"-jFTvKѷW4 aez-OZ.`4[jyj [;'oT&eo2ӲY+B$\خ9i_SWsngmA_hN4oҚsB/}xqnH!_ʐ®yXc_ HTh~F͘Xr$Eܪ@5\$"+CJ8jMĻ%;]m3>prYW 5) 5y\VTR j #&>gmxu\)`[7l22{w^@~A:RVQk 8#]:m"v8l(nB]%+/Mͭvo@cPS7GGH31P|.kYQJufWS DGD&`_:nkS_ԅv[0p3m-Ec;OzgQ_$no%ê%?՘aQ_qTuj;ⷈ=yX(,CfVK\٢d=zXϭF:­VU?RZs).v@č-lϐdC-mO:Tr: zwoAA u:飮F*dꤋ~íXDp wޓȅ+A2'|m[~ovd;I _e~yvGC""k[5mI#^tZIW&Y d n}HRJv0ҮBbior+ ,YQ뷄b0ӌ޵P &O}Dڱ.$^t1տO?ɳCۚMVoî |D.N[-]= Ա;ls[2 ]'bq궻#0#y ľ-^RWn@D9=Q=\s[3$ŞVS(:DIE6 NJR1]ݪ eXSO~ʨ.EC~(Vu͒@g-b+}fm=Iדʰ)XeЛk UMG JWIhؔQueu3+D ;w.AQ#YA=wXdL 'ЍGy@Xu(m J⮨B *[Ҿb@{< 6=̄4 ]nl艌av''vQ_%ď"1*5HH2Dav'?Wd AW>? Kۦh5'+(˅Knu0W:2tӱWN^>M[c!toeHVI ':mJoATp۲e>۹Vȩ˧b.9[uĤ|sQ W˾a'uava^3բm& %^!Yo|Uu2; n[P:_q RhHB:UF.=5߂&_NxZn{ĝ q=Y*~2ER5_3UFo!'Vp4 h+R:tx#')=҈3VH:.>.IX$(XhR!A>yMyObnV &0Qu&Z4t&_z-,i.kOGKD6A"H\/%B$;JEҚ(KHC ^]Vى33$2TQh*TF8ᐷz%O[ךS@C?mЯq6sQ\~|\KjN5~f~_hT WrhWq֢ZKeGgoӢ[z$I=[7mFi?"nڔѪN1l1jD9M2eD鴄ΨZ=k{dSM.'VvU -,U)t?PHNMWKj& v3 ѿ4:dNAR|tz5vPJXi%a%dg,$-Y/A;e9IQbưiSƨ`@m~>J"oQeC2cM6}5bR'I쐧e>@GpqQi3g4R`!g]7m ϼ2(9%31æyQ]̰0y޲F$$\̈́2 D2 -A@2Z.̈́Aڅ3vYf _%+Ku(ܜS&P&b~[%A!>+e 4ɯ'/rDQr ::B++umbQBDq]l/Yxz+ݞD8hCG20}ȔN0΍֚܆K"RDPPͰn\BlZ㝈mw"ZwDr#$ʼnHUB ц(n΃;7( f[XK؈Z2ep-z)nZ CI3m#SZT6@*$ѻFpwpG3alnB/#'#_][n@E偟^ze"yQ@XqSq ƼD+f|yxNbk @×M{~'yD WY=/ 6,?,ۄ'73<`mEf.!!Zi㹫/DU£;QJH8>/?YdƳ'iW6hԣ俏{MopSg>VeWv|UPİoݜgO"N?}|;jcwQCSFovG]ë)N U'\|9Sf| 7o[lHօ/a}lWoљ}8$=6Ȱ;MGTػwl]-ޕ%< x>E?{O`GV $C!$EMDњpc+7K*1tik@</:h0VNP'mZn=q̫]F<Rz|h><޲[m 9`+ si)CO4Wc'ވ8ه/^z L&[}&#GB=O<.aq IخthF6riIvcGѩ#wd(scTD;#"vN4KDűaqk4>Ev}Ly!%DcGoj;}ю1/ Z OP8mGlmF98P.y~+|v)n=y]"j[`rR=F-Q:,D [s~ab^(aOBOz ԆȰ_^vba'밚úe`:ch|ko9tp®1RrgDjlsÏ?|qkYk\8&ܸWo(' t lcmѱWRD@ӞgH#f nȔQ0GCI_ܚC-œw>ɣ(a-/YTˇ)'uBMd@*o7Ԛw:8a4]pq|ߟ`K'UaGT)/uuD[Xahxoku "+~>\dj}]ЧxtN(_6|QL}4 nw|bZ=}uEJ\{{`c*w%v,ANHQT-m.vٞjU9aC5quɺ!%Ǚ#ҷ0[o3sӭ\`8MvqF;QGIgԗ u#ZHǰ%q6|@VsxTws$MޚB@8̘/wQŸ~p9ƲDT!(42}o%6ӍG\4 }C]۸ͪ9 ^۶L5qvlF^ :8iHf~l6U *-t4tžlի-in5uq,\7$o:E5uqnJCVDsqRy޼A4eI=}Ob@P2~q*P9 QAwd=?;}!ӣjK﹡KWzj_#E f0jg+ 쒼bWlfcjO۹EvzGuwr%Kn,\,|k*kSwlwzgFPrZc~\dJK{7~?>Q_>y9yqΣ<,O(ϙgsNڐl0LY'h7\qWs? \CG-PrBI bkWSc8Nv?dm*l|;qY~ޗVa㸴ګbi]peLѥ`մNu['yz|*@%#3{e wS2 632BHq\ͧ,W<_=u٘4 䅚iދ^,gC\&V_ Q0ǣ&R#KM}4QmP%:/T&ICDGen[`9v٣S}s:v=MT%mj<=~7niun>Ety)epI(|XL^ij?*/VgA'^A OcL4dFˈ VO(͝k+\k7{[dx5XYW>a٣S}O# A~&w)[i=2f=mk 3_n!" і#3zN*bk jb.˝?,Kw~ΞO 7} kDUo-8=;WfRi63lrcU n=}3kz{g,V܆sw=ÀQsO?V>פP}5nCEqY S[V¬hJ$)&QY ReDSgG$쯷fuiKx4>$:"A4iuCY5ɡǾp7 _r#=. +ʄC &ihI?ƉDlLK(ʊ?Sk+b bu3A) Uqd>Ek ÎE1]fp&o7-`*3'ivJ^;ci4yO>T4T[jDd&5v7k-! aCK*=)s͚=1⇊ʌsƊڦRfEg􌹕%hKٕ"/gTcRl<%\tmyUZ$ޡ{iTu-93bcv %ӓtfPSt{'?{K/hʈ/NԷ66DOvXq!&c eݧOg~kwx׭~mؗD/.9=wWƘ}Tѐ8rU%총Jw=&VQPW^]&HzC+W=H8P}f|L)p) ªγzɩiR(̐wM\xY- 5y(DIWB?7Ve=b-IHw` ̩a>qń|8vf7WT3L4nD€is[DuklL/\h|yu95a>%6jU dcT*BxͳE/K Zc]ou2:b"sjn)4p12vۻa_:ߌ`l"To_Yb蕏UYx$".? yðXEVCyny _Ѯ{jT@еE76MuF9p&~hz(%1kj8{r!ĥu_ko7pIh֦Y RsRf Vi0{:l'ٽ`^AoZMYK@6̻Wfe#i3 י~KQ]j(\UN[PAnؘ;MDp%|]lWp!VJ[7Z[CWS4qrjʤ > 9Zt ذ9EOnbWU7q+K+jټD dk 8skV l+}XQ-l&ҕ& :$OF@)R9,6%p34rs!z'ncu[WHU# fn%̮kM\J-(C dYes7WH"ERQSP!^98@(TB d@  lYYMY]$$~P$1޵-J$5eurꕠHJ7Ht2[z g^9Uu$^cDNlΫk>cyB/jkέyt񙾗g6Z9c) +7z~xj^ATpڲׯ s惹ܪ?ێt7u[tZ|{ =6f'+O/d*SĜJW:!)vTŨozǙ EAC~C5r>7`/PKjN)RY$e5%ueJZŻ\-kd SZow^I7T6 *")*)B/-+oeiD'8U%̒*^0I$XNCe#GH:]=if]z܋ DI tǺwgy8v'<ֵ-$#>J'ZeMfNI.FN16.d # XuOYf2=K Y)iasyGNESVkb;I\و> ?hh%h 9B U݋-k4t ) tZ->Q cv2 F4lyAfՕ)iqQ3p{ZcV`Ё[n٫m jF~Mv\̂kqsT)HoQ+Ey2GH| @uvY%M*^x&KsJ_A/>ԈiT*=UyHk o5}iǼ>K/ _.5CSQzME@ҚUT??BRj;|Uz[i F^ KiG隘e6 @Y_NaZ@9$odGM4f]qcN^u(6^^ Y'Qej6sN2p38t&i}|x#%}*֌4hMݍ3c60N{Ng}wmAF0^퍳~~c9T ӟkDYpB603JP@$wEZkUݍs~~h2t PtzY5R$i޼[Z36Ӽ"1n5_ۚ[?{׀W.zaD5T/,kDw9jaJwMd[o62/&no#N/ CE403uO>t.5m֨k y֢`3 (\ǖgT <8*~~tP`iAR>'-$'C! YS(å*Љ@V2Q& 9*r?.$e8 &٩3xk]fТً{. -1VgTRsyqN+~̀""61T1$C^_PPסD'9řejF @QQkH+bIlSd:sf#7*eixz)cَfqwz8٥JV<#>")%Wtfp:,\]F8[G-8{jQh[WզOYoCo7⢸3 vXEqgb7Px|@-UZ1v Qzn4 V1|WN8t0" 3 V|WN8tfD9l 4nx\CflmjW&Eqgcn \4pիyW93ҹ?2`s+> FּvrKF/t_%T_>]:`=n4O~e?,\#|W5p~u}F)q;3Nk>)nX}p>ė~[ ٟ^ YsgS?7f%;ʸ.) (ݞ}zyz'ީ(HRz [t, ~`va)^03O?R1|*PMzwp٫0\zTVgUuCiI֟5rSG4͙PObamN?^p&EOv* ӟ~x727n^S0=ovj|W2 mW2dm8zp-_a"xS_=ߟ+@`#օTBⰕ0Y\>ɉdzFam] 9Jzm[{>(!j^VS3d~Dc =knF5% f˷0.Xqi !Ú_]vҞ\ޯy$fڝǖ%NfK[y >zPO^4l2A)[j";OA0̈[qkw];aPڪl@PgV[A!hz@ ?GT<7 ܌gN_OsW38\kU,ȼ,>?kZV[;x҈~Dc c(C(f䗪'jK[u :zHW^ %lx k^V[3x҈~D]>J%iӇie-B.A@᱙rjKHng-%9z&fOg6+Q:-)oOmPQ*BjBM@9be"&KP$' a[\lS՘:{~+nct&lF[y `mGevT\{5z 6+Ҟ.Ĵ^=JܕoSDA)3'lc5'mP`zfe%)@2k@qUE'r-`œ}31&J9HK*br2eMHc͗n0V*q;:$9`iW IDAT~y*5/7$4hՏۍL|$ Bd̗"U^iʻt> *['e=ԀEz`O]哙1O]R. x)X8v1-1a͗^}&=1P8ꙹ4z%B0ָ 'nD0`͗7xq/LOnu1F(nT[A6 *[[yրOOYf5i~g]yyFXYq{VktAнRI@5*=x59"@/֖'nOX,l&k@5 $4K{^Q<$5N0b[SiB@zL9j(MϠӫF/DK.᪲)F1__X.q+Ӟ%6פ?p=5/_^Q3O(,f-zÔ:dLcmeN*}~Z|:~-D\5?^rC >7'c=T&M(vH|MK(QäifRy C^R& I'Vq8q8T$iR lͿ  8V椲n!]1N|C(=^ȿw +xBʥeҲtŭQDyB-r9쬘ԏ< g ShYV39]fy_>܎Oɗ$'kh#Cc]LOϠeKT3Ү䢷il@,f~ΨfWфc33 Z)'z5SZjVyUj[2X<8iJՀG. GM2BneFPr#G&X -[7'/I-$ZpB7.߁SUL22YzAery9AA kgOQ|&3h |BGFa^! UŽG(0&T΁T5g%g#ǭϥ2 Y9YŅ,j)* j[g< $d3bcwBP5D.zV>W%_ea XR_F'/<\(dŧ|*;jLDUq7pjtz?vQ|B°0%)-3<>9y12ߜ4u"̪J{Qu,`L*~ƏPYjBf)d*Ϡ0麀KV+ rK>FdC.{^ė&bF]NE@T^ˤR>N+// Ȣqjr?byY|IK03DVbQU~.] PZ#Vªu0"Tfg{էWQP2(CHXE]C)VĴg y³ ١·|:DO-sR7DK-7D°,a6:'<4j@_RţЛݚdsw:.*tEY2 MA(.1%ʴ$9H:{͟Eo Ph\|F(8N.Qͺ*uLaM#!Va &P1 3_ó ء·~Qi7*;,_">u)gߊ6$8&$H}jsi׭ [55Fm hd9FxءY> pz ZF_,r$}Z諑2fn:Nw1" yd,QXT.tn:N|,K f(À՗a|-^wɌ˨zЎ n|~6_ɔךʞDž‚["5䷰'!Ay) v8.VCy]f$ҮB.p ۣ= z^ƅNNߌ s5z;mpuL,0+_D_e}-Ku`&w0'w_FWFvDB0Џ wVPǽp9ck~H.C#n΍d_n #gd'_c3[ vNƢyq8[eƘDuê;?ANqL/8ǎmM&&+vp}1^nShB]E8jǎmid8(48+jrV.(B'RI^o`w-"},tQԙㄟ ½^_gֶ_ wcpAq Wpk LCY9z"Ņ*A5m7HҐ"}HQo7>x3|oCi5lgZ?{(%U~rC9#3wT!Н`_`_k_X8%/ ~c( ^k,, @k?b[r9\fEDZ[M~+I{JϩT/^(+8sn/u#cq_aTXT/ae)DHFŴuMN%5"}*「=8ysX]^¢7QNqn/, @%8oBqqK*|\wۮ-6:u軿׼|0ADy5 N@eWd9Tg)^{?iUӞcpS.8_]b\mqy N{㍫4ji1|?ܽOX-G[A=t.OV;ә^S|)*=n[J&mӘl4_ڢAV$̂'nߟ4஄e)2mh olgbYojы*)q> &eQM'F"f?]P5T}|ܚh|"aχV+!Yt\+L&IKgVatxrg1SSxe/RPUI7Ĵ=vdH9POZ|Wy֌{xDJFuRɚ8FJ6&\qD2-t5>^B⥼UŷUT"cS|dI P,sVr[4a$dKR$HqҔKNðx8e-A *kܶ9R+HOʘ'i@aĹv*CA a dJQZqxLc()¦/+G ~8E0D\e^FV5+S$x[emzXp=jYçl&VkBP(ɭ߲x/],pF噩1 ɱ lW*Qg$vȿ‹]u:3H]ʙ]9Iie_q_S|m.F%.9-g8 )@_MJdOT@,Z$X')alQN,5Fڛʰh0VLn1bF-jxe^n䳇\(^4r!"e(Ru `qy]xt3xw:-+o!@dӢG԰-;k/23(vjN_Tӏ<=)B@b>On e"OX>{u 4ghpR)YX ?{2Rߔ&sH0 QÓΈyy ?~6^z\DHfiXPyAO;t}z\Қҳr/8(򠧾*Iey Wov=bx.TwI@yə9ɯ/8REzJm;f@Jv)mBS" i&3O^[z8iIW^ijzӓZ",@*Xb+q!= 5D@jٶg)ao~6cVm/ 8C0\O/Y^c^? rU7`ɚHm{}ZqYHp4=#1(#EԶ@a۟-םWtԓ`{lh2JXtҢkBGA2>jiTSpò:F}cQin\,&F{!"مO:8FEx̡&+# @68O-'"W0f`$#xw_Ҍs=~|d4F.1V6A۵4{S,"}EQhL>v3"$[UR0QGOlGh! Zw3 :/ߨ5|_ݽ XgԸ ziF@\qi1! 'L x[o-]z!Pl=T# ]*\>}܌<4z~ 4 Wh05 aȭkJ7A!n#5 ;/DTx첯c/e>'k JcRc_#}ݧ)lCB=pPݳ*J-[<B(A ~8qqxykڵfBHbcz{FssH4\}bؽKh&۞5bK|:5Pr^:nGٖ r>>* e{!(论xYfҘ{vk"&qb?J[}%+,HgtN~>G&c뷪#2x2qWmITUz2 o~7 0ΞxZ05U룣d`OHwF-s{hkj4b~ )=.S:\ڿ+͙b5xt0 ye͜b"@y< @u]O'{Ga Y@cl"b4l9wvu>{/OٳŸd<}xʡl Y܄" \s9,Iԟ~ES &N%8h}οv(50FȈϘlVY9o_o?+d0? "O[>iкvE[~aશ˯Z VY6_%C}"@U6b ӱ?۬Xf"렢Q/f.친ݹyrq]290Z%9ЏZ2} "=)-N *4IƜ_w HK\zǬrX>x1P Ь4ʈ ;mfE}:Ĭr\1dξÑd(75qT PX9Xl8mf#-[֋"ڬۮzYoY\F2I@ /"h$nvlF%k]!;y~FX% T$7UHf {$ j*** ',tKmLwVKL/n~Lʳ3\f\~U9Qu6 $OeV׃r.5u5O"vY~~Vi;76kk(,:rtZ%Fyy ]ZIFLVm3|aњ 31BgrYs`ZUm/Cү]OhԽ]+(۳}ᩘJ1P64V9Dmm< ?eڑ V\.]d ;4 )IJg~U]Z!"Y/;5|a{^Xo$.܆XuUtd!DY6|lA+wVHVNیm\vLt֔9LLvv:]ԔXih2lnƪFHKOh8:olfazRY+|$ǁ.Yk }ө (}*RABmh,w΍+v/b$4!QG9n SzC&Ҏl5d"Ch̆Î~}a;_oke~NTvDgfrY弓M+f6uL/@W RY;|G녗U׮U=:s@.O<7:w~v PTQ@k,)rKM흠P4(A +qQ.vUOx7_4n@Zc[53yH-΂xp41.%<@U>~s7:'*j}*[dԙ\xWZ#k <4$[lERGѾ>T4VQ t` Gw2j/G@bR_Rvu#_.xHjKG)%Z}ceS5<@hp~y^SS^Ђ?#ih Ң'7-0kGhݻsٹؾ+O]=ٶ2[&=eal9b8l_%w\TR7{>&.Cm7x|t?hw*> IDATʾ:P-2!1hU(h./+/&OJb7ϝ{4SҸ?i8ȟ6VT.d =vZt4Xdһwp6SȖ72ACyd”^=Qmߥz$c( sBwfavNn> /cWcq q#@:f܃Žf vS˨lE1IZ͹N^tBK9[I,AP$8b٦$Β%ZTaE{(&&^!%S.VjhaJ n_RL=c0_sXM]YVQU3xn-61* QYV?mE8UlV}cE~EmKANخÌjnEEMmE]Y*.!bvN_SӻO;qDž;aA^>d~1~~M|qhZWj!- tVo" &gݹSX:NN/~uvfs+*h/:')&l.LL_[+|OԮϡ/lAlD&8ꟼ,i'vUih{$oơI7[82=$IP>[%)X5U4@U%<o<]x)^O}MԮe5 g$ITIAED\z*6 $AQeTQCX JUM8uM5mu\K;$ &! 6W z B3f@z.ԯ"ئ֜T'8JⴳqjZj{>O(!C䨱#1*w9,3^":Ѥu^тןt#us,*|k^_?F݊7Z8mༀ<^K9&KWE}$x{ފ߰zRAf \DN@R{0GΝ2C% BS"ƙ.<{N%_pܠúBhǩij2n?Akj2n?lw Gf[gY>f >n^ܷCC<<<18mٜ^ѯ3?%F'L6T*R:Ϟ(CT!3n9LT zU @j 1BⲪeťe&1`2#9'c\ (  j6vgf!u| *:4KELVRS[Yg:tbқP*ʓTgx_^ msS@Q>p`-,& Z0_6saR5lz+:Ctq2+ +LF r)̆n(?Jգf&\ӆ:m!EÌ@%Q@Lf}I^!.Bfxԥ7zf[*WLNP %^޷ݯ&^}F`_ A^B;9W-?Q qy5)f8M?8ؓl~ ,lz^"Yu&mi5[4C,˞?o@ui`-:uV_.D ˤ0Kzy!3 \&\s@AF1JpKhM!6-|Ԧ4mwP: +~u;f],šojSpjt[V%%7}8!IDiْv9SO\WunLs$ϓGmJa/\vTHpK6C55U-+mA-״+VcfQ-2Kzys%B<OAEUL|O ~ jGΛ]R%1kNʩ-Rv.G+{fn}YÚz)c,s& 2T]CL\cza^nw謞9x ii,P?> C077rj;vJ[t &W[pqàUy yY 6\__]z]+HG9bO3g-A 3 QbDoyr;.#3_Q:BpW!jNӸ^8҈УOkYUY7tHK T(؝:q5:>/+}Rc>v#xhem &jv MP]N{h:`+[G׆TB''S*ѳ<6[Oy^|LH#m߿= ڠTƇ5 hը*-:klS.웉1QʏP -.L{5_ n'L9%/i AO?O#vqÄ>r)8?,Ƞ2 8e r +Iy5ߧ!XA4ekKRFO X/(JV{=qFL%T1O]̈́ d^iʻ4]LKL/G8~WXIOL/@ Rmܭ4ƥ}FD A$XVShbj r2(XyTekKRg5  DYMY׀$Z^!V~phAEGܞ/]gt/XSLfj r2E^RU-O\ݞ[YbM9׀$j~ nOy@nIJ]ˆ™܂z.BgfR鹂IRbeUniq)E8lu6%Qވ0Kq "ibY-|bfiE;ç,g-xt}[͌?{aJX[Jߤ#1_N_x9Wܪx]*4V*XQ_Xz9T!i~7,Säf\ ׀+?%Ez`'Vsxqv;TbB)mo<Ȩa&=z_ʌT-4;+&6S^ $%mfy7*3E{S1a^BMbGbR?rUQF&98\aBT uŽ:FR P_]z~8_E2Pjhx!Ѯ}F Ҵ-|g, [-,'+6>SA)+;~sL$5Udѳ3-Ĵ]]I! (\zv.=;ȢPNivVl|jZA >'0ʹPGWU|5%4:G0BbFDdi-Oz[ Kx~Nv=#5x\uCvY#:&UJnyY·F * ([YӂLfyW]Kedѳr iYYVeZ\2ҽܯgcRrzJ1WK -T`P]ah~&*ɪlBG*4 d)OSzЗX!O 0ifq|qR,I|4GMb"Y("7CV6d]w[6yzx`D9[1"πy! A `L.~,5!J,ʧ'ǖ;er. =5Fm hdو ނ"݇VoW# cBk[".}.X?Zd!O.;`mkEZdCmܗNg1ע:ÅW|G_6(V1# y3`6ɵNK#@FKR$@NcmX W.Ex}¹Fy>wiВ|~no=m:~^@|=^ĤPVk_r {Bn=;}-}L-؛"{BnccDP )mZA:Z[c0ݷf?uMtb+va+jwOo[YGjsE@S"e}f)G~ 9=>]fl\[k߸!Z*W19N)u$krKM]Cm'xp w%w53uCbEb !s͇6>ʨuJD$5ioDw2۴})fԡYbJQ$[_;@6W}L A巭Sh~ K#anձ{&}`ϐܶ1ɝwq:Ss(8CqgцېO6QCBt;_;Q9\%BgGgE^y9Ł$= Or aB[֔ӂ1}C2˶T +oA8ABg1vOݓ{XGrž3˨PPSӱ)nuQYJۃ!ԡ-K{747g?zvIk{JHE:N(WzFǚ`"UHhGsI?}#TWI33E}s vP d>B9Fe bޓTt"񺲇9|+ެ_ystnۛ#bg:֣nt2nfa$ׯ }@RLWWWCNZLZo=6QGck* Rƒ~j`)jӒ#\c|gq:KE)GsCI9.:,<бU,W[v?^,T,ܷ6[u)q/jAUۅWZvAL~S|3Т'r {yĞo;;@ڴBԓ{4@=ˤϖd#&Ifح<\"e[$]/t"/&\ޞ+zjTv6 u=)CzB<;+E c;6ۄW~BH&cZE<}V턓`F-v*ebS$`#9WɧG׺S,eO!} YY嬺p uZm< '^ 9e)q)qIl1&0rڄ4qtHѐ@S%Ê eq @>d #ѿ ~ڥFIhrPZ{Y#@1-˧`nOZp)Y` 3(\8NҸd>`$ٖa8WF$Lg%IcdAi"i>5b5a;GHJJŎq-!@dcg8.[#vkRK.8)!"͈}^| Sk di`Hg¹}MؠPq:m]Awcϭz'cԽ۬I@|qvK My̢ӳc IDATmWF6s^ɩVi?d! 'L\RD>HQ?v;=tPGmwK)]HGf@zPBn'<[fABm'֬`hGK!7۪ D6k"&q% iӉ)~Z("Qa±˷(ϿqhX0j$Q4?+`S^Т|E V_Gykǜ|<#R"<4]Dƴ׷?~Slp_B@".!Ttyݎ<*:0'O?|, {v y%vbcBÐF;N{9;GF'%T!J3D(!ͩol?-.8/L3R_]vKr: _=HcBqŠ'b:Qpx(d Y iW^]ߜ/6၏DsMwg@2< 7TlՉɚ>G;}+wFk<<#oUKi G;{HߤOWYI /w{QE{\lH©s)BSضO߀͂^_oXԷA7wO<ҘW$I] nG%g޾F9?I}.:,yPCH~ yq㈅lwG~ BvkG,gLxp_0Qϼ++% `{'H/o&SˉiM3zr\Ѓx>C~9Aͅ=CAO@ς FPmS6w`$!ұϻ.J1N>% Þ(n?kvYj|qTGs5ښu (j+1eYmo^-(۽}J@A+L/1a oMs1!բmo7,Z3jq# UݴjA OT~ ?eD VS],Yd@Qx흧yo$h.W2TQ2f9 *-^3OcT'4 )IJv|Mv6>:&Zd}=,HuZgٓ.f8dr>[RS3!ьtTȥ'g40sT@Q51W|tr\E&VDhmzVzk92['oEpUFݮ>{ŗUuILM[=.mh$R0Drjnc(t. Qr[yl2#!֔X16TMQch)Nc ^nв"UaDэ 䌆~﷽읻bحEk(,A+\xB"=E.t"F).QC,2$HpI QՇ}]+(t2ʘR抏NJѰI\>{@˪k*fřYul۶NSOuUMwJò#~pdO.3myk9ԬlwoBCu|2nw5WTkw$[el d݆kG93y{7컚'ޜ"(1•5nmřY;uG7q=zzb5 5jnZآg汹s;v2cG}yƌN\S1 \qAmŧwi÷ܥ#pxR[ļvS,b"&mXfİKo./W\mYˏdi\qnA:̻ mXf䰎:>;6vҢIe+=)svSv (X<`XIGܴ+uYB=Ixt;pZݛHiV{/]yqH-'׏RPHۥSEV޶sy 6Ƙc>;,S};[\#X{1|%P=LҊq"T CW~9J E,-*)·ksic;;RM412~̑Gzn[a_IHP Y0,H!Nصrg !qJD{H^MZJIP˒u`ER]C}윃穙pu7ϲlYSŒҐ;N\/byN2* Ĭo;" .Aʼ'܁aCqY x9)NXZAƷ6=п4u&f<& `l LtPm%T꿧~=Vh2vfՕSSܥM/Z8RXny*_?/#DAYCGN>.=x"5غGK6éC7Jò#3^:5c`yPxTQ>84teմ'Yܒ/%GHVGz`׹S<~' qo:8$sG~8[F x":k.ϕbE }oN9 ä8rl̪]7A4u3:"Inu5rM&:tjыOڎnm5!ϑbm& @ e{>fS_?TOheFۑ]{)1؃NEL5q6yM2[qf][5u =% p k5 % iz#jŹk0IڦŊ#I:~:RT_I]G/>ѢNBC? ѕOJ)/R\񝹪R1,Yc턡0Clַ6qSnV^n+Ղ9Wq TSJͪqT>ҔԽߠI%%>҂տϥ뙺3 .J}`o̾ fi"/"?_{h{y~tD'^,NrT K؃}%!l|%:1oO;>,Qfy:r/h֌. jXD Ď%&:?`~pcJ/<\7=x;r@Uޱ0xĜU't;!ܰ$`uaԉKMt~dZ {xvԦt/܍<ԣz\)<1oϸzʚ0ۑH13;a#:'v;!ܰZ _M]>}TN3Evj=t/2)"a,}"f֒u8-B̏{aSҔcJBBa{޻ӤD~X}=޵MJUP+>l%{$:7Rgj'0Bs+@Df\-<*Ywe3)2'ɶ@l%""s-@?XW3ȶ6'dIrk✦Q\`oΣγ7oQ&>뗳).B:' &$aV'J"/ۜ2u =QWY iT"q\)NOzVeS;ʽi2)qWK۴n+sTK)ˍ܂CSR pINfbRJ cYNdDC77t$H⌤ ʼxsdGP,ˉ̹yϵrJW=m!?X؈s 8/!1%>95>95>9->1)JHrt\.."U¿o[*").~ l*4u .x4^T=ONj(bb_ΖPgzQZbaRrJPi)%'RLtj{ss*HJIKLNMOIJIMʗQܨ)@(7F#~ 57v= 4SSka Jw$u림˻I+ÀHQiʈ|#Øfc;[@M]Fd 1/2^|$%_UV-Q?x S M"LM5%z{yY{_z%Th nskoeTnQvfCrZJ¬=3Ա ΀*HLIKѦP&uY#,'V!%EV5̗fkbYnT7N.ѡMKEG j᫼W)ٙj|cErLv)fV ]0ԃyߴK-y 3]ڱt(EJ<&8=ej\cGwD;ɱ/LqzTڭDF*޴[)TyjBMEv>\n%Zť$& d1(Ў_&e95,{}݉1I#)95Q8ZYzSҜȨ^94 yo*.*Wqk=N̑ac24W-ڶ,)D֮MPmOĊIu{{TIVƛĔlU#H7u/C4'NL Sżx-,b=5nSx9 (}{B<]Lۏ%<-pEmV04Cl3mIi)E6Y6#'b+$lT'2a[LAr 6Jnou20^ɭ&fyz߂Cjꯓb*gmYSzs# x6t!g?\[j>s '5Y9mU[/}6Fkgب1 3wʘ6S/my籡үO =G ѭG3ZdWSةqlG?`+a {,:Ӆfd`8lk0Vɲim%Qڬ_cw[_5~>Ӫv~[UC-5f쨺.&be2T:[%IVb_O5%_Jլw:UWP<ٺ5H뇱o˨ŶIotk/z- [cNVJ[ TdA^sQEtʵre6 P-+oOVx_Fͅ+N317bߖQZ8K۪jLL,:VP\o% :eח^W5+oQC {]F7_B6J~.fe~k U2@X[kk6LR߶w+rox󷨦-g[ZS㫙c)bDp>63z`r}R~ˬ >qϘ!n{* -Ϭj.2XMSQe e%b[jKr?꿧®y9Qe5jdr1*@1m+G1dY?-]s/i+ETܠ)GN*{vl",m_9ʵ%coz B ]3a3oQY{ϧK^ѿ (4rA2hr ޵SE'*r ̈ ESChT/`O-ˬ9mŻJ8r<, qTѧ2I2:A0*IC rQ*e:qY#{RcnbCVhXY{;EF IDAT[Uh{. r=b:6wOr]9+ r(I;*4NlOwiȴ3v=-H 1}g꬐fXx%Ciaý~yhj e<s3%@a)Ç4J"~\xgXaTל8J"6.3lmL.$IE|j RAV, (f/9ҰHEװ)ֽ[jwT bJ1 ff蜰2nNN* oDG,CDLR*HyW\Ӹgof< T`E{A^_乻1;l5Yb 2=cR|sjZ 4¾˸=5!i20ѽWy}P4O$tCGUAʟO `$T+kgԬR!G&\c{tjZĿddE4ƘYve`2:2!(x{`Y4iKI[s"IҔ-e@FL.Pd+h?$i4NmG-)MSVZ ԗ&m.IX/-d^o$iJR Zb %ċf(W|Jw$<4l-K_&z(֖fwq"d,oiiҞ)u; d$?RteO#U $a8a&U$~+)G\}@0k[9A|  iF:«#[H1w7f|K;6(ERROΪ'?})K|^> ~ }r~-? ,xNvn u;}ިwn]Y'g-έ? w[ٝs/Ҙn^>t{~ߢ^3^U'}xoٮCg }zW_?6룟x2[O~oroaZzx{ ,îǢm/LszW?6^ݑ3ѫՒu7 n YeL!ϥs{pM,czh`b}gX$o竣popBqn$9w@.~m†3^ۭܥTtgp;qw m^il;^zp'ܸEOxMLr̵;gnF۳ x^nh6t|ɧ.Mהe5u+*cy N?i5z-K6fN)*k{Կ USNW1 o?3N@)) xeXS[~6嵅\E],?5ji_ү0 b' _lRdRn%~J ,+.|p MP3>Js~3p 2ު2rD\~RU 9^CXքp8hdSO!׎Jey L_*p}i1U8M !C)WrJS'ut.oʂTގʫvq ku}cM뼞:ۣW[kG q 7먕1 CZN4S+XG]~uJnj9[͑O (&m_f԰N_f}uj.MGtؼ=vמlҩyK)66"splM>d!G{%wqt c}4qsQ;}}7G_삳_/a8ב ~_ ~aEKn~ aVf%m}тG3gUK߾h %=t'12v^,@LO7.}pرˌQ{h;rnv݀ן`uݺn`;X7U#4wl%KF?NY}!bl Ltm"̧窜 czgmWP"f \ $H%gX2 Jsl;U! abN'L08D1AI[ #b?T)8,Wdi xh,DŽye9,k4N`8+ Zao l·J9ɖS?/A@2\ ;zP/eblPQ15#]T7[GҕcôP[\kxVwZIYi\urzEGjM/BKj KJ_AP!~Ù;veHUzʥ: YضW+%%FFo8䥭+)0,$|8?iwpCC5DM*y OK) $(*&D5"v_IȲ? ?I)(|F a,P@CVHtdLӅ'^X/D]B b 4CÞ\<-U_(*G~ g*&J C"]Ǐv Pa )] 2>]BPĞY_h?-J)*($** ׁ-O@4$|ڴ ^.n2Пw̷[s~R@䱗EbtkdMGSOm{(Ogbԧ"qNZ?-A 6Y"Tr%e$vR5/m-]E5 W9@o},BP-׷m% zU"z/@ !P@17, p ׁR寐d}LR*PM$I&L0d8``o8 :PJrIT9udOaoi#%p[N$2!&B,9%oL?)SY w|橊-T+"3@m"ѻ:#)2=,uUzlZ~u2Տxw%fըA&傭1Yþ33ZҔBjޛWOjc.QYld#[Ytvursfş=qHqbћir+V1JtJ,G; T$FaX7ŢS&z

YF f2TN+L-eyuҌ9(@eoS V5@QCy2{ !17X5G hUjB@`p22c+'Q} kR$]Վ Au)L <|jױOOe Э=`sḬ!!MUB,:f3'&2T ?pɔA~灑O^QMg>CBGVHRy*@GY0"o1Rdt_WNss#d8!D3g#uF4Y#裄>WwF8Y#wTHҸN4u*.VbZJ$aKRÿ̟&w }(Ž߃`vyNT@LT)?VHbdل)!"LXa%a/K'h5 մp0bҾƖa[wME ,K4jd}ǭ1.}>M\znD.q?"u!ke(>Mzޭbiq[ }/Q %EAoj6Ax>_  ApטKOt~ऩGM!%iE_Ѯ:sWmga܄a2t<}!*ͯ7E# 9$t;!+|X̴g7/aCЧ&$o~DJ_?s G}=]ˍ'wn9 2ZSeLvO6k@X)51zL%>7Я5Uk]/ G]m}BDZ Ꝕ|1ͣ=r͚ޥA#]mwe" Q'bf,Y7󃓧SN+j<֘v}`hoSDI#f2(QHs,9F<'#b v6(7!d9day#~u``D! f.L]:kPgs6\?kV[Ch:̐%PfddSon,oΣA =QW<⼷o2Yg322S dԯǽʒP`Yn=M-LN+J((͍' hӺ)ݧS$@w5N.s: `Ynv97/WǷ*QnBRjv"%6Nb3^jNnRAV|bJFL,ˉHphӒcLɩB)4'31)%Ky )ɩɩioJIPruJX`O&fʂԘ%_a|<I B((W5{#ҔX }{Ť.ښkF b2NW_?vO:q GpqKhBwN%K_U"Hj3;319%K,'22MKޛ~V+iؤ'L+P E{KH_bv97VF(5>~c#=.> /n`bbJ|rZBrZBrZ|bRZ)I~E4ض3 px$NcUFS䫔.~ 57w O??_p'J2/y|N6WH"+RRʈX6}˱kfF6`p'v. /y,>\#d0*&l>w+]ſMՁ [ IK¯-Ҥ%W꼫A^6"+0jX77w6`gjT3Fc>-L~ ٺ[="k^lVSJu0w狵;^WT{ɭr6VG#U"@WAhٱӽXԵS/4\h-reVS \<*ys7 ˎ͔%6z98frT.xmZ,רb9XJ4KȭQcF`iUE/]0zwk QQljՐ,w8Y6o {nG6W9럱+Ciw;ک4C6Zkf~[5"-nED7Zg%1EKwj82"杽Kɪe]Lu-3ͪd؛iw)☛R; 8}MMp=/fܮmĒ l{ $fԺ~ؽ$ "W@]i:TؐUoW/E 5S.E2d)٦[d`2yd6LAM6o 66y[E~k# nd6oQ-Bf-5E }+"種d(Ƶz*_iW5[ro"0Sˮu3o_7ivȊ6d2'{X/GqCv}>- C:ǩCa;F6mɨը&g@K1=Jd|\\C|h r> dVȊm+M4Kaֱӹ{-20avC**BVl?L)YzϹƒ*FmWSqʃYZ$*hDνݒk(SYl^u)72`0734]KY{ߙreW̼}kiDŽ}q#z:1+2`.br*ħ}q#wb &R``!75$i2{?Z`A:+p!,&BUӸq1'`f:rCB|)m ͬB%"dPȆlʸ}!Qu3v=k;C0F4ܫk!SR"컌+&Qe!3XLCz*rג?n^҄w]aBf{ ?z!2[Ȳޛv{opBͭqn$9C7oO[|͍gvtt$<c !RӢNuˡo-yHwږ#싊p`gحg?⫵WM;qw c ki{Wq>XFFN0 F6enZtصWGpGoF H{jW_?6hФ_O|1&']m}z7^1z,͔w`n}[D }E#7㽡~M@hr{gmoֽQg߉xyAҼ~QF]x0?rڎKǽUI.׽s/=8V1 m{+ڷ!pm{n8nͪGY$9Su-7ѱyv>xe l]?:66BGqvmv=4L8|{{kBWq?j^AIp~E_^}yЮ!llU~k]Uua)bska,zMc/X ldc]SM|E5w؟K{ΕWwƮCf.kX [ ÷CXY_Fi/,~GþZ8f"ൟ_|m.qӻ^05.~|N"g0?+i6}Gw0· ym'mPf԰o~| d}p얇EĹe,lWŠv_dͧB`87uv ]E ->c.uњnpa_}`rᣮ΋E3Υ}p1dBApiƌ`X^O87^ڴ"Ecv01m 4nr&0猟}F]ZϹw*QH+Cf,tfi&͒odGL7zءfn~_ ~aEKh* ҄e+E1I>b$msiV|,qX_6M_v_h.Bs+R[tO?N3iM9cȌQ?n3:rN~1~?ۨU CZ]mrO4p{X&$hXR8οM\Z2MUnOfz9|> 鑺E^k}8Äql yt᝖h4+GӇXC9~_ i>+P+i휠Gw i~O_?w_◬TAKksyR;c<}0"h39j>w |7l{s|P7<]ڊO}׳+x0.&JZ;MomMo7yFx}ђAu?F#݌ pW*[h̏L X>{ő̂e H M>N+iֽEw8 Px &mXfЎ_ V8ʶifV~GoRwRk?u砒 mF˯Is΄zjSGh޲skZtvMn DO8!ПdI6w?ö> nzC<^L n4-c7y'hKTebL^YT*U2xLDK^(jwι@%EEڏ9nm+>bMChmGe7tF0mp+͓>H:syd)v q*vMhU˦}V3ג:)xvH.N[ !qjD{ᗼjmff7Ӈg u"l5! yciaDSq% iRTCfݾbߣ2S>BEMjX imLȫ٨qfm#:k&~w]-1-t / 5jv:^RzxLͧ6DŽ8PMj4hq^<~+w7iаŕKZUWmZH1xrѣ_"|uQV*2"'ZzA#aoDhaErq5O7_✃ l-Kb/i8BTP$QEJ#rDv q/no\JM]a7ȏGl]O8Ua!6ydB4!Q~dž8RMՄr~[JRPG%MaA =OJ+p[.9Q\EwpuWOiFjw49eLgW'wgv|؉E;XeUoȶB)%I3;s(  Xflۋ29eLW'w'VB؉" BY%#| ‚}L(S@r X>=w\Y#3dif͉$d{x<6zg^9JAщ`BLRXAU݉vze()LFw]~IcϑC)Ii(eJ}'`]*H9 lBO^/P%!/ #;]$q GhuZVp{OPY! 3WB?2H b>rw}o*VQ`O!?7 G0"Ih #cSCbjȥ@Hk.h˚ HoHk֐ĀqP%0^aeM%9m\Ew۽֘U)M~d4'Mj.m Pzơ4&T+dQŷXp}Fgb3ɪSg{}|}2)dSYs>w?( 'G(VޠgWb-zۓ Zpo  0-= @4ho(ZׂaG،XP|܍ \Jǹk@Iŕ WwƑ " ^#^)MUo#WȦ8˰ Ѫ>Jesߏ7T4M-2piuRn i,N;'~o~yãݴEN,GdEXY ŕW;Yә  0 K)d8w w[CX|Qܸ> T:rT׽ $KQbU6w!Zd"&Yuj^ZljԵsҒ2?xtH(E)¨%?\鋜zw.A!ZhV@4gvc<.dSkliujIXLcq?!+)=w'GTF$ Z1wUpkcοũ" i,Ns~>I iAsW6Hh~bG^^%U.!ZhV@H0g&v '5͸)"8!;إ>`2sϮg 4&1E ]@g FҒ٪ʣP|5>uX[7Pt 5Ųj$B j&]lN4}G][ž94CQ(*KcHbUfڷbOgiS8Y&{$_OYNuًR('!(r`E\Yn,8\@ŤqY]n|UƖ2=j/7&Q%'%Ie¾]>.m{I:ǽb hY-tMWVjw>Op|RHBߣ Lt.'3İ 6ϳv;P STa6bC:-Gd}i6_J٫ؼ={~լ׾q)f]3>ZZы PDy؝-Eʋcwn4--BNQو!Yd}iv5Wޝu~)f] ?Z ZJP SE LR~@𠰥^R{yȹ99 ]ãA+]i52T8Ef#Ϊ(1T'"=1 ,ʋvm4uǾ#*<ߒ#Tlf~43heoڼ>J]jOӸ ^hwƐBXQs-9s1V55}νGq)fɺs>/*/&ۻja[*V5δ,LA023,$25_5䤷>^aĪ +LG]&q(m=b-*CWv^Sy꬈o3(|>Թb-:R/"Ɓ 0NDOM"*z͓ bϭ&"+,0lѕhn&4ѻk(1*5V5:Sa 䁵4"$;hP~Nvu+M5ܕPj6f 6ll-u5l.3L,uSH&^=E)YEd<-%%=5_Om's:V$a夤e|01.O3>2%r+kzF<ڻ|",3=1EM]],oRm:;q! DBYVz"HI@et`UfS9\̰4='GJғ'$-6U3$&>11S?EPA7"RBh,pwe'NAAi~JcTjzF|,K8zhB!kx&5/g IDAT_l&%|FQ V'}RQab\*g1⥔+,Jgd0iLF>3H/b\fxŜ 1ć mv.Ռ*0S¨B&~FQ `!}9wo+fw>V"aFD2L\]̙ox(DB2bbBf,|r- ay 7˙T=ԙtϩǩ47Jͦgd2 yt^.yoZO_lƫR=e1D`[JěHoe礦e|$ETAHh5"њzT73EAD"uq +YԴ 3? bt=-RP1 ۋ k+]"HwqJ5`%Ow6e8^<=7C.r15<ɚzd7:3 4GtZR.k.P}aU+6XYn+ZAesKb>aAt`[ {l_px2 @$,g3,95~đ ɘ4)ln yo{ 1vRp ?hLGM'ʲʍ)̰p~G) (Ox𹲭S{GO\XEZlBMs;\lU[dk2E<$D7_9@H7~c93yL*'|l;sG/\慽H3nŘ2!@X΢i,Ҳ%3윔TDLM"7NtdJsLIzc/ /ssk"ʲ B˟OV-݌P-|?]N67356!E2KGOJmcy&M(43yZh 5*jæ\6&!W1F'ؚ5T0 ZnuSoۚ3[Bc*o:ln{q~'6X G]5f}EgmY^$,4wwgjz&~"٘`2isŗyX3H(e>jU !L25j0cĤS (T5PP%fheQƸ=j=ysL| ]ӳ=.?E#HPU}TeN]4߂nQnE_D+4tjgh.koU[UP j rY 1kb"m*Z*SPeUoN>S+C{hlJ$Z8aNMIM¾@ m;TbjoCgVЕhmTsdª>T \BT2Zn.ނ5ܧj <ъ22%#Roٽg-$E5dF i&DnuЬْhK,hy|S[I׿!U9$oT[ ȵ86iIQtT3soUL&nuMDCmc2r&r皔/|<6*E-:cgoɶ]@xfUo[<] AT@B3mT[%HD 5&h~H=?A.mʤ b"7xWtHkgcDSi>pt{'>&ޙ<e؂:TQ]kӱOw١<PH|YQ-r~e#=Ami|pӰ`x㍮zMt5M0jwؽ+Ѣ{XΏbe9-jvS߽-xvd]l#h=+ڑ bh:0ՎX~c[pUf!`⮝ڐZO 4&&zg;bS?aΥe1^r}*ⲡljsa6 y0v&B߱s-I:֘kRZSv͉4ps2/D(,l lCpuQbM|o͠Qj\*oW>>ylf7eo:EEn[Nh`g ;SMftӼrL}aè,tB _:B! z\+\YS萢KtMJBd4ha哽t^߶T%/L[acd^}js$ngoaUM8nt8~s g7#d07:)S@2dWxy|@RL)QA9ڤO8!Y]LH1iߣg5z=b"uO@zv貯3Ÿc2Rw}Xy!veMA kىEjFvBQW \rS,jz+<&4:nmf C$2Pgg39zqfMfBK~zbIm'*J! Oo|]4ZŀdƏ8=|]!;\1fG]9^g0`ִ&%3v*YB  7YwH'TX}bS[u+n#N̩Ck ^~I]}2 I^9GOGUƅƒU#(?&u  z:DKbU֌BW)HMO :S`l FXVIuq 4ܨ#hu #յ6KAdUVI̴B9S^duBq쐻0!+^^WJn=-ƫ@<֕rS&d}Yosub#Z!NPC2XvģuH(4T` BO 1bS|T H ./Ug%~zsbUy%LG,:ZM2H)tXV;BPˊxtm dok󨞘l|S3W7q=(4#;DŽ'e"K}=티}p|c\zy>8q0si1_N[ҵVw13iɔ؇wјh?>8dDcH2ޥtIӿ%I9{;~od8lsY?΍iHh[jiwk uK,k7iÙBΌireC"VoC|?b 8LFyÙ;ԍ 0wML<2 b[9om,%2NgjQwSo^"&.?Dp#tj%d8`2jeiNphM΀Ǿuv",|uxg[oa5l'2x拿{r;]烓ۈi[-:s#+'8_}47'I1Z$h>5RQ ϏrtqմRc>_g^$jѩ._cN$$R0]|Kwi kGTnux$>r|P\Wx8qE⭰N?#^E.Nß^2D/d*mew, ' օqۗL#PlĐLZyDE䗖p|a܎%0WԼ2qcaćT.ҐfaW|_ܽPy!Q{q31 U=dIgN#{ Id{u|ȝÌec(u>4=["MsƷ7/>WN~mqgN#{ Q,B3i!3S2XøFzP^ٖΰ,zNNj2g~"nGNK$?x3/Yj ~"nk֓Htڼgkj^ٰrs2UJO!e'ȩ[Y?Ʈyk}a?M1dq8c3 k֕ @dIy&5DV$ʥ_,rYx}j%Ay^6\ТmuY5@dYFsv2'6=EYgЦ[d-=6Bndͺq8 M玘}o\,H"eD&.4 7xJ7 jZ;#jsHC hMnޭ#zٞ];k3}Wj:k<\QCoSTHרmSqz㤎veޛ$+WBnW.qEj҃BݡWp2BNgzLq\fU \X\K cM5'Tjψ?Tx2ϼנ/\E!mw܌3Y;Q.*1/m"o6czznKBܥWp2҉r]0^qAqP KW;TuҗL gN5#jyjޣm'guz3)MbVCPʫsKw%kZhC5 Wbt=u؁|@8=xOd!OPv?6Diװ $Q !qczp;ĀGLf~Qvu5x˨ä'uÄ녕@ťře\͉_2@,u)8n ]F%7o)W +@QWTy:2GMP.F] Ṽ<͈; u`|Y=Fw7L_Â&0=FQ%TBnYiaIeKQW|+|MװCM780* ]cou ]I*x:S u>/,x-C'ζa 8 0fq%pK*XuYYaieέ0դɢL1% M?7Â&)La\[b~!+_B2H-')ɾ KwePܜy'U AUI \ ./+*+,pJJ*"m9o'aƶ%*s3,0rmMa% mxʠn]$$ vc2 G95WA!vc$((%ל`2V`uFz݆t&E!'=n,jv6dr8bzCOD~Ԑ|5~ j11niu="!\ zPIQX(%BB C5ЍL M .J#ɞj@!,;% ejQ4&G,c t:Z e,H ݐrQ=)F|9&ԐK1QK ~mr:2֦^~xUCSCRK1 ba.>3ˇftuFyX;u#5,xeN^ߕQHy}VƷQ][B=?bC3PA!I*1-)$%>*)1!t$_jEB2VA!]&Ы{#5x L I/?) Xqcy#y}hF'"T2*M:9-YEJ؍^}9Y\n& 8-=#-@3! [-|*UX1 H!` *1WV-ghϭͫju5f_Sl*HQg!Σ _;r; d}L Z]DO}yf_,.g| ?-z/$WҊуh$rl ӊ]H@eصg;} %GPe;~ ,tɬ9'APHh`\ϕBV*v+Cʧo 8L_h_e.$#+UŎ:xLw!3Ħ6Pm?-tYƪbG :w=&ިڼhĀ MՇ߳QK=oa)t4pԅ ިw7o<5 E-2ô9Wv(? 0-=h\kW;2P׾@+- #D}U[Ȣs bΞtH'Vbj ԵkU?F$=Xs~`ԘO81g.p'NĪ6PM F*TGbDO 12/w{W-XqȢr5Ui6ܸT{R2M-2&ni ֍-rzkok"#QWIjPa1d .**S*;?Rfa[ړ ZuwBB/ b=9=^(Vl`kGAӬF@VwtԄY4G@ntkTl(82>K.SB`BcB x|ŗޙci!%,xy<׹V{^k}\V$n=2hwyi| ܷ3DYa矯>8QI@[虱%jqی; V!P~؅^5}^/򗗇Nb*"sy_jq0ד^R]Ke<_;|ŕ#wֱ7l/,gx3BtMܼ}uáOAczgr.AVx`ԲO[~o,~e᳥gsa>Z'hĚY<+<(j麃 Lޛ [7yzXZNNbEx<]Xbk$}}ط.=XaWy09!S zScO{qk JVnJj|ߋ[s]WM?͜g=v^q1u06+`=eKgg>سuV rfu`{@1tǗoZuץ =/]gS8- -%~(%U|^eAQh;h|ؑ;g $NYF?:}|%ΔבzipΙ-t8n6KkXqz;dkCb~_CN~+"2/*0Qo40XgPRtH"%iT_TJ3i#N+[~ܙr$Ҩ) ܌,0SRӓd*-JOJ˄ ~136tQeZL!f={ԙ|$|"$7%5=͠]!Tk}Jhg}uMbFv:q?9w$>Ryx|ifZ"GDP PіɣϿdr0Ay>JKcؑFesVSU.'ߎOa憅1L][sLL@XYNfr=GNF5 Yi46XEnvZ:-0uu{ĊCq'>='Up1lx/|WlJ~rxZn@E - bhzŬME(Uש3%RJܬd*=Ww.Dܼi/7%\PN066[n6SR>*?Q3hYl*^@PɈM#\P_ XɌOK7O3 H=F ~{G=VZMgfV'NU+ɢ32r|f:^-Il;d `KT(j|",+KFW~v;ȊNh_L}Z3=ueR͡0SN\W):e3L]]<(̧OKW1 Q _NгgN~3\T툒\;I@q<ňWsHp(Y勔f9w^B͹p/HxfUc65&Ň-liHکjAB쏁3L&|5r1 z҆SIPP]) q6 U<*PRg`kn)5ֵDPnY?̉76 @KdJ6z6*@S`|WUzTVRg= i|sEWnSΰѢ.Vˠ)5"&)}y5iH-#*-X2ɇf8WܩޚdĠDC6joز-H^?5U@T[Gju a/ kM c>_1mCWPAՓۆ^TWde-mL͚ߪT$h=i[ի8qS y /`a?l!oa51D@)i-ԴESiFf̸O9&@ -:95~  _O͠(Z%4@fLڜ5[`&-JA J|GzhH+MQ߸P-a sGv}Z6Xj& ՎLf}bawX(zި":M%5 qRZˊ%l!@Zchlvs5jE32͙R ?n‰}3h7'Pu['}vZ9DbQf2cا6>5'޴q,'HiC?g6"YNJh(:d9qzkJɉ1Ҿy BQ,RT[RH4#;偅?}طImHz!:/8?ueY?< %%ViC7\^xu-vFumx?Zn&EY{d{!Զ|W(bB﨨P_>MrY.w+\>EHV[i ޟ0۷Aq@]sz-H@Q?jۚ$Ř ]3-;D-GNer瑡z}mW#m9;ZgLԑyŮCU tF2V`O\X;yhH>|FJdT5^ RͯK襃7_O(Hc[Q< D-bsF)ۖþ"#,Ƽ="Aݕрi+% 'BCVq[8Yڠ~/64P irH&]z>Аwx,ݴ͑PlⲂ74oH~jpژ (D4Ы(|+,kion:!ġW;]aoJh~ Ph?prRBoEaIMAc/ZhKGZc?}|gXӯ)SiUMIPء suދ7x{z eB ːQ>Rfh q"duO[`}$Y88r׼A:n]hӤUJMT,Ѥ}wb#̍5@,O [ PW0{0ba##3T35qu07*iZyc[e7JS\> 96".@53rӆ6l_gBzUfN3cj7RCJ,m)9xS߳#^CEۗ8CK|͎un@&mu)]=^!m=^໨6ɮ@03v}'%% 腷wc<}Go#(.혨?\K8݁kO{D4d8{U31hߺn?4ܤr{#RAr_G yF8}$٭t;vOb)I<ði&jf&UD)nk4N"Ceo14ꋷb_cض~{Ft9MKn*9=?X)(\5Z-z)E!# IDAT7ae@ȟՂרaW><>Q "dž-\HV__hШgVY, ~s ݔ?GrnؤCƒïF{lj/ ~krN]xq2Wq^nYmg\˝L$NY{O=fbc(KTHp$;: ig\pNChY?yq%Kٹ^ d<뫜H̞.dж\s5yǨ!8J^yjS#& ˕^Eϥ;|޾za6"gy8!)5[-N>y{杏\;Sp:~?~3>vڲSQxᓍJi[<8.55s#kd m<w,s5dՍW!g',cJߗ Ы JŎTCP,gYN@*` PA(*X'HB~{彝ٙ);X1^>>ɏ83 %$O !A?6w< 4>:IJǭߜ(|Ck!tfs>6e̝묕Qo@e]q[XsUD [Ɗ8o|ǐFy~%>b =7بWwmQA~w>tFCQG=,"}-Uħw\E C雞KZG' }cl?4qT{ؐ־-2|ӊh/N`ҙ|79:xZXsn~$~ց-ՍuqBy;0xN qGvM~ukS7/PXczWKtզnA?߼`M-,j#.%Pk=3RXHp;m?lݳ9c*olm`;hĄZ:Dś:,+Q{BEU[uM1xEeÉ@XRDžV3v%ꌴGƍ} iЊ+Lf2/Hk:WУ݃3SX(A>lu~*b󪙇h ,\6IeDr7jpkJ (M1B(̱(*D,ǩg p`F =Ӷ$ԔRFd䉚_g֔0wZ,j1G@#5(be뺰;} ŧ)"{<ȿk3k*'e۽^=ۣc!{̰u0wܺ"/~[SVVX/V *ܾaD:DNMh4Hs H2_N7cy{m~rWPyu O&JKYmԼ=om{ծO&Ewx%mE{nnڲeu $NMo0HugbZܱ٧%) (yZwNu@nAxU0TESud67cfNt\tAݚ }6qieE&Aec)Z&e]q3↺8$'혇: T0QOމǔ 6BRiM]ɞ[U xڔ"@P}9vDGEܗ|ہȪ굜D uV-t=oo@"R4eA(JN]ɞ[ABiS%9Ác 7Vǩm!=}:"*hOr;rWE t@ ;Ṏw= zG(W's4ȕ KnʰoD c5ZvYXᯐ;Ƕo[+iexw)wd:y)['i+Mز^-t{i [W@6|깾r6j}g툒f /;CI5IUYlcDd<.F@vm*։L_f1@V!PrZ_I<ޭŗ QCo:R'oPwrujߩ3 wFO̼y#s|ws٬14-Ebb_h\F ASlr3j8=AώYmnhD(վ9=F@N}#"c:_aO"͏qtDC⼇%* cR^]Rʨs[Y?&6G&zTἦxPa>,mdV Z8ӈnbKi \,H%㩳Jh<݀xiԼ19h]DcZ ʐe1铙ʍ?z|==2Czb%4n،qԼ1wc7#N&DE+ CrݷJd;], !/9ZbddaԚIwaI#Np™Ƥ~giJT@ OOz$##3k9PkAy$Y*F6 r{}lXP©] 1g75 %G5(Jri3TrTÃHj+3oGڀsew*K|~è7M|vhb4M(}+>ěFfnlѠcsWgC\F5b4GHG#ћ&*1"@zXbx-w4>u!7(شRz=q -dqO8$eF,PT'DFf0*9Gu<(_y՛\Lчx֤3D_*XpV_uZc\FkgPwp{iX4#@tFڀ32!]Oi<&^h jX(ƎԾfaF[4&h2m>$jl[T=)n{z+OCS_0@.-פ9v2M/ⵧ\|mT_%=5I^ݳũhj@i` Ϭ(bCT$p*de5e\ƵT0DE~@|<Dž@-c@Xr,#` 2E<xY̾ld^?eZJr<w[y ~s +vqi% j8qvL xufI~S~W@>[ E&2>ZjhGX5R [oNeS5*R f 뫚TF̞$KҔ&ln'ađ?uECyη{O]Jʄ' %T$F8v"hpOob+g+uͷo׹ aZ.rc(q[ rx V壛 8"/10zfcܼW4єgI݂nrھ)䑊!'21]|O:RIERf,Im)ʄl:zmOL*`=ϩ{MtqʪJj,mcQoY n_\puhmRN";[n0ƙ,Xahb@>\ZpUhmD 7)9&j_@ϥ[D4}> \huѲma"2:Q sy=9U$xl/O*0V{+gzUL!p8uz#%YW()/^9|'U|{]fVf]q5"2dzFq1%\y[2eFu` hhM֓Giϴչ}(۴I 8=)4j=j3L-@#Ks#Pm K}%bC߬6yӨC6)Qqh~C!Mi/OUNgNJoϭ fu"_\ 2]|^?/լ.KWf\yJAm!3::ᔷjNmƑ!\iP@S뵍5?Rp:OuR|{~}hTz hO;Th&AwŠE3`c|h}'qTFT v+egs=&-|W@>Dor&aʱޚ uf ^qBeoTo}0X\ $Gl;@A;#!v{I3ԏjߩ5Ij֚zTpF$}FbfY!JPq[_˼ɏ̈᪟FAƼ-M5hX9Ag,nhlkӟe7FR.TutoߣQ"cԬbI2{}W)u^Xv1"Zw Ŷ$Dޥ~M-Q&z&]e~*}w(그kЈ1B*PrQ9nu2J Q <1Cq]L|l"`9_ʳ%;RذU{}Wu^X~1̹}X4.z59CUtar궹Le5bAa=0JA7/WAH}y%y#KT>h[;,_XT' Tk"܎ e3^LJr;6l$f$_)WWl>T%Ucܺay;r=wU]An⺆!l{XJ YuIZ(|'rfʩ [2.64}`Ql`C^ZeܵYV#) [QI~F =Q)+9lYBBwz1T9Uv\\&$h Xwt Gvߍ>WH}:iγxmo_7*5yGxD3audvA&70Eϟ*%}qV0iĹ_Ti> $˓o]gZྜྷyImј2}~)ـV`>.RUsAFY%Ϟ([|Y7d%U`9i5lprTYib+S[OcCȯϪb 8+' \zEvN~6%J?U0#ewa ٙ>Ӫ >RY>IeY#Qn Ao@ZblkTj3Sg?9/wS,QoV}AWXNd.T6HaLQ<";'?:A*qڢ6xm;.ӝ>ɴw %DijO[RDB~hSO1iȄt;,#?i?2Z` JէV9WzA3Q@O*Z_Xok>fsqܪOٕMBS)*Lz[y9rߦWquyh 2eFś?=bA.%aZ@Yڽ3/Mqu%y i( 4!9wE\Fen^anM-E)-(Β3oJ;u"S6 +RH-///+j >`u6qJݗt>5_}د,X go=w(alK)LϮh٣ʅZOnnU)y9L 她e,X1f'gs ڲ܂⊲¢ªʼ¼jUlmQĹl˵Dŵ\3φ(zrUmP ӳ˛D3e99\!74!F_cuR fśeA.\$5/~E:%s)Ԃj@̚F^}q·jVX6^\HKe //+(cAȪɑ77#e<=7J:DzddVp~Z~Y#s(JG,@GTÍw :"A+@yeBbaXd.:\]qޗvMPWr4"0bd$z@fBqY1/-O7W R%e4ԖJAf N}Q)s%"| ^|//@AN [XiGC؛b-TjQϳ[0b ~٫" hp߭@NU8\] &B5k+?ϠDxKՂV* mƳA]YInAQQyi~AqaUE^Aa.GC}o4."yAS+u| WCRHeYj7K*cb Ԭ4+?q/rHO}̸B.E+J+P@,g! Nk̾ ˚]!"yu|a\s3R#gQ IYYqfNAFs[!2&FĎ+cb ՆYiVyaV˥¤o|{_ohOùaQғb BnMQaRo]z*bЯ;:)IyVsJpr3 ;Fdz{ $K@xF@!N\}) r ZٿjA$K% <8=L5 en>pD$IXN¯j6ڥ3y/ Ckz!n;Uv~D?s{#)0[E(W؋߭)қT:P8HA$?A-ل7IV'ny5Q7ӾU;a?WrpqYBGR'V{ۯz[)GCO›{bV_nN{8=N }ᴖ zsN]C!PveT貥Ł3Kg{ݿ[DzL_qu礣tiYށY)_G\Z`BBlמx8QVJ(Xk|(JZd56hE_՘x Q_1oLk-i3@]Q$]U,Z1I!Oֻ`k@ :2Y^GףAu5GEV$Ɔh6eo'視mv ൦oK#.=>謆]?%ܛS]:B5E/otFRбŷ7-;'#:`V !hѼ/|y9PZȅtUǵn8H VAba XCgkBGz8`+O i;f =Ȫ[1ZGv_|>Ar:ҊH{DŷҸKcSgxS;2nGjߡ zT܊ɮOzk!E#K뉋V(҄8vͤ3#0Pvc3GnO6j$!q[&&; D<]XK\&ujcuv[3~F~5{tp.N+eX\{QNMu,F'+ϩJ7\3}bF Yi?|q ߽ɤ:D{~<.HIHRYcw'W)ƍo=LqDHQڪvq,ӌ68" ہ.nJ8+K}{MS&0Ӛy;A|SHG#l(S>6JQk:q6.p !3oF#:;J~3uw 3?+BSu7-vn!nuu䝏M|>%^1qd@[O7"l5x, V|E) {ȏX4N|t'5U+«)x!=Czҧrn;A l%nDm0bJ8.{owWrjd9Fxr$ 78YR0#?bm旾zx7nז0[k7ɸ+"Ȱ"(}nfv K5<-0SRo]ߌgK[ T<7g|O@/?=Y2L'M:z{K`FVղz~wne~|~ hW`ݐ7C7"wB?#?䇹wBˊr]n4{leQ>Xguȍ(ggZs W LuK^8AͷޣDUW7ajal"w;YC jHo޻f,Hc>=n$mȡ3m(a|H]ڋ-e qSsHćt^Զϻњ uκqF+L0lZ}\+Tkzn'c]x5F]~^0Q|?UFDQVQO:v~Xi﩯R#U[̥iZ-AVn礧G:eGȚyǮHxzPj޼+PF0S?[ (=i^ 7M' h jtRo=siJ yʎ]͋BomX~1db}u9eMxCo˘Kڮge=HMxpŔty_;oYm׿#sc\iNHQGQߋYe$t$}oW& 7y-߻Ƕlo=s @u51щ0BЯqblwƒj&-% ;xS[#D]_\}qjk%SKu5sq'OhO'#NO 2~5/E:nuqeͬ# %f,!h0iYuGX4/@nMYiI<' >. <d]{w\.mkA %(tdkJ MݮY"<O?65p!\pd^*+n!m-wԬB) MXl=6IP&HԴVK<7 O? x%mE{nmA5]vWG0d"E Yu]}m@vM:Xxbs VA{S^]@WwN6ɇF)1Q77 Boi24KO50lrjCCRxqieeEWe z-G$ۼ#Ӽ↺8P^;&jgDdWԳV3 ^,pJ8MAQxz !% k:oATN{,TꎶW4T&E9'3Bh ~"3S٥k{o;bԛ& mB^`Fـkw K8'N':EauBxW6'B\e1[m&莲6T&EORaKڳxڌJ6"i@`aQzH2j33Kjg;οJm?=BeR߬D1:EQMoh5)$aE?'\9z^~oDcVqOH_n7U{ʞ;L.B2\}>`+dξhQi{ V /p)6S2N@u 'ZvwgVY W=[\lԭə.\yb]9Ggb5z5btF(W3NlTCl|n|CS˛7hTia4R2a,ܣ%F^bp^S3@ӳO\ 6|n5aʛ@ aʙhQK)ɷc@ IDAT* E7Zr!?5t+5x]|`\>@6v%)X<ƟLDQU**v> m!H{'bSA!# T29\8̏aD"+j263KbI.'$VR/̀מp?82q8Կco2@CTsp*JjʸaH ٰdU@Oxc4awǣ⼨.A@ks-bWN}'K|XO*Z$*!#~D]u[Δ= > MM6 HYhJ@5-ۄSVU"+#<7kZJ+ꎦ7(\ ( -#OYuꚪJGތilr`/ 2W|kcڙBPOiT5>g>IC0$ǞFYRXjt-~]ˑ+^l[='{{6T!P4ѹ&d<@lFP,G Fu y="Dų0ŦDR8e QO@<4>×=sޑ̒ ԽBNCw$j_&w܍ZKIpd+ܶMhWq& ==| r\ w5fg<8f:iJ5*,`H95?UeW1o\OxripKOb&ӕQ*ku@EQrV}d4k03+((t--[>ݹpuhb|XWrV !hw׼x\YHCSrzv̏#(ɺ ᔾ}/g3cVw.<zEn{g*||0#mD nf)|euѲmDxJ5/ 7{Qhz_ +~沱V ;>!!r!޸bd-@n1/K !ڸ;ׁi%o~&-z`^ދw~2R FԯW- v=ldtw:DA! jVv7n& VDsҝӔlmD%͈KvNSJ{wF>5DMq&@yS>ShdKCy;* [.OSb'9iviWk=NؿmvJ:_M`[“J}U쒫1~ɎJw/[.dg y4U>;HO͡0oϢSŃ_em@=h><Aфýr-u*]|j MRguF!mw?௬ao~ݫxZjWKN\>B ˟-({j#N06_ jњ'6Ӷչu/)۴I Ш-C(ǫȾ2Ks#Pj%I IcUl5}S&ou~@zaF7S7]rP iJ6n'~y}/p:OpRJ>68[ͺyߵO bo祚5e) *6͚->WR&om~XG'::E5sTpVxxEDPo)sZ~}!Mq/}*UK2Rl*ك]RMd8<́)1ZFdSvp4ጓqx@M5fқNi&3c{%tY`C w2u>AU%K G3Ʌ$=KsU@9OPZq "6|;?翧m>W9 hy6_@FkRl_f0RNY`䀖LjnrݷYAsڡyrO~cC~/bFҙ*ASjC,*+ECn/_'>2V"Ԙ{O`Q <ʞoߣk1޺+53䶯HL<_ NitkU-qҟc1EIkPlP?֦?QsOK]ι}++Sv~=J=U0#e/J:lmqNz ME_1"ȯϮb 8;' \FyVN~6%Aʞ?U0#f"~cevWi%5iiQP|5q?{WUϝaA,@2ֵum]EWZ¤t 0Ir`aI]|cry9Y#TgvAG]ԯ %|hwuq)r+xcxi/an%3B'rki"+![ ٳϽթByjٍZ֧-YP:eCJrI)_ Q\wlѐ7F X|}чd2#ȧ2)T/(}X@e(ü\zMlJ6A(u WΦdKn!^K!$TZ?T@; (,Hi5ӗ~rI4/Mj+zM.ѱw7KbCx%99[@-P ()i 08aѷg+K*J2۹tw$V 9qg5 89ݜQ6W) J9GB.=-S?V"*̡5l.kY4RXWT@ 9_]Bsh#C2(u A-f!HsJz|$JH24x2BDBNiaΨE{,*A)1O Ѷ!QSVp-U=tq1Ϗ|&+qag3 ]f9JST^H 9PX$)E#|Vƃz;NڕB®C6~.j)(@^U B #X)-!*|%TL@Ll[vKÌ9w>+v^UHq Y9a,{w'bPG5A-KgmQJ/lLL t%f=9 \z<&Q!xU&2&7xuyO|b3_-1(Jy./>ԟ ELDUz:ؐ}#a9<li6(Co{\ƺHCj;D4a;t(Yiq͌] uGBk1̩;jLFh>+ljԺ Q8ƄhUv QPݞs,y鷮nA4I67*k9,.fnM|\6YidQCcn>xL?Sm@{շ[ k\>,պ{ h |W$LS4X79< "?'c ~H#25Ϊn'TY}!JMW+jIm&T! uf iAD!/BM8"T'|@0l'ywE?"AW3j]9Ug,DXIhr,ŏk{ߩE47XIGX{[SAY&]vö[Q;Q KiM]BEF?};lo__۴EH}- [mPtaO[X&j5vHvѨ\Th)mV:u:淕*dQ 6= N +3*5BC-V檇$TU/U j(O3OͣcWEmeDI'E6& ZZђzJ?''gOm=]T'w $?m-A^Pe618߁ҟ]iA!rw=()j!?X4P=" 6?D4\fimҡ: @:Qq,1N[ehΩ#-W"a[1H5X{3CJ/D~P!NL`;Y!!E@Y͖DLj@ͯJYBb[dZ&Q 'Dws_G]=E#mH<l)}kh3gjo`3Iu>UxFξ,5*:D~ۨRм*`;Qd ȏ*V4=`nwcc$P1X4} lnE5F+ت}呓c䅩x! %]"\^Pno2=;N"Ҷڒ֍nK7m_=;e!? )b9+Q⼶m@+~M~SNGƝfBWD E-h7EcH0 q঩\l:14=`~E/ꪭsHV ʞdǴS6b> $&,liq;`YԎ8 ) ^\egqV'/..fvId 5.+դoʄ L ` ;y8` g9i"=BT-tDl b)=̖VoЬLжݐıW'6/z(;(8T 9c 89!o4 V}7"K?#`VCoMYF-3񝂶0QW E ")!-(PGsG燎uĮ+I՚J ^U騉Ť 7qi. ̽ET0630>39)\2}U1@g,?&Ùwljc{As)nDiU&8Pl6fRSrLPYޜ^Ē nms ?3`qfxפGl>ǀC&=;)Uܓ)-f] ^91gAV +yF FHgJV`I&`Mqj GݿoڝO">CPz~C&F7I^aLs|h}s `>i!NTq:̂^(R¨T8Vd*N_n*εrC4%uu3F)`KΜBp:Eo ae)3g *g6kۤqSƊS=uQsCPJKQE7sǫ&}*w_e.uuM _ {QÖ ͼ0.@pZ$lFeh)`;g:0TAEr"#pxD~8_=yD*,-XyT7!Nw ?)8,wv]FkAm!OR ͷw}Ԗ ?ה#e +?"^Qm{[ma3H x:&(aimiw5%PqIԻw!F>f;0mYc>)_y,=W1%IC֝ySfc4QC9'FoS9?}iLջ.!qI=f휌Pe_KQ NKBΥ޽6I>F0FW Ui_1 +]{{~Uv'[%~+!־|sȫb˗Rw/|б`YQp2R`(?ma(?Gh RΝ@{y3bӗ_n,&akvqAWύQR`t NO~7;)mrk7휖?ђ_ν+mƣƬp%Ba]m97j_ѥ-g>a#$H XZ'4Uܻ19O(ϯ!@0>Cwxvy-{?vD}x#=1:g?BVgzzz,ౙw$<ꩄ;1DР%fXJ"0~?\K":=s(Q{t&}̀C)[o䀕/@Q]6_'WBF"k[=Cyq]HIH:/bO|BQ[cW@G&6[>ߒ>/MRscH"FO _mk0}Í}#a<^;MyaWr.}H3[7H *Dzвސ7lBJY2܊)/_L{'/Ǘ?F54`iiA zc5*°Cᇺyw /:o 3_$&FPW7=-ቱ^$޹@,!Xn  F#DY,Oo|}g/ ϯz+N;Egd>W8ߣ=}⯅ר/{p]QMG1 1ª)~_Gt,oIQD4aI+'h֛kQJv8Ⱛ61Ţ3WR8!_s˻_D z,7ItU$NbDƅKo -B\w@$yaY+L6iЯk@]s<|tr%!n/Jh0v NRذM Do&W">7lB1Ml6u\uL]0en)6^uD6/UPzuJ1}fJA*n 5qcti`am Xuqժu"G0vu蠗fJvF!y[=YY9waA/{ !sCƕqmuV޽~}u˶&břjc!YY[je²kWM> PU|Pѡ&I-&c@MtZ}ը_7@}HCB[fhӠQчeъFiCӂ`58:^OIlz者ϛL6 вطotjD8Px;Fo n @kjC\G_G!umE2ʤڄ_.z,SH}αk>c~Wڼ]0݉_)*ٴz*+zV#g ]2zށ;DיG6g.N2 ε헭g1VOp篽b駿OEˆvT}޶TQ uo`gϽAD۬$2 >ظ]~VX\-tYfyӎxδ{_MIGMOZv\.B=6I8=0`V@^EQanS14Hŭ׼8?ƲNq-0H6zEf Dc*M97$hC !`Ip?H [` f]xѳQ&%)KsM6LGYk\: t3ТMc8 &G"Dߣ @KՈC{8~}7=yrLS_0JxfX7ޯlOqL$R'%o5zN@/[v<淠iGDDtch}m/,*36 V%N6-`B-4r:otU_5h욗wВ u9@vP.#e}k˦GƱwOq-&yΔB7l]LayS'W*?t V{S$9ƕ6#DBeJ۷#ֳ|޲xۙkWO9\% 0v4Yb T.yR_f[`ɚŀgES{mO/[o=SP&QD;eP%JG0aQP#}mHCHt2,hK҇ƒx充aZwlq {/vxR7Sȭ, *K[GtMwxz*`iҥK_*s.x6=A┘|{:gV9lCvaYm33]|e+B.Qկu2o*)qOg_ ^6c|]l8k3˰yߌLagG9ޥrQʂrơSgI=M3Q;_89Y ,"ёEt ޡƞ*@Ee#rr^M4tq3*j1~3bʓ._ZXMRʉ[YV1U\N&Rc0',FBu&>,r OF9*,Krk%X +U5VSI.fyU; gX$tv t eԕވ,vQM^UYe__QB7ܪz%zaaYh~L8с¦$\8?A W!N |iqŶ$&TUVjĄD2d &@8Ԅg:Z2CÓ%* VK+q+ *Ŋ58nOw6C0B. n*D%]Yŭ>/!uS8PtjfUc yN7S<= ˪G{O2dBD0o*= JF)bi K:jΩ{i|k'b.N"ßV D'cPѱtXyyugKl;w{%u%&Ql> xŢ4,:/Kڵ,nO8VsT͆^cCceaeHHͫ}`Fmu0"ncAoW fUͭ,QɒjTJ $xyfyȹZ<" !4M2,emCM'M=sp$k-)bR]^YC?9 E ѦZ&U98˰X("Ħ&ē=xr#["dO@ JWn Q޳b083p ǯ-xeVqi/u fwSDtNy2r8$UCT,TxqqP&nE xBNmM6ֈQF!AAɺmOu QlmVN?p`YC* e\Bmc%!Z/5 xD,>ۀ34645e^=wTTlFNk%߿YCj慕6ucnJSu2!@fĴ2}exj|:̍OBWLo\ԏ$UfĴOYࢢxlD_ 䈍C&Fkb>D@[ ;uA yBJC4DE@(:Ob6X3/ %my8#cSC\ yNs^=}r!ofOU% RY5n=}(O'ِtZh@6jSM!ފ=!^Ԓyu(\q.8|ε*(WzQr5g^B9-jrT+*;ON|fn+vw ŸC>.8*cIw bVlA+qEJ6V3YSjVnϼ!Q؆ 6Zghl`b@ȉJ(2moiQO9؅j6uC9=2GYm6}jXBQTi`QpjJKY5hCuB+PVBbO4c3agJ@-"S*Tldl`j@ ^z\%or*\'v\BsA2}딹yvJ::.lN}_1C|vPƖ"B!*A[ uzs 8 _9-&l&M.pYњ!>G'}:V\ܪ>w4}qGN_ ǎzL.s] K(,YElMr MxĹoESNo✦/rqzb9tNoON/Xzӂ܈@I8Q%Ҥ(KÇ>߱2,۱9g}5?[hIVW"~>a|)}Eѱ(&vz^"6✪}l v:hEj(M ?u>8XtPj`lCr|j!XEn7pu>,JI{}CwR٦:A"R"":vE0q9; D^n:]"4(ȇX m~sKf.0gt7dmI !J ,5goD!0:gxZqaFuY.^I8ZnIgx`'B',2]u)ܝUE0vE 0k+CgC,JgG-,J.`nژS̆:dSets?HNR$:wq/w!{ѧ'9"f,3u䒵S~Y;pBAΝ}s?o!׼}=m#Pئ 7D2ǀ8L]`(L= O4[ʹ{G}* J)QїBBbc 2^X1weYk ӡN@0q7(KiӝAhJPXrNzq=Zc}/u [cVTpEc?u˃\f@]me=旖5@ X<,-̥ Qa;،y'[ i;V[yyVPmGD :emT w> D!'biׇ, Yc<8ɟspcK8c&{"'s%Nͤ\†@XBѵҒ]tROBEzoㅅ@HrP~p.v;tZDGRJI{y$K,Fa|MJ>$ IDAT[']L(x$*V%`kLgm`>dqw.,쵪. źNpE+(%eoOG]={GaY[߾lK)<&gsE)7%{T_FVܕ.Dt8 Ul3ph5Rʍ;鋙_Ra,=d .K<})D?P:wuog\ӳ DPQo7c䀮$ Co*"j;m"~~q$S T˜KzaIgw19svљtJ8f .5שgyi9MΫlѿ+znsqիА;œšJ߱V&W^IJx:ʧ>_ܑ>`$.0}k:b]oΡ,y!=S(wno^Ms3eh _3on[qoj#ƴlҳ-ğ}j 3fn('zaOQ%OeyLG9,XOMŶlCE=Rd!rT`u k~%~}|UP :*3=~]uup]&1cN>%pxfÂV8 gqٍzJz;v`/#A]n5_E*즬@tm ~{J+yCs6ړ<X[}x$Kl JݭAߒG*iY M/˭-xbX%/ZpfC$*އX]M:{nJ 1$~],T? fc'̮5ܫ3r ;Y YIL6-oA!WE6zo>tUʬs<@ie;B{MQtݛQkm5=!CNqW#f&D.\7EDnu /l2lkB᎐z^٭ e2?Yه2OR. ?/{v&0f=WElq+w%^JQ=X{ j>%Ci⅄%;ѣPxݟb?:@W; Br:ӑfٙh1f'zR̕:FF Tmat-Y8Av͆mc5$ ċab  K,noCnMVTJY~iaj&^HeGR]JiE7( ͢k> 7/.Xw+zS-s-=ޚZ2UkQWdɈ2î3=~fD:x!~c˵SLp-\Tĕ0UK&v1u} ?^ч6͛8\kZ`u2Hosη{ 2$M3â^deO8ji\\ =X0}1_4^CLAd%hY͇K} L8jۀuS5o)Q[7GȮ3;aVum^c[}PPx>~ΐda+pU^w@HWg7/Bkz OHqm[`q79 ZGrU槟"Yޛ fxJ7H>iZKAk}"\Nuq\5(Zkm" Q93;vA2N|!FjJz1SKN+тsbPP[BPKB +&S <}Js馓uggol~UAnA/̣4fJ#pgq >=- y"2:3߶ ӗHGݢ/< ,xՈ>fIYTZxZ^ɇn.:. @qT''Â6@X,aê$ql!XEO%oggg_QFORʁLek/aeRӌ֏5]1Ja@X[C7@X)Eߵ+1c29@XS7ZlF9f=, FDq4.8O#N{Z_ jZN [`mQ~F[!UMU8\M^N:B VV摩 Fa>K/.9,vefmg5"8 LZ=%뺺ٱ?s!FהPh4ls(d rD,Fl,gaYbYl!r➑]d==aK?ӵth|qԢbHK(atq7^H &Ahrů^ɧ]]toDoxTP9QVcW ri8lu3%D Y:paGJޥ#K4 !.--ɧd0* k ɴܢ|*#^\Dɥ̔B 3%}qrt]\;?w1Fװ4:"|2^hIfiX\Lp 0=,_ }).>U'ްٍDP%A܁w*<4)QQV݄86W'E%JzANQBڱ!RkgcnV"C);$:+qYQgcT6*̡6/rs8lce<ȨI^+ Pt6Q?* PPˢR2^ȁLH tzF:.e)% ^tvWˆD BaP˛X dZ؏ $7c/ yjE=W)Lci9jn@X*6ܱ+%y^)~M%8[s"#LJc09&+uag3 Hq.bdHu+cYz8}믪 YX TN>B5zn.c0t#0?#'4 8N_hjkkVהyPaE rJ sZt2f۹tw$V @yּȈ |&GQz[9rBZ=})wDPϢ((9=!FoeXa9aBGJDW"J#f>9ÜF"y`Ŕ~=tZQa)B31an|lj94M|M;{Dc09Am)FEBoB~igdhfF/E8ll״ /Kz}l'-Q-\^xQ 㤖>W):تǪlQ7!&)oB-T"@e6@k5!PTH-)mp[np[Fz.ݜ$-5RB#ՕlgVլ4d2(դ>U[a/h:5^Ъӑ#o>҂ooRςh,0xYM %5ѿՌ ijշ!9hGkd6NhE`x 1=D0vfRZ6[|;׷iҙ\?炭/$~(}RTX H3Y 8-\GjG9Ҽj< )׷{UTuLo&'MZvP"ۘ&UU`[\}O= jKW%m)[e|@ ԏTFp}-.#}A &:#SLQ؊yS?-qշDnF 1m[ pzGSշ>6M} bxEJɬTwiM} Ԛ1ll3%/l}{?lPO]u%P -Է!< OSm}`@7mZ6: ɾI)n5#tLMڴLU߻%_-O忰 5w&Ev5yh`/aH}u*Gc C3[GC#5eb O*V ۫x <7T%T0 `\\*)է3JyA1TrPy>?/|"8O`1ە w@ݾY ;tm.:fۅ `# LP}?X`50'y Љ 5l<`Jqn+jVag'JuW>Df+5ݷwA->Ӷ܃5ٷwiG+hm40mp}P$!#Œ}O'#k/uц*liڠJ1{=kiKz/ݽH{{Kx%c*w-;Q=Щ>AهW&UV3D];gl».{hK!Tltо+{H_vu['B Zڻ8+8zێFg1׻~_a ^5eY]4<S6?rcWlTt/m5VLm9][H{@~>Ԟ&41\B,W0Yb Ϟ5ʬdtrHM7@co=Wqn&T69,V-.WT:srS#t-բ4{Hu䐓.YNTɭ8I9Hww3#h4a)|ei=MeK6A}/{=o΢K;m53x9Y!Ս,:wDԔEI sj}8xޕdYws5m"y391Y&ؾg'T6}qh>q̩iU Aܷg߿v=Xy.;t`_gSC:Omn g< e_?Yb]l޳le;ŸUHg_q6#@gLԡq^Uh48p_.,}x`L&;j>qWIg 3nC̤QdhDѩ#'v=+JR]ZYZ^¬IL=!<_c~tYʙ" Ww׵;OpKosOWy!osB Ӟ0mVXm #`MU`֩esk1:,j a@>[̪&K5džX<0fLfk NrU:lMihSGMW`6ț"<]@G 5{&o܈r[R&fy&F!Fͽ}1HV\X,m ͷi-QbK͌b  SNmԦa^_>%4lEndJS#tlpgz-XU"+ @nAvC8o#2Nz 1r|;݈/m<HĵM[9+Ywo%2:yTֹ7<0O3T%xv8rxc f̘U'>)yq$Nz7!THj->7#IuxKg ; 'xꂭ`ERy 0=q8UAC[:_TI,7_r=!'xU_&%‛IWۙK(#ӓns-//o9]y%KKzA^x/=zѴSS$5(HNHn%^%8J["V$'uz &\Z9cǃ6%LaȀUԖ]M;A:r)܈y! IDAT[|J8^r䏉:O9v{GyQ'\v\_jw_Jp27?}coɎ)WkoKZx IQ+󕙤2$َ I虌ГM98L~/3xgG\"Y"%9$4t8uGM$Qy@=FpX^Jm4V }(9VdĨ 3e"LhRmx۱9_+HF +z!1L c<\6XzȚ 8Vox9??mb\Z)hLJ :yK[uљ;'(h%~/5໤YO Hrc2g>%D㨃h9o]dD5ǃw D.%>z|"#jI~'|Fִ1AWo)+ΞJJD As% ׷&&bu9io$M75lNeJɦQJAR:bzDfQ1縴Сi=Kjw[NrÖӌg1Yw 2yvKOݖP.V*$ZjjpƃWVLݕen]I>84(M7uGe`lTǔI{TfKkuVDBh#+k,`0g &oqjA?_g*StcI1_x̶lk {Rˑ̈z84-ܱXf& öu[lLW?0}=uoq|@dlJWZQ80 OĘ$hL36s{qO\Tصjm\l~u+$V Ρ[[eJp FVԖ,o1̫Lj뽪OK*Fқbbogr0D6sȦa݀ }6OWScȬ-~ :lr/k{YT,Ҽ+D6v~eӖda)^QSYU-7վf$ tdge$5]1,H/h*e*hK+ͩoꬔҫ57MW^b16*iiCv.8(][3QLfҸs?㤀7~9!oep^FQ^D6։)E hLh׷w=Ja~('(ŨkYkGMaJ.E&~]D~~NdݺyA&N.u0\oDڂ ~Xmb֙`ߵ}ks j )wш@Ma{~dI*6UUԴllF <"i ǨAN,S+P "'h&_w.Neho@+o9GcQNbl6^]^Yd*+Jk:`IǦ6'\ˈ-vQ&B]sc娃.b'74eF?{P=R9 .UajQDjӡĊ5e>zH{}kwݗ,kLjP4GX@[9k]P.ӴF Eq7ӱ{-pQg96%T$1UDLjÀfSDpCR*jI@T§|f E\B W.qRӕ9bE7]?]GJxT0Xw~Tk&_^/U6#_l"?Q5 W/jKMS&BCcLh|U{'4JKK{m<&_hl/V$rHM!.ϰU LVU)ueAtuzCe3k3Wl78''::!8CQܑt::5ca- ܆nv/yp򋟸*a!_JNO)b&_jKÚbv!xkϩC`]ݼ|gB84YsEjAʮ CVPv&,#k`kSDݸ)߆[VBa3]6$țWܨdUƥh/>|ģ(uwL jy fݖW1׏̀X)]#'"?p ɶxJҷ%ߨne?k76Cj L}Tx3N*BӪXs|PW  z]@}s<Sf17Њn+qM ÝTEp3dJți:X$(/lV%Bi3Tȵjb %d%L #˒yEyel pdY V##ugF]צD b1Y-w $r5$^sia3m![/ 53*jdP*D;6dWZ8k?C_6]f!LZf4YA3 4ڇz{WgJfTf-^l? `fV*Jc$*"vqF`m2&;\CK{Ficy "R[tEʵ'J3xM<@<@:5J˓\XLDQN_n[$NrCCwB?c5<^O_ ek*˪P4hL+Iɜڜ^LC.VKoTd-lKsW/H}uey~O A]G[5KI76?׮9lu8;LyK^Cd8sO--&l_^Cs $FOήק.2yɪ/6?=ro|cd#+{;>oӺisRFoGD]E?JLeܜVr"/,o#2<\*,m,q6^cB,T̨%4M\F*˪T4Օ)9C< T[<ů?T~ǔP$&>&fߺw|voܿ/V.v9hEqy i1 e@VP==M~u}%!dž.LL%hnhPvp\P8xH#)uq7"˩ۺj#Ó'3XHT-r*YCiڵ@Jsۛd* ylAK/VrA<L&?Z儧|sKB4@il[OxI%(Lun>h *vOnDѰOYgAgǏEf2GC%-m2}@ىcLS]UmljZ̥DYؐG˷_)>mNqu o(v_X+s;J.$.Y<ŗ*,g3GC]@ѿo9B.cM(Kkce Xw+q^>mݦ[5hʰszX9U>^ɟ 8"ќ3g>#%PtRNBW%' Ɔ,zd9QqJ\f( Yrٌ25񛣐:n同9 @{ӫ.fݨj+I~;&ɕI}]Tc*dY?KX]]^YT72 啍Le$+'GMK׼|&z؃`/[ Vng[KFʍXfS\+*8 j6jKNg[tu~ZkᾹo:T$dǽ\:@R[rL?e$t@X*"ڦ6)Y xPB]_]>8k~0C, Vz$ =}.=dˡ\g\s{Ѕ/S$qcl9T&cЌ$uK3LhjɑsԴ ~T I OD eВ#3:kO&l{)j_8OO{'C JC!Խ) o )LC/c2I*Sv[·;=Ȧs2C5M?.kntK= 5?<\8v灨462dLLuil I7k@YIEx|MnF׊fD69>/D̨.LJ/m.,{(KHу?d4Xui%46Ʈ/MNr?|̮td7D(6W/,yBmb܇RzeԜZ׈gSMc\ 4B(1EgKj5=?~BbxMeҿ29Ee|}f-ָW6/4%oӊG2eL(_ny&ѣtiS7䊣sk!|?x%ӑ.JXٚ^eZ3QmZQXAXHud{N`|}V4Kzvv ٫͋/':3s𸖋(Ĭ-QJc+Χ!T(CĈζ#w8>}C倫~lۍԬf cbR 3p[ qE<Ҭl|>LcCۏrX?{ۨoD?f ظ s~G|0Vه&Q#>d̺̬2P}a^zVv>W -=k@ ڼw9t\q/qۻ]UH/<@+OZ˱VĮ/~qZF\ک}V2pn?5y>2k32fp~:\ޣw4QmԟkjЅ}Iw⒁n`ԨԆ^#.m7)nnʨL~Og[sOo1bV$%TAή}'g/hɘLN\LǞ~va!&#\(͔_&GQxsB̓j!69I>6Lf֔g4#ަfdg5c!ܜ>40])Wj(//~AG_ֈcJm߀8W 3բgMkBuqfVyHzη҂̯<(.6C؈қbՖfed؀34!fmIFoYX)C0j3I;y/wY-9/$xgd, Uw&~=4^_ˡ3@y*&s1 EكUmW3Ɇփ?C߉O7mem[m" ^ Ld} :\"#|nSW($@gwӳ`8NQt%2-g~;sv#:/Dx X7)-aRW//_rc 4m~NaߋDwinjT!ŝ@ceI!OJq4 C6"A˜ d:ԱT]M '>7c=瞺Xq0%ψpŀ"fpԈ{pԉ9r }ǐAqׂƒ.teah8Џ ]ܺ W篯SC`j룮F_ k6 jSQ XfjI/2{REꬨ:K{C+ ɏ:HR-6 kbw,".9yzI&Z>$4Ar]rcΙioOИnxY9c&A}-1q͔I?,+NVL*A}mp2"3 RKP'nDPfCPƺo^$"w4AՐv&0F$N)?fABݴ:!d2̚(2;!:4_J|S>s„{-cz%NS:O=65DmB3IEߠ_yG$԰{J]{W"a?ػ@; AOP{^7@W/J'z:A~ 3m_Yq\eq#[3CG '3@O;PSEՕĺb„(鑳gNPw+vbڴu?1d}us&NJU2Rn]w #*"8L(H&?rdVcL, TB'!I9 }qmG,EVHĉxHD:$e83s"}h`|[Ӑ\D\kL)# R?F#p^:` DF l&9y"A.9My3fmoSy6u<2 K"|EOK#HJ:MVM27Xcm >G)bJxP}IY5៛جO7gL4T*}C6ו$errr3sKj:3GߨFao~ʬ)O_<}!O7tK@mޓ;_9E4Fo$)6Ω;Q 'q혣[j@Lխ!I $|;ow#p㓑1+|wSӊ :xI) 9Zvd:=<x( m8 f =M%F%d )SAIӻdOjc2"Ի=RJ]ryRfng- q>]M\Eh*;ϭ(׎41aeHQwo~S$-a2ݜ&Ԗ"9Nf봱"!)3Qt6V2E9jn(mDX!!ݹK}vȌw1wr6c # \g,+2V;n0P&8wx 0r%G?}eCyq3l8Pqd1[lix5EV.ycR-u(ng_NէS~V[3騒7ڛhIZu2ݬ!ν%آ`,Gjꪙ|{z1 2cVzŵ6Z<@Z#o3}Kg=,^1yd9);·FE[5c gάܵ&* !/o9]9O[!T{ L{8axU-cGyMKy(褓oi̪c NMo*´\v\flh?w^G?&D%8'Q{!w[*UڋgOyo9y> /mEg.Qi8yc{.^Q*R#OzZ$E O-Jب&jI\ky擝y4].6N;3e ?`ѳ _y05!*5[] >tޘ;&(Nf%KD'@^M:[ 9@K5ߩ+qѷ" Q [iB߯Pz'[4I1S[Ǒ%>sisvOizV)(B;]))_:xn0^9jO ˎxi?yM|  "D :qKGeq姻۷wńޱyGGbvjoG3Q=jKB|ۮɉ)Q\4ȚR 罗~Qs_,#/SK>Ü+ǧp^c2[޺g,&O8^}SBYdrtȨ SKuqЕg{''r)%o^my'5p곛u;\;Id!<@9{]}W8^rM=1Hiܐ[t<&왠sWFU$tlf8Il*{XPͫ ]ZxʎIXg|VZQSJk @1w> Mm;0}| |ѲH6So>bcfIF+ۼu2(*g5uuN*8ZY;aA(DҷΎTud ƕ5m׮/E^Fj{Zk6w (& l-3qݬf/& O-deށ4%+"A،sF33[(& Yz`aWL9B+}Ҕ>38 /ڛ$^ycAa=]'TMh67F]Whp[07Yۢ?$yb5֞S2fal?h&MfҸcÐ |mq p gn1>o J;VFy9: Zb"NzEFxt(Nޚ{ClT ,GI-3W#rT RRx$kS)vrbk׾BK!ټVmTu拥n Glycя Qe-W*Mp4yZ} @skIѳf _h4p~ک}RJa?&G&5蝂i?Z{?4k'o mt?n준yJ^kmZRPוZ{Rc;[H:K4 =lqָ&rn>kڎiC67ܴI6k6*'-["4JRmh6'V˨*q(˨O=.k$A@-\ҖL,TPh]vzbg+>r(~6j(P02jA+ÕΟH$ 0 ?j|~d %e. XRhnl̯1d8re.C勑kʊv9I萯 `4CGC4Aban|~TeI d0W;ex\+ѷs*_uyQepÝͦ s8Ƽ|Z;7&6D=( fWXc϶v~-q]Mp#hMrmpLE9v̟Thy9E݉qO,Kb4HaW1vUό^'<;fH:g`-ћ 6STDi)b;1T""Zq&ZFi9tZ*|Z}j-+(-(sҙbl>H_ Z^NaujO [_vTB}@[Y%A܋ᢄ zJ}3TAv5GKHʪGn*-w*0B(Zq( 5tN6xVu*b8X@T}晭#eԮrqQw$C2w{"d@T0P/^3 ]o0%y <4JLW P})!`fV*sڻHhz!Q|z7+B?5<^P(@4wrC9 EJ\ ij!ڒpM^fIzicY©godGx׋4PY^1D[&;B 4,oBdvb1< +{(7'9[֥N p^TQF%tk*ͬP2%=W2TWHMiE4hef6'p((̵N[ʦ ^: z/HF溲bͱR>z+2uSK?w?~^N¬f#I \7Ӛ=-ottUYv6=WԵ&߲~>&~0z3DM\pK[oSYXlc!^`*n{w/6"7EJ%S] )QKh"|H"VcN~=Y7*˪PdE;<$BH}(SCF@T`=YbI2 %[蹸ٲpФ< vu'#ZAT`)>+eHձs7Zʽtɴa fk8=w- RJ}W\6mD&F-ObH%uP!4DrpSJ4Pҗ2jkAYh;'L06  fY/>ҋiX%U9IDKP,Iy^g'_;^b2&c<zyzyngb9 "3wߋdh2fSm'[~^9>yu3kk􍚳.  82}q0oK+"$:mAbY _TX(Z .5S*8<^eQaD@3,,>!(ufk 2rKky:fG5 XE!s1'|1g8t15|o&W'|C|E f9h33I ߗ'hQ #uz^Ry;solglpS62|k!)/8!Jͤ;F^ y)o&@ioѓ!NUx5aH{PL|r nact6R뷐:87=X *9W[gyDh:/b\ϥ= ;+>&jׇ_wM-'-qU(wQEgwSPU ]u* !ԖVະj!}&F=ʭW<]Yĵ^!g13G+Oq~QUN潑{e/ۼkK2?MobS-d~]{eak&'9QvDwۍkDL牋 17K<&Lͻ}![L@ "Ÿv;w6ٚ9WntځL@>8e[qVbƛqZ҈qK ǻ.?fp1B3p6zuIE__y^5b@"]2[~*A5 Åy9rVi1s )W9QWn޷@ɨb"@[ǂc=3õ^Ax3&!XV"qQ%f<iNe-D)*HtJa׾g o[hov"HD^Xg5<7~N~O (jda&UnˌH)=Dx)aMVU.N\xYЊp┅ߍ܇l:iE#W:V3NZyT E$_[{?0=t+rcki{oOOjIUۼ/59 %bH mF_*!SXU*yU+q+6{odɣDFugru5 zXXpkv_M};dZ:PX̹MWUF]DWoa@TtHy/ɧk}.TǕgӓX%uYYH 3EI, ; 3<ɫEwtrs2՗,zy+yߦTv `GN Nsp}whϥr!k-L> :}a%oSyBVb*mV2"sX0qrRY 1 lzRFi=[{h$(TLWw 2J)*xnӇ.(qPl,T͸tFɸ)zQeBaї,RsgOE}`y25#ANdKj۔R 9Zee^##+(d332<ǎ0to~u: $?Ln߯fi7jQFߓjRD(YP ަN7\,|7!wkⱣ3 |IvV|§(v^4{BDLV&TeH) |~VVKYff6i8ɤ*?=y!{Hej"߀L`Ie2X_!d.'`@AazkYIƜq/,v.[|T1a)L5O%Y>%(qK :FPd/Ee+:?dⱣ"b9)bӞ$k|$V~^Q=BeD]PYZJ8_S_tcM~c'dz{{h(yճ FrFI=ǎ0toRб"Upa߯7^@Ʌ|E͋l:+++?Qfddҋxe)1> RZˏ O:8Z&%RVr :'JLVUsr!ֺ7/?RºCD ^~DCގh߉EflՇ I _HOfF>tֲ]E$ӹbIҹɜ}c`Jyr򡚡C^z'iVKb.=/6PB'mSAl~p5Y^.)&lG[U x5|&cΝZjkhE=D O>jP}m-i7 E}8b2.%EKg8Ͼ9fJ>*Zu3i ^۽v9>`Z]F6N/U!N_dʋE]3;Ҁ<.(TV ԂD-4>HR([uNS!D];!\Bi9Щ~dJ ljjo?gFRRBCT`;qoշKPQ.)=- ũu1ӎQr~ۢ[,Aũ-T0z5&ϛRvXAUIb&lrSbDS(-쮑oWJG4q:$f]j2ֵjCnRd7kZQm)g \M8.-aw]G:z tp}K4q8 )RkeM(JP[p0TYTM/ߩo!ldR$RgŅԁLb?lLZEq%[)vϰvŽ2~5H5U2KcuJM}Krj1YkCEmoXV6X;j Է]0?j߄:סW N u*B\GjTɟ7oq?,CUVB T%Y̞aCUOr2)և^,fPv%Y̞އT.HfMRcG25]Vg"EwEm^VXH>@!B ov6.ifCU5"񯙉RbJ;M쒎ބ N$u͠8 1uuC&ꄯDutn"jdRpR5Q~zGז7SsӁs-%K -׽7?}tMm8Iw][* ^ժRĥٖ7|i]B$jz獪)ve8ۂ.޷az5̀܍@c3۝uŽny<4SzjMx'iKȫXS:k]"I-ÎemU@As{zAncBv¯_;/1}{ 5 '?pmmQQgZz [BozkWPQu3R:|9=x9j4kٻ4,ko<8m@o: fkɁ.ȋ Z%y z EPd~Yk1Xhjk׃h$Ļ&#98! Є*9l b"UPhr3 L׺kC BVOF0Z=i­zidž=߶ϕ[\'%| oˀn2Z?@Z#6yK}kzъKK[~ɤ;,^7^f֤*0:ná߬lp]eM ڎaBݑLe+Cƫw{bgQ| YRw{:T㗵3Yb%x_)wX/3f:FYk:vԶ?і.{P!9p$vc#25{[WE:r IDATr?'wވiPATٱOY"2}^Qi-7Ϛf<>砷 Q@0ӧ{ 9 ?6"e" [HI(k_^4k_sj"!;6 eHz;z$b;vk  cXxH7J.ulkRxY8 3 i˛Џ\y[: R̹}*Ğ(4DV%פRqn]:pIM)-ȎҐ5 b8sP½<7_@jxAֵͯW ;Qj0;:,,p=o`4cP=iη%ːIu4'Aa2i\iTsc?I@Ɨe0r9[!NN{?O64̵DglkR JFqhFۅ!kA>J9>֨ s Xiܽ[NsIp*5#n^"@ ő?ڟ 0z2߿zlfdgNm|fBo:w%״Xʎ J'Rbqw.IF;5=M|(ъHZs/>^ߠu"@fJ2_~v/zيVAo_y.@i)2͌?y?r3qN{5ZrAL0LBGϽ 9ut5;08vԐR;ofiV9naoJz^-۠LMcMܘ5cNҵ:k^]d;0(fpFt\Bi)zYQuwJ[>YQh\G҈BJpԡ>q>?;i|zqw{ʠh @u^Lq"Qz$>y=5Ej]ث1'xŮڲN瘹;{NƼ3g吙K2b5 ~yW6߳|^X@nR%d6R%^5F;$w:r&_TxhO:P_txhOb >!vrT"sΨAŎo0YqlA*ý&>aD8>^~sJȗ]ife1gM Dō4P7Hڋ7Kq)7[|5R &lz΁+!_?{spN̐Ϭ0^=Z!&n *y5DdkX)5͖L{v}[ m) ~z!_bK h-9ĈzeT{jy*a_  ];e?>7 %oe$<]j4@?@F1%ڬiu&=zb`O[ `ePok; i td:)oգHg-GEbF-#) ⵺MX4׫h =,Iiۧ/6[IJF rfaO3d[/mGFQ}I^^fQmìi2n>e;kjP+y"+ yiݿo%Ȇx_/ӧB$F\xs% 5x}s`]DNM6`uMq#jrso/^86r^slC r>J6LqsZ|p/Spq⋆7E[Y,cWԛVgu~{q'WD7? YTT 0w~g3E^^ vR2~K{kYt V!0noV/6wGྡྷ}<1`][)!QcGR.}bǧ?. =r&4Y4 Bd'>1SO̾_0 /z3)vG}gdp#K 5O_ţ8M|}fHU0ዴ/66n9e˜5@#p5]tK3MnSDQC m_= $x#eS+)P ʡICGdyk]99;,HnhHQ/>:d]0T}mo1ϘFYdJQd@QM4"~7t3a9"~FU &I:Hu`ŋ?lgFL_1/YD<[_VTV-T׵BH^O1Ds񍣫YfzJtgy>I;q݆ 7B3 tޟbxnnnĴ35 ԑ{=ǬoKgߕTfD `Hh0V2W?U# hDp݆7C3 Cr{La;wʏa7X1!6gx Lk<:6b~0f@>U24{#u7C3k CfCd;w% -1TLdlܸU@7R//. kJ8R )#Y1%ro@"ÆW4C \TVI8 4&cF=iEޡN47(x#7bʏn}5̈gd+- lC>Oܸ񵼮]@'bpuq^]]Γ7)iͶ.ypˇdsc'$ jon  HF'BK'cߔ#|gOO37E'>VVuh2vxץF݆OuL| "TsXh5ea]UEiyhLcE5_E'LF'w'"nQy SnLbA[6m0]7;>/8;ދoܲj{ rMWDp#vn:Z2G0rߍj;QZcnj=L;" A{~YGw":E'L[H(=_}ʇ|R_QRV#ԔU*INِ "An '߀B)=W2_Q Aq7eݗ8FJE/7@(0P$o66ܲlZgf*/8HȗF]R¯ N$)xW=XWn%SjjiC'ٌɺ_(8[QT_z5$JXؒN@27ILߚ y̨Hڜ V4c.On g>tnqE ec gM۱uBn)vhr M,ϯSOf_`삾&V&}ΫHSt50ZEO֊b fmT"SĪVW@ȭ#qskRTϭG SD#Bx/W^'1ÑZ.1Vb 7bLZ@B>&] uhD AP]y=&cKHy~ &sv@"ZKT? oT#Bv%$꨾V@!Xه_g-Z0qׅ'<$q`1v @4s6¾Ƶ9 ^)F0qׅ7 c/%t!dX'8&n9?a7v @Y^A?+jGBXeaސicӟ$&TPV\̦~V_d @CTp/FnV_/q;qu_ urQ:8jDi*_T˹@JTx!lyYį%҃>.GPNPܬz$PDk?DV0^fHĬf0O\{f]aUN봬1u#lKw[nw["|qyCAiIYm#**@K">O&*9%%Ji`r7i \E#F1bĿ&-xRũ28us\n,5C 9E1g9[,˻O-d"@= $"@@$8tNmQs^BBMj*4gi]"iVC%9qg]9z%ԱW#5;Z^\p^ؓI+k5t̒S\j%H.~|iқ 5¿li}K&cltҪEkZپadǮwmgʿ/D@ +{2fI= {Ӻ1DeqO$$j BF>OLbnC>EPtp]=WɻR_(f)'P UbF,1p K!Yj؃ 8 (GapjߜxD` rkRC?_$9Y6:.@@e?rf +#Q!XdX:Y)whuJv$"CiI&ؕ<CBY1 YmNr^koxn%LD.Z{]E ͅO\n 9R}4 G8Ԥ¢& HI685 _I7$s~e**G@_"Wѝ^9<ع[qPQQflY6P3m>S#Y/zӺG{goxn#D NmQ |/}/͜OE&Vdf'YiJ_LCGuz՛93mr&qBM5;.ˀS;!7PՖ͘UZ<~uaUfήȟ9 [B{'WjǪAu1VcVYJs+~ߙzA;&pCSk~Vxn>fx( #½wY6`'Ƅ02 {י z6|XSMw*u?̎j>u"8<M>f/Ocpbj^y%o:+o03(G×8á}y*D<]z <97'RoνOѓaOqc~|̿ xRkT,(S޺<< oML!nλ GO]Y[q5̤Awh?|і:Tk-䯯,p"2λ៞`& a8QcWm{;뇤y\ Ci}T UjL;TkA7K.R&VMf!)ϩ,՘~S}pnI^˺lnJƋ'ҳN[ k WJs2Ҵ|-ù͑@'翖g ̎jGߏa.O}y233B]N-Z,Z\5}#gCGz.+Ɩ{d;sVзh;l;gFQ;5Mc#o:](20bn՚qc]_/i|n b *lLFuf. E6}$gD?hY ȎjyrͻI:VwO=-W?9kәLS%X%;~VSf-`ֲ?w-T"pߣ>d ;h|W@_^YWUJO[qn1_\iw+Ny~0v sI _5e_m ƝP{EQ#W~iM4LPFe*n#95WR宨P ?{L3YΉA{8BWaj ܇l:qy\wlܟ= `*n5_7SbO^|U ߿' IDAT_ӿ7 {,ij191ON΃@Ue)݊zj-R6[dT2/}ٱK@mˌH XmIDׅ~Na(P%kCΞc :ϕ`_>P?)]5Κk]# "%&>rz:쮕@u<<*ςfoF˸AqR8S΂?>1r@ڞ6ΝG/E{P}9;΢s(m,7{r+ŠߦTv `GN u~ /' ԝОK1B@yJ-L> :Xq:B}!+1]6 ?U":B=–@ܢ4&BT,!a5;[_O .ɭH>t&+N3sv԰r+Ϻ+ۉ̼ جQ` (ʌO5((ҪAIiqNc>{d|.VPQL/Oa'}3sYY\fF&D8;3>SJ~ >Dλ&E/,-.L~\þ_or'od"5jǎ0p0NCP^`4mH3$9YEytzFft%ӏHXa2bG`eHȤ2鬬t3Z˃.(/32ҍ]#23ixEyy, aH11㣿@[{gDd f)ErD@H&M)XWfciOk{f>+Rq9ytFFf%_<)gU~.)MѧB"2)Ta/8[{cEtr, t($?HgY72kxLN&xXu'y,7Y/*4T(,Eӭٓ_2عlLO,lP"~!$O'9Iڎ+OPt1堎*uDb?JSQoltLGM. xtvU19XRC(ra- E.^~#څ^gw:u4aSvu*4{K>PE-?JHѡJv xyZr.uZP3B5Oͣ穙qMNDW7v=;&ߦ\ƭiBL-RvhRة(Ժ>'c K3Xs &vN=yq4,W$3lߊ"l>Ԏu5PӝhTmtWIfM`rF]Or Qnstu)~t >8Ko@@RZGH@2ubCEP$6.~-t859K2ؙh6͆򿑲t퓗R:o\n)cj$9=N-':;|j>-*{SsخӁsuFnY1(;5=H0XѵҀ`8IM1lljK-*Ho52u_ݝ^>oTM)K&Du}h%-%4[Kh@MIMZ{YjMx'jc/qӣcuqJ1QH aga7/߸~Bx~勩HM$4?:Vip0R;2jq|U7lވ2.@c֟#wTtQYƓ{pf?8S5GFTC ekkT[ Z{,瑩K4\j T4lu,]WKm*ARW5I!lVģ;h ~~Mi[pwa?o]w«0R5i~s㴨~s&S~}r12bdk{[cQEB2Ĩŋ~P%"#ϞZ{U1F"v^}'NI]4> fIA uԪRIYܫ1mE4AVHLW޵F@~hbkCCd( F7`ub O4UV()ŀ]_ڌ~g(Գ}V)jE_V^xuȰ^R*V^xXipϫv^[$ |s;,^7K`HKgQK_X)T45&oyf ; .ږȱw ' c2dz'26lX}|qUoBaionaD^D(u"@A c17h"8!;6) SӐBiDe(t@#[IGvT] c":tY}UI(D^hx(E=7O\T?S-po xn&oKt O}6 =;Ek54 /̏|^ D-2jQ۬qT2<[XVw߿f_Emh]3ӆdo!CȆd^= ckN1մ5ԷꓫxM*sT-h3]ބ~"$)Z‚hN3]ބ~ln<2?T. r(jdG \.lJ$Ȍ8%l@ɡyAIDy4H5$̎E%(1g~sC4.GrPP yr9 J *|&*ύ$,+WϺΪNfkD1}HH%)QzayHam҅yRx4E)JLŕoi kZՆUjul]նf?u=RFܛ޼sԽ0xMj3rM)AhCCl|߼9C~ Tx60'C"D^aQkR)8Ur? Mm*V (Tj& 9 X"YA_Nrs 5d,iTKS%{r?FI!k\N8֐F pZCKPr}Q?G*ҥ:72 $] 9j PN"IEL,'r*$,F6j'a3$\S(A-Fs"UG^e/&fߝ2d{za{gz/pT\ Cx̖Mj>^9( K(3hde޼O{!)k!厱--TzgEjVڊwn xtaǾ7T~ ?iV|Ԇ=HG|s EW2nf9pw_#)>v%KKZ\I 4L{f?֧Ef!v#71XWfi=v/&y҅$]s36@槗;ƚd8W;$Knm\p,avY=bFm:LzYTKBiZ8V&(dtdž+qZ#6NKxL8'Y&Iқ8Gy ;onp e=E 5z)oB\-HH h{ HkDTjF9D"2g/ d7{ |뱙=]$W >SOU! 7:%\*)A ) Tulc DAl,0 $g:;IAsο뤴w`DIM(JҚS^ޗn͚g"Ľt B?誳}fA<혀v52>Dg< 9&PV:訝M ޒ_ Jxg:>KVU5&? ߼>@QoJ)#1ͺÚJ@d 7aS¿@x] @:^GboDD, BkUȭ;GC<+?M~(4,ntc7ON%@0r.<}$@y! _}c@V)EIkzʌ1!*t lyFoapn!x q`EU&o [eI¸A3(Mp$qRc]/g< "d0}ܷ7HL F;*v[BV ;^ .'yxȨUC?@;T`+UFc ߿wГC[t&f E{a ؠhp./%-`85~B-lwAZMW_b?2Fbz+96K(2tJ/%]cx:f<}hKSs0 ZNmz>~gız耐dsɊI&lrU2tB"g! Ȁ$Zzls7oЖm/<=:Tr~.袊iUEEjhJc@vǐ,0oR '/6k[y- 76pٟ@r:B6i;e81"vs0rr3q$yFs"hk5s$a2ړ#g Öx:yci/* $K_$% ! c=&)bѤ9y%2|<=duڹbIu"6}dSѐh9W?y]0YTcfEbq>*C2qU&JVwrl9L5c۝2/^BҼ#SpINSNm(k!c 4uY5-fnE#gn{o_xiEE[229+2AU͍cּ1K wпBrqyEp}!$Z/8f_m`B S&gF&Ay%U'Y{W\xmBt䄫sh1{JwD+G"e5@ U|;$A;BB]姢F82bY'>he[Ĺcs-[j&):6lVM\h+(-~nAzG%L+QTj:A?o_HqeYGQki#VD:_nQbҔ]4jyEK cjNWׁ+4WuVH5/Ν#PHkq}K-' [BY奈AYwtjÞ鮃7?1o2!*h :m2ŕa}܏$[IҶ.X$hrf)kܬ [S 3 IDATYOߖ+nE46/{_Y.c;@'!2ƵoY u< VD^]Y>.&$ro`W~p3XQcb1Bو([5(_k%2/ow#E%&UHg0Ŋc{7 %<gCb Ly[UcMv|Zg;y z=[OV78?jqJQr XQml"'\ NdǞK¤=Y>SЖ ½ i,(_ÌrXj.-.0ȱψs^St7KM]k( Fp^Ū!?/E9yRX>uJ^gqI!;rhLݢgQowsga&o2ىjIRvͭ=ق:L՛d龍maI(SOčw_S|{ǒGRraQS̥UԻpj]mY1㱪+^XᶊUFvN*@D'ot4^'ѽ5ˮsJXİLzcMK ^dvA |*b5Ć?QG}{b! p(H}Dyk %,aRbe݃-Uzl۹$agWusx4{#PX5J0[^HC_pj؍ Bz%nP^eh>TT:Ј&qsXՁ0,t2RQ̻eAo4%1ZSJp[*#;Pӎ[G)7/gF@}C?{)]ln!pd ,R}Cx&7okR2Byd禬k%eD2Wm#M'l6H/Jyu`0̨)^Ҩ0:#OKXy"ӵaUvPQX-lnXQm4yP>D! /9Zu"Q!lYAr4AB2seX @XN.g$!p7}#Q@(JՍ<4{B)4rq9lvѭ|Rw,-Q$qj̆F AaSKKܝ"VcahQ+BCӫkr^%ʄЛUʋRRU~NXQmd<{b ȱHp ʒ;HJ+nU2 .b5>=E=ĆEח% .w4& AԱy5UDZ;VyD'RHj(g+|7Vg*~o7riՍ ͑g1X@l^s@l:Q#I 5VᔔTqDU]3Kl)t'̬{TTR=NIYQU*B #xO[kfRxG1b'^kལ~ 4GO4s]~GSxu/ՙeg:"adgr˪qsSL>m#蝿-Ig19ٯpʕ`1vtسj .T-"F^w\XURF-./^k ;3~0 (?avNQYAEvIGO:kwIο$r{ dUfjH;hf9<% J~6ݟTSG7kᖷ_cJh;쎝^DM%Qj(vY 7I]>~a:G^qg o-oٓ::uqPRUg7C)^D;4/F)ʩBQ j'hXޜl:N,ev^IYAEQuN49̓>io]Zl~m%BvNQEAE~ 4I̘@UI!X(®= }$ ۵qkxm"!X|ǒz1  7%vOo^bhWiƸS,\yp;x;NwсQ[˸bV&il\*dڼיHuJ4-sO|ʫ [' Zl ;}!Io+K؊Ҝ: %Mye4_ޝ|C$ѯXFm[xڭ͖ !h3oۊT2m맮D|BP—+V0\cF!U-[NXTUYe xed2*Xq[D^]ꦉSkZӎ6ݯuHۑ[N)[ЭTZ[-RTFŻ7N_HfWEbˇijbyEn5%A x(IqJ.ӱJȬ@~ ޝ5" !ۦHP$`!|d`=iY}[-)>벩A|?}!E}EQ۽_8.\bGSOMn9P6(K?ɁKTQm*e4ɂ !r2QB K" Q/WV.XuxZ6k9ӝe|UlHcSR#꺑:w,Km_pڭ1Q*ǁk~:.p˳烮 OLSB3jU5r2X^H+%"PŌF1љx:/\?r#?xM3@nΛL$GWA5 pO s UP&q^"k Ž?Z5T֫yOi&8NB[GSرv 닣JZIc1#>](1/PG\;de Qx9ݎRm>M,n T/y\4+2 ņlU0o>]:P#`%5ɞ?X^Ջ0x3mqw# (bTuǵ^ Fu|=-AoҲ5MeL nDՂUEΞ@j\;*e ;z> ̼s榣+yc[^NX{kϾEi.be wB@WT'1' ˴1Vۅ@­ˣn$~},U)`Tm=I κ{#DLŠ_I\Bj|ez\ #mR塓q]UCkhRGi*zXvri')VASspZP]?h0SQ?jho\(HCgtZ%V'X{8q^b(:^M[o&. ;B!hxaU~KUu*VD^Ig\L ] _;թ7Wv;Dx4txyF v/{KF:]Y]{.vn"xVHO#HMZdyuG԰:jƞM \p+U [_P%yZbF2˟_M^~\OcW , vi(&[ކ+ϯݼz 1#T!{w<[SVI*nt->kIA ?TM%W [ 5jҒͿ$04By w%峖x2^˕_KNug UNw9vŎicI դW>vP%6w9vΞ[r9 mzX9[Ow{ x=f|WRS.ǮD" 쁳疄;g3;|$(}Tzh%c"ڸն. +sy?CY|uW)հ_evg@z_[΂:vp$5FZ d/[ix< ƭ`$+8W93+Xm)- ٣od!rEI_ildRSKZ+'Qq<܊p.#:'iE )tcC_+ W3]UEnPƚ֊o^ŗ8v%%X,giF̌qa: 0&:[ڀK <@Uz')% 7}⤯485'%bMzk? leFIvJ0#SrkK޽Zc~l&KCp[[J&d1xdfS 2bbfČ;OG4oBZNiȼaP/95T %7Ol>bce,, 컒TFf]Bl!K0LZ>LsdJ}K cRe ky_ՋoXaWfd3K#Ҍ,GXn&f!ޱ!Ybc%&543Y|;o̠ ՒJ);_ef4H1;L{r){ǐ-ZվHȢdIION&0#?$<Jߧ2ʋsjī]^eL6]U"p"_YdBj i4YAǴY,%Dp 2ˋsj3YlG_ ,I<}+Sy>6;3rK K2K?Um֓/%^?Aue쯯 i_R?U0cTfsj +0\Z^eCYRHdI$8W`h~@TjnqQ9 Bu5J_9('Ο;RT[esjآ} )|o)@^Mrn~~IaN^A^)_Uɟ L-86$Y^}r^[\-@ Ȥessk(6TS\[#e2y|%:4u(CbϝL+C8؆r})ak~Prא|%s]FDZ7s% < Fsk=K: C5|@o?DPD}7oLE8O9lnuяœܲJnʬJONN=wi,fI\L~C?%pܚ2 %/[(8Jn!2ٹ| 9ed@ ɹL%qqy5J_:(\l,YŒxGLr tX?S\_m哉ANˣ iڹպ:!((q1Y2V ]E:,{-giFx aA5E?2BX @fIl*WN<jǃ'2& && gniPr@ :ˏ~CH6'fgy!ܤ,JVdO!3hyIIiߋQ=UGG IDATԔfedR(yYlr^-*"dW0[f)#u-=IN}YBȋ櫻msmBi\l] ҉8.?5J8[R띐-42Ncy⥶]=R MR:z >ë^/rn_1bvvԦ{Y$iaPhCϞ# $M@8z1Vc3LU }ƝJg n-Lnsm*H/շH/OӒqU0߼ *wB1oNF$xl{mH;q*no,&8WPhC:!zZq*EwvCn {ATX&_~Ykͽ6௢Ma`RX*7rՖ.U07tbυ׷ݏ d]YxhH\#׮߷(_ITQX  CҰ#[m$a}Ty4XRݹMKvSzYշHCAo[߶PW[]D94ҋɂ-"c2T1*+wװ.qHOLlhU-˶_ַmHlk7D݇aiD?!6kJ0I9P@&O66 [)`&!=m mz0k mEIYwܧw[}sHסHByh${2S@Zne#=C<{azsvDEbO㝩ڛOpԷ.eRkw|]{TA2њaAjk]fl5Ko{szvdxػr-E5ߧք"m3u[/17ӵLKt? ~2ݗv.|tgJB_ډEc,AwK?Zq k#&Lw1ik8WP.6Ͳ.֙`G kcn0=r0FWu FF@: _YtְbH9=tcCdm#fᯚZosoB{mLܳHq CRt? Qc^}u,F 1WǶ }Xq9c&Hq治p¨7V'64g\p>؈ch 0XEW EN J#g3o B<]U6j=q ;!W=LgYv-n`kьVfC/}{pZmєRŶFX+&xAiO+ Fno]~1ڞ9WKnZ5iBk`MvvF$v?ʷ}S}5\-9.޶RnV9d&دY#T5Q:Pd6^|!<&A& L/hM`e!*Ǝ~X1 <'wvZZM6R% 9-QŵX%zd܆JwIr #?cxe݆$G2; 5Fp$l %됷"+i.CJ{˪r}[x#:6Cܪs#g4X1(/t[/waX hȎZ{6#gU D^n5z~rz3/Jt%@> oC7;[Ɋ:|̾Tv=`EģAlm|=F}|Ĵ>Yg:(E]XW{yG&Hrn]w`DIrh&I֜JO|tt%4++=D>*L{y:7w/&zWu( EwDt-x㓈Ef|C {npˇO|+t B?誳@}fA<4,ϑ3q3jE ytNUDM[r;A / !Owh[6!Ylr>Z4^@Y10x"(#Da 1î5?Hc|'f `EN&;=I]) smfFHiOs^%@^u1quF>SM{~޹tg4M?mJڤyײt_U#jߖ=pXt 3Znjsأ51ڑ.FSPa؊Ql'q RZԖMy%{;N7Ԝ{ojA +i& Zzuԭ Z-v xy L~'ZRF9޴Ydk$OͷϹ:붖j°?6h?0ܮKmEqjvCT՗؏Qľi ".:LG+k?LnϾW̟Ors3yj] 6s-}FI6gKWL7qf* 8t3pxyߥf}h3P@N[i\+hҕuQu&U VN4Z&jhJcQ@vǐ,0oR '/i VOq`4u ~By-~/N\'= ,>TtE5]T02Lfu޴ќ$Zx$.9y[0 Q*F0tBr * [N#zH~.(.^2TU0_D9 S?$4rf F~*+c9dDk.5~NK´VQ+ʤWKVX s| \0OyȮ,*+\ѬZRMyp;yFg IN+Dc@ =;֘bU?FfU0_b^G`{/+E9WA!!HwtjÞ.D7] JKҊ *ڽ1Zq&գ[/zq5 .npRA弣Sp"gvtWD| 餚Ӵ.͵tn7ABukHcׯp aϩm]VoM˶=kz$'QC_n5t9QZM=rc+unȎm4*-l>Ftd@y7^TkXQcl1\glLy&;TBx z=SO+"3zqE(U"'\ NdǞK¤=Y>SЖϥ"4ݖaQK\ͥUեCzxnAtւQ* S>*iUC~^*_ VwPIuwi: -,WҜ+->wy6y>׵IsWf-`Ck>oriL..SrL̹ Wf+Ϸ]0,_J;\~(6blQݑ MHB:t>vA |,f@F{- QOMwL$d9bNy^,/3ޒ@p[*γ*@éN B<޻XhHhDnIJyȂ 9iUؙ~2_FZAPvbEےau9% A@\]ݥWAZc=z+!i ZYm)ckMʁqj 9 t Qmd< }_9`Ue2a1gG=-b,IQ@^j@奸 l@ ǃ(.D]?F Of[MUi le˨mBo{NU'`Aq(J(#Kc! x*~1! x%E5E|f G~Bsl^ DA'屹kbI 8%eUE\ƭ+Q6x׌҄uc*EoI$N{=NIYQUz%G 88Gyuo;.?a&w{#%sRo(-hyw<̲sPxe@#XL|& U1Uǣl>}nG;1r;.-p0Gĭ=v8{rp5e:8m\AwF^RbSKe =!0k+Cݡ'/ªy,RaW1y5b-; ^VQAU 8EeBV'U[j&#=ňmu#cHQ;^;z;C1UY5 6ۂ!dן'-<0dAa7[}uPtek9@ FF16LS+{>T oGft$-S46J.2H.VRVT$BlFQY6M@@P,a@-ͪG5#%hIm(OOн<"?APi*|֩ Tgd0 ࠀ!@d FhQ _9|DA.'%OB FJnF̡o]@;I_=vQD,FKUl%S^F8m_\6oվ^,|@3l?Z/hG nsOq鼕W.`ADՠcxh7_>å+U!TܿD#NWh9ȧF\Z>oU-Kx-S3>X3$kA(;omv<1Άk5"x~f6dx}"QwCK) U:sE4\]ZR =DTr,b*c6UBZ&fzK%S*]~J'D;g9bkN+[gW0b-\ xQży.UzջZȂ?;! {xMR$ilq3_$`DUU&/Zađf2ZtBvBhVxꈅOwJ,Q>Y{>zx^Јnix6TVnW@ K2'^Gٰ,.$g{ry7ҙkd(٭H0*\\ '0v}7 *dZOG:lL̞KluًV~^zo JIbV$q!OW8뫔5`|- &0Ν捝:{oy9a#^&>Q6lob@3>JY<旅ݽStc?+pN HušasBzJj޺Lcx]P=n]MwcJyjI'<+3e‹|&a‘{zoɸ.!54)#4osU,ME4ԓQY輠~Єa$-1:~ҥTUvܫ1twqmm9ԸV8<:߫i;禐{-a ]0 EzGGU9{-´; t1yKZ EȮz_[@79Ew\B^x~U^S*Ф;EΨz;K,?OOwpz"V~bcWO|u=+~yv7.qco?yl;6M4-VVw:,~5y}s>i]5Po-aAH ɏI(\@=x m?Xzz?v9N9E,2U6W]-$..M̷OJnj[`\}S?od#EI_ilȤ$b1ٟs*[97[+V\խ.#:'i Sާ&$cǯdm!$3;'*ܠ5W^E &UFI(2 c,H;=LgBe- XT'~"_p3ї-NJc~шcQsR2J d[~(OCGF&%M; +:]~^kD+:TK22UX[\M)d@,![3<(@S*9a'wL),6B,z6FQ <`M<$֔fSr uEYB$giJʈyQSU(;蘿 P@qym4K_?8_J6>=wDWJяb[[F-."ŒPV5R٩4{xkGK pRF9D(}yd9xWM}{/ ˜Tq5Jc%ZOžKr:=Ox"ѓ-yP92Ecb}~wt4dL尀kyh9T2%7O,r*g1ٲG]Iwmry}YKҘLZ>: }LciaL8"<ήKL^fWfd3Kx__WK`r_({OyVn@l@Ll*v\^;9Sf IDATE"iP* FHwml徿yg||㤁9;j[a# AcSs4zyʓzUwT]0Jz;YK c}bJ´;Ea`_b{+58kaiVaQܭnԁ<Ҏ=Lw[1%Pb1Ε0.F^ 21]ǗND|/l[b7?(CZ[|_Z/ ַJ'¬_C~Kggȯַ?M@bܤŧbʘ]m \[(:T# 6%FDWx =K#߬ ֹ`[m'h) vw?:t?π)>H6/Ȑ^wmHBSiEzD"rt`Ui-QX\4QM[]Y+ f^]$o/ɾ~_]!)_C6s4obK(mQۖ`P`AU$7#]a=>շ>KD=/IىYvZ}Y;[! uא{"SbCzoSL%A&5jg5~^*b̦jF@i{?YBoP8Gu?3tP^nXF KC,tHO\StuN7=Kك\ %KCl n7".BC kd}]2Wqqƣ^i{t\GGD(#Ɍujjn6de5[w겍B^Y`8`֟ Lqs'`?yZ-ؘ}nRo{!GrܶSεjm0C /&3uBSU3ҧr:rdNDc7f[3{XWv$>F'Z:EwG踳ntD?~}\E4D`F3i=o^]c.j4l:qCQ o7V_^D]ɪ?R$EO^zzu"+=g9cnĘqzHh W~f0&kYjM=| 0sO_~{m2'A(eua柾~8;Rؑ{^sP>m7n }U۽!A6ѫ *Ɏ;"_G}pQTF│zDK8:R+j+;j﹛3:&H_j Ef ۘҾ;t6{lO k !ɴ*21LaMgX$$7wkjX,JHcGɣ̰ qk(93K(jwT1Xv vF1.d:g|t@[ R߾OZZ-xJuPR9`` *n8_Cz;2-'gW!}ku0 `O™`3oG`F YFv" 7N7-w:ܼ].?nN$GR J}fZ)NPv΄sSyvu0dX1σk\\/jZ!)5Sj|rFl Zq kf^y%!i{[3@4lT?k)uĎ"ra)3 e|R]ՊR#.1%#Lp8 ҳ tYYe;=ޡzLeK׍ͽ d{ڽmRӄI8=_--^sВ'Ԉg+I c}{mU[s;rݛ̴/Z9|)OJ o'D/'<&ߞA$kӭl&yf kwۙܤ7ϹhF(|{)A7ColVY0dvϔ|+yk! ۑt1->Al&yO&G1^Acٛ<{\0gI.(^,go`w+F+9~d!L:r2@Y=\Od}rf&C _\ruFlx~F-P46flL?|T=+oYew2jj]-ZNGRЄQqS88cl; 55A4mg*=NlűNe'"p"WvO@c3tMkIZoJpIG_~tuM 5h}ެO^js)wF{7P gSòb|=r#4GG] z$jN[lФ09t). d>v$8t!ϸ9kpWrUg[n(?qڒ4vÙSpb߸A֝uIl8?|J _FPDO] \l|\ψןIJV5~U5ť7$ӝQ>>b-NjO'IGffT$]?b[@Q t9*;n^R|X`^SY6 O45a֞ lԌS^/ӟ_ El,K+~עCB)ȉgg>^sn۠6@ S]mɕW<| h=o C i3__fVykcŇ'П+ O>v6@@F4i3_޿y{F =`cWwn-7xN@K 7SjY̚N}REj~3YqGb 6>,i!W7j*.}{ 2Sm0!@W2SwY7ĈO'5Pilo"Q z$+/>4h1;͆;ﮟu7(}SԈ$w P1Υ}Û\㕗\y}-&. !=- NwƴFsnoMD_xۇ_z]t;{념'Ia+JikOmR\{|_わ-աI6U^ߥl(k9'|S>D%=sדkY̚p^=)PzM&DtIPz׽O>~J9Q,(?o ]Hzl NBN>#<92VrԚm*V#hߔ^b$$k?nu~-b"cg]=gJMV$GVQS&_/pr5;Vy [+:r{yy[,dkv1O4YrѩfaQ@f˯:W>U6yPr*'v!tHBMM=A^MC?AIgm1?mua[8Y<),X=~}Ԑ5p { = -(W9z xNCɚ)6z7nwCnzVlD(>j6"c^ / #Q߹W)f~D.91u9r;ʡ@rl#deU%<#E:m8QA]OJ;o=غHl5LS8!;(7mH%$@}کr9ʢhq5U<}!H4vۨep񪣍yc NI J\YԱz7.g8 ;W6-ܦHOW^`I=7aCq@EǺ=FoqfrmsD4\d'^uxȨ,,-oj#'Yߔ^αٝ#%ZCl5"i%˒8ZB6LiR2_~s-IZ{=Y‘lw1jN&soH.Yf;ɘ~Ȩ**QŰ˞U}*vs*@٢6ymj/]ש%>fDQFDv[w-qZ8e'?9L;_s 6"Egl*79 Y-aZ+纏7Qc$;gej3h[l%?5L'?_޵EkYۧ"pǜӱ5]ΑH=vÛnsTpܜAm-}n%1t]gH@k}83I)Z8 \< %F-tlv]rRs1UsH#ָ]Egl*79]%ag^N:Wūw* 1t\MYm^D`I\[*Pc>Kj&@\Dl5"m%ɒ0Fs'\=U~=^UTȶOp$իu3kUwy)B~K8 &Ǵ\d1fؙy4ڗζ%:Y%a4Wn{=>E;<m˫ C)tq2Bn)ŕ̛uhԍsD}ӴCc8|mxt^FH0jzN÷ߵEmӽo%P^+Mp 2b-54Em8 Rמ2(v]X}]XPu$en^2eU֡冓66o0+ĵLѲ$hNka{ENnH-]:B w7%ɫ $->o[aƭt.Evkƫ;ˠi:{VM\ӕ0c,`"@ifGYѮшUmWZg[l8T-Ms. m\^^U]oa̔e[-շ3t['CF mgw]kd$[ZqSC`qa>سyH% ~LTY$}]ŵ3x W\4#P㦻 x 3m[|%7IbTV70UeulV=RFg b8VBˊ$:E+qbTV7 t&~fԥ<O@R=DJ*ѰDrݙ;3*n[|-:^ޛZ[Yh,AKϿ4SCqy lӭVf*cju1D#y,`SmM]Xq3Sm%-{}d؂dx1Yn]^x JuHZkQR,;mX=+ou)~tq1+Zc6-/p vVc^[]oy\bѵq{>_2'0-)`YVۥՍ "h,Mx|H^W 6ۭ*cWeŔ[>x]EMyKb*jtl\GIt٢Mu ̖ʚFzW l}ٝVMy|_8èMqm }YB:HV' oX|e!dդΡv04w=D)1X&DBAB`*S>lД#p&i|vw#zD[i,`6׷I!fChMFf:@V+MRX X<`VM(фf6IxDLKfDEad0~wB+Y]ȡGW/Fmga<H20ҲRrR I4bXO]ozjE71&BVyCrªeV^/tg5:yhØBn Eqx Eg"@& Ui-o/΍[DƏT'.U_$=abA+z0&>DeE䌠XիBwoٳO+dFDX"">Ns 냰=nМ[L c4ae$$q԰X),ޑHnGLjj-@(4D8FFJFRVɇ}Ϝ;S^{MoZ(䤳4 N =)*` )?x7A6@EҤ=67ވT] JoМ[Dks{,3>eﵷd7Ld5H K -DڌQʉlS^{{z~Wm"Ҥ[o.F:LHJP &p45}#Aw_u2\Dj$@k>;OZiǾM5* `Uq]31x-1<>Oi|5ވe}VՉ]>msuu> nȬ4 q$ ++ewRU0#t c`[˨2f8aE0ʨU2C%'o3wo{-!->>G M0IřUt2ïm-TɚipC3!h-ɬQN!kh-5^v,gqDtUShN/nF!kQaJ`Rʚ^sG"leI4VD&lE|kVO)k*$ H767%UdxDJϊkj/j̶:̑~囚E.3{,Qrk'bwot#ՖW !gUʚiI `;YOWTj[;h%zM uNH:!\Lm DҨܩd2`(fCaa};s@ˢykD $tz7\RU30SzĵS˚*oxp|℅ZK>}*T+ @ZU%kIdh͐i+oz߿p'6!wֺ[QcV@i>\,VɘjLJi3[!\Rd2Z,"S"V9TƜDIX`+mW7h} ;>[AZ\׃ C>x$„;m$SC9$q8BzM ( bkC Jɿo%kXʔ75ج`bΎ2H%뛩K9l㌦Tx|+كVC0lYK>v:_݅l3|n4 @dM?/O1˲d-g&גY?,Vɘ񍣒f~) 63^)c) )O#8-2@Lv<-W4!'XAReSTmiIi#qtP:L[xo,{!􎀙Բ抄7 NlJ)5TcXg`;+vsHSvl3xww͙8o8#;ءb0(eo?gu *Jp|KFqsJ6%uYJQ6$R\ps>2`E>Ń\$^d>yIJQpY[%NטSWw Prc'\?bf&JUWEp>s\Y[ ҀRFgGɍ^D ;Pرp`֖n93ʀ><] 1t2_44+來7.ȧ+k'1 Y> g +-|V*F-$:(;EoJo.\xB{&CvFuf,JF/j"}A:s輅e~64`FPPSk^&LbqjIw7JsM| *jݾKҙC#:smnǮz]䍣bRF,kZ+IVNF(GĞ [ ߞPr#" \xTx/ӆ"WĭrbGIFf(UЅC%2S18UNV}ת$U- ႈX͕ vkMOTnZP_-p򐒌߻4}U={ӈJV>,v/'L0^@`TqL.wwa}ÉCJ2~L=Gɲ2TW_6e5G\'K]}q' zPEYed߽%̶uյk ^^tXO~od׉[`:2UA~G &(ڌSygPXͺ Svi{W\rdMDM[l̫!Xwm ewn9ʸIdT1M rֱҴ*! : ?zl&yxS‚eQwo9P:Iju-0QP ^& AXB3v}7~EWA֮ExEގcu8IMeQwWl9NY*xÿ=.16#u fj cx[4cZ 0yŁNT<{dⵍw)-ˣFZFjrK.Qvf|%Xu7+: [} "&/N$>rD\[SJШ.$FE ]4aѫsP ۂ4G.}"婡IuFz2/-0*ƳPhVO9XM)˯l(I}ڠedz/F-##v/G9CߞgkM 5+AىeXt]^֗U<[*+̤ CH+_OF dG\ '5*f`kmi&5'3;73;73G&%+&=@ZqdE؀E3jKj ʼ/ X<iQh-5;C~q s*i,ZqDE؀mBz63|ɭ0$,JvB좂"Y_Caâ 5oR *s|̮AP68 I%WKٹT)Y9sNH)Ţ9Utṙ(=~mX5$3ˇBRJ`fh|͌*ʛZ<΢EgM5RNPdwʑ37S,ystNV98x_Wg&>y|jj/dd18hq}b?=sH>%+Qv'w7" \4ޟ)Jk׈=W_Y̺2jvv[NK.h̚f^:UXIȣṙ(9Ƒ<V]a^:5֙i7 21JĴ^@!z 4kAOL1gylwX(Zb{+ٵXzFq6Ѧj_afFt"~?HW 7FaQܭ]kc'Գ`yw[HL1Ѯ=7uv'.1=hEk[yu2Wק2O![x|շB!"OCB,~Cq R&аTLee |WV[{I= <"x]OVC,xմ~0?' ҫZ4"+lYc-w&v~ơp@#(4cW"hl+v9QJx^ԏKN"N-) }reZgI/IBD[ʣJܜFpF MTVeVtW`շ6VE"}m?EWߊwpobK(KƚXES #0b2Y"q&h2+3r袆-;~Tn_uiwɯ_ {EH鑫3 YVu߅~I,^:_m7PB[ O%n_C}*HOj_!cH_ y(Q X{Z߂Vx^x?߈]ߢnV G4-H2C,KR!^ѹũtLT]H}FNűaO[q*3PNB(4  }}{#`A:)ph>"?h9OF^p^ؗEgCHC!JWou&/|_H;1`CմTH$  2˩(#}5^7o@P5jsQql9wf 2UMFL:?ɌuTՌtMRX 'efN\V@ڜ8/ SØ;~apc]-;~b]޶%Or{k3樗wqaa$ZI6}-xj 8n^3Ա=6Ps,cL=?Ô#BW3!HXxIOn[oTt;,: %md&&Fq]˃8v m[b#ɨo +=L[iK)u99Q ے ;oO|kZQd,|Y74yyewŒt6Qچ&rX[b#`BP-qLg&QteU)(IukL\ޡ@cǍh< ;H2s-vf^Ӡo5 ڮx':H| A ÁjH OS!4Bȏ[`E>^#h=e4FM:ʏ~fْL.zMt B׎ x߰:خ;Fɐ׺n/=.7 Xo6&`UO)R>aS}>peU>b8_8#;7+?YpZ ] 0Sl7e _gHY =]ov%V7w^.5؛^`W1 JX "@Ȼl}z黭uY˨EsR-^cВ'Ԉg+ >Ͻ騭.3'щQ)_PsN>07;ϊIQs⩇Y} m؟LJdD'p$d94m?g^`.śVl{ʓ|zyg%Ǧ]pbCDKXn67sL|(9:!i[̳o;|ߧ޼~|e@KLt%;MهjbC2%m3KaXrn5%BaI3f h-?|+?a͹9BO;}c^, .N*[q͗1%^WFmDNyu -@^mAiBof63%;`r^`p=xe&Gj h)YRAPzσ d'|=;C h r,U_ . `vE{ܓG>.x⥬yCY=\Od}rgFRda|j\).01/| Ɉ 7@l'M @Y]= zY9f؎myRBG\zmJoe&&Δ~ޙۼ4f؎lI~غ7xJ߃%H?DG\rm ocd (yh !LG>BNemwJvS0"g)>~W*[w /_WnF ILԝ:v?(-."鸳&G?9їx(Vv}F{cgT&z}e1k"|R[2k!`ϥ< H音{[&+z_Aǀ6KAQOq*[(9j6PSoJ/]1VrKoYn{ 8)CY _JiZsT9ȋ=CӼ:kVoUy6qTm\cm¼2( n>T.zBɒ N{ = TҖǣ!+)@MZ9b;Ne ߩۖa-q]njJVv YWҖ`'*M݆SmBB:RwaiyPLv:58u{mxi{l98deǚ]v *{lqG$Gܢb7. tcb:ӧekv"y5 " %mlcӑl-\AܠӨRR^0zpG4p@ lM64ؽw, D~n7/ZTc'8duv^r9qqOpE׆]o†q@s L74ؽwJo.^)fơ8]:{r:ʲ LH*x4Yy ?O /%uq`Menm[|4oؠi6H/Dؼ3o4ϯMjHLXs~8W ")ji_8sy+hqU99e>@0s-`%q, @4롞l" j#ܟ"i+K`x䌽 ꣌ImE\R¥SQ m,,-ob`rU1ICBYl˫y3Bq)-7zY~XCBPSFp ab n]I5"(5cߎ^ک,84W=X[WӌQ%{u Q/O m {wcȖHn\1%k5 ǐ#tg :1Z]Ɯؿ,.M tnB)iR\QyҔ|VTg~9_%EOY-v:]@š]UdfzzǓV@P&ŧSgKK⮅H^J@b656Pwy4IANKx j8>?R[++D`?>]Z ju#ONܨ@Yɐq]!M J{tìQ^yy$0vHG7|=3oӒ=}5CHO~rt"EcUC-|*A$ UoDs,;<<'-IfPH^];;d e{7x]Q֡{7GVGR¤"LbѤ5̉׿cOhIC5. %,[q&pi\:ǰ:Ϯr/x,;1,Exkr96Y\-+$M&88;ӒΜGTbk@:rS nx}\+[&x\;[̶7~ZS0oqXX؁~](5|q+H*:yXFcw.[RӸUNTA khD "#^P1sp[@sk&Ja 9AI{/W {} j:֪8[ G~v=s"I֝aE%t zjZ[~Ҕp͵8!OAN)vnP&_?6؉Y@5^5<˳ot+dFdM@un2GfTg ls E<E~31vu-,z/ U6J$gp K[W P23ć4EW\ *zm/al @s(̧[~ u r'[pJj]hikN?,8VdA6YdHNa?pb C{)K_<ߝC+F(wŒA};廓~S~TwGT-63eq_wƂ_ϟ!:;ҼW3J7L5WX֘cBcho7t%[iƺ6kxZNa <|rK@dGdك^/ CA䮟V4D ) l*7p'\ 2aά JFzqGL C>cHo@Q*ubۻӻL؎t0ͽ\mr ]!,VBcho @|&g\K6gMk$@W37c5/ G:l40o֞Cz{WGn]gSRaƤ.L9v3Rd1ag ȭscR_OO`~J\iǙ۞H Jy8z k9ܱ -#6o^LJ FѶlzj_K/#Wĕ. Qp75t\a ۴SCypǂlI.`FΩQZ i>yv^Nav߯=!݄Pu_wϵ~w~)YR ܆N :|ֵ%cp/ eR=y9E$ΓQkQ'Jb%]SduL<^竼6_:=G)ZSe*cg}R J@9'm[k`[q0f?8=wt^GeJMfD͕WL"[s}r NssN.#릢׀Ts떘Bu6`}.7 TSk5ykaäh8//+a kF O1#{ҝ͑cG/ ~Qco92%ɤ̤i$"ӊY)yŬ"1)//195-R,%&i5BG>-Л?78LjlD t<̮cid5KF-vvTLVϝcW%_|㼏} @ol>X\T "(LLNa,κ};ŶuKf߶^{/(+HNMM*r3RR4ySҔibdsғbB}v]PKF•_^{/H^Fڻsͷ9Y",/xuI[Ob`|Ͼ^ZZHt;_gx`G[zoٵܬJشu?–mSJHI)Ʌ'L 5Q"QBIb)v[2MO,ΉdӺ?V-U@ɻǯ-RPc'rE/YA?yBL0!Ti RE쬄R ~޳ '"J= " R _ySS8H^ZI)J QRL b "v~ujN[8/*:%m{]{/"'|wB')ef%EEd$\_C )x 7^ ]"vr nok "oi^~Ԝ\!/+,/KI ERuJҞS%)oX 塅:o^&J)R6+.œRU֦(~Yg+R➍HQ!ҴJIVGUP1:NT 0#+>߾[FG\Bo~-ALw7?siێSiB @m<:-}䳯u)QqW^ 19<.\-`=~\v9(YI~bRjR~SKI%2FVjFby8s1Pk;@3wvOi"\ I4dYVw͂lʏe 0`qaNbrKe2X^NKKO)f1atv{qD ^xa]K)7AW>b[ @ ?܈@Q -Q^,mֆ "2#+92{r+=V[h |+ maOL>bLaCg|F5~SM`I04 ]aB[;2Da9(Q'(QB!1b lM;FO IDATo{nQۨb'̢}mJq5U{5 vTQZ=>z/0WHJiCADuԠ J!M LwO&L\؂~_kOr K0˭RH]:Z; 5}P/Z2~5{Mwي*LCRiU&r~- r%9LwX ذXRjzJ 9 67$)YmF|{AP[d|@b6 jj[Js(mIzjj7L0lZȑ  !sHRh$D挫ILVMmJYYB%֜a2.b 3z;)Y)jbMI*VjQs;L-n]r5Or:GU%",qfH5'u ݠؠsmjPMUM+ 4;6]"[sВ̝V &@"sM-X,B桯NI͸-fdTRqMIju9DQ @GU~DU]m~i\)? Ze_āNf>UG.{rA^h ' {=,-7FOc?0JmyW. ^3lW_dOL:6Z4443z'uN~6ǎ~,A q5֛۪hE!da+4OzxnWF#O8SyUw sk7~#뇧N&Md>M@u,C;tؚ n3v^u_#]߭ۍ\1vCVE@ֳ7\e mɡS\&ls+ :`p5 lVz4ezjqv>5SU{\{w??WFn6k^΁5Wo 7𩃑F>ylXWqݛeylUlpuYpj-Ҡ9~(̡һLPND$d!TZ[@i1y ojUs6휊+톭^McE|Hmn#ku ^|쑘#1GbNnD?)&ܺYO&[6Ck@OE[8|8W,"懥U#Z1Gs?'^ DaL#"/6V~qM|Zm :{Rx\m :{ffޢEc34iծW)~KvM[LsT=`n᪩~ʓp1!џק)*K*ZwJu:${u>d aף’:yrdzɞ}n|lWfG{w2u|Y[%K3,ɯKr!-2?ɥͨ`;?{_GM[gk#ύY]T룻5ߙ Qώ#aQ,{Jf*MBwv+lZ>٬ #P1 c n'O:{HQTV cR3BGScͿ ]oJafתp=ho5Db/BkHv*>٫/c nd5TYw]L2:#t;}lLQ+$]CU>"tYn#[<&ɦ8-<$?~Óe}q2WnUÅT*1H)I3rh7Hɭ>@gemMBF( dPFFY'yrvB ݚl\Hwd Byޝ.]t=_pq&tJ50eY"$+[JINbfVjFVjVA1S$l{{>{F۝NPU*A!#BZR%jQ/֏Uc=fe.->[4 l}ָǷRڮDx_{3z=xbdc1G㨷v;~_wԚKW߸-//D틉tQyWFj4uS/cO `*A&l>?Ꮕι;g4"y>|5-V8ye3U(yM۸'*lߝKPR6h5{%'EǬ %u{eta\SU }i]W iDy!Eё~<.c%%p`ssIRq6M1/{<=}-q^/:X[l{ETVlA*q8_z.<fy>R7 p[Q,N-([T~ J/M?CUCea\ĭ\ͳ62)a Yww=YujKԐO~WZTM587;HX~ͲYKYM\RRť*U;vS,ϰsV#1zh3z@&*('UNɵ۾kOxgkYÏ7,D@d[Ͼzټ{'VwktQ Q=;N\q Z/'o,X?ld$_!M"-f *vM9\nGh=y#C-eI(eCE?|6*#ۺ7qQz FVd%MꫀOm?q7eEMZ{ҶIJŀ:Ϙ9簖eG+@$U/U}hKXr0OGm\8w@h \/ u"?bocxY[ cHr(ԙ;{-g/dg#^;CKWm=#(}aMw:%p&VE-?Q"_ꥥuh=yPo#f%G;4LY=EwMR2FsUqf pTײ G mƌx%١_Po2#7˸Sm@K'tRo)Ry_FqlxD"OBc[w,4Y9v^s/?3?%}޸GaT]pk_wRC B 7˷$n _67ԛ~thye{@V5CJkcԠ@߻I2xs&ur`% _Cf* dEJk۪5c85:f5ݧ.oYW 4(i5vv(|_h/WPϹ'ktq p K$5\Dj>yyR"CVYC썩2DNul L\"#H^ [vT?kA>hAGR,xni_gڿTC."'6iwȐRvy ?l^Guf^:;Cf7aG\y{֜.1Hi2W3 ƅ1_Q<)IzBL)l ]KZq,֬9'Kt#˼5kwjQ/7̏k~l%Ae-:]XFFdIGo -:=ۆxn!j 8J+=1.)T`=҅e)9Q="ڴmĹ]vvz M+ō@~:=OdwGP%BZRr)023Ҕq#k۟uj=LQv=5W.E/U%v{{{'WlN8f9R =nP"w7Mw;疠OfmF}!#"@ qkWJ_}`a*II;֟+R`ߟ SW[\-+`[Ӑcpwvy=r{NX`WW? 6!d13ԎF1֖)=wiAߒ s xFգ玳~&J*_J;#1h2!Ş| nұS?]-5B'2!)* "3XZS=-I S?[ ZeD>jӞ=&3f"Xrk=K_g1ZS(M;tz Zּg+fNO^E+ٞtT"j@0/1U*:cTwžT]X ^C0QV p+V^ =;`oִE'r|U?ضMY&d{jϼ/3'~=ڢRonܯn$1hRmC5c^ i-ޓd6* A!W{]T.,.,y q,IO-bm۔@6ڼC+X7%+aS?y  5HI&ةqi܅K$_H'F܃HiOSyrG&J&=.iy@ǯs@T :PHt;':Pl!H ;B(S+tiwcX"SԬu`:,u5B\.,.(,fw. m8QCRr>|@é –7_Ts?n{n9~دZ_]1uӱY,j#G`;ך)laӃO+PF!e]LE\+ Ƨ6qnk4`qRS [/i'Ђ.>zT=pڪL.pẚP 46.!Ih Ejp0-*zv]*e[/~`_s>ݽM|tu'N?Vk⏆~o7oyj@Q=;x65FCH|tuŴ'^WC nڍ v [t+TC)K͞:Ts-@b =t-j/ΙH ^#ޏɒ4ę}'ScውIAlå?q+^G֪_\v*)zMe}:-MmqZ v2[Tۏ]z B$ShL[qR\*FPS9Nm|m%UR DhѲmc%Kv=us۸uԀLe''hL P9y`'^$%u/&7e';܎㆔n\ *zmG.J;" y!> ȦqOhw YyQ˖mЌ2 nb(׭YOPSt+2%A=Zd/`VSeh*NYv6@Aޓp?pو|hLA!da`"2ƙ1h1Fէ)qB2_.-zx^;pHAE~oϕTey=I^(&R2x6?Ѓ| ;ǟ|pDWfL=*C˸kV;Cl /v/ov s,XsSk@ 0X[M0nBιb(sɗ Lt|뻐idq5[%AcѳVlSg&W]"6Y0;X_|c H"w ~QI/pcđiJUJ.Tq{!SKFZǀ5*5dD~Ox];Kri]XžB`:'ь={I^F!1'>܂h@gribFF\fK^U4 2x?ϝxxP<{eݓN%q4t,j˾PXN={IYMT %h7;}ٓ{h2K3WTʤ"P5)낾!Pd>~{f8n$&/[}U9-E߇9Sƥ Y{#GP R/ IDAT2KvSx.sW Nr|kNHGe&: kxyv̱oWl6 g% Oؾ;BeǷn|FI},ۍh6umHf3|Sݿ_O$pF }]rq"B=Cfm?`KӗMwĖ`F\"wo"4R46XD!_҂h'~ y?0=vA>3[R&r/ܐ׀43­}ׯ7vLe;_[:%Cyrv~19Ru8p=s$PXZcUS~#^k+,y m;`bv~1.yCĆ|$ų׺#ꌯVdVHIDuW!T~CofYz[lQT}PIT"٫ڨ(i+n\jBRjRNmC;D=G Ye.~2IFFYqFƓo ¤O ̔ b;=ظz@rvܵ8AV+;vPn"x 7Z"vS(XbԒpcݟ%8/˥C[M' A"vNbRD('%d_5ߚ1x=g+dq$Uw lXQNIKO))ii9b bqyi.q^Lt S})x&ezX2%9Y)촌LVA^*Z$&1wҝ;?ܸZ9;ZU+ʎ]a S718Ww b'wsphǑ,.x0"yM==+;.J@;'J4&/`=y]@yQwL,x+bkc !$@ySRXEb$EKYoY)`Jֆ{8&MfoN\NTN}Z[qlQg<)H|Inw]ʗ*zr-j(LDZ.+-#9D5c%Я,m܉ϮM[V2G@ E.U}\~vZr>7#_5N$sy0ڍXJ~İCnyMOyI~rJz!~fij4Ņ9i2&GEضnLf׍D 4SsXVRJLN(S$/9\$Z.W^Xn2ё*{_FD yzyQՂ87&&[ӏI/+Ĺёɶ[2__F3?ϧK3Sޤs$R·,j=;n+"eBDYnVrJZ+IoeqYo^{>>O RRSJ&g%e+w1$i\Rő`KH{ۯ%&x-lkŸԜ8/:ӝaʅ,t?GRBu;ɺuk_k?.U4$Z m0á+>۱}O!fħkk]BE&۶nHz RvJZz2[D.S14O#KʑYIARrzb*K/)UV. ض̎4ZEL~aF_nQu"3z;ɋYɨ֌[l䷵U4l~Dn\Qdʏš <;.XL* ~R$ǕUσԅbdjBꇱX,DfM ` z?Tचp]_,GUfUf$Y~kj$|.8WSú *ex:,!QM!To(}&T4#fut ړzmv\ ˄H'5y6ln2j~*SA旒0z^ 둴꫔ߚ~2>Rv"@UQΘfj5Huݢ/XR06 PdV:Mc}VE56:V;~$Q]xIJpgAq{4 !Y7g94Zl?Ym \ҟ਱'˞B?l$m{Sj^pU^I+:slkgsg~lOzq266@=e/TS36\#u8ԅh\F] VmS4}Hp%Yile_Ku/LQpd Q(Ԧ&8J җ җ җӗ cB8^nkfk߯S6̋ \0MߤU P Ǥse5@KmR|pdDi^KEr~CvYyC{;c[fso 4^",v5VɔrrJu!m\9Ӌf /af,8A?+O6k=ZkՃhWx">=giF!0H|E{tk%6ށ+@?(Оb4AMiH+vWK_[_j&grKy}rsKy}IT1]=ŭEVȘFMkvkyb(bcn54 [hLGHtE{t&G5ei'El9!57ח;lY>`}<ƢD6ڵT/JrK #9# #- 'E}T(eu7m4ȪT^T3*uLE'rO)J$['rDMX'PtO^Da7Dqebƕr\1h:;lXֻy VUeb@UM1J%*}OWDQ벞S9nX\'S*'[Y3ISdT 4TjYI̡c ֪#D5D^]\m/DQT[zQ'Ө$]/(L'.Dx NTSې{ceV԰LZHYdNigBؒW*+62l$ w(kB0DTZD*Y+ Q g!?ecYZC{4/ 6 Ta$I"ttذ`7iUBvOdZYX4ind(8?QFPwo$ZO(`h$=\Dž3w&qd2~ ]9!cRh)_X4'Y|/!,ʙ*W5b9 w$*aqt./X"(rgXY{33[]Ҟ4Í$y|+n؎4M+hڢ?~B3H7Iġ7%Du@bv՝w"6`Ub5٦o ϛuW磻jg샨G*%+i;“"^^;3)|?=mި1/}`,Ճ{-C}isesZ31{oػ.PyV y^>k\QL/ȹxqM] ݹ/Gw"u;"󇶲&OHsh3of[Wln;xa%qm ooGSjLhȖWw=XS+%Vy& 4ЁBQu|bZ3ɖ\){6Y?ly>V4|\+ Tc*!0偕;IV^hVŴFUyE&l^Ǽr LݺA2"9*)^ 2X?+i jƒAb.wMDtA2T+f6Ѯ ;A.+1iz&CF,*C&Ъu!$|6~FOIHj2ZFR7EvlwP +\$ded#W  IؓEr!k Hdy & ]v*1\fӟc &QTXRqDԶO~WpPHDTRFyr~֮de6:掗IIlv1fxefN RKn6܋NnE%@\_"gȄvH8rT_ 0MF f/>w$ /-pXˊ6!FwqkeS (Z0dx)\-Xm\h=i@-~Y6ұƻAmJOɠy:LEv5m﷟U0#hl麟O>z]J W闛-T)1ws~u"`n0'"ۺ5qRóGȄgvH<|Fu{5㳉SWlzǐE?N>}}z4S (^0dD)-TJSwly҅1+ᡨ|FsDK(m0a' 3N2x`1 ]KaЍid`uRu6\}og^ cE:[7P[PN@Wt8MGq@Zo!r)ByQɄ0 2 Beb /!/)JRHKYfX˨MIT+B¢@`FSBU H& R5X& œ2i2YSFJK"JUQ 0V"ĈY5jiOi`Kز[\F ȳKg:s5KP!͘ T|+0:ߨGX];;4:Cn6طF%GuZ_qlD4L@vvcдVVήtĩ6czGޖe{ Uͺ' n yvc̓J#' [xG4,w6JGp&]4P3\ii=u ߻yFX4,֓W<~Cv~Jib+RN@fT9gy S>&yagpeUЍZgSE^lrjznWls&f9;\#m'P ??HݪJHx8J?OyZ *"AaT rJ+;BVLݗ P55NdBQnHyXd :LPH$2&l1A!TӞd廚ieU(rCKYF_Ցoy;k<5+dT-@ lAAߤM5??`2|Ei~nȓኋ6!,_V`bB"a`F5ZQyq,i]T\PT̓fXM&8:ٻӒϜ#j$dxV;KPUzq.n,VXHp㖍70Xt+(T(vtP / 0 }Ƭ$5KR?ᒌwX/$ 8QTֽZZVm=Z-7NM2Bw?@IDǞ{{{@ePH,40ңNʕrio(R6&dt\5;\/Zam@\X_PſU$AU7˄.MzVJ]$e]$K¯6@B0r6B0I.TǤp3M# U$H, bca L",J$($N3)LxH:J3Eǁ$# m0ftL}|D )eȓ' (bDR(4qULB0@H>R(a@I!"(&7A!KXvwLE\"ykʈq:d@Hap"֡I7Ҏ yiaH\7MQk$_Cfm% /6۪>.\ATF13;5TO#de:|j˯SjK Ocs],5G41I[O}K{_fٓfvIr83u\KAtF11/6¥ P֯א QՈ%baQ1ͤ)&t:r5ͷug;tF;̢̘u4q%ڍ5K5çvc1|[zL `-C>ϸOWaՓ[*oa@^h.B5%Z/pSjň ܡRI$h/d,"( [E#J(A \ LS1FC5KSbQ.&.NK@Q8">#&8 9~`LU2I!DD(KdPk:AżTJ}0F+OBY?aݦ& 29HO1P1٣E\uxVAm o C $Q@`>)aR.ibߥdygqЮto:ߧRꉄ4TZ y9Bg @{iEXhJS3HK.qmI~TSB7~sii>F6 5`] G37XۻP5G1~g9|èڢú֖f3'Tӿߨ{pٔEƘ15fQj2?qܜO'[yAx?$VPc9V-ڦWǦL]NʧZSq0w m2.HQ :8ç^ 5Ć]2ŭ;ucA bÿ.:rD*t1Ȃ )w$=Z\?MYdDPq +*{yAR 1{mckc"}bS=\ vK*EX V("PQe+X4T/Z`dk z5iYRdb 3ZVJdPYDr IDAT3 '|Geg`#fX Ec`AC̥qhLAYwV (L[PC*,13,b: 0<*'Jc#SG3N%$ *"Mc )ɥY3Q2 F*&J: DPH x4\R3Y=9(f *1C0)#bE!I!K=Z2BX sZ&T (fKD8&<6SR7ѵ x}!ҨJ]njʞ?BzvJh&1@t߳thQQ^%X ] B KrӢcbd5bAZ``s3Vĭ oEbEyi1 1ո spQB =HsI{Q%gPqWQ"(#!<*HMOs3fĭ oEU|KfI RcS8/[l9ř7 hјsgDpP|{㞛RaAZ`@۹CѻN}iDއ&v{w~OKN`Gf^` DZ4DK 59&6.E;9Y&p-<>%'RiZsN{?7J05%)2&.UtJ1/%*:>!_ bA-۹ؤ=H$r{6^ KM rrhȪ%C}Sh@ ÷X9@F"k+ iZcCX72H)iRH f1 'PZCwz %RڿՎ&?DuU{V^}#WS;[\V>#(O*I9ʯS,{oLɷ4QahT_j5VXV \4J C w[: 205F߼Rl ;RuA+i".4Sv!W(**`}TXGf_rb{߽俔I6Ȥ|FW̺5G+VK]3͞U*w q_f=]GLuX퀧M[fGtS^j#z*iyG`?kC_#;6n?!:Y_<_E#4k[QbQ]fn ʞƶ2^G <xr(fWgЯ7<X-A?tr(znz[7]n:EK{XgÔdd[}j_%D2T= PrkJ NU S )C"uF_Lplt2 \Uzr#*$ܽ,I|۔$-4nWR 4hN 9U=Q؝=w/<̑@-(Ɲ=wEj5@gk1qCQ5W;&J]~G)7h2njХsҤd3êV&.L{s%_ Ml egTˊ&~Ig:?#ZjV/7uNJQc+2xֲ9@ 3nؤ,IK>UK k&A3PHA"ԛ@t$cQRm! "v.-V~jG9]_k_8Bm(ղj_ѪEdk/Tl|\i1>u&u;Zا_?~ˏI oP,JLzxfaL+D:R꺫<ˏ-Ъ;F-_zfqPmQn|ը<|LQ iETZ>W+H7PD̈́ٮZ{EJ(Jh ح<ۅ^{/T"JSDc iOqƝvW`ݪKgQ2K84q+vO+Q0Xͨ:#T4, ”g}ΫhSwagJgVn6CՀ!smFcZT-FeghԺ10PrSbb24."QV\ŸHj`CFV,[JԌDYq_ }"zsNQzSϒ6 "5jiewU5V%4L(H*Bj~[2wurq՞ojo֞&~rc~!\\0 \2Y=5f02d`8iQJ҇tPdd;i׹3oBR,uC:>Iy=szL\i;H %*.giWSآߊsZ210zn޷9e~s?5lwTwӻ(bWl'u NWQБTШm~uH6Li3k{Y+F>C-0Eef tЀW֧(:gwg"|S;#Nyx<a%@}Z\LcY?n:)Tr@><|fWtը=~OZ*<;(ST^nj~K䅈_mR&]ʸoO z}Y=daannQdrEg3$uvs{lL5S]NcC:E HˆܰտwD psOUp&B.ʩߖ+3de v~zqKȹ%/۲oE2;i}?t7G/[ЉYߎʵW.&3XeO.GZ*]; )u_ؠδB7n:yJDߡr4bRș=Z5fX+&֐q孋n0eہ`CO^9Wio͕+CȕȐ 6,wfVMoݿCӢ@6OM-~kZ=kq%j|[نg jC>kJyulL{z7mft:2`p/NZP!9XUT=ޯHjҹ# #,ܲj=rf9{ϱ>jR+:`sd*ɕ -ׄ_E(~rKX=eDE 2tL1ij,:s~ (-HZ('591HPGX׷4l[: f:{϶1jR+:Ji@4S;ѫ.,jy+10ح~靦V Q4ANy9EؤyZ:`:y+Wn5YUVdU|vy' 5.;Ko/lnZ~ۍ`"K8-[>Ԃ@ZN<;H e/4ea˶E+;gi].e_ rӲ ,4'N ACZ?] (R׭cD)nZ~ɹd]AK83NmBrJr/弽R=22o*: 71;Lo?j|Ldm| )9)c(ůlIzfA<(FLˆu;r\#&v}DzX+z}(:3írۆel E9)1 ‚" ֻ[tMGگ8q8(s))P㛑nXVRhvǬ[G_",>~?z^tiҽH/,-$dVn5ߌz|զ)GxzϿ,AWMh>ŋ1g0oGQ {perGJwיU[yg)DKLy4urb.ٺɸAbt7ńM:L[h}Wwa&Omo/DK G]CMZt8es##ChέZrNYR/H?'3_v:^5aOaF3/o]O}ʶyec6aOaF3/ؽمVzG~> :絭i_Tu/s7M(Dc=I$RE:hP 60x!{  rwּEcv;@ύBA#X~)?3$ܭrF)Ŝ.d1 fM_*Q('/_BgX Id۩@rp(F,WBMlJoOr,Ufn<ŷP he2s|!Q*FRaq3Ͻ6$̎G| n' {N6Ԁ)ʘCF QC)E_Ԕw¼,gJs~fr}z1OKjTf4A`RCd~7 `/7ק,r{~> :mi_wtp iBAl`{э]'|oIlAL`{M]'|onxgW,>[I)ޖsz| yf3~qx Ps'^~Zy/_ʹ$^*ܝ>ge[Sn$:u ɗtd}^OB_3+o}m/ `Wp?[BY2W9q=?<5ӗ]:el@a rvN =27_(l.]:eptGdEMz:&QP7 Dx(֡&-Ҝidimc6L9qy2*"Uxz:4{CNw:IHj@o+InoU:Tb5( bu{G7.KfrK7l\8uqR|@jn'&tQҔwV.H~~ ]yߣP5404Gcǖb*ӄ!)I,!ɪվм[BW4Lor*F'(GڍIa1HKLi(v?uqRjW"uPR F%tt=QS((b%%æ!B$dI,,&הw6_ TnȐ/!LH6 Pa9 TmQOޒRAEr@bWcOjcXe.i_&*DaH =ߺ'+q1d3au:Bp .oG%Eev$,3M>$e#&,y*@J3lG;Qǒ[۫wԯ_Ֆ|S맔C/QQs!%Dl3 _K ^Vf%܈Pn[FEUTQ*_Vmz33xي(  :P94XIfs'nhpX-,QNȑ Qq rfce5]$CEW "tXFEME;y#Ԗ01ZT]Qa c2 @BV Xq%I!C=1֊th*˨T P;eC2 mLl49U<jhO$6qrq0℄Yv)_#41~YWϞ4͘UAl] cdI V :]9]1(fm[#DHewIfl6ץ\5dhNy)-u|s¦ IE4F@ҺMiE;rcę9Vu 21)%hT+'m=yܫ]mgنdPu|}}Lı9V9uRDfm]a@ldFg=ؕ Wk$ʱgrK l6k]ߤX[tj+hVZK|à0f1qI|Z%0,"Mtr# F}g.?6GTݩz(V ݲUIdzƃt;%d쾿-nvqyj(q2DQl;\~2&¥ rlZБF=KqKy\hLi4rjm8q:̭|I3:h"gqq\iX%2UM Vw尊^7+ 2A'*Ƙ*_WZ]A!a9F ;\#lxʟ2 4-dXu!28_ؔYǭ"Pw;b1/v?Goh93 4Q&6w!3"tt Nfܴ7cq6DÄw'] 1yvS߅&tk똟 !˺?+v}U/ekN%݌}gŮo6M\' 'cTGaKoMnf4v3ٴ۰i)#of\3fԘQM1vƾ9K1¦%Em_9om+A)GO?7M*Ihߏrw< t"tڢM_YCc" sX29U$_tu9{ 'ٜ|t0ݒ9VɉYg`w+ד[1?"iiy!S[ձ82Hxis~1GEUP(v nM~pgKuHCи66PeMH@TG.uFEKbx72 ZTgߑ^_[VtUa|!$ ڎki?sp!GX< P}~7}}OV9kfs<2JDf$J+5ZHZƇˠQ|H)\lofd D7 hјsgD%Uj=HUBPm"_ L)G%##ɣC7<+\d(D[:ot2@q<e%&> {YJ;Smo+=$Av{w}OMN`E1٥7Ɣs_E")1fϷ7)۾DX0G<{K79sĨD#勇ΗALJG^/VKKȗk+/ڶ@x# j{C%$?36.>WL.HKK`,H 6vnƊa $?vxQf{6\ KM 1=tuN{P烕͑|͌JMK`,H 87cF^ϭH!@;EJ$-]]lҞlu3D$AuE &eI)*RdL 'W 9Bs%"TQfBxdbAfJdt\|L S Z}| +"qePI1rd:fe)iHv]P,WKW[v݌L-Wvs:zK^ȡr'LovJDg^ؠq%JLxcjbI(/=2*6*HC#Yxaiqw/ۜe'&>{)PVMt)䘸,0՗p_z&KX"V Rp1#nu3D~ VnzTL|t@WO)S8/=*:NRbdtlWlnkڥIŢGD /_t =<=H&my3y/ݲe?,U={N'żJ[Ii iw27͹qw66%X&OߐN␃qZG~Q۫o tvde_s*h,H LtuhrNrӢ㣕W+4Y[Y WNSE CwM~1 nS!pEk*ػ#+!CdH73BFGZj /m3Dڒ/?iHN-F+y"EkKޑŏ*z0eUH,HiA M:zߡ}A36KSQu$ٻ9HjGMȔBRS*Lam`ϕdE׮Vp:…jfԘ\HJU5 ~բ̺aVdV?veX&UWjV>x_t-Kd!j5drL"2YwZE[dnD8UʋB~˴onH0ԇE,%*Mz}[-%^W|K:  7ջi~K@^ l X?S!`iw׸]ێmjD kބ\݆NGNOVtM~hFT -kwvc2O=5,߯}ׅ;D* j7iױK]9߆VΫ@NDr:c(!SR1[X=jW<{FrF1 YaV}z0:5Ӫ@S=݋IY?p:bĦ:ם D^~RNYNDNQ[ךRqg( ߴ}&מ!E)5 (e(kf=H*#.\D^&)&kNwk]^ֽz;z9jbw Ы=)Et #}绬+vT̥p׬]oÊ=N=n~gikZmؤjѕPm zɷtxvߵ:R~GS wc:NՍ%l;yz.km}┐{7x_QŰnҴO;YML}UE= (TY ?[sS^pyǟM="uȓTQZWQ85kx[ *4p`=85̯ځuPNiҤϻ>)H&$9o,_9Ďp'TEI?[3%fMZx0iмUVG NÊQJ^b;ޙ\7.PR(_y^^۸mc*<$B/9#STk'FKYgOl|O2 x'kTjS)iݴRgMl|ot$:i}> 9~IxWgR>ޱqC7i!D=B5 ">cp! q޸txV':-WwBYujGbsowgNcjL6£@BX $]ƌ-=]_t MS爪ԊD^y͓W)%Z^i|Un'J‰^=9/9O8Ht´\qI}LcfQPeL L˂JڨZ/tX\t*4jy;Kе dZKQФ-?+~g/߆|nk49g3[Nu{Bqj&k2O}Wv];i3l9&C)e瞐"RpB%3Ɉ"T8+UJDNUcA֮);r HRT՘i1ɼBEܸ#tz^ *)R5fXFQ\L2OJܸ\";Tܪ^Gp:znZ/In@^PdĦV'8["%b0yw4ÚO݇`JiFOLjd=oj$QQ-fS r)&zvTe`-MWl+/-heReD#]S-WtgH;V8ʋ~3rQao)} OYђM .}zh4Mo_q9>RPȀR=bQlڀtKj(+7?ѩӿx8 <9Eon:>kS#RJ= N/T`wm<21 l97ksե(j._,/;6{S#B_mZ(KlTFN-pfU|qndҾ6S ^BA8ݸ3>v5|ө C^m1'/쁠Wt5C3Ufm͋N)ٹKhbeO,ݸgy7u|E?:Xb~KO!/7 G( W=X^H\ t|2VeQT@j3RSK"Kb_(aFVrSG<4k8 tlan֮wNtmg?=R߭E zh9N-Qi8/y%ܻoa.b%L;x{eOϋpE~ݟvjOք #k&e:ՔC+8͹|VpLfL.s\&D| L|a[gaD3a[+|CTVވY-㕻½o/c5ܽg_߲m,JITqe%#  KИj?^+5{?FZ^-ہS^W+AD42&qlL pw^;a׹A.գ8?˸a+z=6Ыmz<Ʀf,ٻSFͦNk567^/ہČӋ O{/1zqoz%a̚뿷{Eqic\_6̖wz|]5»͗aY_~@bpv&Oݽr'GZ@8v/.L&rϜpso_KۍK,;d-rq_*dǤYnvF}"plpK)à(;?Qu`;x2fY.w Z0г8_T~ty[ W?uӓbr4 Ǯ릶7Q[ELݲl5ޗ;9l/Yj2s`FWޓU%i3I[:w_ 27NVXGK8-[1\uv}]sx0{}Q:*̡C f-0] *_կ!#U<|I,j5)t(3nO-x*qj\쌪[Xj6fkinǕ[ %6kJV+7Le5(=3)j(šcM/*ժعM,LZq6 zR 1wm9ōUܻc6F}fYO ZJ< Ë\4| W(  `A߾CN pVȩBnMX1?wX˵IӏCFY(nJ|A}#6a(uW,(\6d5< ).c*(Nَ;;R _OY0/K~vfnI5t:;%Dt`pk}NߴnmZ5}J/AѪf-yLk݂ɰ6BP,/D4iw!ܬBXAp.Ͳ5qRN%z4fez7N8aHwL\? FwO1N#x4feA:G+* $[V,yk2Cl: IDAT3jjB @W֙_TaSQ̀o/?,ք$G@ω 2hͳF:7bjYoX Hp0ˑu6Q-^ %&вBΞ[BdY AhmP]Mqi46BP6|N\޺lz!N `/l:SX8hTa =($!kL 5}/wg:I3k-!~‡!tH&=No{#|f!N̲^6@aƃ0/bq1UL gj>` /⺝ec1/EMz:&X Ecsg#ra&k(_@:#H^:&ŮsEdA X\˧ɒBnGR@gF qN̲^I)JǍ5`^|+j1Q$7 E0/_ l^:vIK3=^@NsBT,(I( do]O}궕JP X@w4$.*3,=iuख͍,pPgjjZٓƵ'ErN{53\#PˊH⊧LX~]UN2cYUՎk jP-l8; H#4L Z}K)>Ŀť=<|ols#$?l(FiBQ-,(g^r<܈7qe b d r4XH$T%L^VF&/3W1$s# A7bE@" 0ph ȿн jt<-":9nР<(G_Li:qQb!V(%ȱ̷7Պ+9pVE_RY]䊪4h\3+3Zc׳HƠ" )-!կPu4F;~=K6Ă4s6M&1M"Y%$T_ϖur/)SYU:$bdb,.g)`DUM^ YQy,:R[ BFMЬo'p[-xGn%lP*-iBJeD;q#D9D\")?bv]nV xurJ )'Ͷ˾kZIHI?_*r[}(gt3LiW:VlԔF/ZKO$")%QR$ KrܸB9Ҍw&2@1iffc*{Iƌ-W4*Ɣ24s 3K3z*ӆ*eH9EH6sI;yO"%)%T N@W  YG×[D^B="YURIyc F'*4m7;Z%ŧ &e]' ̭u{X}҆ YTÔVmaK'W%F>XbeUF_n*W(A5WˏfNYt9[RO~\D^?i(Ό(=ٳ_/ HF8#oRty9F÷piAt66BN-60Ti0Ayu{7+LKc[iG1f@3s]AųZ*g2TG\n؉IP?QE}T\Ld\S]HY ݻ߇. klc(ۺ ZۼiQS@i|/,:dܽż}+OY*8qqfLץ>ЭX "ԉWqfLU}B@lc-LZ9nm3[u4FX%,zJL6όɱhՀt6Vȴbs=^m3>X,)FNmuc 'Nj29q Gg}фE-[o tVb?3$:*  b{C]{t׾v^Ql`%!BKH v>攙33R}˩{wr@¢-|MH"FDc44u1ʫ.H"ƈƆxLIO-d4rf/@@¢1yq 05#1Ğ;5 (3 $ZdQ:bhB#L\P ˧uM֧EcX.\=l: >1Ek`TTg ͜+5[Le[Ӈ"H!=Po//U{/xkam9&OMdȱe&.ĵ8WoԠ TW֟nsT@Hu*$/4+(~okRjH![4*O!퇵% utTP>C UIa!0!fJm9b6yvףĞ,ndףDAo;45=OIIIZ՛H_<)̈a+^eaL!|5f$D~\޿;HPtdJR}H<IՕ Tj!&EWZt6ycHJlUI?^<ERZ|q;8g1T/̡mھg!,.7Si`C}?V͸RҏCg0Č ^$%߻}c%ϰ;j(h989H0a DX;-uE9bfDPز'WEZՁ13K`ʛJ X{ݹCOG"9im֓~9tV&uʄ!(lf)ȿ5,Y64`*6-h륓E yjj3"(lR:Lw{x21)_eѺ ߔiAS3n3W>u!MdU-D̈K/3I8ez):,i"ͯx2fvݝd;}b6q]7֣MY!LJ4#Ԅqʴ;RRʇ#`9rvRcB4,4w\{O>X6cYjBɦwkfjSB\^/gh{nڽ3?Y[ޅ:#Xp.sϙA"tϰC,\5e %nco߭"}{9ke=#S:{鷬3m\QJ켵{%ܠ5{a} ,uXG@RQdqRbR3dE/?ؘqԜ~4bq?m,n`n#YX"0wXC*UkaɷyǦgK/v0:cZ 9}nmH6C{?'KU a=N]U_lP!Hk..w:F Ya-Ш9jJ%k¦dTm05^CE Quق׷"Hr^(LZrnaZFAIާx:L-G??T^^[uio]V(9΀ Q 9TEbIq>H#Jaw1wx-:t4ʍ1ŗ;{u#>8p^~>~nx8˃tp"~N#/oC{ĖȤ.PejLkB와?9Y|LR̤4 wGXQ? .CSYB/N>6yQ?Mar%)H1d*Q,JgPY< `%9YTz!~nd$ҹM?Mc@(%]9,JX#ӈf1q 3ΠxJsht)Fx.;'w?LH͑aɰ&O+Da%94FNUxd=#@LҜ,*͗SIѓd g2Ny gҊ2qȭ|JbzLڷ4vEnB ~nDtdi4DȢ2Hks۶NH+GZ6CAQ\I-.(etxt qQ.-5VXIwCkx>ҝ4HX/OQ+(ZM/!mW}ua}{p(ۈ@a?YR{ntwL8]Q2a'Nj,`g6ZXQU ͹]j9a#B=7TFhJDTխU ߩW+ʇID(05ƚ@Ղ FլB؈+A~_c%PS67AvU)fz|Uz#`ˑ1#l(RHmBeSF 5-W\K k h>"Qw6no\FX l/ne_ WÖ29 8߬ oo٨-Tk5٘!9([b705\@C#$E!'^e][%Uشoh4j! z:ގ-UۿPB(X H HؾK}h\}#ۦ 'VxH~oؐ)TփB-"F4'-S7^ƽ̆d4->Ot!.Y @FDEUal @oКb^z] kUH4;Rxхj*۫UX5 Qc yd5Zw@/jԥӦm!9Zͬh2:!5R2k!m^ hE"jo#0p}bO&u jD&`Dݸ0ٍ,:i{tt8#<пY^|{P[c!}_ݹurQ7L$_Z>@6X g=܇M}ޟ͈n^ q1Ű55D "Xv !<7sBbjdžq_P6k9W.Xʴç_ܸ ] ]U@φw;nD߭G8EfVan[Hhl^YaùY`=GX( |{ 2hQ2=Zk/7wo:z׮ENDiBn;21d!H >}Eٻg^"Svޤ郭?Ӹs+NM{/7&k'c)! H>3g znZǟR2}1N%76:޸iS{aǐ)uǠ ;Zgۄ% COjqaȎ;RX]_!vm3޾5P䆵t/(SI3{SjFZ+jh);V\S;4+3Bvs+CǷ܈buԆMNaϩS)xӦ7WĴmڴo3vlgM!ۂoci')y|~ױq?B;} _W@RFZ/!qnt3j Vٖ>}jK|gdHrb"J;Ӗ\Mq[yxSUQq+/ +F=O`|ViF=Oռy&4nM*G׌)xQ"\ʠ>TwP%bf'RylyN5DWø \Īu704UάI, jE2wWgowbE:ܢ+'VD%9ubzEƙ:Ais<ӌ@2$h`: \#޺<5$ktvϩ[ipfOb&ώ[y;I?^)]lZ'<(xJIk2X30&p2hi+szY5oV?tmjrDPS 635YP"msBWOَڶq&mJDCA+RO)T<$,l 0u<<"W*+Y4 2}zH\=:S #o FdLe*2_=yT$Ru<).X'J$upUU!5UY npM.a\OAy CS5'hV1RJe}xehVP+\e{u`ʇ^Ԋ$kΦ~G^9;tuK|:,l1yiesKg Ѷ}~I<>ޙ ;,8鯇=G>O ޤϚ3_0?vn:@#WOs2n=_- $ǂޅǽ}K)Dqybv8zaN 9zһqobe ^ ]̠tVN;5.4xhYEs #cž'lUӪ+2?ZX( hɈH@YrS2nImlc-d3#:ie|K|giIR̒T #P@4#j:iLa@ jf k7ca =;7J!Eosoa78e0;wE~٥[wT:h3+m柿zK)5pˏ|yѭH230𛁑/B., wPݜSw诮^[=PnVF}@C66aߵ{1mȗW!^ J!w:F,T'*@R"FD@7| IDAT6auW.:f2+eX9$99x&ft65`Q拇t1Ug4Eaq\FD&w^I6#]{`ᅄ. ^HSh1UHPN?fohqqo?%g;n8r Hr{[>M.:&~s_={~Xg0{VjčwgD,Xq4QwEEk`7m˛_ܛN֊3|66 /܌[ {<5A{\8Wwν|di3Y.gCϮni­}2W>7,bq8Þ+|w?Nԗn`?ĝW}x2['7@.R8/ތ?RIaUǾ}}8G I{O|ohóm^ZMk?LHfF{+U3cn.C\]>/sWP>{ɔ?Э|q5ǿHumTmANS%fgwvHx=H+6j[vLqqS|z9 89vψ-1ݽ  Z:*.Zgt@!.cΙ_K of3rK}wo#Xؾ|dPVm9t֎.~~^?wc`zuQ/H v~;kĴm( rzUߠM,>gD9b#!<׮#?7YOoHtGy+'QpYBs'FD@Iҁn-z Ot"=DIfFC?޿|؝=G}vJt铰JaNI$eLM2^<蓨JQaNVzADo[mSp{I9>+X=¯ kG@d~2/qmIpTSnԺMc.eg i80\q8 ~~xYӴD V@Z7"!FJPm5kHH^W( ؍\=gܥ0~`Xcl|8 ~~## Vyr()~m":2D򚼬G%s no\>`L5Nc¶XG߶dBg4f_*~H+9ޯs%A4iC{ëѨrJlgm,{m-s nm\>A. vk{ _)-*BdLmqmIuzW gֲ3~=ߵB&WZv9((h޹CR%Dj?ذg\ZZBkrfu֖ xcgC;{[Je /](c V5exT2]Űc<'͛/.Oyhn]pkòc8H>sV v*H$)+OuܶXТ/|!eK]MD,9v[$㣊nj^xn? d`G{h6o~mM 6bܰlܾR`6sE 4t7aVmd=jFmbfƈY#8ạ̇Jwm,ev]s[DgCGyNHY~%z4QV>+C.v Bnv,I21&pJ%0#L\.@}<H D%" Pḁ J@{;R߳ʰrͬ]apFW,CϮ(rL<7)0L,$ 9RViX׮!52hH)s]!{ qL֤qcSp۴(|ư71OF{!①6~ +sȍ1=za$}5 >ॆ='vHHPȾRcX=Ķ3ڌq%)(cd^%F`¢vDc2u^2xI?tƓŠkW^Ca ҳׅ}~ݝ Vqb_Sg_u0Qͫ)__#akqZ\8k()՞A* q4mzEt l\RFK/ۣcv, e<_JbՌ媅о/xQϾ1hO 5& |Jֶp$(S}w_3'!\:%)ano;-3rJeAu7DqDw3K]n ݽ[劕*) +S)[P ;5"h=zǯrFX׉-.+lN Y' Q{:5|B":'"uG(x$;]U0DERrb.6dlE)㧆0_h"aQ!T" y"U&EϮ(?B 4"b}Wsy- 4(%JUsѭyۨV{2>-yo~+6 "Үb$%OoIt}^ 93e2@a?8|xHͬ1RʏjE.MT}>C pWt]ճ|=x,[r#[-̆TKY]@/G2! -ͬ I7`H&ri Ð%$ IDEܱ/ʗd3}/FLPă&zryn]|I =#gҊ`†4O&g> Ǫ<-gnUQa;.>5SFiDOTN04n?*`%Ft]0c I6z-&.?~lk$)/77Olk8Q~Ns}za?vsZBtyQ9%:W@G4k_Q,*0H߻oTKMzb7FllPSY|e 'VVݯBEɊLcC=XY3!MMQ9”bJ޾w8 [&'-͡zuCD qB/bݬ5)H:* 8C̔cbLf70¤Q%VbT #3 SKSbkpꄑ'aˤ㄃:9?Db o~wĻ|qTdˇ&zZaNB͍*Uї;fSbgmsX=5zwnGwk^&#GP9:ݱʜ:J00Sn_}ZB0Ng'ݑYMH&DaҔb~ =>'B!_tjӇUdfaji|ST0k}hأS+فiG+81ƶq6r0Apׯw뿵dI.Ěu@LC~373Mdkn3Hwph`T/2i~'_#d;b9#yd$c1{cAUe^ 63I ^2kn3W{! јL@虺y\I̢2yq s4ݓm3+oaȤ[9HC 7M Z<뷫zZho֖& Ag)Oc2mn]'~u+ףk [fh&5W{գ7{ӄР3^um$/H3cYi[sUMC1+ HJ3"8|Ԏԁ@[xb%R]@@R^dqRbQybF^v46}vJ84f=`6_MJ9~MrԐ{9Awg?X4 RvO,Qx./©*ҟ?Ϳ. /$"wPG┐{atx16XWb1꤀rcZ1ڸ|5))&›|X/"kJ8đ5FDJ!5"#o?ĈqԜ{~ wI:Ҷ~eb3#~(Tys6U^P18r6b0&) =8phސuIRQRҡ6$aZ<;?νi2W_g'~;f*Gikq3Z6ڄ)Paֹ|}401_^y`柬-BR1^aeťtkC,gcf,?`sԣT97ֲ‡bu1޼b )1ع7y1_^Yv 6VtN916YyTsGe#%bd{2rŀ2f @KۀoN9~3?~.wn՚ 9| (RR?+,"]J݇'dB-,Iҩ HG p3_lBzvvmמlXv#"Ctɺ"e Rˍ̺ 4E蘯߳Ji۟.^mlM4ZڡqaFZlן9eXHx/Τ}Kg @/,;9pI2>Zܶ+QieH d%3i*NAIQ.ݓ{%sYB,@ qq>Fc0Jsl>B4Jg)HO I-H3L!RT0=65$>+qoe^*SwOQ("f\#Iq~BsZF/bԻ2řoil!ͭ+C13qBYKnGǎH+Gʚ 1k>T+ʐg#~nD8˃ϞMIIvfR*#"3;FO+Zl)lCJ"!R k8--@HR¤T&XiN-ů>2+`bfe-۶u#CTkk6EqdJ9TFzzN=-HcQc0aDWJSs%oBF_«?IR)!P8ˍ=z:(a}H'<'='KJUbQ ɠtjo:Q&~ڀsG/fGü?"@>% BfZBJn)+T)Bq&\#">yQd*HLx_֍=pQ1@ڜA"(Ox(If NW98焇y{;}]M|sh~xhBVcq;c IDAT@OHH-h,T,y M?7e"L7@\\ ܱF"ꃚHGCluހ#XP&7y-/u4_`é^?tw`X{CbXǠP,X=k3EC\MƉo,F[4UqTʀ9_1%:' Uu7Mm_>ŧPHȘD:!?Bjf%tсM>iÓP,(Wb:oaFl7O{gu˼f^nobd0.^uTM]ORͻ2ƷJ rHZnWIATc;[n'd)CmUA 3ځ6v| }=[hغ 19a!R]W#2xh( ^bt\ry`i:mŬ]%qzXS a3o&Dk-Vk~-jр52t=!Fo3ƻ3Go0 O!n[*mA8A5  2KzEuX\EZY|[eeP;zp_>s|Kr4G/3u5,Mx ٔH9jӨ&7diBt &H;ʹєDhV''Q5 -JVe،$K0CufQo5ľ)j^^_4 xCKL-H 5NpeUH;^-f/a뮮FUo:4PM] +Q=ITIV{6\]IB5ClZց 86!+Q_;f duc5 ZL{) z.;ͳg {.=>jnCՅI3/Wt{GU&P@UzO#/54MFlus5E $)'@$e 3ta~qZYU2cZwHaB?0jo^G--3RM͋V6鄔,\D8:a\Mr$E Xn4VIDIpYq!BԬ GM ډ#lR5ΔV4&}fMlWߒ4 Sy gX-~H֏RB3 68V::ߝRx3 S}9Y@t>KNFx5ms xp2t'>NMzϘ>D s?܏L9#ڎXq}M8_}^ ߺC3V5ykkX^txt.&8ՅҴg'ϐ4.tfFljr%i$IEXud/\؋x$]Lxlέ%:՞$rRՃ0QTTC%"mAdXJ|>TսJ_ u/Y[MX=!VB%/-$۾ĉڊeBz CKo``OiC0J>P3+^ -L{N4$xQ^cT׎ƊAW[u fhL{N߂ HS6!D20kam4gsJ!~F§W>ųEi޼6#V*H 4Jpe8߫702WA``HXf\Mq&=Ng;fE_' R}eW$쟯 )yļ}S)&A:nTIBCHH8LZ)IBJ^V:%T=M+kQ (zC7͡ctINϪ}=^Ы檘jjW UtXEHƥ5$"LU U]cz#A!Zs@Pc8Uc8dRJ$,%iiA* Q%>vHx ՉJzjʚjb&]G V9!b%$􈠩?TefFÊ[j躙%$j:,b_/8lyR?Ynz7% 'NJHԄm>r5Gt]ևj|zLѕI.$yaՁ__#,\=.}aÒ 1N>e}iL &}ל}xhG}T1ٔ0?2EP I ~zak*`7 ǐp^|z~kA?hZ#}ۮ):xg9NrOkG.lO4=!^(}˦ 2$wT'cP=cޢ 8.<0;~җG=dy$G/ńǾ'lug)rы.R{>45.Vi4qåo %H ϯu_^qF]V?;<"D ^~.竺TW] Tް@0j=`eZDNJ?1J1 cꅨϽ=M+=QQ H`q|XvkTQ& [h"XlWo#yfAMIM%n%Y%ԁ$yVHi .fc~)Z}kI^9_s.ɐS| dQ-'~knLZ Yع Yf:4w  lZAz+xAjnvy ;rlgڡ*{J8m_@)ȲF^lFGPRoHr*YrRVpҶFSV3fM}A9ёei*o; `@r-ĤvHOFXZ}C,II!)UWڋڰ RjN߾[ddG3З qݜ gr]0h*oM!8R_+MM,{ԑַ<#YU,i/<㗽d`_.RVmWAg߱[~5x6=څ#wFU:&~LF$=_Q F9®G*刖-M9iLִۢuvOwl$)v~;k#DpG©Gne@O[2hh(6QprNdK y2[4zw4VI'Q$j={ܴƴVYi*Wg,- {% K%";THT-#o?mOEςLץ">+Chhk25jjHzAHEoH:u|[Z^FGPu@HЅ+ZL.۴;@?+4mo'f43wcaN BpK=y?|\^ZoV4R(K$EJK)lq"\,$HpW hH">EPj+,D"IYzAȂL=#<^ty(t#]h`YiUyTHJ&'Zܚ ('1ɫ'f.Tb$T TI%H!fꢡqI+xIIHdܴp,pmB7$V4B( k)L)LF Hrm۟0`N^v['$>Oʸ\ik)ʤIX .D&EL\D?(\::b~e.qm"P֜p\r(Ii@BMjvF n: Qgc ךxnf q,ߖd`ec BNT,)es*ar!"K3\!˜K?#NuH!8fVPzظi=Ls11$=O3¤ ebq)0H:wʸ~ez2%\ F(4/V~;i.f+ xf0&9fxmI>6W%wV{ldRST'D_#R#s+D.>6 9jL2P-۴c?c%g@]"DA='`l[>Ew-9iCK&9ftm  Orܿg7nc0ڌv%)tޢ.ϖ%] :BsҴO]:Lͫ/Q\tfE:vж6yȖ6 y㶇ˇdŧ" ʿyc% I pfղD Rdߨ@Q ${sjEN$\,r+I)"!()W<<)؊W]yxT]gL6%A R,T@\SOqiֶ~ꃨ֥uaua+D@:Id3sqg3IfAɝwE$)"IV $!eIofdgeŷB{>@ $KbN*ʧs6 ݇%[+^Lae({RyNKfc~ܥɤaR{8zާҵ"έ:m٠:PI!6kcN("8:;$Z|}܄jY%#8CIJZH9nvX~#74PD 5 T* #(UYK@)uMYv+2֬%Tqn:&nc; M$zP'RV0BI}bf̸V1Dr ]sB7`?RY=fZjA&PoB>2xoԩm$bE5oiRJOR"ȘjD{*O(uF [$RNJ6^ (u1@YfNf\a"^Լ\Tp.! - ;NY{Ya'SEsNv놗oJUUԸ.xv%_.;lx\n<PhFzӼmM{0"%f߻8mޚa*U/lpkT7UW|@Recr| k~ƽD2|PTO_5_fz"\ 9B)yI+Xd}_D$HB0DE$0~R; Bզg,zDS$98p|ܰW Y>: ѣU~P#15tC9_??VM'>t`{dcgG*PJ¥3>X4oƌύT % #kVG{4dzr.=郇-ޘkگ2i٣\"!̼yqJ!֌^ʘKV;>1?.Yg71ióF u7&dOra\Twzb3CQڲ90~'$:c"j @KlZ`"Z"a<;L, 3PE~)uٜMyBe:nHKoi)u6QCbmff`5B dK<-+FYhE "f!ʝڔt͵!`-VfRZE. cho>w|bO$0Vu]}qzh=o[3Vs^*m⎽RuşVVф-6Y<_< M-qoſ{)OO8{zZLʙ!!{?F[zq]4|

{Yݍ0A e4ᓩE`p֖ Fo (j݈ʶ{eSv-׷onn,u[ڴjV|mEjLJ̙g a""(]hsZYm]he*ԥ!aDD~\Z S[ș$J@jd,cT =RH cTm$iDxVɛۊ絶;U :Lus5R~SVqT)`)T["RV]{NR6jRNgIDATqzg)ۨi%Ql$;@s59fs|%V״񙂬:T+HVN8s!/ZTd1}${,5*T?\ ,ZB)JҮO@njZL)D]ՍͱPۢ8E^ ӽuS?qr&B^|؄p|q&^ڻ45ߝ1˿;UO%Y-û~7\;;e8S{O-#ɳomþƎ4q}^$'Ꝼ+ƎJҪ6mf5^yqÑfGOQbɩ c:֗xǵqWDb'CF$Te,np`l޹L;2KUy٪v ^kWeҘkS{ڶBNĦ㶌WS5~e6 k*,.0E%J[ElڱL;2KUe ۷ozOsf놊XZ^^b$ڋ%eU6 |s]qiyI˱/F2Yʢ^^h@Hl/):tbJ j; ?YMѳ&Ħ̆Or#Gt4"\ͮݕcM5{mLo+)(ic/(?z"[.Rr_z~Vڝ>Uv؁S[Vyxb [ȫ|Zv6]8Sgkd.?'Wǝ[қ8h[%+/WVW5dFaB;}Ma䓶'8~[IPE!Cnc ZQ8,h-fDalz]>'E2rN 'lfJiV֓¤WKɏK?Jt2L0ҬIC$tFMc$X _B[HɢTMFQ0joIE MSgTjU:DnȷRTJ %8EvmR%62),iŒKH3ThHH*@RQ(8 YM3FVqzßa]Ku5cfҏ AdBg8=RN)H,gd%#@PS["m"(I%U=Ay֒X"讒 U @TSCT$o$]&7!RȤN6+q 6eʗ*甪滝jM;E\7-oܸh!P  8wbϲwXA]E죱]x{:{RHNGc{t1 Gd_{gQVv#VsD$$HA)Eܠ | iF=n>.tDN KR(Oe`w߳=df&d|7 Q5(Y+^_4 BqHB\m˾÷~`( ءSAp"#LFtI 2-/~ODe:i0X@v`S(v8I,$`-8DuwЮ<шV둶q⍊M4 ]Jh&'o6&*UweG(\q,N;6q$D51~W졽o=pHuRca%gA0nW^_ A;.F'ME`#n[ gEq:*t}ѱ:Arķ(-RϾW i0m0D#x5dz=B,fpwdLL{7 Fz}j/X1 Gà8'K(hDM(1Gs(c+( ч:1Bn˙9C>(Aqq2vҷt9 8p=7e.+6O `vTz\/@\{zpG0wcV[Ʊ=OnYCtwio^z"dI|jǿQt#{Ȟ7kt?Zp1NON70t}fu}ۍ9ʈ3n3{bdGUezߒq7/IdhuLGT?5I脡c24dRaptB7$#Y{p'>B̙;o2 #BH47 ʥS23)QD)dxXH&߉və=49Q耪@UP2?BŽ[|Dnw$j%Pw Ro4C4]N7'7~)ۄN4(Ĺw ΰ sb<"K7D)T> %5P~#}PéI{pUyr=Ž۾8,:܉. sܢJx @QZUV7unolŝ8 >mpp_fd"znWu21LlAM|;?FeMߛNa`e ɼkgP/G>}yj+g!觼yp{gW 0c5t ߏ]ŒJ3=Ek]wa(J*wLw-}4'czIENDB`nodeunit-0.11.2/img/example_pass.png000066400000000000000000000334651317343222700174020ustar00rootroot00000000000000PNG  IHDR)sBITOtEXtSoftwaregnome-screenshot> IDATxy|SUsoI-Rv]+"@8,32(u**;]t{5 `R(9&O'@ݛgҶaNƍJ?d|o[5gߤHuތuثS;X[瑯:~_ܜz7rmo3?깥?H9廃5uu ={z[Ϻɩt/l>uW Gݠ\K>ږ\*-?ȆG\b|ʰfĨA/kM>Njwuq7-ګՄu|TF[2+4Q:}g+ٙvûܴwװuJ]r륧-FmǻofD9vd_]ym[wK^EGV/;r_oqrstlwUJ)mc<@#6㹕RJiI:?:lk3f+' T]mX0m΄3)ĵ{B _b7tЙdSƉ! g?=Upwp|Ym>o2ghN;gϿ|dIR>].x1KK7'^{dm}|5'yvJ)K2uJ3 *v1KdI(JX;Ag] z#TMJ)-{=B_ԁDsݒ}j g~s]WޜV.eyi/eW9޽f 4ۮWiZ;=\qw:aڡS\؝Z'4k%f/p^q>nq߁c7Zv2KgwGցUW_h>i\ 4uުjl9rEzئќ :9cgǵVyzB)wx ^s=I pw}]MvwyzREeu?ಟ}E{P6W8;n5*S<<*ko8u>5q߁[ً+Ol-nh!kC]7XS\Cl}*of.a5~i6ļuΨ˛x5TWVo=J]Jȣ[ʲ?U]}gu.7evee>Bk:{s9V{x#A«[ɩ4PSqxm>]Vw !.y/?wrЁ?}1!tAg՗ my9"yq'qVx.fvjTEqTJZ6mԫKi}/VS!Xd5ˁI5#ﰚ-Me}]kWm∢sۑSf>?uw}5#^{ /~l%WCkfa^nγX,%wKLC`и>>]|44?ŬL*H6_?eٹc2ٯǛ|$]l^"v]Fr8|*Ϭ綨O]^n !JkBJ<jn,U!lfSZee5D ɺD٭mN{\VIU5 >5ɹ.'SE^6ŖW Z?w,zzef}0c{-BC"U0]p_y>Ϧ2\UwM|6f|piėOIm̦liNC/i^bYrb=#Z>wfBhDG_wed:j]L?ߵov iVS=~qrz OpyŊg>Q¹B ݕTBQi{O _wHn}xxX3Srˤ 5H}^6^Q -FLdUg\7]qNY-gFvdF^pʳ8+-ZZV⫞^Q -<Ӳ>eyN54cNEUkh8BAf];_ ԪR ;ye]V#ykcĨy5ЯO t?Bx4;C*532*N;}rnc?|7v%Zo7(SxnUsfpGh6x^9~pe>B 9F=|j _^6lj|B軼s4.j4!_`MJ)^_#MVi/+JV]~eJ")}C4BmOL)RTy 㸸6:tn[BhqRm/[deEֹ.Y9zBW$}xvm4fŲy̔6yvyo ?wy_yEڞP[>)7_qtCY;JRVO};cH|ŷp]K0*$mǿmvՐϏL)V)eAd:q ǡh#F~͓ &7z5k] sOCquz_B3ftm;.;~wD,sMG7.|F93~gu(7vPzjT+UE[Pno%/ ^${RʵWC_uJ[ Εg-aB-̴eT k:ǂJ{eAQw֫ݬe,c$.DNgIO` G uKFY򭏅T] ǽʰј-ҟ+BbEB:R)egiB.̊ij֯i_BmI+.XwOlY?CQ^^fs8*+ Y^)f]a+(R4j`}_n[Gw~jfco9[)[*MYei)s:jq^bPݧ.}ZWTi,(E#ǿ>} z/"+x{B]P@)yN.!m6讠ʒb{I/nZ׍*p0o/ }-5}[5x;eҰǽǭ~k@7@g9SG^y2#4骺`g?׵O!cv粟G!;gJKJJOE~3OM-F#ΪQ,m;ȵb'jg=kJ)326h{DbwMJ;r>'5S3˭%կְp6~\Kz&(}nWa3Oe.ke׆ ]f̾aM8kHhP|Ǘ,wMYdp뻡irEe+϶CZMGW|"_cfgq`\Abj?TᎿ\ \wl1#sUtvOoy8Z\)jujϧuL&ak;Z4QI> al7k@IV/-vy8}S5meMu҄ ଔR-VFjȽs|HJi+JlB.f鞌2)E k FRZ.z L&OOsWcqMJ[{Bh"bw&zkŞҬ3/ږm>hP*53gzc2)ei=xlEJ 80.ĂiKw&I4'|M'K?ofΗ4*G`o=qgl۸VnMPQvz%jh'DjUCȕ%[ckM[bn+BowWP8%)gW2="'+M]x[\^%N{2.>иFخq`Eڏ̹7S5oI;~]ד.+Y}\oE(>'TT?߷9yk 5h'9_W]Q^'מ{BJ)>/}1%-%=8-̨3:\Bh9zF!6G  S*h55TRmGʏO=P z}iuƕ0<*EޟY._?ﻗWcBoXFhJ'wZOԹNRUM6'D?pp|]]vM,̫ybn sh !l) a1+ R6;Kv_nkI<.Y#z-/9G7 !VᨴVH!5lzE͡hjf+gڮz>}?/ˮ^x²gbw/H)iq5ԝ_-ݨvûԴBpdzKqK~ƀw?u}?/^T~Mu/Hw^؝Wun&lg2mzNW#RCERJ[AvVVVVg}B(v1KdI(JX;aވ?U`RJKEiinʋ@[_7ۤ^9g*&"vg⪷VI/8smq]8sƪ7nK/R&#{WiZ-tsb;Τd}Υ˷W|9(OyM\:(37E[G`o=qgl۸Vnl^54!r쒭1B}-1zs]ſ^vgc.{<[U-GH/T=PvVyh\ }g@|\l80"Gܷ$~|vްEo[O iNޚ4B IFVږa]<)RJ}5_9)cJ[W;0t[Qgt*ј%sF+5BmH8JLUjjB7.8㏔{x#A«[ɩ4P25+)axPU޽?-Xu92\bY7Կw/1(~!zOajdKig/:mvo]RRGz6'D?pp|]]vM,̫yUE&wKLC`aKhhԟ YTQm5Orv.}M>'f)RtUlfS4[V4/R!dɉ5Gh>_]ן'Ճ݂ʜ\^Ӏa]Prw"WW8y~cE}z2 gEcvk^fF,sy [soW.ֲe۷{{{\T׼:w[B%O?̕|tkhT0F !9?[3w\&F;q~}Z!G:40BZ3N+0z(mG3Sk?'g8bvT$޾f/M\(#o*ٺv#fHkvбoʿhSvXym/.l׮ݦMzpyE^~!%I#Bn;KR<"0t#WS@&4pґr#&+W:yGWOB`P?qnwwȷyc#4.q40nQ5$&SJUJYf2~B2_\rQ= k?ߓ&SJv2?d:w^7~s.\OU{oTbx~4kg~(0ݙ߃p8*?u?uOWuCe( !ƷiMVr>nl6n;w-IDAT۫g0s=VijL97;;'/7`&|O.;!R~Tbs啔TVV^|ٲeTbW{/`4穪ڦM䪇***E?6 Pua8##>s8cǎUf'Wbb޽{ CNNNii)wp-"P #FBhWTT޽ipjoo\x^kh5+LWnc]Ytd+c<;sUR^;ͣ yj:k h. 3nM?s~L[vWS)Zi!ԈOwv݃tUg\2h}ǩ:N|GDXˎte-i_o.ow6㹕RJiI:?:zڰAoğ*I)%}4n,ݓQ&(agk2O첃YRlX+Ԑ{lV@_!^m;kR|"wԯmR3PB -ݙp&%Ӝvrmi]gx% tȿԼφVu7!w%_c؝Z'4k%f/֘x'Yտsj@?}CMBxy?xӴ^|BG_i0mq%V6tsk=hAj R~x<+ZPZEgI{!wo*s^wx:V%jh'DjUCȕ%[c)E~^>(B vlPד...{<[U-GH/T'q`Eo[O ǧ&״M_8P;2,;Nݛ?WIi߿J/&"@e]|[q-ݟWgДp}B"B*ƚUBţ3X_R-yv'.\ teOL(KZjkRMrwK BcvO<#Ӓ~x1YWmm嫋Wsz nӿ9ca˹\̣c1mfO*(>kR:!pX|#RȒ?*߱]3eϸ |rwG[6we?L.)1:o9kAJ筩9*my_ZwJB")4Bxi=*BhE!HŎ΍}'[9xӓ/sTm|#鋱MTIU5 5ɹwa5H`+̠/g|vHaք/t=EȒU j !*>Uֿ׿YY;[1oL;UBն-Lڰuߍ9½/jC;kٰS]c>ݺl9V|Xni ]_[~{V9iډ{^Bh=|q+);x]%nՀ^}oJ{YQGƧo|_! ]fH+RJYi>! 6Bn;KR]+ri(In!q)%*,H3LG?gBMpWVͯt8*򎮞7D#ƁqWXzZ]X^ymAKib?5>Z©Zu=-ܰe?97gBQx3:pPi ݛgҶa_݆S;~8t&ٔqbAYOO}ky\wxE$䛶B!Y/_?Y?rҶԬi87hʼn.Y2{[t8`MC]v0RʒcuvJ3 煛*v1KdI(JX;Ag] z#TMJ)-{=B_ԁDsݒ}j g_܂n*5ePέ>ZPZEgI{zjNc1x+B<=;<9S}~_KzWWzʳ^˥GuBh$d?K]]]!3zF_=`^Ey3GvoɯhiaVT)E~^>(ĠB{[u _nU #WflinO#益ܦWΡU_=N7唙0( F6{p^_j7es&|g)?~єD#J,W=}{m7~tcQaGk=q -Rnm|U#-(XHS'eeqƷK h=e [wտpϹ{PP%۪eeX }|5sIï+WN˰ј%sF_|ūŦ}s vS)nU!tA̓~IQm|#鋱M<E_9qVx.fvjTEqTJZ6mԫKi}/VS!X.,u`R Ȯ;fK2̶"5IiU8hǜv䔙}=OC=]_&E`M}o_:8=zImy9bX,-1amAtŖШ?2 eӻ-ƲܱSGM o>qSf6Z]VCGĚڶԹiUY/wd.T–W Z?w,zzef}0c{-BC"U0]p_y>Ϧ2\UwM|6f|piėm̦liNC/i^bYrb=#Z>wfBhDG_wed:jב*4{yxxGo53%LXê.w*s`n1=l4%7ueVUlYiҲ'v_Jlbhᆟ_UdyN54cNEUkh8BAf];_ ԪR ;ye]V#ykcĨy5ЯO t?Bx4;C*532*N;}rnc?|71%hBz,R:G3F5kߛ^Vѱ@|{mg{dJɮR槚Lfp80 cqk޽f 4 u֡s[GBՇw@c[/Ojwp|QZ'.+ҷv gˏ:$û}ܴ}m1[,c`ɳ;ǵlu|5@(%SP[>)7_Unwc2kGZRJog ipq\ǥD,sMG7.|y[/7?΍;hmQ=[NQOVe pK޾Cyߒ/yfqժ={kx-:^ GO-K,Me)}Ǻt]n X9p3 ̄IENDB`nodeunit-0.11.2/index.js000066400000000000000000000002461317343222700150730ustar00rootroot00000000000000// This file is just added for convenience so this repository can be // directly checked out into a project's deps folder module.exports = require('./lib/nodeunit'); nodeunit-0.11.2/lib/000077500000000000000000000000001317343222700141725ustar00rootroot00000000000000nodeunit-0.11.2/lib/assert.js000066400000000000000000000265411317343222700160410ustar00rootroot00000000000000/** * This file is based on the node.js assert module, but with some small * changes for browser-compatibility * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! */ /** * Added for browser compatibility */ var _keys = function(obj){ if(Object.keys) return Object.keys(obj); if (typeof obj != 'object' && typeof obj != 'function') { throw new TypeError('-'); } var keys = []; for(var k in obj){ if(obj.hasOwnProperty(k)) keys.push(k); } return keys; }; // http://wiki.commonjs.org/wiki/Unit_Testing/1.0 // // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! // // Originally from narwhal.js (http://narwhaljs.org) // Copyright (c) 2009 Thomas Robinson <280north.com> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the 'Software'), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var pSlice = Array.prototype.slice; // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. var assert = exports; // 2. The AssertionError is defined in assert. // new assert.AssertionError({message: message, actual: actual, expected: expected}) assert.AssertionError = function AssertionError (options) { this.name = "AssertionError"; this.message = options.message; this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; var stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); } }; // code from util.inherits in node assert.AssertionError.super_ = Error; // EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call // TODO: test what effect this may have var ctor = function () { this.constructor = assert.AssertionError; }; ctor.prototype = Error.prototype; assert.AssertionError.prototype = new ctor(); assert.AssertionError.prototype.toString = function() { if (this.message) { return [this.name+":", this.message].join(' '); } else { return [ this.name+":" , typeof this.expected !== 'undefined' ? JSON.stringify(this.expected) : 'undefined' , this.operator , typeof this.actual !== 'undefined' ? JSON.stringify(this.actual) : 'undefined' ].join(" "); } }; // assert.AssertionError instanceof Error assert.AssertionError.__proto__ = Error.prototype; // At present only the three keys mentioned above are used and // understood by the spec. Implementations or sub modules can pass // other keys to the AssertionError's constructor - they will be // ignored. // 3. All of the following functions must throw an AssertionError // when a corresponding condition is not met, with a message that // may be undefined if not provided. All assertion methods provide // both the actual and expected values to the assertion error for // display purposes. function fail(actual, expected, message, operator, stackStartFunction) { throw new assert.AssertionError({ message: message, actual: actual, expected: expected, operator: operator, stackStartFunction: stackStartFunction }); } // EXTENSION! allows for well behaved errors defined elsewhere. assert.fail = fail; // 4. Pure assertion tests whether a value is truthy, as determined // by !!guard. // assert.ok(guard, message_opt); // This statement is equivalent to assert.equal(true, guard, // message_opt);. To test strictly for the value true, use // assert.strictEqual(true, guard, message_opt);. assert.ok = function ok(value, message) { if (!!!value) fail(value, true, message, "==", assert.ok); }; // 5. The equality assertion tests shallow, coercive equality with // ==. // assert.equal(actual, expected, message_opt); assert.equal = function equal(actual, expected, message) { if (actual != expected) fail(actual, expected, message, "==", assert.equal); }; // 6. The non-equality assertion tests for whether two objects are not equal // with != assert.notEqual(actual, expected, message_opt); assert.notEqual = function notEqual(actual, expected, message) { if (actual == expected) { fail(actual, expected, message, "!=", assert.notEqual); } }; // 7. The equivalence assertion tests a deep equality relation. // assert.deepEqual(actual, expected, message_opt); assert.deepEqual = function deepEqual(actual, expected, message) { if (!_deepEqual(actual, expected)) { fail(actual, expected, message, "deepEqual", assert.deepEqual); } }; var Buffer = null; if (typeof require !== 'undefined' && typeof process !== 'undefined') { try { Buffer = require('buffer').Buffer; } catch (e) { // May be a CommonJS environment other than Node.js Buffer = null; } } function _deepEqual(actual, expected) { // 7.1. All identical values are equivalent, as determined by ===. if (actual === expected) return true; // Convert to primitives, if supported actual = actual.valueOf ? actual.valueOf() : actual; expected = expected.valueOf ? expected.valueOf() : expected; // 7.2. If the expected value is a Date object, the actual value is // equivalent if it is also a Date object that refers to the same time. if (actual instanceof Date && expected instanceof Date) { return actual.getTime() === expected.getTime(); // 7.2.1 If the expcted value is a RegExp object, the actual value is // equivalent if it is also a RegExp object that refers to the same source and options } else if (actual instanceof RegExp && expected instanceof RegExp) { return actual.source === expected.source && actual.global === expected.global && actual.ignoreCase === expected.ignoreCase && actual.multiline === expected.multiline; } else if (Buffer && actual instanceof Buffer && expected instanceof Buffer) { return (function() { var i, len; for (i = 0, len = expected.length; i < len; i++) { if (actual[i] !== expected[i]) { return false; } } return actual.length === expected.length; })(); // 7.3. Other pairs that do not both pass typeof value == "object", // equivalence is determined by ==. } else if (typeof actual != 'object' && typeof expected != 'object') { return actual == expected; // 7.4. For all other Object pairs, including Array objects, equivalence is // determined by having the same number of owned properties (as verified // with Object.prototype.hasOwnProperty.call), the same set of keys // (although not necessarily the same order), equivalent values for every // corresponding key, and an identical "prototype" property. Note: this // accounts for both named and indexed properties on Arrays. } else { return objEquiv(actual, expected); } } function isUndefinedOrNull (value) { return value === null || value === undefined; } function isArguments (object) { return Object.prototype.toString.call(object) == '[object Arguments]'; } function objEquiv (a, b) { if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) return false; // an identical "prototype" property. if (a.prototype !== b.prototype) return false; //~~~I've managed to break Object.keys through screwy arguments passing. // Converting to array solves the problem. if (isArguments(a)) { if (!isArguments(b)) { return false; } a = pSlice.call(a); b = pSlice.call(b); return _deepEqual(a, b); } try{ var ka = _keys(a), kb = _keys(b), key, i; } catch (e) {//happens when one is a string literal and the other isn't return false; } // having the same number of owned properties (keys incorporates hasOwnProperty) if (ka.length != kb.length) return false; //the same set of keys (although not necessarily the same order), ka.sort(); kb.sort(); //~~~cheap key test for (i = ka.length - 1; i >= 0; i--) { if (ka[i] != kb[i]) return false; } //equivalent values for every corresponding key, and //~~~possibly expensive deep test for (i = ka.length - 1; i >= 0; i--) { key = ka[i]; if (!_deepEqual(a[key], b[key] )) return false; } return true; } // 8. The non-equivalence assertion tests for any deep inequality. // assert.notDeepEqual(actual, expected, message_opt); assert.notDeepEqual = function notDeepEqual(actual, expected, message) { if (_deepEqual(actual, expected)) { fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); } }; // 9. The strict equality assertion tests strict equality, as determined by ===. // assert.strictEqual(actual, expected, message_opt); assert.strictEqual = function strictEqual(actual, expected, message) { if (actual !== expected) { fail(actual, expected, message, "===", assert.strictEqual); } }; // 10. The strict non-equality assertion tests for strict inequality, as determined by !==. // assert.notStrictEqual(actual, expected, message_opt); assert.notStrictEqual = function notStrictEqual(actual, expected, message) { if (actual === expected) { fail(actual, expected, message, "!==", assert.notStrictEqual); } }; function expectedException(actual, expected) { if (!actual || !expected) { return false; } if (expected instanceof RegExp) { return expected.test(actual.message || actual); } else if (actual instanceof expected) { return true; } else if (expected.call({}, actual) === true) { return true; } return false; } function _throws(shouldThrow, block, expected, message) { var actual; if (typeof expected === 'string') { message = expected; expected = null; } try { block(); } catch (e) { actual = e; } message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + (message ? ' ' + message : '.'); if (shouldThrow && !actual) { fail('Missing expected exception' + message); } if (!shouldThrow && expectedException(actual, expected)) { fail('Got unwanted exception' + message); } if ((shouldThrow && actual && expected && !expectedException(actual, expected)) || (!shouldThrow && actual)) { throw actual; } } // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); assert.throws = function(block, /*optional*/error, /*optional*/message) { _throws.apply(this, [true].concat(pSlice.call(arguments))); }; // EXTENSION! This is annoying to write outside this module. assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { _throws.apply(this, [false].concat(pSlice.call(arguments))); }; assert.ifError = function (err) { if (err) {throw err;}}; nodeunit-0.11.2/lib/core.js000066400000000000000000000175511317343222700154710ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed * * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, it's mostly to avoid requiring code * that is node specific */ /** * Module dependencies */ var async = require('../deps/async'), //@REMOVE_LINE_FOR_BROWSER nodeunit = require('./nodeunit'), //@REMOVE_LINE_FOR_BROWSER types = require('./types'); //@REMOVE_LINE_FOR_BROWSER /** * Added for browser compatibility */ var _keys = function (obj) { if (Object.keys) { return Object.keys(obj); } var keys = []; for (var k in obj) { if (obj.hasOwnProperty(k)) { keys.push(k); } } return keys; }; var _copy = function (obj) { var nobj = {}; var keys = _keys(obj); for (var i = 0; i < keys.length; i += 1) { nobj[keys[i]] = obj[keys[i]]; } return nobj; }; /** * Runs a test function (fn) from a loaded module. After the test function * calls test.done(), the callback is executed with an assertionList as its * second argument. * * @param {String} name * @param {Function} fn * @param {Object} opt * @param {Function} callback * @api public */ exports.runTest = function (name, fn, opt, callback) { var options = types.options(opt); options.testStart(name); var start = new Date().getTime(); var test = types.test(name, start, options, callback); options.testReady(test); try { fn(test); } catch (e) { test.done(e); } }; /** * Takes an object containing test functions or other test suites as properties * and runs each in series. After all tests have completed, the callback is * called with a list of all assertions as the second argument. * * If a name is passed to this function it is prepended to all test and suite * names that run within it. * * @param {String} name * @param {Object} suite * @param {Object} opt * @param {Function} callback * @api public */ exports.runSuite = function (name, suite, opt, callback) { suite = wrapGroup(suite); var keys = _keys(suite); async.concatSeries(keys, function (k, cb) { var prop = suite[k], _name; _name = name ? [].concat(name, k) : [k]; _name.toString = function () { // fallback for old one return this.join(' - '); }; if (typeof prop === 'function') { var in_name = false, in_specific_test = (_name.toString() === opt.testFullSpec) ? true : false; for (var i = 0; i < _name.length; i += 1) { if (_name[i] === opt.testspec) { in_name = true; } } if ((!opt.testFullSpec || in_specific_test) && (!opt.testspec || in_name)) { if (opt.moduleStart) { opt.moduleStart(); } exports.runTest(_name, suite[k], opt, cb); } else { return cb(); } } else { exports.runSuite(_name, suite[k], opt, cb); } }, callback); }; /** * Run each exported test function or test suite from a loaded module. * * @param {String} name * @param {Object} mod * @param {Object} opt * @param {Function} callback * @api public */ exports.runModule = function (name, mod, opt, callback) { var options = _copy(types.options(opt)); var _run = false; var _moduleStart = options.moduleStart; mod = wrapGroup(mod); function run_once() { if (!_run) { _run = true; _moduleStart(name); } } options.moduleStart = run_once; var start = new Date().getTime(); exports.runSuite(null, mod, options, function (err, a_list) { var end = new Date().getTime(); var assertion_list = types.assertionList(a_list, end - start); options.moduleDone(name, assertion_list); if (nodeunit.complete) { nodeunit.complete(name, assertion_list); } callback(null, a_list); }); }; /** * Treats an object literal as a list of modules keyed by name. Runs each * module and finished with calling 'done'. You can think of this as a browser * safe alternative to runFiles in the nodeunit module. * * @param {Object} modules * @param {Object} opt * @api public */ // TODO: add proper unit tests for this function exports.runModules = function (modules, opt) { var all_assertions = []; var options = types.options(opt); var start = new Date().getTime(); async.concatSeries(_keys(modules), function (k, cb) { exports.runModule(k, modules[k], options, cb); }, function (err, all_assertions) { var end = new Date().getTime(); options.done(types.assertionList(all_assertions, end - start)); }); }; /** * Wraps a test function with setUp and tearDown functions. * Used by testCase. * * @param {Function} setUp * @param {Function} tearDown * @param {Function} fn * @api private */ var wrapTest = function (setUp, tearDown, fn) { return function (test) { var context = {}; if (tearDown) { var done = test.done; test.done = function (err) { try { tearDown.call(context, function (err2) { if (err && err2) { test._assertion_list.push( types.assertion({error: err}) ); return done(err2); } done(err || err2); }); } catch (e) { done(e); } }; } if (setUp) { setUp.call(context, function (err) { if (err) { return test.done(err); } fn.call(context, test); }); } else { fn.call(context, test); } }; }; /** * Returns a serial callback from two functions. * * @param {Function} funcFirst * @param {Function} funcSecond * @api private */ var getSerialCallback = function (fns) { if (!fns.length) { return null; } return function (callback) { var that = this; var bound_fns = []; for (var i = 0, len = fns.length; i < len; i++) { (function (j) { bound_fns.push(function () { return fns[j].apply(that, arguments); }); })(i); } return async.series(bound_fns, callback); }; }; /** * Wraps a group of tests with setUp and tearDown functions. * Used by testCase. * * @param {Object} group * @param {Array} setUps - parent setUp functions * @param {Array} tearDowns - parent tearDown functions * @api private */ var wrapGroup = function (group, setUps, tearDowns) { var tests = {}; var setUps = setUps ? setUps.slice(): []; var tearDowns = tearDowns ? tearDowns.slice(): []; if (group.setUp) { setUps.push(group.setUp); delete group.setUp; } if (group.tearDown) { tearDowns.unshift(group.tearDown); delete group.tearDown; } var keys = _keys(group); for (var i = 0; i < keys.length; i += 1) { var k = keys[i]; if (typeof group[k] === 'function') { tests[k] = wrapTest( getSerialCallback(setUps), getSerialCallback(tearDowns), group[k] ); } else if (typeof group[k] === 'object') { tests[k] = wrapGroup(group[k], setUps, tearDowns); } } return tests; }; /** * Backwards compatibility for test suites using old testCase API */ exports.testCase = function (suite) { return suite; }; nodeunit-0.11.2/lib/nodeunit.js000066400000000000000000000046141317343222700163620ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var async = require('../deps/async'), types = require('./types'), utils = require('./utils'), core = require('./core'), reporters = require('./reporters'), assert = require('./assert'), path = require('path'), events = require('events'); /** * Export sub-modules. */ exports.types = types; exports.utils = utils; exports.reporters = reporters; exports.assert = assert; // backwards compatibility exports.testrunner = { run: function () { console.log( 'WARNING: nodeunit.testrunner is going to be deprecated, please ' + 'use nodeunit.reporters.default instead!' ); return reporters['default'].run.apply(this, arguments); } }; /** * Export all core functions */ for (var k in core) { exports[k] = core[k]; }; /** * Load modules from paths array and run all exported tests in series. If a path * is a directory, load all supported file types inside it as modules. This only * reads 1 level deep in the directory and does not recurse through * sub-directories. * * @param {Array} paths * @param {Object} opt * @api public */ exports.runFiles = function (paths, opt) { var all_assertions = []; var options = types.options(opt); var start = new Date().getTime(); if (!paths.length) { return options.done(types.assertionList(all_assertions)); } utils.modulePaths(paths, function (err, files) { if (err) throw err; async.concatSeries(files, function (file, cb) { var name = path.basename(file); exports.runModule(name, require(file), options, cb); }, function (err, all_assertions) { var end = new Date().getTime(); exports.done() options.done(types.assertionList(all_assertions, end - start)); }); }, options.recursive); }; /* Export all prototypes from events.EventEmitter */ var label; for (label in events.EventEmitter.prototype) { exports[label] = events.EventEmitter.prototype[label]; } /* Emit event 'complete' on completion of a test suite. */ exports.complete = function(name, assertions) { exports.emit('complete', name, assertions); }; /* Emit event 'complete' on completion of all tests. */ exports.done = function() { exports.emit('done'); }; module.exports = exports; nodeunit-0.11.2/lib/reporters/000077500000000000000000000000001317343222700162175ustar00rootroot00000000000000nodeunit-0.11.2/lib/reporters/browser.js000066400000000000000000000105141317343222700202410ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed * * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ /** * NOTE: this test runner is not listed in index.js because it cannot be * used with the command-line tool, only inside the browser. */ /** * Reporter info string */ exports.info = "Browser-based test reporter"; /** * Run all tests within each module, reporting the results * * @param {Array} files * @api public */ exports.run = function (modules, options, callback) { var start = new Date().getTime(), div, textareas, displayErrorsByDefault; options = options || {}; div = options.div || document.body; textareas = options.textareas; displayErrorsByDefault = options.displayErrorsByDefault; function setText(el, txt) { if ('innerText' in el) { el.innerText = txt; } else if ('textContent' in el){ el.textContent = txt; } } function getOrCreate(tag, id) { var el = document.getElementById(id); if (!el) { el = document.createElement(tag); el.id = id; div.appendChild(el); } return el; }; var header = getOrCreate('h1', 'nodeunit-header'); var banner = getOrCreate('h2', 'nodeunit-banner'); var userAgent = getOrCreate('h2', 'nodeunit-userAgent'); var tests = getOrCreate('ol', 'nodeunit-tests'); var result = getOrCreate('p', 'nodeunit-testresult'); setText(userAgent, navigator.userAgent); nodeunit.runModules(modules, { moduleStart: function (name) { /*var mheading = document.createElement('h2'); mheading.innerText = name; results.appendChild(mheading); module = document.createElement('ol'); results.appendChild(module);*/ }, testDone: function (name, assertions) { var test = document.createElement('li'); var strong = document.createElement('strong'); strong.innerHTML = name + ' (' + '' + assertions.failures() + ', ' + '' + assertions.passes() + ', ' + assertions.length + ')'; test.className = assertions.failures() ? 'fail': 'pass'; test.appendChild(strong); var aList = document.createElement('ol'); aList.style.display = displayErrorsByDefault ? 'block' : 'none'; (displayErrorsByDefault ? strong : test).onclick = function () { var d = aList.style.display; aList.style.display = (d == 'none') ? 'block': 'none'; }; for (var i=0; i' + (a.error.stack || a.error) + '' : '
' + (a.error.stack || a.error) + '
'); li.className = 'fail'; } else { li.innerHTML = a.message || a.method || 'no message'; li.className = 'pass'; } aList.appendChild(li); } test.appendChild(aList); tests.appendChild(test); }, done: function (assertions) { var end = new Date().getTime(); var duration = end - start; var failures = assertions.failures(); banner.className = failures ? 'fail': 'pass'; result.innerHTML = 'Tests completed in ' + duration + ' milliseconds.
' + assertions.passes() + ' assertions of ' + '' + assertions.length + ' passed, ' + assertions.failures() + ' failed.'; if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); } }); }; nodeunit-0.11.2/lib/reporters/default.js000066400000000000000000000100301317343222700201730ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var nodeunit = require('../nodeunit'), utils = require('../utils'), fs = require('fs'), track = require('../track'), path = require('path'), AssertionError = require('../assert').AssertionError; /** * Reporter info string */ exports.info = "Default tests reporter"; /** * Run all tests within each module, reporting the results to the command-line. * * @param {Array} files * @api public */ exports.run = function (files, options, callback) { if (!options) { // load default options var content = fs.readFileSync( __dirname + '/../../bin/nodeunit.json', 'utf8' ); options = JSON.parse(content); } var error = function (str) { return options.error_prefix + str + options.error_suffix; }; var ok = function (str) { return options.ok_prefix + str + options.ok_suffix; }; var bold = function (str) { return options.bold_prefix + str + options.bold_suffix; }; var assertion_message = function (str) { return options.assertion_prefix + str + options.assertion_suffix; }; var pass_indicator = process.platform === 'win32' ? '\u221A' : '✔'; var fail_indicator = process.platform === 'win32' ? '\u00D7' : '✖'; var start = new Date().getTime(); var tracker = track.createTracker(function (tracker) { if (tracker.unfinished()) { console.log(''); console.log(error(bold( 'FAILURES: Undone tests (or their setups/teardowns): ' ))); var names = tracker.names(); for (var i = 0; i < names.length; i += 1) { console.log('- ' + names[i]); } console.log(''); console.log('To fix this, make sure all tests call test.done()'); process.reallyExit(tracker.unfinished()); } }); var opts = { testspec: options.testspec, testFullSpec: options.testFullSpec, recursive: options.recursive, moduleStart: function (name) { console.log('\n' + bold(name)); }, testDone: function (name, assertions) { tracker.remove(name); if (!assertions.failures()) { console.log(pass_indicator + ' ' + name); } else { console.log(error(fail_indicator + ' ' + name) + '\n'); assertions.forEach(function (a) { if (a.failed()) { a = utils.betterErrors(a); if (a.error instanceof AssertionError && a.message) { console.log( 'Assertion Message: ' + assertion_message(a.message) ); } console.log(a.error.stack + '\n'); } }); } }, done: function (assertions, end) { var end = end || new Date().getTime(); var duration = end - start; if (assertions.failures()) { console.log( '\n' + bold(error('FAILURES: ')) + assertions.failures() + '/' + assertions.length + ' assertions failed (' + assertions.duration + 'ms)' ); } else { console.log( '\n' + bold(ok('OK: ')) + assertions.length + ' assertions (' + assertions.duration + 'ms)' ); } if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); }, testStart: function(name) { tracker.put(name); } }; if (files && files.length) { var paths = files.map(function (p) { return path.resolve(p); }); nodeunit.runFiles(paths, opts); } else { nodeunit.runModules(files,opts); } }; nodeunit-0.11.2/lib/reporters/eclipse.js000066400000000000000000000057651317343222700202160ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var nodeunit = require('../nodeunit'), utils = require('../utils'), fs = require('fs'), track = require('../track'), path = require('path'), AssertionError = require('../assert').AssertionError; /** * Reporter info string */ exports.info = "Reporter for eclipse plugin"; /** * Run all tests within each module, reporting the results to the command-line. * * @param {Array} files * @api public */ exports.run = function (files, options, callback) { var start = new Date().getTime(); var paths = files.map(function (p) { if (p.indexOf('/') === 0) { return p; } return path.resolve(p); }); var tracker = track.createTracker(function (tracker) { if (tracker.unfinished()) { console.log(''); console.log('FAILURES: Undone tests (or their setups/teardowns): '); var names = tracker.names(); for (var i = 0; i < names.length; i += 1) { console.log('- ' + names[i]); } console.log(''); console.log('To fix this, make sure all tests call test.done()'); process.reallyExit(tracker.unfinished()); } }); nodeunit.runFiles(paths, { testspec: undefined, moduleStart: function (name) { console.log('\n' + name); }, testDone: function (name, assertions) { tracker.remove(name); if (!assertions.failures()) { console.log('✔ ' + name); } else { console.log('✖ ' + name + '\n'); assertions.forEach(function (a) { if (a.failed()) { a = utils.betterErrors(a); if (a.error instanceof AssertionError && a.message) { console.log( 'Assertion Message: ' + a.message ); } console.log(a.error.stack + '\n'); } }); } }, done: function (assertions, end) { var end = end || new Date().getTime(); var duration = end - start; if (assertions.failures()) { console.log( '\n' + 'FAILURES: ' + assertions.failures() + '/' + assertions.length + ' assertions failed (' + assertions.duration + 'ms)' ); } else { console.log( '\n' + 'OK: ' + assertions.length + ' assertions (' + assertions.duration + 'ms)' ); } if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); }, testStart: function (name) { tracker.put(name); } }); }; nodeunit-0.11.2/lib/reporters/html.js000066400000000000000000000067161317343222700175330ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var nodeunit = require('../nodeunit'), utils = require('../utils'), fs = require('fs'), path = require('path'), AssertionError = require('../assert').AssertionError; /** * Reporter info string */ exports.info = "Report tests result as HTML"; /** * Run all tests within each module, reporting the results to the command-line. * * @param {Array} files * @api public */ exports.run = function (files, options, callback) { var start = new Date().getTime(); var paths = files.map(function (p) { return path.resolve(p); }); console.log(''); console.log(''); console.log(''); console.log(''); console.log(''); console.log(''); nodeunit.runFiles(paths, { testspec: options.testspec, testFullSpec: options.testFullSpec, moduleStart: function (name) { console.log('

' + name + '

'); console.log('
    '); }, testDone: function (name, assertions) { if (!assertions.failures()) { console.log('
  1. ' + name + '
  2. '); } else { console.log('
  3. ' + name); assertions.forEach(function (a) { if (a.failed()) { a = utils.betterErrors(a); if (a.error instanceof AssertionError && a.message) { console.log('
    ' + 'Assertion Message: ' + a.message + '
    '); } console.log('
    ');
                            console.log(a.error.stack);
                            console.log('
    '); } }); console.log('
  4. '); } }, moduleDone: function () { console.log('
'); }, done: function (assertions) { var end = new Date().getTime(); var duration = end - start; if (assertions.failures()) { console.log( '

FAILURES: ' + assertions.failures() + '/' + assertions.length + ' assertions failed (' + assertions.duration + 'ms)

' ); } else { console.log( '

OK: ' + assertions.length + ' assertions (' + assertions.duration + 'ms)

' ); } console.log(''); console.log(''); if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); } }); }; nodeunit-0.11.2/lib/reporters/index.js000066400000000000000000000013751317343222700176720ustar00rootroot00000000000000// This is a hack to make browserify skip tap var tap; try { tap = require('./' + 'tap'); } catch (ex) { tap = { run: function() { throw new Error('Sorry, tap reporter not available'); } }; } module.exports = { 'junit': require('./junit'), 'default': require('./default'), 'skip_passed': require('./skip_passed'), 'minimal': require('./minimal'), 'html': require('./html'), 'eclipse': require('./eclipse'), 'machineout': require('./machineout'), 'tap': tap, 'nested': require('./nested'), 'verbose' : require('./verbose'), 'lcov' : require('./lcov') // browser test reporter is not listed because it cannot be used // with the command line tool, only inside a browser. }; nodeunit-0.11.2/lib/reporters/junit.js000066400000000000000000000131101317343222700177020ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var nodeunit = require('../nodeunit'), utils = require('../utils'), fs = require('fs'), path = require('path'), async = require('../../deps/async'), AssertionError = require('../assert').AssertionError, child_process = require('child_process'), ejs = require('ejs'); /** * Reporter info string */ exports.info = "jUnit XML test reports"; /** * Ensures a directory exists using mkdir -p. * * @param {String} path * @param {Function} callback * @api private */ var ensureDir = function (path, callback) { var mkdir = child_process.spawn('mkdir', ['-p', path]); mkdir.on('error', function (err) { callback(err); callback = function(){}; }); mkdir.on('exit', function (code) { if (code === 0) callback(); else callback(new Error('mkdir exited with code: ' + code)); }); }; /** * Returns absolute version of a path. Relative paths are interpreted * relative to process.cwd() or the cwd parameter. Paths that are already * absolute are returned unaltered. * * @param {String} p * @param {String} cwd * @return {String} * @api public */ var abspath = function (p, /*optional*/cwd) { if (p[0] === '/') return p; cwd = cwd || process.cwd(); return path.normalize(path.resolve(p)); }; /** * Run all tests within each module, reporting the results to the command-line, * then writes out junit-compatible xml documents. * * @param {Array} files * @api public */ exports.run = function (files, opts, callback) { if (!opts.output) { console.error( 'Error: No output directory defined.\n' + '\tEither add an "output" property to your nodeunit.json config ' + 'file, or\n\tuse the --output command line option.' ); return; } opts.output = abspath(opts.output); var error = function (str) { return opts.error_prefix + str + opts.error_suffix; }; var ok = function (str) { return opts.ok_prefix + str + opts.ok_suffix; }; var bold = function (str) { return opts.bold_prefix + str + opts.bold_suffix; }; var start = new Date().getTime(); var paths = files.map(function (p) { return path.resolve(p); }); var modules = {}; var curModule; nodeunit.runFiles(paths, { testspec: opts.testspec, testFullSpec: opts.testFullSpec, moduleStart: function (name) { curModule = { errorCount: 0, failureCount: 0, tests: 0, testcases: {}, name: name, start: new Date().getTime() }; modules[name] = curModule; }, testStart: function(name) { curModule.testcases[name] = {name: name, start : new Date().getTime()}; }, moduleDone: function(name) { curModule.end = new Date().getTime(); }, testDone: function (name, assertions) { var testcase = curModule.testcases[name]; testcase.end = new Date().getTime(); for (var i=0; i name_slice(['TC1', 'TC1.1', 'mytest'], 1); * "TC1,TC1.1" */ var name_slice = function (name_arr, end_index) { return name_arr.slice(0, end_index + 1).join(","); }; var indent = (function () { var txt = ''; var i; for (i = 0; i < spaces_per_indent; i++) { txt += ' '; } return txt; }()); // Indent once for each indent_level var add_indent = function (txt, indent_level) { var k; for (k = 0; k < indent_level; k++) { txt += indent; } return txt; }; // If it's not the last element of the name_arr, it's a testCase. var is_testCase = function (name_arr, index) { return index === name_arr.length - 1 ? false : true; }; var testCase_line = function (txt) { return txt + "\n"; }; /** * Prints (console.log) the nested test status line(s). * * @param {Array} name_arr - Array of name elements. * @param {String} status - either 'pass' or 'fail'. * @example * > print_status(['TC1', 'TC1.1', 'mytest'], 'pass'); * TC1 * TC1.1 * mytest (pass) */ var print_status = function (name_arr, status) { var txt = ''; var _name_slice, part, i; for (i = 0; i < name_arr.length; i++) { _name_slice = name_slice(name_arr, i); part = name_arr[i]; if (!tracker.already_printed[_name_slice]) { txt = add_indent(txt, i); if (is_testCase(name_arr, i)) { txt += testCase_line(part); } else { txt += status_text(part, status); } tracker.already_printed[_name_slice] = true; } } console.log(txt); }; nodeunit.runFiles(paths, { testspec: options.testspec, testFullSpec: options.testFullSpec, moduleStart: function (name) { console.log('\n' + bold(name)); }, testDone: function (name, assertions) { tracker.remove(name); if (!assertions.failures()) { print_status(name, 'pass'); } else { print_status(name, 'fail'); assertions.forEach(function (a) { if (a.failed()) { a = utils.betterErrors(a); if (a.error instanceof AssertionError && a.message) { console.log( 'Assertion Message: ' + assertion_message(a.message) ); } console.log(a.error.stack + '\n'); } }); } }, done: function (assertions, end) { end = end || new Date().getTime(); var duration = end - start; if (assertions.failures()) { console.log( '\n' + bold(error('FAILURES: ')) + assertions.failures() + '/' + assertions.length + ' assertions failed (' + assertions.duration + 'ms)' ); } else { console.log( '\n' + bold(ok('OK: ')) + assertions.length + ' assertions (' + assertions.duration + 'ms)' ); } if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); }, testStart: function (name) { tracker.put(name); } }); }; nodeunit-0.11.2/lib/reporters/skip_passed.js000066400000000000000000000065311317343222700210670ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var nodeunit = require('../nodeunit'), utils = require('../utils'), fs = require('fs'), path = require('path'), AssertionError = require('../assert').AssertionError; /** * Reporter info string */ exports.info = "Skip passed tests output"; /** * Run all tests within each module, reporting the results to the command-line. * * @param {Array} files * @api public */ exports.run = function (files, options, callback) { if (!options) { // load default options var content = fs.readFileSync( __dirname + '/../../bin/nodeunit.json', 'utf8' ); options = JSON.parse(content); } var error = function (str) { return options.error_prefix + str + options.error_suffix; }; var ok = function (str) { return options.ok_prefix + str + options.ok_suffix; }; var bold = function (str) { return options.bold_prefix + str + options.bold_suffix; }; var assertion_message = function (str) { return options.assertion_prefix + str + options.assertion_suffix; }; var pass_indicator = process.platform === 'win32' ? '\u221A' : '✔'; var fail_indicator = process.platform === 'win32' ? '\u00D7' : '✖'; var start = new Date().getTime(); var paths = files.map(function (p) { return path.resolve(p); }); nodeunit.runFiles(paths, { testspec: options.testspec, testFullSpec: options.testFullSpec, moduleStart: function (name) { console.log('\n' + bold(name)); }, testDone: function (name, assertions) { if (assertions.failures()) { console.log(error(fail_indicator + ' ' + name) + '\n'); assertions.forEach(function (a) { if (a.failed()) { a = utils.betterErrors(a); if (a.error instanceof AssertionError && a.message) { console.log( 'Assertion Message: ' + assertion_message(a.message) ); } console.log(a.error.stack + '\n'); } }); } }, moduleDone: function (name, assertions) { if (!assertions.failures()) { console.log(pass_indicator + ' all tests passed'); } else { console.log(error(fail_indicator + ' some tests failed')); } }, done: function (assertions) { var end = new Date().getTime(); var duration = end - start; if (assertions.failures()) { console.log( '\n' + bold(error('FAILURES: ')) + assertions.failures() + '/' + assertions.length + ' assertions failed (' + assertions.duration + 'ms)' ); } else { console.log( '\n' + bold(ok('OK: ')) + assertions.length + ' assertions (' + assertions.duration + 'ms)' ); } if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); } }); }; nodeunit-0.11.2/lib/reporters/tap.js000066400000000000000000000034551317343222700173500ustar00rootroot00000000000000/** * Module dependencies */ var nodeunit = require('../nodeunit'), path = require('path'), assert = require('tap').assert, tap = require('tap'), fs = require('fs'); /** * Reporter info string */ exports.info = "TAP output"; /** * Run all tests within each module, reporting the results to the command-line. * * @param {Array} files * @api public */ exports.run = function (files, options, callback) { if (!options) { // load default options var content = fs.readFileSync( __dirname + '/../../bin/nodeunit.json', 'utf8' ); options = JSON.parse(content); } var paths = files.map(function (p) { return path.resolve(p); }); tap.pipe(process.stdout); nodeunit.runFiles(paths, { testStart: function (name) { tap.comment(name.toString()); }, testDone: function (name, assertions) { assertions.forEach(function (e) { var extra = {}; if (e.error) { extra.error = { name: e.error.name, message: e.error.message, stack: e.error.stack.split(/\n/).filter(function (line) { // exclude line of "types.js" return ! RegExp(/types.js:83:39/).test(line); }).join('\n') }; extra.wanted = e.error.expected; extra.found = e.error.actual; } tap.assert(e.passed(), e.message, extra); }); }, done: function (assertions) { tap.end(); if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); } }); }; nodeunit-0.11.2/lib/reporters/verbose.js000066400000000000000000000074621317343222700202330ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var nodeunit = require('../nodeunit'), utils = require('../utils'), fs = require('fs'), track = require('../track'), path = require('path'), AssertionError = require('../assert').AssertionError; /** * Reporter info string */ exports.info = "Verbose tests reporter" /** * Run all tests within each module, reporting the results to the command-line. * * @param {Array} files * @api public */ exports.run = function (files, options, callback) { if (!options) { // load default options var content = fs.readFileSync( __dirname + '/../../bin/nodeunit.json', 'utf8' ); options = JSON.parse(content); } var error = function (str) { return options.error_prefix + str + options.error_suffix; }; var ok = function (str) { return options.ok_prefix + str + options.ok_suffix; }; var bold = function (str) { return options.bold_prefix + str + options.bold_suffix; }; var assertion_message = function (str) { return options.assertion_prefix + str + options.assertion_suffix; }; var pass_indicator = process.platform === 'win32' ? '\u221A' : '✔'; var fail_indicator = process.platform === 'win32' ? '\u00D7' : '✖'; var start = new Date().getTime(); var paths = files.map(function (p) { return path.resolve(p); }); var tracker = track.createTracker(function (tracker) { if (tracker.unfinished()) { console.log(''); console.log(error(bold( 'FAILURES: Undone tests (or their setups/teardowns): ' ))); var names = tracker.names(); for (var i = 0; i < names.length; i += 1) { console.log('- ' + names[i]); } console.log(''); console.log('To fix this, make sure all tests call test.done()'); process.reallyExit(tracker.unfinished()); } }); nodeunit.runFiles(paths, { testspec: options.testspec, testFullSpec: options.testFullSpec, moduleStart: function (name) { console.log('\n' + bold(name)); }, testDone: function (name, assertions) { tracker.remove(name); if (!assertions.failures()) { console.log(pass_indicator + ' ' + name); } else { console.log(error(fail_indicator + ' ' + name)); } // verbose so print everything assertions.forEach(function (a) { if (a.failed()) { console.log(error(' ' + fail_indicator + ' ' + a.message)); a = utils.betterErrors(a); console.log(' ' + a.error.stack); } else { console.log(' ' + pass_indicator + ' ' + a.message); } }); }, done: function (assertions, end) { var end = end || new Date().getTime(); var duration = end - start; if (assertions.failures()) { console.log( '\n' + bold(error('FAILURES: ')) + assertions.failures() + '/' + assertions.length + ' assertions failed (' + assertions.duration + 'ms)' ); } else { console.log( '\n' + bold(ok('OK: ')) + assertions.length + ' assertions (' + assertions.duration + 'ms)' ); } if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); }, testStart: function(name) { tracker.put(name); } }); }; nodeunit-0.11.2/lib/track.js000066400000000000000000000022641317343222700156400ustar00rootroot00000000000000/*! * Simple util module to track tests. Adds a process.exit hook to print * the undone tests. */ exports.createTracker = function (on_exit) { var names = {}; var tracker = { names: function () { var arr = []; for (var k in names) { if (names.hasOwnProperty(k)) { arr.push(k); } } return arr; }, unfinished: function () { return tracker.names().length; }, put: function (testname) { names[testname] = testname; }, remove: function (testname) { delete names[testname]; } }; process.on('exit', function() { on_exit = on_exit || exports.default_on_exit; on_exit(tracker); }); return tracker; }; exports.default_on_exit = function (tracker) { if (tracker.unfinished()) { console.log(''); console.log('Undone tests (or their setups/teardowns): '); var names = tracker.names(); for (var i = 0; i < names.length; i += 1) { console.log(names[i]); } process.reallyExit(tracker.unfinished()); } }; nodeunit-0.11.2/lib/types.js000066400000000000000000000120501317343222700156720ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed * * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, it's mostly to avoid requiring code * that is node specific */ /** * Module dependencies */ var assert = require('./assert'), //@REMOVE_LINE_FOR_BROWSER async = require('../deps/async'); //@REMOVE_LINE_FOR_BROWSER /** * Creates assertion objects representing the result of an assert call. * Accepts an object or AssertionError as its argument. * * @param {object} obj * @api public */ exports.assertion = function (obj) { return { method: obj.method || '', message: obj.message || (obj.error && obj.error.message) || '', error: obj.error, passed: function () { return !this.error; }, failed: function () { return Boolean(this.error); } }; }; /** * Creates an assertion list object representing a group of assertions. * Accepts an array of assertion objects. * * @param {Array} arr * @param {Number} duration * @api public */ exports.assertionList = function (arr, duration) { var that = arr || []; that.failures = function () { var failures = 0; for (var i = 0; i < this.length; i += 1) { if (this[i].failed()) { failures += 1; } } return failures; }; that.passes = function () { return that.length - that.failures(); }; that.duration = duration || 0; return that; }; /** * Create a wrapper function for assert module methods. Executes a callback * after it's complete with an assertion object representing the result. * * @param {Function} callback * @api private */ var assertWrapper = function (callback) { return function (new_method, assert_method, arity) { return function () { var message = arguments[arity - 1]; var a = exports.assertion({method: new_method, message: message}); try { assert[assert_method].apply(null, arguments); } catch (e) { a.error = e; } callback(a); }; }; }; /** * Creates the 'test' object that gets passed to every test function. * Accepts the name of the test function as its first argument, followed by * the start time in ms, the options object and a callback function. * * @param {String} name * @param {Number} start * @param {Object} options * @param {Function} callback * @api public */ exports.test = function (name, start, options, callback) { var expecting; var a_list = []; var wrapAssert = assertWrapper(function (a) { a_list.push(a); if (options.log) { async.nextTick(function () { options.log(a); }); } }); var test = { done: function (err) { if (expecting !== undefined && expecting !== a_list.length) { var e = new Error( 'Expected ' + expecting + ' assertions, ' + a_list.length + ' ran' ); var a1 = exports.assertion({method: 'expect', error: e}); a_list.push(a1); if (options.log) { async.nextTick(function () { options.log(a1); }); } } if (err) { var a2 = exports.assertion({error: err}); a_list.push(a2); if (options.log) { async.nextTick(function () { options.log(a2); }); } } var end = new Date().getTime(); async.nextTick(function () { var assertion_list = exports.assertionList(a_list, end - start); options.testDone(name, assertion_list); callback(null, a_list); }); }, ok: wrapAssert('ok', 'ok', 2), same: wrapAssert('same', 'deepEqual', 3), equals: wrapAssert('equals', 'equal', 3), expect: function (num) { expecting = num; }, _assertion_list: a_list }; // add all functions from the assert module for (var k in assert) { if (assert.hasOwnProperty(k)) { test[k] = wrapAssert(k, k, assert[k].length); } } return test; }; /** * Ensures an options object has all callbacks, adding empty callback functions * if any are missing. * * @param {Object} opt * @return {Object} * @api public */ exports.options = function (opt) { var optionalCallback = function (name) { opt[name] = opt[name] || function () {}; }; optionalCallback('moduleStart'); optionalCallback('moduleDone'); optionalCallback('testStart'); optionalCallback('testReady'); optionalCallback('testDone'); //optionalCallback('log'); // 'done' callback is not optional. return opt; }; nodeunit-0.11.2/lib/utils.js000066400000000000000000000170761317343222700157030ustar00rootroot00000000000000/*! * Nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed */ /** * Module dependencies */ var async = require('../deps/async'), fs = require('fs'), util = require('util'), Script = require('vm').Script, http = require('http'), path = require('path'); /** * Detect if coffee-script, iced-coffeescript, or streamline are available and * the respective file extensions to the search filter in modulePaths if it is. */ var extensions = [ 'js' ]; // js is always supported: add it unconditionally var extensionPattern; try { require('coffee' + '-script/register'); extensions.push('coffee'); } catch (e) { } try { require('iced-coffee' + '-script/register'); extensions.push('iced'); } catch (e) { } try { require('stream' + 'line').register(); extensions.push('_coffee'); extensions.push('_js'); } catch (e) { } extensionPattern = new RegExp('\\.(?:' + extensions.join('|') + ')$'); /** * Finds all modules at each path in an array, If a path is a directory, it * returns all supported file types inside it. This only reads 1 level deep in * the directory and does not recurse through sub-directories. * * The extension (.js, .coffee etc) is stripped from the filenames so they can * simply be require()'ed. * * @param {Array} paths * @param {Function} callback * @param {Boolean=} recursive * @api public */ exports.modulePaths = function modulePaths(paths, callback, recursive) { recursive = (recursive === true); async.concatSeries(paths, function (p, cb) { fs.stat(p, function (err, stats) { if (err) { return cb(err); } if (stats.isFile()) { return cb(null, [p]); } if (stats.isDirectory()) { fs.readdir(p, function (err, files) { if (err) { return cb(err); } // filter out any filenames with unsupported extensions var modules = files.filter(function (filename) { return extensionPattern.exec(filename); }); // remove extension from module name and prepend the // directory path var fullpaths = modules.map(function (filename) { var mod_name = filename.replace(extensionPattern, ''); return [p, mod_name].join('/'); }); if (recursive) { // get all sub directories var directories = files .map(function(filename) { // resolve path first return path.resolve(p, filename); }) .filter(function(filename) { // fetch only directories return (fs.statSync(filename).isDirectory()); }); // recursively call modulePaths() with sub directories modulePaths(directories, function(err, files) { if (!err) { cb(null, fullpaths.concat(files).sort()) } else { cb(err); } }, recursive); } else { // sort filenames here, because Array.map changes order fullpaths.sort(); // finish cb(null, fullpaths); } }); } }); }, callback); }; /** * Evaluates JavaScript files in a sandbox, returning the context. The first * argument can either be a single filename or an array of filenames. If * multiple filenames are given their contents are concatenated before * evalution. The second argument is an optional context to use for the sandbox. * * @param files * @param {Object} sandbox * @return {Object} * @api public */ exports.sandbox = function (files, /*optional*/sandbox) { var source, script, result; if (!(files instanceof Array)) { files = [files]; } source = files.map(function (file) { return fs.readFileSync(file, 'utf8'); }).join(''); if (!sandbox) { sandbox = {}; } script = new Script(source); result = script.runInNewContext(sandbox); return sandbox; }; /** * Provides a http request, response testing environment. * * Example: * * var httputil = require('nodeunit').utils.httputil * exports.testSomething = function(test) { * httputil(function (req, resp) { * resp.writeHead(200, {}); * resp.end('test data'); * }, * function(server, client) { * client.fetch('GET', '/', {}, function(resp) { * test.equal('test data', resp.body); * server.close(); * test.done(); * }) * }); * }; * * @param {Function} cgi * @param {Function} envReady * @api public */ exports.httputil = function (cgi, envReady) { var hostname = process.env.HOSTNAME || 'localhost'; var port = process.env.PORT || 3000; var server = http.createServer(cgi); server.listen(port, hostname); var agent = new http.Agent({ host: hostname, port: port, maxSockets: 1 }); var client = { fetch: function (method, path, headers, respReady) { var request = http.request({ host: hostname, port: port, agent: agent, method: method, path: path, headers: headers }); request.end(); request.on('response', function (response) { response.setEncoding('utf8'); response.on('data', function (chunk) { if (response.body) { response.body += chunk; } else { response.body = chunk; } }); response.on('end', function () { if (response.headers['content-type'] === 'application/json') { response.bodyAsObject = JSON.parse(response.body); } respReady(response); }); }); } }; process.nextTick(function () { if (envReady && typeof envReady === 'function') { envReady(server, client); } }); }; /** * Improves formatting of AssertionError messages to make deepEqual etc more * readable. * * @param {Object} assertion * @return {Object} * @api public */ exports.betterErrors = function (assertion) { if (!assertion.error) { return assertion; } var e = assertion.error; if (typeof e.actual !== 'undefined' && typeof e.expected !== 'undefined') { var actual = util.inspect(e.actual, false, 10).replace(/\n$/, ''); var expected = util.inspect(e.expected, false, 10).replace(/\n$/, ''); var multiline = ( actual.indexOf('\n') !== -1 || expected.indexOf('\n') !== -1 ); var spacing = (multiline ? '\n' : ' '); e._message = e.message; e.stack = ( e.name + ':' + spacing + actual + spacing + e.operator + spacing + expected + '\n' + e.stack.split('\n').slice(1).join('\n') ); } return assertion; }; nodeunit-0.11.2/man1/000077500000000000000000000000001317343222700142605ustar00rootroot00000000000000nodeunit-0.11.2/man1/nodeunit.1000066400000000000000000000036451317343222700161770ustar00rootroot00000000000000.\" Generated with Ronnjs/v0.1 .\" http://github.com/kapouer/ronnjs/ . .TH "NODEUNIT" "1" "October 2010" "" "" . .SH "NAME" \fBnodeunit\fR \-\- simple node\.js unit testing tool . .SH "SYNOPSIS" . .nf nodeunit [options] [ \.\.\.] . .fi . .SH "DESCRIPTION" Nodeunit is a simple unit testing tool based on the node\.js assert module\. . .IP "\(bu" 4 Simple to use . .IP "\(bu" 4 Just export the tests from a module . .IP "\(bu" 4 Helps you avoid common pitfalls when testing asynchronous code . .IP "\(bu" 4 Easy to add test cases with setUp and tearDown functions if you wish . .IP "\(bu" 4 Allows the use of mocks and stubs . .IP "" 0 . .SH "OPTIONS" \fB\-\-config FILE\fR: . .br Load config options from a JSON file, allows the customisation of color schemes for the default test reporter etc\. See bin/nodeunit\.json for current available options\. . .P \fB\-\-reporter FILE\fR: . .br You can set the test reporter to a custom module or on of the modules in nodeunit/lib/reporters, when omitted, the default test runner is used\. . .P \fB\-\-list\-reporters\fR: . .br List available build\-in reporters\. . .P \fB\-h\fR, \fB\-\-help\fR: . .br Display the help and exit\. . .P \fB\-v\fR, \fB\-\-version\fR: . .br Output version information and exit\. . .P \fB\fR: You can run nodeunit on specific files or on all \fI*\.js\fR files inside . .br a directory\. . .SH "AUTHORS" Written by Caolan McMahon and other nodeunit contributors\. . .br Contributors list: \fIhttp://github\.com/caolan/nodeunit/contributors\fR\|\. . .SH "REPORTING BUGS" Report nodeunit bugs to \fIhttp://github\.com/caolan/nodeunit/issues\fR\|\. . .SH "COPYRIGHT" Copyright © 2010 Caolan McMahon\. . .br Nodeunit has been released under the MIT license: . .br \fIhttp://github\.com/caolan/nodeunit/raw/master/LICENSE\fR\|\. . .SH "SEE ALSO" node(1) nodeunit-0.11.2/nodelint.cfg000066400000000000000000000003571317343222700157260ustar00rootroot00000000000000//See: http://www.jslint.com/lint.html#options var options = { //white: false, // if false, strict whitespace rules should be enforced. indent: 4, onevar: false, vars: true // allow multiple var statement per function. }; nodeunit-0.11.2/package.json000066400000000000000000000034401317343222700157130ustar00rootroot00000000000000{ "name": "nodeunit", "version": "0.11.2", "description": "Easy unit testing for node.js and the browser.", "maintainers": [ { "name": "Caolan McMahon", "web": "https://github.com/caolan" } ], "contributors": [ { "name": "Romain Beauxis", "web": "https://github.com/toots" }, { "name": "Alex Gorbatchev", "web": "https://github.com/alexgorbatchev" }, { "name": "Alex Wolfe", "web": "https://github.com/alexkwolfe" }, { "name": "Carl Fürstenberg", "web": "https://github.com/azatoth" }, { "name": "Gerad Suyderhoud", "web": "https://github.com/gerad" }, { "name": "Kadir Pekel", "web": "https://github.com/coffeemate" }, { "name": "Oleg Efimov", "web": "https://github.com/Sannis" }, { "name": "Orlando Vazquez", "web": "https://github.com/orlandov" }, { "name": "Ryan Dahl", "web": "https://github.com/ry" }, { "name": "Sam Stephenson", "web": "https://github.com/sstephenson" }, { "name": "Thomas Mayfield", "web": "https://github.com/thegreatape" }, { "name": "Elijah Insua ", "web": "http://tmpvar.com" } ], "repository": { "type": "git", "url": "http://github.com/caolan/nodeunit.git" }, "devDependencies": { "should": ">=11.1.0", "uglify-js": ">=2.7.3" }, "bugs": { "url": "http://github.com/caolan/nodeunit/issues" }, "license": "MIT", "directories": { "lib": "./lib", "doc": "./doc", "man": "./man1" }, "bin": { "nodeunit": "./bin/nodeunit" }, "dependencies": { "ejs": "^2.5.2", "tap": "^10.0.2" }, "scripts": { "test": "node ./bin/nodeunit" } } nodeunit-0.11.2/share/000077500000000000000000000000001317343222700145265ustar00rootroot00000000000000nodeunit-0.11.2/share/junit.xml.ejs000066400000000000000000000015221317343222700171610ustar00rootroot00000000000000 <% for (var i=0; i < suites.length; i++) { %> <% var suite=suites[i]; %> <% for (var testCaseName in suite.testcases) { %> <% var testcase=suite.testcases[testCaseName]; %> <% if (testcase.failure) { %> <% if (testcase.failure.backtrace) { %><%= testcase.failure.backtrace %><% } %> <% } %> <% } %> <% } %> nodeunit-0.11.2/share/license.js000066400000000000000000000003531317343222700165070ustar00rootroot00000000000000/*! * Nodeunit * https://github.com/caolan/nodeunit * Copyright (c) 2010 Caolan McMahon * MIT Licensed * * json2.js * http://www.JSON.org/json2.js * Public Domain. * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. */ nodeunit-0.11.2/share/nodeunit.css000066400000000000000000000025161317343222700170710ustar00rootroot00000000000000/*! * Styles taken from qunit.css */ h1#nodeunit-header, h1.nodeunit-header { padding: 15px; font-size: large; background-color: #06b; color: white; font-family: 'trebuchet ms', verdana, arial; margin: 0; } h1#nodeunit-header a { color: white; } h2#nodeunit-banner { height: 2em; border-bottom: 1px solid white; background-color: #eee; margin: 0; font-family: 'trebuchet ms', verdana, arial; } h2#nodeunit-banner.pass { background-color: green; } h2#nodeunit-banner.fail { background-color: red; } h2#nodeunit-userAgent, h2.nodeunit-userAgent { padding: 10px; background-color: #eee; color: black; margin: 0; font-size: small; font-weight: normal; font-family: 'trebuchet ms', verdana, arial; font-size: 10pt; } div#nodeunit-testrunner-toolbar { background: #eee; border-top: 1px solid black; padding: 10px; font-family: 'trebuchet ms', verdana, arial; margin: 0; font-size: 10pt; } ol#nodeunit-tests { font-family: 'trebuchet ms', verdana, arial; font-size: 10pt; } ol#nodeunit-tests li strong { cursor:pointer; } ol#nodeunit-tests .pass { color: green; } ol#nodeunit-tests .fail { color: red; } p#nodeunit-testresult { margin-left: 1em; font-size: 10pt; font-family: 'trebuchet ms', verdana, arial; } nodeunit-0.11.2/test/000077500000000000000000000000001317343222700144035ustar00rootroot00000000000000nodeunit-0.11.2/test/fixtures/000077500000000000000000000000001317343222700162545ustar00rootroot00000000000000nodeunit-0.11.2/test/fixtures/coffee/000077500000000000000000000000001317343222700175035ustar00rootroot00000000000000nodeunit-0.11.2/test/fixtures/coffee/mock_coffee_module.coffee000066400000000000000000000001001317343222700244500ustar00rootroot00000000000000j = 0 j += i for i in [0..5] exports.name = "mock_coffee_#{j}" nodeunit-0.11.2/test/fixtures/dir/000077500000000000000000000000001317343222700170325ustar00rootroot00000000000000nodeunit-0.11.2/test/fixtures/dir/.should_not_be_run.js.swp000066400000000000000000000002121317343222700237610ustar00rootroot00000000000000var assert = require('assert'); // throw an assertion error if this gets required assert.ok(false, 'this module should not be loaded!'); nodeunit-0.11.2/test/fixtures/dir/example_test_sub.js000066400000000000000000000001271317343222700227330ustar00rootroot00000000000000exports['example test sub'] = function (test) { test.ok(true); test.done(); }; nodeunit-0.11.2/test/fixtures/dir/mock_module3.js000066400000000000000000000000371317343222700217510ustar00rootroot00000000000000exports.name = 'mock_module3'; nodeunit-0.11.2/test/fixtures/dir/mock_module4.js000066400000000000000000000000371317343222700217520ustar00rootroot00000000000000exports.name = 'mock_module4'; nodeunit-0.11.2/test/fixtures/example_test.js000066400000000000000000000001231317343222700213000ustar00rootroot00000000000000exports['example test'] = function (test) { test.ok(true); test.done(); }; nodeunit-0.11.2/test/fixtures/mock_module1.js000066400000000000000000000000371317343222700211710ustar00rootroot00000000000000exports.name = 'mock_module1'; nodeunit-0.11.2/test/fixtures/mock_module2.js000066400000000000000000000000371317343222700211720ustar00rootroot00000000000000exports.name = 'mock_module2'; nodeunit-0.11.2/test/fixtures/raw_jscode1.js000066400000000000000000000000671317343222700210160ustar00rootroot00000000000000function hello_world(arg) { return "_" + arg + "_"; } nodeunit-0.11.2/test/fixtures/raw_jscode2.js000066400000000000000000000000711317343222700210120ustar00rootroot00000000000000function get_a_variable() { return typeof a_variable; } nodeunit-0.11.2/test/fixtures/raw_jscode3.js000066400000000000000000000000171317343222700210130ustar00rootroot00000000000000var t=t?t+1:1; nodeunit-0.11.2/test/test-base.js000066400000000000000000000151531317343222700166350ustar00rootroot00000000000000/* * This module is not a plain nodeunit test suite, but instead uses the * assert module to ensure a basic level of functionality is present, * allowing the rest of the tests to be written using nodeunit itself. * * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ var assert = require('assert'), // @REMOVE_LINE_FOR_BROWSER async = require('../deps/async'), // @REMOVE_LINE_FOR_BROWSER nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER // NOT A TEST - util function to make testing faster. // retries the assertion until it passes or the timeout is reached, // at which point it throws the assertion error var waitFor = function (fn, timeout, callback, start) { start = start || new Date().getTime(); callback = callback || function () {}; try { fn(); callback(); } catch (e) { if (e instanceof assert.AssertionError) { var now = new Date().getTime(); if (now - start >= timeout) { throw e; } else { async.nextTick(function () { waitFor(fn, timeout, callback, start); }); } } else { throw e; } } }; // TESTS: // Are exported tests actually run? - store completed tests in this variable // for checking later var tests_called = {}; // most basic test that should run, the tests_called object is tested // at the end of this module to ensure the tests were actually run by nodeunit exports.testCalled = function (test) { tests_called.testCalled = true; test.done(); }; // generates test functions for nodeunit assertions var makeTest = function (method, args_pass, args_fail) { return function (test) { var test1_called = false; var test2_called = false; // test pass nodeunit.runTest( 'testname', function (test) { test[method].apply(test, args_pass); test.done(); }, {testDone: function (name, assertions) { assert.equal(assertions.length, 1); assert.equal(assertions.failures(), 0); }}, function () { test1_called = true; } ); // test failure nodeunit.runTest( 'testname', function (test) { test[method].apply(test, args_fail); test.done(); }, {testDone: function (name, assertions) { assert.equal(assertions.length, 1); assert.equal(assertions.failures(), 1); }}, function () { test2_called = true; } ); // ensure tests were run waitFor(function () { assert.ok(test1_called); assert.ok(test2_called); tests_called[method] = true; }, 500, test.done); }; }; // ensure basic assertions are working: exports.testOk = makeTest('ok', [true], [false]); exports.testEquals = makeTest('equals', [1, 1], [1, 2]); exports.testSame = makeTest('same', [{test: 'test'}, {test: 'test'}], [{test: 'test'}, {monkey: 'penguin'}] ); // from the assert module: exports.testEqual = makeTest('equal', [1, 1], [1, 2]); exports.testNotEqual = makeTest('notEqual', [1, 2], [1, 1]); exports.testDeepEqual = makeTest('deepEqual', [{one: 1, two: 2}, {one: 1, two: {valueOf:function() {return 2;}}}], [{one: 1, two: 2}, {two: 2}] ); exports.testNotDeepEqual = makeTest('notDeepEqual', [{one: 1}, {two: 2}], [{one: 1}, {one: 1}] ); exports.testStrictEqual = makeTest('strictEqual', [1, 1], [1, true]); exports.testNotStrictEqual = makeTest('notStrictEqual', [true, 1], [1, 1]); exports.testThrows = makeTest('throws', [function () { throw new Error('test'); }], [function () { return; }] ); exports.testThrowsWithReGex = makeTest('throws', [function () { throw new Error('test'); }, /test/], [function () { throw new Error('test'); }, /fail/] ); exports.testThrowsWithErrorValidation = makeTest('throws', [function () { throw new Error('test'); }, function(err) { return true; }], [function () { throw new Error('test'); }, function(err) { return false; }] ); exports.testDoesNotThrows = makeTest('doesNotThrow', [function () { return; }], [function () { throw new Error('test'); }] ); exports.testIfError = makeTest('ifError', [false], [new Error('test')]); exports.testExpect = function (test) { var test1_called = false, test2_called = false, test3_called = false; // correct number of tests run nodeunit.runTest( 'testname', function (test) { test.expect(2); test.ok(true); test.ok(true); test.done(); }, {testDone: function (name, assertions) { test.equals(assertions.length, 2); test.equals(assertions.failures(), 0); }}, function () { test1_called = true; } ); // no tests run nodeunit.runTest( 'testname', function (test) { test.expect(2); test.done(); }, {testDone: function (name, assertions) { test.equals(assertions.length, 1); test.equals(assertions.failures(), 1); }}, function () { test2_called = true; } ); // incorrect number of tests run nodeunit.runTest( 'testname', function (test) { test.expect(2); test.ok(true); test.ok(true); test.ok(true); test.done(); }, {testDone: function (name, assertions) { test.equals(assertions.length, 4); test.equals(assertions.failures(), 1); }}, function () { test3_called = true; } ); // ensure callbacks fired waitFor(function () { assert.ok(test1_called); assert.ok(test2_called); assert.ok(test3_called); tests_called.expect = true; }, 1000, test.done); }; // tests are async, so wait for them to be called waitFor(function () { assert.ok(tests_called.testCalled); assert.ok(tests_called.ok); assert.ok(tests_called.equals); assert.ok(tests_called.same); assert.ok(tests_called.expect); }, 10000); nodeunit-0.11.2/test/test-bettererrors.js000066400000000000000000000051431317343222700204430ustar00rootroot00000000000000/* * Test utils.betterErrors. utils.betterErrors should provide sensible error messages even when the error does not * contain expected, actual or operator. */ var assert = require("../lib/assert"); var should = require("should"); var types = require("../lib/types"); var util = require('util'); var utils = require("../lib/utils"); function betterErrorStringFromError(error) { var assertion = types.assertion({error: error}); var better = utils.betterErrors(assertion); return better.error.stack.toString(); } function performBasicChecks(betterErrorString) { betterErrorString.should.containEql("AssertionError"); betterErrorString.should.containEql("test-bettererrors"); //betterErrorString.should.not.include("undefined"); } /** * Control test. Provide an AssertionError that contains actual, expected operator values. * @param test the test object from nodeunit */ exports.testEqual = function (test) { try { assert.equal(true, false); } catch (error) { var betterErrorString = betterErrorStringFromError(error); performBasicChecks(betterErrorString); betterErrorString.should.containEql("true"); betterErrorString.should.containEql("false"); betterErrorString.should.containEql("=="); test.done(); } }; /** * Test an AssertionError that does not contain actual, expected or operator values. * @param test the test object from nodeunit */ exports.testAssertThrows = function (test) { try { assert.throws(function () { }); } catch (error) { var betterErrorString = betterErrorStringFromError(error); performBasicChecks(betterErrorString); test.done(); } }; /** * Test with an error that is not an AssertionError. * * This function name MUST NOT include "AssertionError" because one of the * tests it performs asserts that the returned error string does not contain * the "AssertionError" term. If this function name does include that term, it * will show up in the stack trace and the test will fail! * @param test the test object from nodeunit */ exports.testErrorIsNotAssertion = function (test) { try { throw new Error("test error"); } catch (error) { var betterErrorString = betterErrorStringFromError(error); betterErrorString.should.not.containEql("AssertionError"); betterErrorString.should.containEql("Error"); betterErrorString.should.containEql("test error"); betterErrorString.should.containEql("test-bettererrors"); betterErrorString.should.not.containEql("undefined"); test.done(); } }; nodeunit-0.11.2/test/test-cli.js000066400000000000000000000024641317343222700164730ustar00rootroot00000000000000var exec = require('child_process').exec, path = require('path'); var bin = (process.platform === 'win32' ? 'node ' : "") + path.resolve(__dirname, '../bin/nodeunit'); var testfile_fullpath = path.resolve(__dirname, './fixtures/example_test.js'); var fixtures_path = path.resolve(__dirname, './fixtures'); exports['run test suite using absolute path'] = function (test) { exec(bin + ' ' + testfile_fullpath, function (err, stdout, stderr) { if (err) { return test.done(err); } test.ok(/example test/.test(stdout)); test.ok(/1 assertion/.test(stdout)); test.done(); }); }; exports['runs only top-level suites without recursive flag'] = function (test) { exec(bin + ' ' + fixtures_path, function (err, stdout, stderr) { if (err) { return test.done(err); } test.ok(/example test/.test(stdout)); test.ok(!/example test sub/.test(stdout)); test.done(); }); }; exports['runs top + nested suites with recursive flag'] = function (test) { exec(bin + ' ' + fixtures_path + ' -r', function (err, stdout, stderr) { if (err) { return test.done(err); } test.ok(/example test/.test(stdout)); test.ok(/example test sub/.test(stdout)); test.done(); }); }; nodeunit-0.11.2/test/test-failing-callbacks.js000066400000000000000000000070361317343222700212520ustar00rootroot00000000000000var nodeunit = require('../lib/nodeunit'); exports.testFailingLog = function (test) { test.expect(3); // this is meant to bubble to the top, and will be ignored for the purposes // of testing: var ignored_error = new Error('ignore this callback error'); var err_handler = function (err) { if (err && err.message !== ignored_error.message) { throw err; } }; process.addListener('uncaughtException', err_handler); // A failing callback should not affect the test outcome var testfn = function (test) { test.ok(true, 'test.ok'); test.done(); }; nodeunit.runTest('testname', testfn, { log: function (assertion) { test.ok(true, 'log called'); throw ignored_error; }, testDone: function (name, assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 1, 'total'); process.removeListener('uncaughtException', err_handler); } }, test.done); }; exports.testFailingTestDone = function (test) { test.expect(2); var ignored_error = new Error('ignore this callback error'); var err_handler = function (err) { if (err && err.message !== ignored_error.message) { throw err; } }; process.addListener('uncaughtException', err_handler); // A failing callback should not affect the test outcome var testfn = function (test) { test.done(); }; nodeunit.runTest('testname', testfn, { log: function (assertion) { test.ok(false, 'log should not be called'); }, testDone: function (name, assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 0, 'total'); process.nextTick(function () { process.removeListener('uncaughtException', err_handler); test.done(); }); throw ignored_error; } }, function () {}); }; exports.testAssertionObj = function (test) { test.expect(4); var testfn = function (test) { test.ok(true, 'ok true'); test.done(); }; nodeunit.runTest('testname', testfn, { log: function (assertion) { test.ok(assertion.passed() === true, 'assertion.passed'); test.ok(assertion.failed() === false, 'assertion.failed'); }, testDone: function (name, assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 1, 'total'); } }, test.done); }; exports.testLogOptional = function (test) { test.expect(2); var testfn = function (test) { test.ok(true, 'ok true'); test.done(); }; nodeunit.runTest('testname', testfn, { testDone: function (name, assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 1, 'total'); } }, test.done); }; exports.testExpectWithFailure = function (test) { test.expect(3); var testfn = function (test) { test.expect(1); test.ok(false, 'test.ok'); test.done(); }; nodeunit.runTest('testname', testfn, { log: function (assertion) { test.equals(assertion.method, 'ok', 'assertion.method'); }, testDone: function (name, assertions) { test.equals(assertions.failures(), 1, 'failures'); test.equals(assertions.length, 1, 'total'); } }, test.done); }; nodeunit-0.11.2/test/test-httputil.js000066400000000000000000000033271317343222700176000ustar00rootroot00000000000000var nodeunit = require('../lib/nodeunit'); var httputil = require('../lib/utils').httputil; exports.testHttpUtilBasics = function (test) { test.expect(6); httputil(function (req, resp) { test.equal(req.method, 'PUT'); test.equal(req.url, '/newpair'); test.equal(req.headers.foo, 'bar'); resp.writeHead(500, {'content-type': 'text/plain'}); resp.end('failed'); }, function (server, client) { client.fetch('PUT', '/newpair', {'foo': 'bar'}, function (resp) { test.equal(resp.statusCode, 500); test.equal(resp.headers['content-type'], 'text/plain'); test.equal(resp.body, 'failed'); server.close(); test.done(); }); }); }; exports.testHttpUtilJsonHandling = function (test) { test.expect(9); httputil(function (req, resp) { test.equal(req.method, 'GET'); test.equal(req.url, '/'); test.equal(req.headers.foo, 'bar'); var testdata = {foo1: 'bar', foo2: 'baz'}; resp.writeHead(200, {'content-type': 'application/json'}); resp.end(JSON.stringify(testdata)); }, function (server, client) { client.fetch('GET', '/', {'foo': 'bar'}, function (resp) { test.equal(resp.statusCode, 200); test.equal(resp.headers['content-type'], 'application/json'); test.ok(resp.bodyAsObject); test.equal(typeof resp.bodyAsObject, 'object'); test.equal(resp.bodyAsObject.foo1, 'bar'); test.equal(resp.bodyAsObject.foo2, 'baz'); server.close(); test.done(); }); }); }; nodeunit-0.11.2/test/test-runfiles.js000066400000000000000000000157161317343222700175570ustar00rootroot00000000000000var assert = require('assert'), fs = require('fs'), path = require('path'), nodeunit = require('../lib/nodeunit'); var setup = function (fn) { return function (test) { process.chdir(__dirname); var env = { mock_module1: require(__dirname + '/fixtures/mock_module1'), mock_module2: require(__dirname + '/fixtures/mock_module2'), mock_module3: require(__dirname + '/fixtures/dir/mock_module3'), mock_module4: require(__dirname + '/fixtures/dir/mock_module4') }; fn.call(env, test); }; }; exports.testRunFiles = setup(function (test) { test.expect(33); var runModule_copy = nodeunit.runModule; var runModule_calls = []; var modules = []; var opts = { moduleStart: function () { return 'moduleStart'; }, testDone: function () { return 'testDone'; }, testReady: function () { return 'testReady'; }, testStart: function () { return 'testStart'; }, log: function () { return 'log'; }, done: function (assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 5, 'length'); test.ok(typeof assertions.duration === "number"); var called_with = function (name) { return runModule_calls.some(function (m) { return m.name === name; }); }; test.ok(called_with('mock_module1'), 'mock_module1 ran'); test.ok(called_with('mock_module2'), 'mock_module2 ran'); test.ok(called_with('mock_module3'), 'mock_module3 ran'); test.ok(called_with('mock_module4'), 'mock_module4 ran'); test.equals(runModule_calls.length, 5); nodeunit.runModule = runModule_copy; test.done(); } }; nodeunit.runModule = function (name, mod, options, callback) { test.equals(options.testDone, opts.testDone); test.equals(options.testReady, opts.testReady); test.equals(options.testStart, opts.testStart); test.equals(options.log, opts.log); test.ok(typeof name === "string"); runModule_calls.push(mod); var m = [{failed: function () { return false; }}]; modules.push(m); callback(null, m); }; nodeunit.runFiles( [__dirname + '/fixtures/mock_module1.js', __dirname + '/fixtures/mock_module2.js', __dirname + '/fixtures/dir'], opts ); }); exports.testRunFilesEmpty = function (test) { test.expect(3); nodeunit.runFiles([], { moduleStart: function () { test.ok(false, 'should not be called'); }, testDone: function () { test.ok(false, 'should not be called'); }, testReady: function () { test.ok(false, 'should not be called'); }, testStart: function () { test.ok(false, 'should not be called'); }, log: function () { test.ok(false, 'should not be called'); }, done: function (assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 0, 'length'); test.ok(typeof assertions.duration === "number"); test.done(); } }); }; exports.testEmptyDir = function (test) { var dir2 = __dirname + '/fixtures/dir2'; // git doesn't like empty directories, so we have to create one fs.access(dir2, function (err) { if (err) { fs.mkdirSync(dir2, 0777); } // runFiles on empty directory: nodeunit.runFiles([dir2], { moduleStart: function () { test.ok(false, 'should not be called'); }, testDone: function () { test.ok(false, 'should not be called'); }, testReady: function () { test.ok(false, 'should not be called'); }, testStart: function () { test.ok(false, 'should not be called'); }, log: function () { test.ok(false, 'should not be called'); }, done: function (assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 0, 'length'); test.ok(typeof assertions.duration === "number"); test.done(); } }); }); }; var CoffeeScript; try { CoffeeScript = require('coffee-script'); if (CoffeeScript.register != null) { CoffeeScript.register(); } } catch (e) { } if (CoffeeScript) { exports.testCoffeeScript = function (test) { process.chdir(__dirname); var env = { mock_coffee_module: require(__dirname + '/fixtures/coffee/mock_coffee_module') }; test.expect(10); var runModule_copy = nodeunit.runModule; var runModule_calls = []; var modules = []; var opts = { moduleStart: function () { return 'moduleStart'; }, testDone: function () { return 'testDone'; }, testReady: function () { return 'testReady'; }, testStart: function () { return 'testStart'; }, log: function () { return 'log'; }, done: function (assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 1, 'length'); test.ok(typeof assertions.duration === "number"); var called_with = function (name) { return runModule_calls.some(function (m) { return m.name === name; }); }; test.ok( called_with('mock_coffee_15'), 'mock_coffee_module ran' ); test.equals(runModule_calls.length, 1); nodeunit.runModule = runModule_copy; test.done(); } }; nodeunit.runModule = function (name, mod, options, callback) { test.equals(options.testDone, opts.testDone); test.equals(options.testReady, opts.testReady); test.equals(options.testStart, opts.testStart); test.equals(options.log, opts.log); test.ok(typeof name === "string"); runModule_calls.push(mod); var m = [{failed: function () { return false; }}]; modules.push(m); callback(null, m); }; nodeunit.runFiles( [__dirname + '/fixtures/coffee/mock_coffee_module.coffee'], opts ); }; } nodeunit-0.11.2/test/test-runmodule.js000066400000000000000000000205551317343222700177370ustar00rootroot00000000000000/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER exports.testRunModule = function (test) { test.expect(59); var call_order = []; var testmodule = { test1: function (test) { call_order.push('test1'); test.ok(true, 'ok true'); test.done(); }, test2: function (test) { call_order.push('test2'); test.ok(false, 'ok false'); test.ok(false, 'ok false'); test.done(); }, test3: function (test) { call_order.push('test3'); test.done(); } }; nodeunit.runModule('testmodule', testmodule, { log: function (assertion) { call_order.push('log'); }, testStart: function (name) { call_order.push('testStart'); test.ok( name.toString() === 'test1' || name.toString() === 'test2' || name.toString() === 'test3', 'testStart called with test name ' ); }, testReady: function (tst) { call_order.push('testReady'); test.ok(tst.done, 'testReady called with non-test object'); test.ok(tst.ok, 'testReady called with non-test object'); test.ok(tst.same, 'testReady called with non-test object'); test.ok(tst.expect, 'testReady called with non-test object'); test.ok(tst._assertion_list, 'testReady called with non-test object'); test.ok(tst.AssertionError, 'testReady called with non-test object'); test.ok(tst.fail, 'testReady called with non-test object'); test.ok(tst.equal, 'testReady called with non-test object'); test.ok(tst.notEqual, 'testReady called with non-test object'); test.ok(tst.deepEqual, 'testReady called with non-test object'); test.ok(tst.notDeepEqual, 'testReady called with non-test object'); test.ok(tst.strictEqual, 'testReady called with non-test object'); test.ok(tst.notStrictEqual, 'testReady called with non-test object'); test.ok(tst.throws, 'testReady called with non-test object'); test.ok(tst.doesNotThrow, 'testReady called with non-test object'); test.ok(tst.ifError, 'testReady called with non-test object'); }, testDone: function (name, assertions) { call_order.push('testDone'); test.ok( name.toString() === 'test1' || name.toString() === 'test2' || name.toString() === 'test3', 'testDone called with test name' ); }, moduleDone: function (name, assertions) { call_order.push('moduleDone'); test.equals(assertions.length, 3); test.equals(assertions.failures(), 2); test.equals(name, 'testmodule'); test.ok(typeof assertions.duration === "number"); test.same(call_order, [ 'testStart', 'testReady', 'test1', 'log', 'testDone', 'testStart', 'testReady', 'test2', 'log', 'log', 'testDone', 'testStart', 'testReady', 'test3', 'testDone', 'moduleDone' ]); } }, test.done); }; exports.testRunModuleTestSpec = function (test) { test.expect(22); var call_order = []; var testmodule = { test1: function (test) { test.ok(true, 'ok true'); test.done(); }, test2: function (test) { call_order.push('test2'); test.ok(false, 'ok false'); test.ok(false, 'ok false'); test.done(); }, test3: function (test) { test.done(); } }; nodeunit.runModule('testmodule', testmodule, { testspec: "test2", log: function (assertion) { call_order.push('log'); }, testStart: function (name) { call_order.push('testStart'); test.equals( name,'test2', 'testStart called with test name ' ); }, testReady: function (tst) { call_order.push('testReady'); test.ok(tst.done, 'testReady called with non-test object'); test.ok(tst.ok, 'testReady called with non-test object'); test.ok(tst.same, 'testReady called with non-test object'); test.ok(tst.expect, 'testReady called with non-test object'); test.ok(tst._assertion_list, 'testReady called with non-test object'); test.ok(tst.AssertionError, 'testReady called with non-test object'); test.ok(tst.fail, 'testReady called with non-test object'); test.ok(tst.equal, 'testReady called with non-test object'); test.ok(tst.notEqual, 'testReady called with non-test object'); test.ok(tst.deepEqual, 'testReady called with non-test object'); test.ok(tst.notDeepEqual, 'testReady called with non-test object'); test.ok(tst.strictEqual, 'testReady called with non-test object'); test.ok(tst.notStrictEqual, 'testReady called with non-test object'); test.ok(tst.throws, 'testReady called with non-test object'); test.ok(tst.doesNotThrow, 'testReady called with non-test object'); test.ok(tst.ifError, 'testReady called with non-test object'); }, testDone: function (name, assertions) { call_order.push('testDone'); test.equal( name, 'test2', 'testDone called with test name' ); }, moduleDone: function (name, assertions) { call_order.push('moduleDone'); test.equals(assertions.length, 2); test.equals(name, 'testmodule'); test.ok(typeof assertions.duration === "number"); test.same(call_order, [ 'testStart', 'testReady', 'test2', 'log', 'log', 'testDone', 'moduleDone' ]); } }, test.done); }; exports.testRunModuleEmpty = function (test) { nodeunit.runModule('module with no exports', {}, { log: function (assertion) { test.ok(false, 'log should not be called'); }, testStart: function (name) { test.ok(false, 'testStart should not be called'); }, testReady: function (tst) { test.ok(false, 'testReady should not be called'); }, testDone: function (name, assertions) { test.ok(false, 'testDone should not be called'); }, moduleDone: function (name, assertions) { test.equals(assertions.length, 0); test.equals(assertions.failures(), 0); test.equals(name, 'module with no exports'); test.ok(typeof assertions.duration === "number"); } }, test.done); }; exports.testNestedTests = function (test) { var call_order = []; var m = { test1: function (test) { test.done(); }, suite: { t1: function (test) { test.done(); }, t2: function (test) { test.done(); }, another_suite: { t3: function (test) { test.done(); } } } }; nodeunit.runModule('modulename', m, { testStart: function (name) { call_order.push(['testStart'].concat(name)); }, testReady: function (tst) { call_order.push(['testReady']); }, testDone: function (name, assertions) { call_order.push(['testDone'].concat(name)); } }, function () { test.same(call_order, [ ['testStart', 'test1'], ['testReady'], ['testDone', 'test1'], ['testStart', 'suite', 't1'], ['testReady'], ['testDone', 'suite', 't1'], ['testStart', 'suite', 't2'], ['testReady'], ['testDone', 'suite', 't2'], ['testStart', 'suite', 'another_suite', 't3'], ['testReady'], ['testDone', 'suite', 'another_suite', 't3'] ]); test.done(); }); }; nodeunit-0.11.2/test/test-runtest.js000066400000000000000000000030421317343222700174210ustar00rootroot00000000000000/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER exports.testArgs = function (test) { test.ok(test.expect instanceof Function, 'test.expect'); test.ok(test.done instanceof Function, 'test.done'); test.ok(test.ok instanceof Function, 'test.ok'); test.ok(test.same instanceof Function, 'test.same'); test.ok(test.equals instanceof Function, 'test.equals'); test.done(); }; exports.testDoneCallback = function (test) { test.expect(4); nodeunit.runTest('testname', exports.testArgs, { testDone: function (name, assertions) { test.equals(assertions.failures(), 0, 'failures'); test.equals(assertions.length, 5, 'length'); test.ok(typeof assertions.duration === "number"); test.equals(name, 'testname'); } }, test.done); }; exports.testThrowError = function (test) { test.expect(3); var err = new Error('test'); var testfn = function (test) { throw err; }; nodeunit.runTest('testname', testfn, { log: function (assertion) { test.same(assertion.error, err, 'assertion.error'); }, testDone: function (name, assertions) { test.equals(assertions.failures(), 1); test.equals(assertions.length, 1); } }, test.done); }; nodeunit-0.11.2/test/test-sandbox.js000066400000000000000000000017671317343222700173670ustar00rootroot00000000000000var nodeunit = require('../lib/nodeunit'); var sandbox = require('../lib/utils').sandbox; var testCase = nodeunit.testCase; exports.testSimpleSandbox = function (test) { var raw_jscode1 = sandbox(__dirname + '/fixtures/raw_jscode1.js'); test.equal(raw_jscode1.hello_world('foo'), '_foo_', 'evaluation ok'); test.done(); }; exports.testSandboxContext = function (test) { var a_variable = 42; // should not be visible in the sandbox var raw_jscode2 = sandbox(__dirname + '/fixtures/raw_jscode2.js'); a_variable = 42; // again for the win test.equal( raw_jscode2.get_a_variable(), 'undefined', 'the variable should not be defined' ); test.done(); }; exports.testSandboxMultiple = function (test) { var raw_jscode3 = sandbox([ __dirname + '/fixtures/raw_jscode3.js', __dirname + '/fixtures/raw_jscode3.js', __dirname + '/fixtures/raw_jscode3.js' ]); test.equal(raw_jscode3.t, 3, 'two files loaded'); test.done(); }; nodeunit-0.11.2/test/test-testcase-legacy.js000066400000000000000000000155301317343222700207770ustar00rootroot00000000000000/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER var testCase = nodeunit.testCase; exports.testTestCase = function (test) { test.expect(7); var call_order = []; var s = testCase({ setUp: function (callback) { call_order.push('setUp'); test.equals(this.one, undefined); this.one = 1; callback(); }, tearDown: function (callback) { call_order.push('tearDown'); test.ok(true, 'tearDown called'); callback(); }, test1: function (t) { call_order.push('test1'); test.equals(this.one, 1); this.one = 2; t.done(); }, test2: function (t) { call_order.push('test2'); test.equals(this.one, 1); t.done(); } }); nodeunit.runSuite(null, s, {}, function () { test.same(call_order, [ 'setUp', 'test1', 'tearDown', 'setUp', 'test2', 'tearDown' ]); test.done(); }); }; exports.tearDownAfterError = function (test) { test.expect(1); var s = testCase({ tearDown: function (callback) { test.ok(true, 'tearDown called'); callback(); }, test: function (t) { throw new Error('some error'); } }); nodeunit.runSuite(null, s, {}, function () { test.done(); }); }; exports.catchSetUpError = function (test) { test.expect(2); var test_error = new Error('test error'); var s = testCase({ setUp: function (callback) { throw test_error; }, test: function (t) { test.ok(false, 'test function should not be called'); t.done(); } }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.setUpErrorCallback = function (test) { test.expect(2); var test_error = new Error('test error'); var s = testCase({ setUp: function (callback) { callback(test_error); }, test: function (t) { test.ok(false, 'test function should not be called'); t.done(); } }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.catchTearDownError = function (test) { test.expect(2); var test_error = new Error('test error'); var s = testCase({ tearDown: function (callback) { throw test_error; }, test: function (t) { t.done(); } }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.tearDownErrorCallback = function (test) { test.expect(2); var test_error = new Error('test error'); var s = testCase({ tearDown: function (callback) { callback(test_error); }, test: function (t) { t.done(); } }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.testErrorAndtearDownError = function (test) { test.expect(3); var error1 = new Error('test error one'); var error2 = new Error('test error two'); var s = testCase({ tearDown: function (callback) { callback(error2); }, test: function (t) { t.done(error1); } }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 2); test.equal(assertions[0].error, error1); test.equal(assertions[1].error, error2); test.done(); }); }; exports.testCaseGroups = function (test) { var call_order = []; var s = testCase({ setUp: function (callback) { call_order.push('setUp'); callback(); }, tearDown: function (callback) { call_order.push('tearDown'); callback(); }, test1: function (test) { call_order.push('test1'); test.done(); }, group1: { test2: function (test) { call_order.push('group1.test2'); test.done(); } } }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.same(call_order, [ 'setUp', 'test1', 'tearDown', 'setUp', 'group1.test2', 'tearDown' ]); test.done(); }); }; exports.nestedTestCases = function (test) { var call_order = []; var s = testCase({ setUp: function (callback) { call_order.push('setUp'); callback(); }, tearDown: function (callback) { call_order.push('tearDown'); callback(); }, test1: function (test) { call_order.push('test1'); test.done(); }, group1: testCase({ setUp: function (callback) { call_order.push('group1.setUp'); callback(); }, tearDown: function (callback) { call_order.push('group1.tearDown'); callback(); }, test2: function (test) { call_order.push('group1.test2'); test.done(); } }) }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.same(call_order, [ 'setUp', 'test1', 'tearDown', 'setUp', 'group1.setUp', 'group1.test2', 'group1.tearDown', 'tearDown' ]); test.done(); }); }; exports.deepNestedTestCases = function (test) { var val = 'foo'; var s = testCase({ setUp: function (callback) { val = 'bar'; callback(); }, group1: testCase({ test: testCase({ test2: function (test) { test.equal(val, 'bar'); test.done(); } }) }) }); nodeunit.runSuite(null, s, {}, function (err, assertions) { test.ok(!assertions[0].failed()); test.equal(assertions.length, 1); test.done(); }); }; nodeunit-0.11.2/test/test-testcase.js000066400000000000000000000154161317343222700175400ustar00rootroot00000000000000/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. * Only code on that line will be removed, its mostly to avoid requiring code * that is node specific */ var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER exports.testTestCase = function (test) { test.expect(7); var call_order = []; var s = { setUp: function (callback) { call_order.push('setUp'); test.equals(this.one, undefined, 'in setUp, this.one not set'); this.one = 1; callback(); }, tearDown: function (callback) { call_order.push('tearDown'); test.ok(true, 'tearDown called'); callback(); }, test1: function (t) { call_order.push('test1'); test.equals(this.one, 1, 'in test1, this.one is 1'); this.one = 2; t.done(); }, test2: function (t) { call_order.push('test2'); test.equals(this.one, 1, 'in test2, this.one is still 1'); t.done(); } }; nodeunit.runSuite(null, s, {}, function () { test.same(call_order, [ 'setUp', 'test1', 'tearDown', 'setUp', 'test2', 'tearDown' ]); test.done(); }); }; exports.tearDownAfterError = function (test) { test.expect(1); var s = { tearDown: function (callback) { test.ok(true, 'tearDown called'); callback(); }, test: function (t) { throw new Error('some error'); } }; nodeunit.runSuite(null, s, {}, function () { test.done(); }); }; exports.catchSetUpError = function (test) { test.expect(2); var test_error = new Error('test error'); var s = { setUp: function (callback) { throw test_error; }, test: function (t) { test.ok(false, 'test function should not be called'); t.done(); } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.setUpErrorCallback = function (test) { test.expect(2); var test_error = new Error('test error'); var s = { setUp: function (callback) { callback(test_error); }, test: function (t) { test.ok(false, 'test function should not be called'); t.done(); } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.catchTearDownError = function (test) { test.expect(2); var test_error = new Error('test error'); var s = { tearDown: function (callback) { throw test_error; }, test: function (t) { t.done(); } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.tearDownErrorCallback = function (test) { test.expect(2); var test_error = new Error('test error'); var s = { tearDown: function (callback) { callback(test_error); }, test: function (t) { t.done(); } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 1); test.equal(assertions[0].error, test_error); test.done(); }); }; exports.testErrorAndtearDownError = function (test) { test.expect(3); var error1 = new Error('test error one'); var error2 = new Error('test error two'); var s = { tearDown: function (callback) { callback(error2); }, test: function (t) { t.done(error1); } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.equal(assertions.length, 2); test.equal(assertions[0].error, error1); test.equal(assertions[1].error, error2); test.done(); }); }; exports.testCaseGroups = function (test) { var call_order = []; var s = { setUp: function (callback) { call_order.push('setUp'); callback(); }, tearDown: function (callback) { call_order.push('tearDown'); callback(); }, test1: function (test) { call_order.push('test1'); test.done(); }, group1: { test2: function (test) { call_order.push('group1.test2'); test.done(); } } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.same(call_order, [ 'setUp', 'test1', 'tearDown', 'setUp', 'group1.test2', 'tearDown' ]); test.done(); }); }; exports.nestedTestCases = function (test) { var call_order = []; var s = { setUp: function (callback) { call_order.push('setUp'); callback(); }, tearDown: function (callback) { call_order.push('tearDown'); callback(); }, test1: function (test) { call_order.push('test1'); test.done(); }, group1: { setUp: function (callback) { call_order.push('group1.setUp'); callback(); }, tearDown: function (callback) { call_order.push('group1.tearDown'); callback(); }, test2: function (test) { call_order.push('group1.test2'); test.done(); } } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.same(call_order, [ 'setUp', 'test1', 'tearDown', 'setUp', 'group1.setUp', 'group1.test2', 'group1.tearDown', 'tearDown' ]); test.done(); }); }; exports.deepNestedTestCases = function (test) { var val = 'foo'; var s = { setUp: function (callback) { val = 'bar'; callback(); }, group1: { test: { test2: function (test) { test.equal(val, 'bar'); test.done(); } } } }; nodeunit.runSuite(null, s, {}, function (err, assertions) { test.ok(!assertions[0].failed()); test.equal(assertions.length, 1); test.done(); }); }; nodeunit-0.11.2/test/test.html000066400000000000000000000016221317343222700162510ustar00rootroot00000000000000 Nodeunit Test Suite

Nodeunit Test Suite